X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=psi.d%2Fnetdb.psi;h=a564a7a01353e9c9148f5014798562ca3805c454;hp=0820c205723a9ab23e187cb79a63dc01d8460983;hb=93d6b7f962a82b725d1918684297d68221b0b733;hpb=5c82e8c40c87314d9bd93c42d36f194413eae619 diff --git a/psi.d/netdb.psi b/psi.d/netdb.psi index 0820c20..a564a7a 100644 --- a/psi.d/netdb.psi +++ b/psi.d/netdb.psi @@ -1,28 +1,67 @@ +#ifdef __linux__ +#pragma lib "anl"; +#endif + +#include + function psi\endhostent() : void { - return void(endhostent); + return endhostent() as void(endhostent); } -function psi\endnetend() : void { - return void(endnetent); +function psi\endnetent() : void { + return endnetent() as void(endnetent); } function psi\endprotoent() : void { - return void(endprotoent); + return endprotoent() as void(endprotoent); } function psi\endservent() : void { - return void(endservent); + return endservent() as void(endservent); +} + +function psi\sethostent(bool $stayopen) : void { + let stayopen = intval($stayopen); + return sethostent(stayopen) as void(sethostent); +} +function psi\setnetent(bool $stayopen) : void { + let stayopen = intval($stayopen); + return setnetent(stayopen) as void(setnetent); +} +function psi\setprotoent(bool $stayopen) : void { + let stayopen = intval($stayopen); + return setprotoent(stayopen) as void(setprotoent); +} +function psi\setservent(bool $stayopen) : void { + let stayopen = intval($stayopen); + return setservent(stayopen) as void(setservent); +} + +function psi\gethostent() : array { + return gethostent() as to_array(*gethostent, + to_string(h_name), + to_array(h_aliases, to_string(h_aliases)), + to_int(h_addrtype), + to_int(h_length), + to_array(h_addr_list, to_string(h_addr_list, h_length)) + ); } function psi\gai_strerror(int $errcode) : string { let errcode = intval($errcode); - return to_string(gai_strerror); + return gai_strerror(errcode) as to_string(gai_strerror); } -function psi\getaddrinfo(string $node, string $service, array $hints, object &$res = NULL) : int { +// extern int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) +function psi\getaddrinfo(string $node, string $service, array $hints = NULL, object &$res = NULL) : int { let node = strval($node); let service = strval($service); - let hints = arrval($hints); + let hints = &arrval($hints, + intval($ai_flags), + intval($ai_family), + intval($ai_socktype), + intval($ai_protocol) + ); let res = &NULL; - return to_int(getaddrinfo); - set $res = to_array(*res, + return getaddrinfo(node, service, hints, res) as to_int(getaddrinfo); + set $res = to_array(**res, to_int(ai_flags), to_int(ai_family), to_int(ai_socktype), @@ -30,7 +69,21 @@ function psi\getaddrinfo(string $node, string $service, array $hints, object &$r to_int(ai_addrlen), to_string(ai_addr, ai_addrlen), to_string(ai_canonname), - to_array(ai_next, ...) + to_array(*ai_next, ...) ); - free freeaddrinfo(res); -} \ No newline at end of file + free freeaddrinfo(*res); +} + +// extern int getnameinfo(struct sockaddr *sa, socklen_t salen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags) +function psi\getnameinfo(string $addr, string &$host = NULL, string &$service = NULL, int $flags = 0) : int { + let sa = strval($addr); + let salen = strlen($addr); + let hostlen = NI_MAXHOST; + let host = calloc(hostlen, sizeof(char)); + let servlen = NI_MAXSERV; + let serv = calloc(servlen, sizeof(char)); + let flags = intval($flags); + return getnameinfo(sa, salen, host, hostlen, serv, servlen, flags) as to_int(getnameinfo); + set $host = to_string(host); + set $service = to_string(serv); +}