Import Upstream version 20180207
[hcoop/debian/mlton.git] / runtime / basis / Net / Socket / UnixSock.c
1 #include "platform.h"
2
3 #define UNIXSOCK_PATH_MAX (sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path))
4
5 void Socket_UnixSock_toAddr (NullString8_t path, C_Size_t pathlen, Array(Word8_t) addr, Ref(C_Socklen_t) addrlen) {
6 size_t i;
7 struct sockaddr_un *sa = (struct sockaddr_un*)addr;
8
9 sa->sun_family = AF_UNIX;
10 if (pathlen <= UNIXSOCK_PATH_MAX) {
11 for (i = 0; i < pathlen; i++) {
12 sa->sun_path[i] = ((const char*)path)[i];
13 }
14 } else {
15 for (i = 0; i < UNIXSOCK_PATH_MAX-1; i++) {
16 sa->sun_path[i] = ((const char*)path)[i];
17 }
18 sa->sun_path[UNIXSOCK_PATH_MAX-1] = '\000';
19 }
20 *((socklen_t*)addrlen) = sizeof(struct sockaddr_un);
21 }
22
23 C_Size_t Socket_UnixSock_pathLen (Vector(Word8_t) addr) {
24 size_t i;
25 const struct sockaddr_un *sa = (const struct sockaddr_un*)addr;
26
27 i = 0;
28 if (sa->sun_path[i] == '\000') {
29 return UNIXSOCK_PATH_MAX;
30 } else {
31 while (i < UNIXSOCK_PATH_MAX && sa->sun_path[i] != '\000') i++;
32 return i;
33 }
34 }
35
36 void Socket_UnixSock_fromAddr (Vector(Word8_t) addr, Array(Char8_t) path, C_Size_t pathlen) {
37 size_t i;
38 const struct sockaddr_un *sa = (const struct sockaddr_un*)addr;
39
40 assert (sa->sun_family == AF_UNIX);
41 for (i = 0; i < pathlen; i++) {
42 ((char*)path)[i] = sa->sun_path[i];
43 }
44 }
45
46 #undef UNIXSOCK_PATH_MAX