6b55fec29947cf90d8b63762584bc09e6ce96ed1
[m6w6/ext-psi] / psi.d / netdb.psi
1 #ifdef __linux__
2 lib "anl";
3 #endif
4
5 #include <netdb.h>
6
7 function psi\endhostent() : void {
8 return endhostent() as void(endhostent);
9 }
10 function psi\endnetent() : void {
11 return endnetent() as void(endnetent);
12 }
13 function psi\endprotoent() : void {
14 return endprotoent() as void(endprotoent);
15 }
16 function psi\endservent() : void {
17 return endservent() as void(endservent);
18 }
19
20 function psi\sethostent(bool $stayopen) : void {
21 let stayopen = intval($stayopen);
22 return sethostent(stayopen) as void(sethostent);
23 }
24 function psi\setnetent(bool $stayopen) : void {
25 let stayopen = intval($stayopen);
26 return setnetent(stayopen) as void(setnetent);
27 }
28 function psi\setprotoent(bool $stayopen) : void {
29 let stayopen = intval($stayopen);
30 return setprotoent(stayopen) as void(setprotoent);
31 }
32 function psi\setservent(bool $stayopen) : void {
33 let stayopen = intval($stayopen);
34 return setservent(stayopen) as void(setservent);
35 }
36
37 function psi\gethostent() : array {
38 return gethostent() as to_array(*gethostent,
39 to_string(h_name),
40 to_array(h_aliases, to_string(h_aliases)),
41 to_int(h_addrtype),
42 to_int(h_length),
43 to_array(h_addr_list, to_string(h_addr_list, h_length))
44 );
45 }
46
47 function psi\gai_strerror(int $errcode) : string {
48 let errcode = intval($errcode);
49 return gai_strerror(errcode) as to_string(gai_strerror);
50 }
51
52 // extern int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res)
53 function psi\getaddrinfo(string $node, string $service, array $hints = NULL, object &$res = NULL) : int {
54 let node = strval($node);
55 let service = strval($service);
56 let hints = &arrval($hints,
57 intval($ai_flags),
58 intval($ai_family),
59 intval($ai_socktype),
60 intval($ai_protocol)
61 );
62 let res = &NULL;
63 return getaddrinfo(node, service, hints, res) as to_int(getaddrinfo);
64 set $res = to_array(**res,
65 to_int(ai_flags),
66 to_int(ai_family),
67 to_int(ai_socktype),
68 to_int(ai_protocol),
69 to_int(ai_addrlen),
70 to_string(ai_addr, ai_addrlen),
71 to_string(ai_canonname),
72 to_array(*ai_next, ...)
73 );
74 free freeaddrinfo(*res);
75 }
76
77 // extern int getnameinfo(struct sockaddr *sa, socklen_t salen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags)
78 function psi\getnameinfo(string $addr, string &$host = NULL, string &$service = NULL, int $flags = 0) : int {
79 let sa = strval($addr);
80 let salen = strlen($addr);
81 let hostlen = NI_MAXHOST;
82 let host = calloc(hostlen, sizeof(char));
83 let servlen = NI_MAXSERV;
84 let serv = calloc(servlen, sizeof(char));
85 let flags = intval($flags);
86 return getnameinfo(sa, salen, host, hostlen, serv, servlen, flags) as to_int(getnameinfo);
87 set $host = to_string(host);
88 set $service = to_string(serv);
89 }