1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
%% 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);
}
}
|