@@ -73,6 +73,22 @@ static char* getIntFromList(K propValues,int row, int* value, char* errStr)
73
73
return 0 ;
74
74
}
75
75
76
+ static int ssl_error_cb (const char * str , size_t len , void * u ) {
77
+ fprintf (stderr ,"mqtt ssl error: %.*s\n" ,(int )len ,str );
78
+ return 0 ;
79
+ }
80
+
81
+ static void freeOpts (MQTTClient_connectOptions * conn_opts ){
82
+ free ((void * )conn_opts -> username );
83
+ free ((void * )conn_opts -> password );
84
+ free ((void * )conn_opts -> ssl -> trustStore );
85
+ free ((void * )conn_opts -> ssl -> keyStore );
86
+ free ((void * )conn_opts -> ssl -> privateKey );
87
+ free ((void * )conn_opts -> ssl -> privateKeyPassword );
88
+ free ((void * )conn_opts -> ssl -> enabledCipherSuites );
89
+ free ((void * )conn_opts -> ssl -> CApath );
90
+ }
91
+
76
92
/* Establish a tcp connection from a q process to mqtt client
77
93
* tcpconn = tcp connection being connected to (symbol)
78
94
* pname = name to be associated with the connecting process (symbol)
@@ -90,6 +106,7 @@ EXP K connX(K tcpconn,K pname, K opt){
90
106
91
107
MQTTClient_willOptions will_opts = MQTTClient_willOptions_initializer ;
92
108
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer ;
109
+ MQTTClient_SSLOptions ssl_opts = MQTTClient_SSLOptions_initializer ;
93
110
94
111
K propNames = (kK (opt )[0 ]);
95
112
K propValues = (kK (opt )[1 ]);
@@ -106,7 +123,6 @@ EXP K connX(K tcpconn,K pname, K opt){
106
123
{
107
124
if ((kS (propNames )[row ])[0 ] == '\0' )
108
125
continue ;
109
-
110
126
if (strcmp (kS (propNames )[row ],"username" )== 0 )
111
127
errStr = getStringFromList (propValues ,row ,& conn_opts .username ,"username type incorrect" );
112
128
else if (strcmp (kS (propNames )[row ],"password" )== 0 )
@@ -136,28 +152,40 @@ EXP K connX(K tcpconn,K pname, K opt){
136
152
errStr = getCharArrayAsStringFromList (propValues ,row ,& will_opts .message ,"lastWillMessage type incorrect" );
137
153
else if (strcmp (kS (propNames )[row ],"lastWillRetain" )== 0 )
138
154
errStr = getIntFromList (propValues ,row ,& will_opts .retained ,"lastWillRetain type incorrect" );
155
+ else if (strcmp (kS (propNames )[row ],"trustStore" )== 0 )
156
+ errStr = getStringFromList (propValues ,row ,& ssl_opts .trustStore ,"trustStore type incorrect" );
157
+ else if (strcmp (kS (propNames )[row ],"keyStore" )== 0 )
158
+ errStr = getStringFromList (propValues ,row ,& ssl_opts .keyStore ,"keyStore type incorrect" );
159
+ else if (strcmp (kS (propNames )[row ],"privateKey" )== 0 )
160
+ errStr = getStringFromList (propValues ,row ,& ssl_opts .privateKey ,"privateKey type incorrect" );
161
+ else if (strcmp (kS (propNames )[row ],"privateKeyPassword" )== 0 )
162
+ errStr = getStringFromList (propValues ,row ,& ssl_opts .privateKeyPassword ,"privateKeyPassword type incorrect" );
163
+ else if (strcmp (kS (propNames )[row ],"enabledCipherSuites" )== 0 )
164
+ errStr = getStringFromList (propValues ,row ,& ssl_opts .enabledCipherSuites ,"enabledCipherSuites type incorrect" );
165
+ else if (strcmp (kS (propNames )[row ],"enableServerCertAuth" )== 0 )
166
+ errStr = getIntFromList (propValues ,row ,& ssl_opts .enableServerCertAuth ,"enableServerCertAuth type incorrect" );
167
+ else if (strcmp (kS (propNames )[row ],"sslVersion" )== 0 )
168
+ errStr = getIntFromList (propValues ,row ,& ssl_opts .sslVersion ,"sslVersion type incorrect" );
169
+ else if (strcmp (kS (propNames )[row ],"verify" )== 0 )
170
+ errStr = getIntFromList (propValues ,row ,& ssl_opts .verify ,"verify type incorrect" );
171
+ else if (strcmp (kS (propNames )[row ],"CApath" )== 0 )
172
+ errStr = getStringFromList (propValues ,row ,& ssl_opts .CApath ,"CApath type incorrect" );
139
173
else
140
174
errStr = "Unsupported conn opt name in dictionary" ;
141
175
}
142
176
143
- if (errStr != 0 )
144
- {
145
- free ((void * )conn_opts .username );
146
- free ((void * )conn_opts .password );
147
- return krr (errStr );
148
- }
177
+ ssl_opts .ssl_error_cb = * ssl_error_cb ;
178
+ conn_opts .ssl = & ssl_opts ;
179
+
180
+ if (errStr )
181
+ return freeOpts (& conn_opts ),krr (errStr );
149
182
150
183
if (MQTTCLIENT_SUCCESS != (err = MQTTClient_create (& client , tcpconn -> s , pname -> s , MQTTCLIENT_PERSISTENCE_NONE , NULL )))
151
- {
152
- free ((void * )conn_opts .username );
153
- free ((void * )conn_opts .password );
154
- return krr ((S )MQTTClient_strerror (err ));
155
- }
184
+ return freeOpts (& conn_opts ),krr ((S )MQTTClient_strerror (err ));
156
185
157
186
MQTTClient_setCallbacks (client , NULL , disconn , msgrcvd , msgsent );
158
187
err = MQTTClient_connect (client , & conn_opts );
159
- free ((void * )conn_opts .username );
160
- free ((void * )conn_opts .password );
188
+ freeOpts (& conn_opts );
161
189
162
190
if (MQTTCLIENT_SUCCESS != err )
163
191
return krr ((S )MQTTClient_strerror (err ));
0 commit comments