iRefurbishing the getaddrinfo stuff and signals. - geomyidae - A small C-based gopherd. Err bitreich.org 70 hgit clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ URL:git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ bitreich.org 70 1Log /scm/geomyidae/log.gph bitreich.org 70 1Files /scm/geomyidae/files.gph bitreich.org 70 1Refs /scm/geomyidae/refs.gph bitreich.org 70 1Tags /scm/geomyidae/tag bitreich.org 70 1README /scm/geomyidae/file/README.gph bitreich.org 70 1LICENSE /scm/geomyidae/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit cd5884a78c51da927a0cbf302989b21a055b770a /scm/geomyidae/commit/cd5884a78c51da927a0cbf302989b21a055b770a.gph bitreich.org 70 1parent f470bb28b01e20414e34e074a17447c556884095 /scm/geomyidae/commit/f470bb28b01e20414e34e074a17447c556884095.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Tue, 1 Mar 2011 06:54:34 +0100 Err bitreich.org 70 i Err bitreich.org 70 iRefurbishing the getaddrinfo stuff and signals. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M main.c | 32 +++++++++++++++++-------------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 18 insertions(+), 14 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/main.c b/main.c /scm/geomyidae/file/main.c.gph bitreich.org 70 i@@ -16,6 +16,8 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i@@ -212,7 +214,7 @@ sighandler(int sig) Err bitreich.org 70 i case SIGTERM: Err bitreich.org 70 i if(logfile != nil) Err bitreich.org 70 i stoplogging(glfd); Err bitreich.org 70 i- running = 0; Err bitreich.org 70 i+ exit(EXIT_SUCCESS); Err bitreich.org 70 i break; Err bitreich.org 70 i default: Err bitreich.org 70 i break; Err bitreich.org 70 i@@ -245,7 +247,7 @@ usage(void) Err bitreich.org 70 i int Err bitreich.org 70 i main(int argc, char *argv[]) Err bitreich.org 70 i { Err bitreich.org 70 i- struct addrinfo hints, *ai; Err bitreich.org 70 i+ struct addrinfo hints, *ai, *rp; Err bitreich.org 70 i struct sockaddr_storage clt; Err bitreich.org 70 i socklen_t cltlen; Err bitreich.org 70 i int sock, list, opt, dofork; Err bitreich.org 70 i@@ -325,8 +327,8 @@ main(int argc, char *argv[]) Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- memset(&hints, 0, sizeof(hints)); Err bitreich.org 70 i- hints.ai_flags |= AI_PASSIVE; Err bitreich.org 70 i+ bzero(&hints, sizeof(hints)); Err bitreich.org 70 i+ hints.ai_flags = AI_PASSIVE; Err bitreich.org 70 i hints.ai_socktype = SOCK_STREAM; Err bitreich.org 70 i hints.ai_protocol = IPPROTO_TCP; Err bitreich.org 70 i hints.ai_family = AF_INET; Err bitreich.org 70 i@@ -339,11 +341,20 @@ main(int argc, char *argv[]) Err bitreich.org 70 i return 1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- list = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); Err bitreich.org 70 i- if(list < 0) { Err bitreich.org 70 i- perror("socket"); Err bitreich.org 70 i+ for(rp = ai; rp != nil; rp = rp->ai_next) { Err bitreich.org 70 i+ list = socket(rp->ai_family, rp->ai_socktype, Err bitreich.org 70 i+ rp->ai_protocol); Err bitreich.org 70 i+ if(list < 0) Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ if(bind(list, rp->ai_addr, rp->ai_addrlen) == 0) Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ close(list); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if(rp == nil) { Err bitreich.org 70 i+ perror("Could not find any suitable bindable address."); Err bitreich.org 70 i return 1; Err bitreich.org 70 i } Err bitreich.org 70 i+ freeaddrinfo(ai); Err bitreich.org 70 i Err bitreich.org 70 i opt = 1; Err bitreich.org 70 i if(setsockopt(list, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) { Err bitreich.org 70 i@@ -351,18 +362,11 @@ main(int argc, char *argv[]) Err bitreich.org 70 i return 1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- if(bind(list, ai->ai_addr, ai->ai_addrlen)) { Err bitreich.org 70 i- perror("bind"); Err bitreich.org 70 i- return 1; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i if(listen(list, 255)) { Err bitreich.org 70 i perror("listen"); Err bitreich.org 70 i return 1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- freeaddrinfo(ai); Err bitreich.org 70 i- Err bitreich.org 70 i if(dropprivileges(gr, us) < 0) { Err bitreich.org 70 i perror("cannot drop privileges"); Err bitreich.org 70 i return 1; Err bitreich.org 70 .