Changeset 5390
- Timestamp:
- 03/14/08 16:26:34 (4 months ago)
- Files:
-
- libwired/trunk/libwired/net/wi-socket.c (modified) (30 diffs)
- libwired/trunk/libwired/net/wi-socket.h (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
libwired/trunk/libwired/net/wi-socket.c
r5386 r5390 57 57 #include <wired/wi-assert.h> 58 58 #include <wired/wi-address.h> 59 #include <wired/wi-crypto.h> 59 60 #include <wired/wi-date.h> 60 61 #include <wired/wi-macros.h> … … 69 70 70 71 71 struct _wi_socket_ context{72 struct _wi_socket_tls { 72 73 wi_runtime_base_t base; 73 74 … … 75 76 SSL_CTX *ssl_ctx; 76 77 DH *dh; 77 78 RSA *pub_rsa; 79 RSA *priv_rsa; 80 81 wi_boolean_t certificate; 78 wi_boolean_t private_key; 82 79 #endif 83 80 }; … … 111 108 #endif 112 109 113 static void _wi_socket_ context_dealloc(wi_runtime_instance_t *);110 static void _wi_socket_tls_dealloc(wi_runtime_instance_t *); 114 111 115 112 static void _wi_socket_dealloc(wi_runtime_instance_t *); … … 124 121 #endif 125 122 126 static wi_runtime_id_t _wi_socket_ context_runtime_id = WI_RUNTIME_ID_NULL;127 static wi_runtime_class_t _wi_socket_ context_runtime_class = {128 "wi_socket_ context_t",129 _wi_socket_ context_dealloc,123 static wi_runtime_id_t _wi_socket_tls_runtime_id = WI_RUNTIME_ID_NULL; 124 static wi_runtime_class_t _wi_socket_tls_runtime_class = { 125 "wi_socket_tls_t", 126 _wi_socket_tls_dealloc, 130 127 NULL, 131 128 NULL, … … 147 144 148 145 void wi_socket_register(void) { 149 _wi_socket_ context_runtime_id = wi_runtime_register_class(&_wi_socket_context_runtime_class);146 _wi_socket_tls_runtime_id = wi_runtime_register_class(&_wi_socket_tls_runtime_class); 150 147 _wi_socket_runtime_id = wi_runtime_register_class(&_wi_socket_runtime_class); 151 148 } … … 217 214 #pragma mark - 218 215 219 wi_runtime_id_t wi_socket_ context_runtime_id(void) {220 return _wi_socket_ context_runtime_id;216 wi_runtime_id_t wi_socket_tls_runtime_id(void) { 217 return _wi_socket_tls_runtime_id; 221 218 } 222 219 … … 225 222 #pragma mark - 226 223 227 wi_socket_ context_t * wi_socket_context_alloc(void) {228 return wi_runtime_create_instance(_wi_socket_ context_runtime_id, sizeof(wi_socket_context_t));229 } 230 231 232 233 wi_socket_ context_t * wi_socket_context_init(wi_socket_context_t *context) {234 return context;235 } 236 237 238 239 static void _wi_socket_ context_dealloc(wi_runtime_instance_t *instance) {240 #ifdef WI_SSL 241 wi_socket_ context_t *context= instance;242 243 if( context->ssl_ctx)244 SSL_CTX_free( context->ssl_ctx);245 246 if( context->dh)247 DH_free( context->dh);224 wi_socket_tls_t * wi_socket_tls_alloc(void) { 225 return wi_runtime_create_instance(_wi_socket_tls_runtime_id, sizeof(wi_socket_tls_t)); 226 } 227 228 229 230 wi_socket_tls_t * wi_socket_tls_init(wi_socket_tls_t *tls) { 231 return tls; 232 } 233 234 235 236 static void _wi_socket_tls_dealloc(wi_runtime_instance_t *instance) { 237 #ifdef WI_SSL 238 wi_socket_tls_t *tls = instance; 239 240 if(tls->ssl_ctx) 241 SSL_CTX_free(tls->ssl_ctx); 242 243 if(tls->dh) 244 DH_free(tls->dh); 248 245 #endif 249 246 } … … 253 250 #pragma mark - 254 251 255 wi_boolean_t wi_socket_ context_set_ssl_type(wi_socket_context_t *context, wi_socket_ssl_type_t type) {252 wi_boolean_t wi_socket_tls_set_type(wi_socket_tls_t *tls, wi_socket_tls_type_t type) { 256 253 #ifdef WI_SSL 257 254 SSL_METHOD *method = NULL; 258 255 259 256 switch(type) { 260 case WI_SOCKET_ SSL_CLIENT:257 case WI_SOCKET_TLS_CLIENT: 261 258 method = TLSv1_client_method(); 262 259 break; 263 260 264 case WI_SOCKET_ SSL_SERVER:261 case WI_SOCKET_TLS_SERVER: 265 262 method = TLSv1_server_method(); 266 263 break; 267 264 } 268 265 269 context->ssl_ctx = SSL_CTX_new(method);270 271 if(! context->ssl_ctx) {266 tls->ssl_ctx = SSL_CTX_new(method); 267 268 if(!tls->ssl_ctx) { 272 269 wi_error_set_openssl_error(); 273 270 … … 275 272 } 276 273 277 SSL_CTX_set_mode( context->ssl_ctx, SSL_MODE_AUTO_RETRY);278 SSL_CTX_set_quiet_shutdown( context->ssl_ctx, 1);274 SSL_CTX_set_mode(tls->ssl_ctx, SSL_MODE_AUTO_RETRY); 275 SSL_CTX_set_quiet_shutdown(tls->ssl_ctx, 1); 279 276 280 277 return true; … … 288 285 289 286 290 wi_boolean_t wi_socket_context_set_ssl_certificate(wi_socket_context_t *context, wi_string_t *path) { 291 #ifdef WI_SSL 292 const char *certificate; 293 294 context->certificate = false; 295 296 certificate = wi_string_cstring(path); 297 298 if(SSL_CTX_use_certificate_chain_file(context->ssl_ctx, certificate) != 1) { 287 wi_boolean_t wi_socket_tls_set_certificate(wi_socket_tls_t *tls, wi_x509_t *x509) { 288 #ifdef WI_SSL 289 if(SSL_CTX_use_certificate(tls->ssl_ctx, wi_x509_x509(x509)) != 1) { 299 290 wi_error_set_openssl_error(); 300 291 301 292 return false; 302 293 } 303 304 if(SSL_CTX_use_PrivateKey_file(context->ssl_ctx, certificate, SSL_FILETYPE_PEM) != 1) {305 wi_error_set_openssl_error();306 307 return false;308 }309 310 context->certificate = true;311 294 312 295 return true; … … 320 303 321 304 322 wi_boolean_t wi_socket_context_set_ssl_privkey(wi_socket_context_t *context, wi_string_t *path) { 323 #ifdef WI_SSL 324 FILE *fp; 325 326 fp = fopen(wi_string_cstring(path), "r"); 327 328 if(!fp) { 329 wi_error_set_errno(errno); 330 305 wi_boolean_t wi_socket_tls_set_private_key(wi_socket_tls_t *tls, wi_rsa_t *rsa) { 306 #ifdef WI_SSL 307 tls->private_key = false; 308 309 if(SSL_CTX_use_RSAPrivateKey(tls->ssl_ctx, wi_rsa_rsa(rsa)) != 1) { 310 wi_error_set_openssl_error(); 311 331 312 return false; 332 313 } 333 334 context->priv_rsa = PEM_read_RSAPrivateKey(fp, NULL, 0, NULL); 335 336 if(!context->priv_rsa) 337 wi_error_set_openssl_error(); 338 339 fclose(fp); 340 341 return (context->priv_rsa != NULL); 342 #else 343 wi_error_set_libwired_error(WI_ERROR_SOCKET_NOSSL); 344 345 return false; 346 #endif 347 } 348 349 350 351 void wi_socket_context_set_ssl_pubkey(wi_socket_context_t *context, void *rsa) { 352 #ifdef WI_SSL 353 if(context->pub_rsa != rsa) { 354 if(context->pub_rsa) 355 RSA_free(context->pub_rsa); 356 357 context->pub_rsa = rsa; 358 } 359 #endif 360 } 361 362 363 364 wi_boolean_t wi_socket_context_set_ssl_ciphers(wi_socket_context_t *context, wi_string_t *ciphers) { 365 #ifdef WI_SSL 366 if(SSL_CTX_set_cipher_list(context->ssl_ctx, wi_string_cstring(ciphers)) != 1) { 367 wi_error_set_libwired_error(WI_ERROR_SOCKET_NOVALIDCIPHER); 368 369 return false; 370 } 314 315 tls->private_key = true; 371 316 372 317 return true; … … 380 325 381 326 382 wi_boolean_t wi_socket_context_set_ssl_dh(wi_socket_context_t *context, const unsigned char *p, size_t p_size, const unsigned char *g, size_t g_size) { 383 #ifdef WI_SSL 384 context->dh = DH_new(); 385 386 if(!context->dh) { 327 wi_boolean_t wi_socket_tls_set_ciphers(wi_socket_tls_t *tls, wi_string_t *ciphers) { 328 #ifdef WI_SSL 329 if(SSL_CTX_set_cipher_list(tls->ssl_ctx, wi_string_cstring(ciphers)) != 1) { 330 wi_error_set_libwired_error(WI_ERROR_SOCKET_NOVALIDCIPHER); 331 332 return false; 333 } 334 335 return true; 336 #else 337 wi_error_set_libwired_error(WI_ERROR_SOCKET_NOSSL); 338 339 return false; 340 #endif 341 } 342 343 344 345 wi_boolean_t wi_socket_tls_set_dh(wi_socket_tls_t *tls, const unsigned char *p, size_t p_size, const unsigned char *g, size_t g_size) { 346 #ifdef WI_SSL 347 tls->dh = DH_new(); 348 349 if(!tls->dh) { 387 350 wi_error_set_openssl_error(); 388 351 … … 390 353 } 391 354 392 context->dh->p = BN_bin2bn(p, p_size, NULL);393 context->dh->g = BN_bin2bn(g, g_size, NULL);394 395 if(! context->dh->p || !context->dh->g) {355 tls->dh->p = BN_bin2bn(p, p_size, NULL); 356 tls->dh->g = BN_bin2bn(g, g_size, NULL); 357 358 if(!tls->dh->p || !tls->dh->g) { 396 359 wi_error_set_openssl_error(); 397 360 398 DH_free( context->dh);399 context->dh = NULL;361 DH_free(tls->dh); 362 tls->dh = NULL; 400 363 401 364 return false; … … 989 952 990 953 991 wi_boolean_t wi_socket_connect(wi_socket_t *socket, wi_socket_context_t *context, wi_time_interval_t timeout) { 992 if(!wi_socket_tcp_connect(socket, timeout)) 993 return false; 994 995 #if WI_SSL 996 if(context) { 997 if(!wi_socket_tls_connect(socket, context, timeout)) 998 return false; 999 } 1000 #endif 1001 1002 return true; 1003 } 1004 1005 1006 1007 wi_boolean_t wi_socket_tcp_connect(wi_socket_t *socket, wi_time_interval_t timeout) { 954 wi_boolean_t wi_socket_connect(wi_socket_t *socket, wi_time_interval_t timeout) { 1008 955 struct sockaddr *sa; 1009 956 wi_socket_state_t state; … … 1070 1017 1071 1018 1072 wi_boolean_t wi_socket_ tls_connect(wi_socket_t *socket, wi_socket_context_t *context, wi_time_interval_t timeout) {1019 wi_boolean_t wi_socket_connect_tls(wi_socket_t *socket, wi_socket_tls_t *tls, wi_time_interval_t timeout) { 1073 1020 #ifdef WI_SSL 1074 1021 wi_socket_state_t state; … … 1082 1029 wi_socket_set_blocking(socket, false); 1083 1030 1084 socket->ssl = SSL_new( context->ssl_ctx);1031 socket->ssl = SSL_new(tls->ssl_ctx); 1085 1032 1086 1033 if(!socket->ssl) { … … 1135 1082 wi_socket_set_blocking(socket, true); 1136 1083 } else { 1137 socket->ssl = SSL_new( context->ssl_ctx);1084 socket->ssl = SSL_new(tls->ssl_ctx); 1138 1085 1139 1086 if(!socket->ssl) { … … 1166 1113 1167 1114 1168 wi_socket_t * wi_socket_accept_multiple(wi_array_t *array, wi_ socket_context_t *context, wi_time_interval_t timeout, wi_address_t **address) {1115 wi_socket_t * wi_socket_accept_multiple(wi_array_t *array, wi_time_interval_t timeout, wi_address_t **address) { 1169 1116 wi_socket_t *socket; 1170 1117 … … 1175 1122 return NULL; 1176 1123 1177 return wi_socket_accept(socket, context, timeout, address); 1178 } 1179 1180 1181 1182 wi_socket_t * wi_socket_accept(wi_socket_t *accept_socket, wi_socket_context_t *context, wi_time_interval_t timeout, wi_address_t **address) { 1183 wi_socket_t *socket; 1184 1185 socket = wi_socket_accept_tcp(accept_socket, timeout, address); 1186 1187 if(!socket) 1188 return NULL; 1189 1190 #ifdef WI_SSL 1191 if(context) { 1192 if(!wi_socket_accept_tls(socket, context, timeout)) 1193 return NULL; 1194 } 1195 #endif WI_SSL 1196 1197 return socket; 1198 } 1199 1200 1201 1202 wi_socket_t * wi_socket_accept_tcp(wi_socket_t *accept_socket, wi_time_interval_t timeout, wi_address_t **address) { 1124 return wi_socket_accept(socket, timeout, address); 1125 } 1126 1127 1128 1129 wi_socket_t * wi_socket_accept(wi_socket_t *accept_socket, wi_time_interval_t timeout, wi_address_t **address) { 1203 1130 wi_socket_t *socket; 1204 1131 struct sockaddr_storage ss; … … 1237 1164 1238 1165 1239 wi_boolean_t wi_socket_accept_tls(wi_socket_t *socket, wi_socket_ context_t *context, wi_time_interval_t timeout) {1166 wi_boolean_t wi_socket_accept_tls(wi_socket_t *socket, wi_socket_tls_t *tls, wi_time_interval_t timeout) { 1240 1167 #ifdef WI_SSL 1241 1168 SSL *ssl; 1242 1169 1243 ssl = SSL_new( context->ssl_ctx);1170 ssl = SSL_new(tls->ssl_ctx); 1244 1171 1245 1172 if(!ssl) { … … 1255 1182 } 1256 1183 1257 if(! context->certificate && context->dh) {1258 if(SSL_set_tmp_dh(ssl, context->dh) != 1) {1184 if(!tls->private_key && tls->dh) { 1185 if(SSL_set_tmp_dh(ssl, tls->dh) != 1) { 1259 1186 wi_error_set_openssl_error(); 1260 1187 … … 1317 1244 #pragma mark - 1318 1245 1319 wi_integer_t wi_socket_sendto (wi_socket_t *socket, wi_socket_context_t *context, wi_string_t *fmt, ...) {1246 wi_integer_t wi_socket_sendto_format(wi_socket_t *socket, wi_string_t *fmt, ...) { 1320 1247 wi_string_t *string; 1321 1248 int bytes; … … 1326 1253 va_end(ap); 1327 1254 1328 bytes = wi_socket_sendto_buffer(socket, context,wi_string_cstring(string), wi_string_length(string));1255 bytes = wi_socket_sendto_buffer(socket, wi_string_cstring(string), wi_string_length(string)); 1329 1256 1330 1257 wi_release(string); … … 1335 1262 1336 1263 1337 wi_integer_t wi_socket_sendto_buffer(wi_socket_t *socket, wi_socket_context_t *context,const char *buffer, size_t length) {1264 wi_integer_t wi_socket_sendto_buffer(wi_socket_t *socket, const char *buffer, size_t length) { 1338 1265 wi_address_t *address; 1339 1266 char *outbuffer = NULL; … … 1341 1268 1342 1269 address = wi_socket_address(socket); 1343 1344 #ifdef WI_SSL 1345 if(context && context->pub_rsa) { 1346 outbuffer = wi_malloc(RSA_size(context->pub_rsa)); 1347 bytes = RSA_public_encrypt(length, (unsigned char *) buffer, (unsigned char *) outbuffer, 1348 context->pub_rsa, RSA_PKCS1_OAEP_PADDING); 1349 1350 if(bytes < 0) { 1351 wi_error_set_openssl_error(); 1352 1353 goto end; 1354 } 1355 1356 bytes = sendto(socket->sd, outbuffer, bytes, 0, 1357 wi_address_sa(address), wi_address_sa_length(address)); 1358 } else { 1359 #endif 1360 bytes = sendto(socket->sd, buffer, length, 0, 1361 wi_address_sa(address), wi_address_sa_length(address)); 1362 #ifdef WI_SSL 1363 } 1364 #endif 1270 bytes = sendto(socket->sd, buffer, length, 0, 1271 wi_address_sa(address), wi_address_sa_length(address)); 1365 1272 1366 1273 if(bytes < 0) { … … 1379 1286 1380 1287 1381 wi_integer_t wi_socket_recvfrom_multiple(wi_array_t *array, wi_socket_context_t *context,char *buffer, size_t length, wi_address_t **address) {1288 wi_integer_t wi_socket_recvfrom_multiple(wi_array_t *array, char *buffer, size_t length, wi_address_t **address) { 1382 1289 wi_socket_t *socket; 1383 1290 … … 1388 1295 return -1; 1389 1296 1390 return wi_socket_recvfrom(socket, context,buffer, length, address);1391 } 1392 1393 1394 1395 wi_integer_t wi_socket_recvfrom(wi_socket_t *socket, wi_socket_context_t *context,char *buffer, size_t length, wi_address_t **address) {1297 return wi_socket_recvfrom(socket, buffer, length, address); 1298 } 1299 1300 1301 1302 wi_integer_t wi_socket_recvfrom(wi_socket_t *socket, char *buffer, size_t length, wi_address_t **address) { 1396 1303 struct sockaddr_storage ss; 1397 1304 char *inbuffer = NULL; … … 1400 1307 1401 1308 sslength = sizeof(ss); 1402 1403 #ifdef WI_SSL 1404 if(context && context->priv_rsa) { 1405 inbuffer = wi_malloc(length); 1406 bytes = recvfrom(socket->sd, inbuffer, length, 0, (struct sockaddr *) &ss, &sslength); 1407 1408 if(bytes < 0) { 1409 wi_error_set_errno(errno); 1410 1411 goto end; 1412 } 1413 1414 bytes = RSA_private_decrypt(bytes, (unsigned char *) inbuffer, (unsigned char *) buffer, 1415 context->priv_rsa, RSA_PKCS1_OAEP_PADDING); 1416 1417 if(bytes < 0) { 1418 wi_error_set_openssl_error(); 1419 1420 goto end; 1421 } 1422 } else { 1423 #endif 1424 bytes = recvfrom(socket->sd, buffer, length, 0, (struct sockaddr *) &ss, &sslength); 1425 1426 if(bytes < 0) { 1427 wi_error_set_errno(errno); 1428 1429 goto end; 1430 } 1431 #ifdef WI_SSL 1432 } 1433 #endif 1309 bytes = recvfrom(socket->sd, buffer, length, 0, (struct sockaddr *) &ss, &sslength); 1310 1311 if(bytes < 0) { 1312 wi_error_set_errno(errno); 1313 1314 goto end; 1315 } 1434 1316 1435 1317 end: … … 1446 1328 #pragma mark - 1447 1329 1448 wi_integer_t wi_socket_write (wi_socket_t *socket, wi_time_interval_t timeout, wi_string_t *fmt, ...) {1330 wi_integer_t wi_socket_write_format(wi_socket_t *socket, wi_time_interval_t timeout, wi_string_t *fmt, ...) { 1449 1331 wi_string_t *string; 1450 1332 wi_integer_t bytes; libwired/trunk/libwired/net/wi-socket.h
r5384 r5390 39 39 40 40 41 typedef struct _wi_socket_context wi_socket_context_t; 42 41 typedef struct _wi_socket_tls wi_socket_tls_t; 43 42 typedef struct _wi_socket wi_socket_t; 44 43 … … 52 51 53 52 enum _wi_socket_direction { 54 WI_SOCKET_READ = 1 << 0,55 WI_SOCKET_WRITE = 1 << 153 WI_SOCKET_READ = (1 << 0), 54 WI_SOCKET_WRITE = (1 << 1) 56 55 }; 57 56 typedef enum _wi_socket_direction wi_socket_direction_t; 58 57 59 58 60 enum _wi_socket_ ssl_type {61 WI_SOCKET_ SSL_CLIENT,62 WI_SOCKET_ SSL_SERVER,59 enum _wi_socket_tls_type { 60 WI_SOCKET_TLS_CLIENT, 61 WI_SOCKET_TLS_SERVER, 63 62 }; 64 typedef enum _wi_socket_ ssl_type wi_socket_ssl_type_t;63 typedef enum _wi_socket_tls_type wi_socket_tls_type_t; 65 64 66 65 … … 73 72 74 73 75 WI_EXPORT wi_runtime_id_t wi_socket_ context_runtime_id(void);74 WI_EXPORT wi_runtime_id_t wi_socket_tls_runtime_id(void); 76 75 77 WI_EXPORT wi_socket_ context_t * wi_socket_context_alloc(void);78 WI_EXPORT wi_socket_ context_t * wi_socket_context_init(wi_socket_context_t *);76 WI_EXPORT wi_socket_tls_t * wi_socket_tls_alloc(void); 77 WI_EXPORT wi_socket_tls_t * wi_socket_tls_init(wi_socket_tls_t *); 79 78 80 WI_EXPORT wi_boolean_t wi_socket_context_set_ssl_type(wi_socket_context_t *, wi_socket_ssl_type_t); 81 WI_EXPORT wi_boolean_t wi_socket_context_set_ssl_certificate(wi_socket_context_t *, wi_string_t *); 82 WI_EXPORT wi_boolean_t wi_socket_context_set_ssl_privkey(wi_socket_context_t *, wi_string_t *); 83 WI_EXPORT void wi_socket_context_set_ssl_pubkey(wi_socket_context_t *, void *); 84 WI_EXPORT wi_boolean_t wi_socket_context_set_ssl_dh(wi_socket_context_t *, const unsigned char *, size_t, const unsigned char *, size_t); 85 WI_EXPORT wi_boolean_t wi_socket_context_set_ssl_ciphers(wi_socket_context_t *, wi_string_t *); 79 WI_EXPORT wi_boolean_t wi_socket_tls_set_type(wi_socket_tls_t *, wi_socket_tls_type_t); 80 WI_EXPORT wi_boolean_t wi_socket_tls_set_certificate(wi_socket_tls_t *, wi_x509_t *); 81 WI_EXPORT wi_boolean_t wi_socket_tls_set_private_key(wi_socket_tls_t *, wi_rsa_t *); 82 WI_EXPORT wi_boolean_t wi_socket_tls_set_dh(wi_socket_tls_t *, const unsigned char *, size_t, const unsigned char *, size_t); 83 WI_EXPORT wi_boolean_t wi_socket_tls_set_ciphers(wi_socket_tls_t *, wi_string_t *); 86 84 87 85 … … 120 118 121 119 WI_EXPORT wi_boolean_t wi_socket_listen(wi_socket_t *, wi_uinteger_t); 122 WI_EXPORT wi_boolean_t wi_socket_connect(wi_socket_t *, wi_socket_context_t *, wi_time_interval_t); 123 WI_EXPORT wi_boolean_t wi_socket_tcp_connect(wi_socket_t *, wi_time_interval_t); 124 WI_EXPORT wi_boolean_t wi_socket_tls_connect(wi_socket_t *, wi_socket_context_t *, wi_time_interval_t); 125 WI_EXPORT wi_socket_t * wi_socket_accept_multiple(wi_array_t *, wi_socket_context_t *, wi_time_interval_t, wi_address_t **); 126 WI_EXPORT wi_socket_t * wi_socket_accept(wi_socket_t *, wi_socket_context_t *, wi_time_interval_t, wi_address_t **); 127 WI_EXPORT wi_socket_t * wi_socket_accept_tcp(wi_socket_t *, wi_time_interval_t, wi_address_t **); 128 WI_EXPORT wi_boolean_t wi_socket_accept_tls(wi_socket_t *, wi_socket_context_t *, wi_time_interval_t); 120 WI_EXPORT wi_boolean_t wi_socket_connect(wi_socket_t *, wi_time_interval_t); 121 WI_EXPORT wi_boolean_t wi_socket_connect_tls(wi_socket_t *, wi_socket_tls_t *, wi_time_interval_t); 122 WI_EXPORT wi_socket_t * wi_socket_accept_multiple(wi_array_t *, wi_time_interval_t, wi_address_t **); 123 WI_EXPORT wi_socket_t * wi_socket_accept(wi_socket_t *, wi_time_interval_t, wi_address_t **); 124 WI_EXPORT wi_boolean_t wi_socket_accept_tls(wi_socket_t *, wi_socket_tls_t *, wi_time_interval_t); 129 125 WI_EXPORT void wi_socket_close(wi_socket_t *); 130 126 131 WI_EXPORT wi_integer_t wi_socket_sendto (wi_socket_t *, wi_socket_context_t *, wi_string_t *, ...);132 WI_EXPORT wi_integer_t wi_socket_sendto_buffer(wi_socket_t *, wi_socket_context_t *,const char *, size_t);133 WI_EXPORT wi_integer_t wi_socket_recvfrom_multiple(wi_array_t *, wi_socket_context_t *,char *, size_t, wi_address_t **);134 WI_EXPORT wi_integer_t wi_socket_recvfrom(wi_socket_t *, wi_socket_context_t *,char *, size_t, wi_address_t **);127 WI_EXPORT wi_integer_t wi_socket_sendto_format(wi_socket_t *, wi_string_t *, ...); 128 WI_EXPORT wi_integer_t wi_socket_sendto_buffer(wi_socket_t *, const char *, size_t); 129 WI_EXPORT wi_integer_t wi_socket_recvfrom_multiple(wi_array_t *, char *, size_t, wi_address_t **); 130 WI_EXPORT wi_integer_t wi_socket_recvfrom(wi_socket_t *, char *, size_t, wi_address_t **); 135 131 136 WI_EXPORT wi_integer_t wi_socket_write (wi_socket_t *, wi_time_interval_t, wi_string_t *, ...);132 WI_EXPORT wi_integer_t wi_socket_write_format(wi_socket_t *, wi_time_interval_t, wi_string_t *, ...); 137 133 WI_EXPORT wi_integer_t wi_socket_write_buffer(wi_socket_t *, wi_time_interval_t, const void *, size_t); 138 134 WI_EXPORT wi_string_t * wi_socket_read(wi_socket_t *, wi_time_interval_t, size_t);
