From 64999b98e2c98ab92d60ac625fc3ea3a1ec630ec Mon Sep 17 00:00:00 2001 From: Jann Horn Date: Wed, 19 Mar 2014 15:57:08 +0100 Subject: [PATCH] add netopen_server for opening server sockets --- net.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/net.c b/net.c index 2fba39a..a5d5b50 100644 --- a/net.c +++ b/net.c @@ -46,4 +46,36 @@ PUBLIC_FN int fnetopen(FILE **in, FILE **out, const char *node, const char *serv int ret = fopen_bistream(in, out, fd, 0); if (ret) close(fd); return ret; -} \ No newline at end of file +} + +HEADER // negative return value for error, else a socket +PUBLIC_FN int netopen_server(const char *node /*NULL for ANY*/, const char *service, const struct addrinfo *hints) { + struct addrinfo hints_; + if (hints == &libjh_tcp_hints) { + hints_ = *hints; + hints_.ai_flags |= AI_PASSIVE; + hints_.ai_flags &= ~AI_ADDRCONFIG; + hints = &hints_; + } + + struct addrinfo *addrs; + int gai_res = getaddrinfo(node, service, hints, &addrs); + if (gai_res) return gai_res; + + int s = socket(addrs[0].ai_family, addrs[0].ai_socktype, addrs[0].ai_protocol); + if (s == -1) goto err_socket; + + if (bind(s, addrs[0].ai_addr, addrs[0].ai_addrlen)) goto err_bind_n_listen; + if (listen(s, 16)) goto err_bind_n_listen; + + freeaddrinfo(addrs); + return s; + +err_bind_n_listen:; + int errno_ = errno; + close(s); + errno = errno_; +err_socket: + freeaddrinfo(addrs); + return EAI_SYSTEM; +} -- 2.20.1