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