iAdding IPv6 support. - 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 0989e87037363bc4977b23da4304c51284026a14 /scm/geomyidae/commit/0989e87037363bc4977b23da4304c51284026a14.gph bitreich.org 70 1parent 2878cc2d95ecac6eef2c33c8cd79a126dc9aa7f0 /scm/geomyidae/commit/2878cc2d95ecac6eef2c33c8cd79a126dc9aa7f0.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Sat, 13 Apr 2013 21:04:46 +0200 Err bitreich.org 70 i Err bitreich.org 70 iAdding IPv6 support. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M main.c | 94 +++++++++++++++++++++---------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 65 insertions(+), 29 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@@ -242,6 +242,40 @@ initsignals(void) Err bitreich.org 70 i signal(SIGPIPE, SIG_IGN); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+int Err bitreich.org 70 i+getlistenfd(struct addrinfo *hints, char *bindip, char *port) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct addrinfo *ai, *rp; Err bitreich.org 70 i+ int on, listfd; Err bitreich.org 70 i+ Err bitreich.org 70 i+ listfd = -1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(getaddrinfo(bindip, port, hints, &ai)) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ if(ai == nil) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ on = 1; Err bitreich.org 70 i+ for(rp = ai; rp != nil; rp = rp->ai_next) { Err bitreich.org 70 i+ listfd = socket(rp->ai_family, rp->ai_socktype, Err bitreich.org 70 i+ rp->ai_protocol); Err bitreich.org 70 i+ if(listfd < 0) Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ if(setsockopt(listfd, SOL_SOCKET, SO_REUSEADDR, &on, Err bitreich.org 70 i+ sizeof(on)) < 0) { Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if(bind(listfd, rp->ai_addr, rp->ai_addrlen) == 0) Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ close(listfd); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if(rp == nil) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ freeaddrinfo(ai); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return listfd; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i void Err bitreich.org 70 i usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -256,10 +290,10 @@ 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, *rp; Err bitreich.org 70 i+ struct addrinfo hints; Err bitreich.org 70 i struct sockaddr_storage clt; Err bitreich.org 70 i socklen_t cltlen; Err bitreich.org 70 i- int sock, dofork, on; Err bitreich.org 70 i+ int sock, dofork, v4, v6; Err bitreich.org 70 i char *port, *base, clienth[NI_MAXHOST], clientp[NI_MAXSERV]; Err bitreich.org 70 i char *user, *group, *bindip, *ohost, *sport; Err bitreich.org 70 i struct passwd *us; Err bitreich.org 70 i@@ -275,8 +309,16 @@ main(int argc, char *argv[]) Err bitreich.org 70 i bindip = nil; Err bitreich.org 70 i ohost = nil; Err bitreich.org 70 i sport = port; Err bitreich.org 70 i+ v4 = 1; Err bitreich.org 70 i+ v6 = 1; Err bitreich.org 70 i Err bitreich.org 70 i ARGBEGIN { Err bitreich.org 70 i+ case '4': Err bitreich.org 70 i+ v6 = 0; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case '6': Err bitreich.org 70 i+ v4 = 0; Err bitreich.org 70 i+ break; Err bitreich.org 70 i case 'b': Err bitreich.org 70 i base = EARGF(usage()); Err bitreich.org 70 i break; Err bitreich.org 70 i@@ -318,8 +360,9 @@ main(int argc, char *argv[]) Err bitreich.org 70 i free(ohost); Err bitreich.org 70 i return 1; Err bitreich.org 70 i } Err bitreich.org 70 i- } else Err bitreich.org 70 i+ } else { Err bitreich.org 70 i ohost = gstrdup(ohost); Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i if(group != nil) { Err bitreich.org 70 i if((gr = getgrnam(group)) == nil) { Err bitreich.org 70 i@@ -349,36 +392,29 @@ main(int argc, char *argv[]) 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 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- if(getaddrinfo(bindip, port, &hints, &ai)) { Err bitreich.org 70 i- perror("getaddrinfo"); Err bitreich.org 70 i- return 1; Err bitreich.org 70 i- } Err bitreich.org 70 i- if(ai == nil) { Err bitreich.org 70 i- perror("getaddrinfo"); Err bitreich.org 70 i- return 1; Err bitreich.org 70 i+ if(bindip) Err bitreich.org 70 i+ hints.ai_flags |= AI_CANONNAME; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(v6) { Err bitreich.org 70 i+ hints.ai_family = PF_INET6; Err bitreich.org 70 i+ listfd = getlistenfd(&hints, bindip, port); Err bitreich.org 70 i+ if(!v4 && listfd < 0) { Err bitreich.org 70 i+ perror("getlistenfd"); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i } Err bitreich.org 70 i- Err bitreich.org 70 i- on = 1; Err bitreich.org 70 i- for(rp = ai; rp != nil; rp = rp->ai_next) { Err bitreich.org 70 i- listfd = socket(rp->ai_family, rp->ai_socktype, Err bitreich.org 70 i- rp->ai_protocol); Err bitreich.org 70 i- if(listfd < 0) Err bitreich.org 70 i- continue; Err bitreich.org 70 i- if(setsockopt(listfd, SOL_SOCKET, SO_REUSEADDR, &on, Err bitreich.org 70 i- sizeof(on)) < 0) { Err bitreich.org 70 i- break; Err bitreich.org 70 i+ if(v4) { Err bitreich.org 70 i+ hints.ai_family = PF_INET; Err bitreich.org 70 i+ listfd = getlistenfd(&hints, bindip, port); Err bitreich.org 70 i+ if(listfd < 0) { Err bitreich.org 70 i+ perror("getlistenfd"); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i } Err bitreich.org 70 i- if(bind(listfd, rp->ai_addr, rp->ai_addrlen) == 0) Err bitreich.org 70 i- break; Err bitreich.org 70 i- close(listfd); Err bitreich.org 70 i } Err bitreich.org 70 i- if(rp == nil) { Err bitreich.org 70 i- perror("getaddrinfo"); Err bitreich.org 70 i+ if(listfd < 0) { Err bitreich.org 70 i+ perror("You did not specify and TCP protocol."); 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 if(listen(listfd, 255)) { Err bitreich.org 70 i perror("listen"); Err bitreich.org 70 i@@ -416,7 +452,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i Err bitreich.org 70 i getnameinfo((struct sockaddr *)&clt, cltlen, clienth, Err bitreich.org 70 i sizeof(clienth), clientp, sizeof(clientp), Err bitreich.org 70 i- NI_NUMERICHOST); Err bitreich.org 70 i+ NI_NUMERICHOST|NI_NUMERICSERV); Err bitreich.org 70 i Err bitreich.org 70 i switch(fork()) { Err bitreich.org 70 i case -1: Err bitreich.org 70 .