1 /*
2 Copyright (C) 2015-2021, Dirk Krause
3 SPDX-License-Identifier: BSD-3-Clause
4 */
5
6 /*
7 WARNING: This file was generated by the dkct program (see
8 http://dktools.sourceforge.net/ for details).
9 Changes you make here will be lost if dkct is run again!
10 You should modify the original source and run dkct on it.
11 Original source: dk4sock22.ctr
12 */
13
14 /** @file dk4sock22.c The dk4sock22 module.
15 */
16
17
18
19 #include "dk4conf.h"
20 #include <libdk4sock/dk4sock.h>
21 #include <libdk4base/dk4mem.h>
22
23 #if DK4_HAVE_ASSERT_H
24 #ifndef ASSERT_H_INCLUDED
25 #include <assert.h>
26 #define ASSERT_H_INCLUDED 1
27 #endif
28 #endif
29
30
31
32
33
34
35 dk4_socket_set_t *
dk4socket_set_new(size_t max,dk4_er_t * erp)36 dk4socket_set_new(
37 size_t max,
38 dk4_er_t *erp
39 )
40 {
41 dk4_socket_set_t *back = NULL;
42 dk4_socket_t *ps;
43 size_t i;
44 #if DK4_USE_ASSERT
45 assert(0 < max);
46 #endif
47 if (0 < max) {
48 if ((SIZE_MAX / sizeof(dk4_socket_t)) >= max) {
49 back = dk4mem_new(dk4_socket_set_t,1,erp);
50 if (NULL != back) {
51 back->szMax = max;
52 back->szUsed = 0;
53 back->pSockets = dk4mem_new(dk4_socket_t,max,erp);
54 if (NULL != back->pSockets) {
55 ps = back->pSockets;
56 i = max;
57 while (i--) { *(ps++) = INVALID_SOCKET; }
58 } else {
59 dk4mem_free(back);
60 back = NULL;
61 }
62 }
63 } else {
64 dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW);
65 }
66 } else {
67 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
68 }
69 return back;
70 }
71
72
73
74 void
dk4socket_set_delete(dk4_socket_set_t * set,dk4_er_t * erp)75 dk4socket_set_delete(
76 dk4_socket_set_t *set,
77 dk4_er_t *erp
78 )
79 {
80 #if DK4_USE_ASSERT
81 assert(NULL != set);
82 #endif
83 if (NULL != set) {
84 if (NULL != set->pSockets) {
85 dk4mem_release(set->pSockets);
86 }
87 dk4mem_free(set);
88 } else {
89 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
90 }
91 }
92
93
94
95 void
dk4socket_set_close(dk4_socket_set_t * set,dk4_er_t * erp)96 dk4socket_set_close(
97 dk4_socket_set_t *set,
98 dk4_er_t *erp
99 )
100 {
101 size_t i;
102 #if DK4_USE_ASSERT
103 assert(NULL != set);
104 #endif
105 if (NULL != set) {
106 if (NULL != set->pSockets) {
107 for (i = 0; i < set->szUsed; i++) {
108 if (INVALID_SOCKET != (set->pSockets)[i]) {
109 #if 0
110 /* 2015-06-22 Setting SO_REUSEADDR or SO_REUSEPORT must
111 follow immediately on socket()
112 */
113 (void)dk4socket_option_set_reuse((set->pSockets)[i], 1, NULL);
114 #endif
115 (void)dk4socket_close((set->pSockets)[i], erp);
116 (set->pSockets)[i] = INVALID_SOCKET;
117 }
118 }
119 dk4socket_set_delete(set, erp);
120 } else {
121 dk4mem_free(set);
122 }
123 } else {
124 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
125 }
126 }
127
128