%% options copyright owner = Dirk Krause copyright year = 2015-xxxx license = bsd %% module #include "dk4sock.h" #include "dk4mem.h" $!trace-include dk4_socket_set_t * dk4socket_set_new( size_t max, dk4_er_t *erp ) { dk4_socket_set_t *back = NULL; dk4_socket_t *ps; size_t i; if (0 < max) { if ((SIZE_MAX / sizeof(dk4_socket_t)) >= max) { back = dk4mem_new(dk4_socket_set_t,1,erp); if (NULL != back) { back->szMax = max; back->szUsed = 0; back->pSockets = dk4mem_new(dk4_socket_t,max,erp); if (NULL != back->pSockets) { ps = back->pSockets; i = max; while (i--) { *(ps++) = INVALID_SOCKET; } } else { dk4mem_free(back); back = NULL; } } } else { dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } void dk4socket_set_delete( dk4_socket_set_t *set, dk4_er_t *erp ) { if (NULL != set) { if (NULL != set->pSockets) { dk4mem_release(set->pSockets); } dk4mem_free(set); } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } } void dk4socket_set_close( dk4_socket_set_t *set, dk4_er_t *erp ) { size_t i; if (NULL != set) { if (NULL != set->pSockets) { for (i = 0; i < set->szUsed; i++) { if (INVALID_SOCKET != (set->pSockets)[i]) { #if 0 /* 2015-06-22 Setting SO_REUSEADDR or SO_REUSEPORT must follow immediately on socket() */ (void)dk4socket_option_set_reuse((set->pSockets)[i], 1, NULL); #endif (void)dk4socket_close((set->pSockets)[i], erp); (set->pSockets)[i] = INVALID_SOCKET; } } dk4socket_set_delete(set, erp); } else { dk4mem_free(set); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } }