summaryrefslogtreecommitdiff
path: root/support/dktools/dk4sock22.ctr
blob: 06809a82bd92c62a8b1a85f5eb9edc974f868c93 (plain)
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);
  }
}