iCleaning up signal handling. - 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 cb73df5b7e3746edcb70fd57b462161efec5385a /scm/geomyidae/commit/cb73df5b7e3746edcb70fd57b462161efec5385a.gph bitreich.org 70 1parent 0fbb73a1590a323d17ac96dad034c608b891e56c /scm/geomyidae/commit/0fbb73a1590a323d17ac96dad034c608b891e56c.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Sun, 27 Feb 2011 10:56:56 +0100 Err bitreich.org 70 i Err bitreich.org 70 iCleaning up signal handling. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M main.c | 42 +++++++++++++++++++++++-------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 32 insertions(+), 10 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@@ -33,6 +33,8 @@ enum { Err bitreich.org 70 i Err bitreich.org 70 i int glfd = -1; Err bitreich.org 70 i int loglvl = 15; Err bitreich.org 70 i+int running = 1; Err bitreich.org 70 i+char *logfile = nil; Err bitreich.org 70 i Err bitreich.org 70 i char *argv0; Err bitreich.org 70 i char *stdbase = "/var/gopher"; Err bitreich.org 70 i@@ -57,7 +59,6 @@ char *htredir = "\n" Err bitreich.org 70 i int Err bitreich.org 70 i dropprivileges(struct group *gr, struct passwd *pw) Err bitreich.org 70 i { Err bitreich.org 70 i- Err bitreich.org 70 i if(gr != nil) Err bitreich.org 70 i if(setgroups(1, &gr->gr_gid) != 0 || setgid(gr->gr_gid) != 0) Err bitreich.org 70 i return -1; Err bitreich.org 70 i@@ -194,19 +195,41 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-hndlsigchld(int signo) Err bitreich.org 70 i+sighandler(int sig) Err bitreich.org 70 i { Err bitreich.org 70 i- int status; Err bitreich.org 70 i- Err bitreich.org 70 i- while(waitpid(-1, &status, WNOHANG) > 0); Err bitreich.org 70 i+ switch(sig) { Err bitreich.org 70 i+ case SIGCHLD: Err bitreich.org 70 i+ while(waitpid(-1, NULL, WNOHANG) > 0); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case SIGHUP: Err bitreich.org 70 i+ case SIGINT: Err bitreich.org 70 i+ case SIGQUIT: Err bitreich.org 70 i+ case SIGABRT: 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+ break; Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i Err bitreich.org 70 i- return; Err bitreich.org 70 i+void Err bitreich.org 70 i+initsignals(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ signal(SIGCHLD, sighandler); Err bitreich.org 70 i+ signal(SIGHUP, sighandler); Err bitreich.org 70 i+ signal(SIGINT, sighandler); Err bitreich.org 70 i+ signal(SIGQUIT, sighandler); Err bitreich.org 70 i+ signal(SIGABRT, sighandler); Err bitreich.org 70 i+ signal(SIGTERM, sighandler); Err bitreich.org 70 i+ signal(SIGKILL, sighandler); 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- Err bitreich.org 70 i tprintf(2, "usage: %s [-d] [-l logfile] [-v loglvl] [-b base]" Err bitreich.org 70 i " [-p port] [-o sport] [-u user] [-g group] [-h host]" Err bitreich.org 70 i " [-i IP]\n", Err bitreich.org 70 i@@ -222,7 +245,7 @@ main(int argc, char *argv[]) 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- char *port, *base, *logfile, clienth[NI_MAXHOST], clientp[NI_MAXSERV]; 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 struct group *gr; Err bitreich.org 70 i@@ -230,7 +253,6 @@ main(int argc, char *argv[]) Err bitreich.org 70 i base = stdbase; Err bitreich.org 70 i port = stdport; Err bitreich.org 70 i dofork = 1; Err bitreich.org 70 i- logfile = nil; Err bitreich.org 70 i user = nil; Err bitreich.org 70 i group = nil; Err bitreich.org 70 i us = nil; Err bitreich.org 70 i@@ -349,7 +371,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i signal(SIGCHLD, hndlsigchld); Err bitreich.org 70 i Err bitreich.org 70 i cltlen = sizeof(clt); Err bitreich.org 70 i- for(;;) { Err bitreich.org 70 i+ while(running) { Err bitreich.org 70 i sock = accept(list, (struct sockaddr *)&clt, &cltlen); Err bitreich.org 70 i if(sock < 0) { Err bitreich.org 70 i perror("accept"); Err bitreich.org 70 .