Import Upstream version 20180207
[hcoop/debian/mlton.git] / runtime / basis / Net / Socket / Socket.c
1 #include "platform.h"
2
3 C_Errno_t(C_Int_t) Socket_accept (C_Sock_t s, Array(Word8_t) addr, Ref(C_Socklen_t) addrlen) {
4 int out;
5
6 MLton_initSockets ();
7 out = accept (s, (struct sockaddr*)addr, (socklen_t*)addrlen);
8 if (out == -1) MLton_fixSocketErrno ();
9
10 return out;
11 }
12
13 C_Errno_t(C_Int_t) Socket_bind (C_Sock_t s, Vector(Word8_t) addr, C_Socklen_t addrlen) {
14 int out;
15
16 MLton_initSockets ();
17 out = bind (s, (const struct sockaddr*)addr, (socklen_t)addrlen);
18 if (out == -1) MLton_fixSocketErrno ();
19
20 return out;
21 }
22
23 C_Errno_t(C_Int_t) Socket_close(C_Sock_t s) {
24 #ifdef __MINGW32__
25 int out;
26
27 MLton_initSockets ();
28 out = closesocket(s);
29 if (out == -1) MLton_fixSocketErrno ();
30
31 return out;
32 #else
33 return close(s);
34 #endif
35 }
36
37 C_Errno_t(C_Int_t) Socket_connect (C_Sock_t s, Vector(Word8_t) addr, C_Socklen_t addrlen) {
38 int out;
39
40 MLton_initSockets ();
41 out = connect (s, (const struct sockaddr*)addr, (socklen_t)addrlen);
42 if (out == -1) MLton_fixSocketErrno ();
43
44 return out;
45 }
46
47 C_Int_t Socket_familyOfAddr(Vector(Word8_t) addr) {
48 return ((const struct sockaddr*)addr)->sa_family;
49 }
50
51 C_Errno_t(C_Int_t) Socket_listen (C_Sock_t s, C_Int_t backlog) {
52 int out;
53
54 MLton_initSockets ();
55 out = listen (s, backlog);
56 if (out == -1) MLton_fixSocketErrno ();
57
58 return out;
59 }
60
61 C_Errno_t(C_SSize_t)
62 Socket_recv (C_Sock_t s, Array(Word8_t) msg,
63 C_Int_t start, C_Size_t len, C_Int_t flags) {
64 ssize_t out;
65
66 MLton_initSockets ();
67 out = MLton_recv (s, (void*)((char *)msg + start), len, flags);
68 if (out == -1) MLton_fixSocketErrno ();
69
70 return out;
71 }
72
73 C_Errno_t(C_SSize_t)
74 Socket_recvFrom (C_Sock_t s, Array(Word8_t) msg,
75 C_Int_t start, C_Size_t len, C_Int_t flags,
76 Array(Word8_t) addr, Ref(C_Socklen_t) addrlen) {
77 ssize_t out;
78
79 MLton_initSockets ();
80 out = MLton_recvfrom (s, (void*)((char *)msg + start), len, flags,
81 (struct sockaddr*)addr, (socklen_t*)addrlen);
82 if (out == -1) MLton_fixSocketErrno ();
83
84 return out;
85 }
86
87 static inline C_Errno_t(C_SSize_t)
88 Socket_send (C_Sock_t s, Pointer msg,
89 C_Int_t start, C_Size_t len, C_Int_t flags) {
90 ssize_t out;
91
92 MLton_initSockets ();
93 out = send (s, (void*)((char *)msg + start), len, flags);
94 if (out == -1) MLton_fixSocketErrno ();
95
96 return out;
97 }
98
99 C_Errno_t(C_SSize_t)
100 Socket_sendArr (C_Sock_t s, Array(Word8_t) msg,
101 C_Int_t start, C_Size_t len, C_Int_t flags) {
102 return Socket_send (s, (Pointer)msg, start, len, flags);
103 }
104 C_Errno_t(C_SSize_t)
105 Socket_sendVec (C_Sock_t s, Vector(Word8_t) msg,
106 C_Int_t start, C_Size_t len, C_Int_t flags) {
107 return Socket_send (s, (Pointer)msg, start, len, flags);
108 }
109
110 static inline C_Errno_t(C_SSize_t)
111 Socket_sendTo (C_Sock_t s, Pointer msg,
112 C_Int_t start, C_Size_t len, C_Int_t flags,
113 Vector(Word8_t) addr, C_Socklen_t addrlen) {
114 ssize_t out;
115
116 MLton_initSockets ();
117 out = sendto (s, (void*)((char *)msg + start), len, flags,
118 (const struct sockaddr*)addr, (socklen_t)addrlen);
119 if (out == -1) MLton_fixSocketErrno ();
120
121 return out;
122 }
123
124 C_Errno_t(C_SSize_t)
125 Socket_sendArrTo (C_Sock_t s, Array(Word8_t) msg,
126 C_Int_t start, C_Size_t len, C_Int_t flags,
127 Vector(Word8_t) addr, C_Socklen_t addrlen) {
128 return Socket_sendTo (s, (Pointer)msg, start, len, flags, addr, addrlen);
129 }
130 C_Errno_t(C_SSize_t)
131 Socket_sendVecTo (C_Sock_t s, Vector(Word8_t) msg,
132 C_Int_t start, C_Size_t len, C_Int_t flags,
133 Vector(Word8_t) addr, C_Socklen_t addrlen) {
134 return Socket_sendTo (s, (Pointer)msg, start, len, flags, addr, addrlen);
135 }
136
137 C_Errno_t(C_Int_t) Socket_shutdown (C_Sock_t s, C_Int_t how) {
138 int out;
139
140 MLton_initSockets ();
141 out = shutdown (s, how);
142 if (out == -1) MLton_fixSocketErrno ();
143
144 return out;
145 }
146
147 C_Errno_t(C_Int_t)
148 Socket_Ctl_getSockOptC_Int (C_Sock_t s, C_Int_t level, C_Int_t optname,
149 Ref(C_Int_t) optval) {
150 socklen_t optlen = sizeof(int);
151 int out;
152
153 MLton_initSockets ();
154 out = getsockopt (s, level, optname, optval, &optlen);
155 assert (optlen == sizeof(int));
156 if (out == -1) MLton_fixSocketErrno ();
157
158 return out;
159 }
160
161 C_Errno_t(C_Int_t)
162 Socket_Ctl_setSockOptC_Int (C_Sock_t s, C_Int_t level, C_Int_t optname,
163 C_Int_t optval) {
164 socklen_t optlen = sizeof(int);
165 int out;
166
167 MLton_initSockets ();
168 out = setsockopt (s, level, optname, &optval, optlen);
169 if (out == -1) MLton_fixSocketErrno ();
170
171 return out;
172 }
173
174 C_Errno_t(C_Int_t)
175 Socket_Ctl_getSockOptC_Linger (C_Sock_t s, C_Int_t level, C_Int_t optname,
176 Ref(C_Int_t) optval_l_onoff, Ref(C_Int_t) optval_l_linger) {
177 struct linger optval;
178 socklen_t optlen = sizeof(struct linger);
179 int out;
180
181 MLton_initSockets ();
182 out = getsockopt (s, level, optname, &optval, &optlen);
183 assert (optlen == sizeof(struct linger));
184 *((int*)optval_l_onoff) = optval.l_onoff;
185 *((int*)optval_l_linger) = optval.l_linger;
186 if (out == -1) MLton_fixSocketErrno ();
187
188 return out;
189 }
190
191 C_Errno_t(C_Int_t)
192 Socket_Ctl_setSockOptC_Linger (C_Sock_t s, C_Int_t level, C_Int_t optname,
193 C_Int_t optval_l_onoff, C_Int_t optval_l_linger) {
194 struct linger optval;
195 socklen_t optlen = sizeof(struct linger);
196 int out;
197
198 MLton_initSockets ();
199 optval.l_onoff = optval_l_onoff;
200 optval.l_linger = optval_l_linger;
201 out = setsockopt (s, level, optname, &optval, optlen);
202 if (out == -1) MLton_fixSocketErrno ();
203
204 return out;
205 }
206
207 C_Errno_t(C_Int_t) Socket_Ctl_getPeerName (C_Sock_t s, Array(Word8_t) name, Ref(C_Socklen_t) namelen) {
208 int out;
209
210 MLton_initSockets ();
211 out = getpeername (s, (struct sockaddr*)name, (socklen_t*)namelen);
212 if (out == -1) MLton_fixSocketErrno ();
213
214 return out;
215 }
216
217 C_Errno_t(C_Int_t) Socket_Ctl_getSockName (C_Sock_t s, Array(Word8_t) name, Ref(C_Socklen_t) namelen) {
218 int out;
219
220 MLton_initSockets ();
221 out = getsockname (s, (struct sockaddr*)name, (socklen_t*)namelen);
222 if (out == -1) MLton_fixSocketErrno ();
223
224 return out;
225 }
226
227 C_Errno_t(C_Int_t)
228 Socket_Ctl_getNREAD (C_Sock_t s, Ref(C_Int_t) argp) {
229 int out;
230
231 out = ioctl (s, FIONREAD, &argp);
232 if (out == -1) MLton_fixSocketErrno ();
233
234 return out;
235 }
236
237 C_Errno_t(C_Int_t)
238 Socket_Ctl_getATMARK (C_Sock_t s, Ref(C_Int_t) argp) {
239 int out;
240
241 out = ioctl (s, SIOCATMARK, &argp);
242 if (out == -1) MLton_fixSocketErrno ();
243
244 return out;
245 }