3 C_Errno_t(C_Int_t
) Socket_accept (C_Sock_t s
, Array(Word8_t
) addr
, Ref(C_Socklen_t
) addrlen
) {
7 out
= accept (s
, (struct sockaddr
*)addr
, (socklen_t
*)addrlen
);
8 if (out
== -1) MLton_fixSocketErrno ();
13 C_Errno_t(C_Int_t
) Socket_bind (C_Sock_t s
, Vector(Word8_t
) addr
, C_Socklen_t addrlen
) {
17 out
= bind (s
, (const struct sockaddr
*)addr
, (socklen_t
)addrlen
);
18 if (out
== -1) MLton_fixSocketErrno ();
23 C_Errno_t(C_Int_t
) Socket_close(C_Sock_t s
) {
29 if (out
== -1) MLton_fixSocketErrno ();
37 C_Errno_t(C_Int_t
) Socket_connect (C_Sock_t s
, Vector(Word8_t
) addr
, C_Socklen_t addrlen
) {
41 out
= connect (s
, (const struct sockaddr
*)addr
, (socklen_t
)addrlen
);
42 if (out
== -1) MLton_fixSocketErrno ();
47 C_Int_t
Socket_familyOfAddr(Vector(Word8_t
) addr
) {
48 return ((const struct sockaddr
*)addr
)->sa_family
;
51 C_Errno_t(C_Int_t
) Socket_listen (C_Sock_t s
, C_Int_t backlog
) {
55 out
= listen (s
, backlog
);
56 if (out
== -1) MLton_fixSocketErrno ();
62 Socket_recv (C_Sock_t s
, Array(Word8_t
) msg
,
63 C_Int_t start
, C_Size_t len
, C_Int_t flags
) {
67 out
= MLton_recv (s
, (void*)((char *)msg
+ start
), len
, flags
);
68 if (out
== -1) MLton_fixSocketErrno ();
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
) {
80 out
= MLton_recvfrom (s
, (void*)((char *)msg
+ start
), len
, flags
,
81 (struct sockaddr
*)addr
, (socklen_t
*)addrlen
);
82 if (out
== -1) MLton_fixSocketErrno ();
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
) {
93 out
= send (s
, (void*)((char *)msg
+ start
), len
, flags
);
94 if (out
== -1) MLton_fixSocketErrno ();
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
);
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
);
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
) {
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 ();
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
);
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
);
137 C_Errno_t(C_Int_t
) Socket_shutdown (C_Sock_t s
, C_Int_t how
) {
140 MLton_initSockets ();
141 out
= shutdown (s
, how
);
142 if (out
== -1) MLton_fixSocketErrno ();
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);
153 MLton_initSockets ();
154 out
= getsockopt (s
, level
, optname
, optval
, &optlen
);
155 assert (optlen
== sizeof(int));
156 if (out
== -1) MLton_fixSocketErrno ();
162 Socket_Ctl_setSockOptC_Int (C_Sock_t s
, C_Int_t level
, C_Int_t optname
,
164 socklen_t optlen
= sizeof(int);
167 MLton_initSockets ();
168 out
= setsockopt (s
, level
, optname
, &optval
, optlen
);
169 if (out
== -1) MLton_fixSocketErrno ();
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
);
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 ();
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
);
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 ();
207 C_Errno_t(C_Int_t
) Socket_Ctl_getPeerName (C_Sock_t s
, Array(Word8_t
) name
, Ref(C_Socklen_t
) namelen
) {
210 MLton_initSockets ();
211 out
= getpeername (s
, (struct sockaddr
*)name
, (socklen_t
*)namelen
);
212 if (out
== -1) MLton_fixSocketErrno ();
217 C_Errno_t(C_Int_t
) Socket_Ctl_getSockName (C_Sock_t s
, Array(Word8_t
) name
, Ref(C_Socklen_t
) namelen
) {
220 MLton_initSockets ();
221 out
= getsockname (s
, (struct sockaddr
*)name
, (socklen_t
*)namelen
);
222 if (out
== -1) MLton_fixSocketErrno ();
228 Socket_Ctl_getNREAD (C_Sock_t s
, Ref(C_Int_t
) argp
) {
231 out
= ioctl (s
, FIONREAD
, &argp
);
232 if (out
== -1) MLton_fixSocketErrno ();
238 Socket_Ctl_getATMARK (C_Sock_t s
, Ref(C_Int_t
) argp
) {
241 out
= ioctl (s
, SIOCATMARK
, &argp
);
242 if (out
== -1) MLton_fixSocketErrno ();