iFixing various major bugs. - 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 451a9fae7303cc2457d025d51c6c153413020211 /scm/geomyidae/commit/451a9fae7303cc2457d025d51c6c153413020211.gph bitreich.org 70 1parent a4c4ddaceafa6d22ee03502b6b4d764c51ba8d49 /scm/geomyidae/commit/a4c4ddaceafa6d22ee03502b6b4d764c51ba8d49.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Sun, 6 Mar 2011 10:48:45 +0100 Err bitreich.org 70 i Err bitreich.org 70 iFixing various major bugs. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M handlr.c | 14 -------------- Err bitreich.org 70 i M ind.c | 2 +- Err bitreich.org 70 i M main.c | 45 +++++++++++++++++++------------ Err bitreich.org 70 i M rc.d/NetBSD.rc.d | 110 ++++++++++++++++---------------- Err bitreich.org 70 i Err bitreich.org 70 i4 files changed, 84 insertions(+), 87 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/handlr.c b/handlr.c /scm/geomyidae/file/handlr.c.gph bitreich.org 70 i@@ -40,7 +40,6 @@ handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i addr = gmallocz(512, 2); Err bitreich.org 70 i if(gethostname(addr, 512) == -1) { Err bitreich.org 70 i perror("gethostname"); Err bitreich.org 70 i- close(sock); Err bitreich.org 70 i free(addr); Err bitreich.org 70 i free(pa); Err bitreich.org 70 i return; Err bitreich.org 70 i@@ -60,7 +59,6 @@ handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i ndir = scandir(pa, &dirent, 0, alphasort); Err bitreich.org 70 i if(ndir < 0) { Err bitreich.org 70 i perror("scandir"); Err bitreich.org 70 i- close(sock); Err bitreich.org 70 i free(addr); Err bitreich.org 70 i free(pa); Err bitreich.org 70 i return; Err bitreich.org 70 i@@ -90,8 +88,6 @@ handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i if(addr != nil) Err bitreich.org 70 i free(addr); Err bitreich.org 70 i free(pa); Err bitreich.org 70 i- close(sock); Err bitreich.org 70 i- return; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i@@ -111,7 +107,6 @@ handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i if(args == nil) { Err bitreich.org 70 i if(gethostname(addr, sizeof(addr)) == -1) { Err bitreich.org 70 i perror("gethostname"); Err bitreich.org 70 i- close(sock); Err bitreich.org 70 i return; Err bitreich.org 70 i } Err bitreich.org 70 i } else Err bitreich.org 70 i@@ -139,9 +134,6 @@ handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i Err bitreich.org 70 i freeindex(act); Err bitreich.org 70 i } Err bitreich.org 70 i- Err bitreich.org 70 i- close(sock); Err bitreich.org 70 i- return; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i@@ -163,9 +155,6 @@ handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i send(sock, sendb, len, 0); Err bitreich.org 70 i close(fd); Err bitreich.org 70 i } Err bitreich.org 70 i- Err bitreich.org 70 i- close(sock); Err bitreich.org 70 i- return; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i@@ -189,8 +178,5 @@ handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i sear = ""; Err bitreich.org 70 i Err bitreich.org 70 i execl(file, p, sear, args, (char *)nil); Err bitreich.org 70 i- Err bitreich.org 70 i- close(sock); Err bitreich.org 70 i- return; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/ind.c b/ind.c /scm/geomyidae/file/ind.c.gph bitreich.org 70 i@@ -148,7 +148,7 @@ addelem(Elems *e, char *s) Err bitreich.org 70 i Err bitreich.org 70 i e->num++; Err bitreich.org 70 i e->e = realloc(e->e, sizeof(char *) * e->num); Err bitreich.org 70 i- e->e[e->num - 1] = gmallocz(slen, 0); Err bitreich.org 70 i+ e->e[e->num - 1] = gmallocz(slen, 2); Err bitreich.org 70 i strncpy(e->e[e->num - 1], s, slen - 1); Err bitreich.org 70 i Err bitreich.org 70 i return; Err bitreich.org 70 1diff --git a/main.c b/main.c /scm/geomyidae/file/main.c.gph bitreich.org 70 i@@ -38,6 +38,7 @@ enum { 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+int listfd = -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@@ -129,7 +130,7 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i char *clientp) Err bitreich.org 70 i { Err bitreich.org 70 i struct stat dir; Err bitreich.org 70 i- char recvc[1024], recvb[1024], path[1024], *args, *sear, *c; Err bitreich.org 70 i+ char recvc[1025], recvb[1025], path[1025], *args, *sear, *c; Err bitreich.org 70 i int len, fd; Err bitreich.org 70 i filetype *type; Err bitreich.org 70 i Err bitreich.org 70 i@@ -137,14 +138,14 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i bzero(recvb, sizeof(recvb)); Err bitreich.org 70 i bzero(recvc, sizeof(recvc)); Err bitreich.org 70 i Err bitreich.org 70 i- len = recv(sock, recvb, sizeof(recvb), 0); Err bitreich.org 70 i- if(len > 1) { Err bitreich.org 70 i+ len = recv(sock, recvb, sizeof(recvb)-1, 0); Err bitreich.org 70 i+ if(len > 0) { Err bitreich.org 70 i if(recvb[len - 2] == '\r') Err bitreich.org 70 i recvb[len - 2] = '\0'; Err bitreich.org 70 i if(recvb[len - 1] == '\n') Err bitreich.org 70 i recvb[len - 1] = '\0'; Err bitreich.org 70 i } Err bitreich.org 70 i- strncpy(recvc, recvb, sizeof(recvc) - 1); Err bitreich.org 70 i+ memmove(recvc, recvb, len+1); Err bitreich.org 70 i Err bitreich.org 70 i if(!strncmp(recvb, "URL:", 4)) { Err bitreich.org 70 i len = snprintf(path, sizeof(path), htredir, Err bitreich.org 70 i@@ -194,7 +195,6 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i send(sock, err, strlen(err), 0); Err bitreich.org 70 i if(loglvl & ERRORS) Err bitreich.org 70 i logentry(clienth, clientp, recvc, "not found"); Err bitreich.org 70 i- close(sock); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i return; Err bitreich.org 70 i@@ -214,6 +214,8 @@ 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+ if(listfd >= 0) Err bitreich.org 70 i+ close(listfd); 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@@ -250,7 +252,7 @@ main(int argc, char *argv[]) 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+ int sock, opt, dofork; 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@@ -342,33 +344,36 @@ main(int argc, char *argv[]) Err bitreich.org 70 i } Err bitreich.org 70 i 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+ listfd = 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+ if(listfd < 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+ if(bind(listfd, 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+ close(listfd); 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+ perror("getaddrinfo"); 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+ if(setsockopt(listfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) { Err bitreich.org 70 i perror("setsockopt"); Err bitreich.org 70 i+ close(listfd); 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+ if(listen(listfd, 255)) { Err bitreich.org 70 i perror("listen"); Err bitreich.org 70 i+ close(listfd); Err bitreich.org 70 i return 1; Err bitreich.org 70 i } 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+ perror("dropprivileges"); Err bitreich.org 70 i+ close(listfd); Err bitreich.org 70 i return 1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -376,15 +381,19 @@ main(int argc, char *argv[]) Err bitreich.org 70 i Err bitreich.org 70 i cltlen = sizeof(clt); Err bitreich.org 70 i while(running) { Err bitreich.org 70 i- sock = accept(list, (struct sockaddr *)&clt, &cltlen); Err bitreich.org 70 i+ sock = accept(listfd, (struct sockaddr *)&clt, &cltlen); Err bitreich.org 70 i if(sock < 0) { Err bitreich.org 70 i switch(errno) { Err bitreich.org 70 i case ECONNABORTED: Err bitreich.org 70 i case EINTR: Err bitreich.org 70 i+ if (!running) { Err bitreich.org 70 i+ close(listfd); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+ } Err bitreich.org 70 i continue; Err bitreich.org 70 i default: Err bitreich.org 70 i perror("accept"); Err bitreich.org 70 i- close(list); Err bitreich.org 70 i+ close(listfd); Err bitreich.org 70 i return 1; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i@@ -401,13 +410,15 @@ main(int argc, char *argv[]) Err bitreich.org 70 i case 0: Err bitreich.org 70 i handlerequest(sock, base, ohost, sport, clienth, Err bitreich.org 70 i clientp); Err bitreich.org 70 i+ shutdown(sock, SHUT_RDWR); Err bitreich.org 70 i+ close(sock); Err bitreich.org 70 i return 0; 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- close(list); Err bitreich.org 70 i+ close(listfd); Err bitreich.org 70 i if(logfile != nil) Err bitreich.org 70 i stoplogging(glfd); Err bitreich.org 70 i return 0; Err bitreich.org 70 1diff --git a/rc.d/NetBSD.rc.d b/rc.d/NetBSD.rc.d /scm/geomyidae/file/rc.d/NetBSD.rc.d.gph bitreich.org 70 i@@ -1,55 +1,55 @@ Err bitreich.org 70 i-#!/bin/sh Err bitreich.org 70 i-# Err bitreich.org 70 i- Err bitreich.org 70 i-# REQUIRE: local Err bitreich.org 70 i-# PROVIDE: geomyidae Err bitreich.org 70 i- Err bitreich.org 70 i-$_rc_subr_loaded . /etc/rc.subr Err bitreich.org 70 i- Err bitreich.org 70 i-name="geomyidae" Err bitreich.org 70 i-rcvar=$name Err bitreich.org 70 i-command="/usr/pkg/sbin/${name}" Err bitreich.org 70 i- Err bitreich.org 70 i-##################################################### Err bitreich.org 70 i-# Geomyidae Options Section - "?" => geomyidae(8) # Err bitreich.org 70 i-# Uncomment & define options (defaults are shown) # Err bitreich.org 70 i-##################################################### Err bitreich.org 70 i-# Err bitreich.org 70 i-#LOGFILE="-l /var/log/gopherd.log" Err bitreich.org 70 i-#LOGLEVEL="-v 15" Err bitreich.org 70 i-#HTDOCS="-b /var/gopher" Err bitreich.org 70 i-#PORT="-p 70" Err bitreich.org 70 i-#SPORT="-o 70" Err bitreich.org 70 i-#USR="-u $USER" Err bitreich.org 70 i-#GRP="-g $GROUP" Err bitreich.org 70 i-#HOST="-h localhost" Err bitreich.org 70 i-#IP="-i 127.0.0.1" Err bitreich.org 70 i- Err bitreich.org 70 i-###################################################### Err bitreich.org 70 i-# Now remove any UNDEFINED options from line below: # Err bitreich.org 70 i-###################################################### Err bitreich.org 70 i-# Err bitreich.org 70 i-command_args="$LOGFILE $LOGLEVEL $HTDOCS $PORT $SPORT $USR $GRP $HOST $IP" Err bitreich.org 70 i- Err bitreich.org 70 i- Err bitreich.org 70 i-###################################################### Err bitreich.org 70 i-# Uncomment this section if a PID file is desired # Err bitreich.org 70 i-###################################################### Err bitreich.org 70 i- Err bitreich.org 70 i-#pidfile="/var/run/${name}.pid" Err bitreich.org 70 i-#start_cmd="geomyidae_start" Err bitreich.org 70 i-# Err bitreich.org 70 i-#geomyidae_start() Err bitreich.org 70 i-#{ Err bitreich.org 70 i-# echo "Starting $name" Err bitreich.org 70 i-# $command $command_args Err bitreich.org 70 i-# pgrep -x $name > $pidfile Err bitreich.org 70 i-#} Err bitreich.org 70 i- Err bitreich.org 70 i-###################################################### Err bitreich.org 70 i-# Lastly, add the following to /etc/rc.conf: # Err bitreich.org 70 i-# "geomyidae=YES" (without the quotes) # Err bitreich.org 70 i-###################################################### Err bitreich.org 70 i- Err bitreich.org 70 i-load_rc_config $name Err bitreich.org 70 i-run_rc_command "$1" Err bitreich.org 70 i+#!/bin/sh Err bitreich.org 70 i+# Err bitreich.org 70 i+ Err bitreich.org 70 i+# REQUIRE: local Err bitreich.org 70 i+# PROVIDE: geomyidae Err bitreich.org 70 i+ Err bitreich.org 70 i+$_rc_subr_loaded . /etc/rc.subr Err bitreich.org 70 i+ Err bitreich.org 70 i+name="geomyidae" Err bitreich.org 70 i+rcvar=$name Err bitreich.org 70 i+command="/usr/pkg/sbin/${name}" Err bitreich.org 70 i+ Err bitreich.org 70 i+##################################################### Err bitreich.org 70 i+# Geomyidae Options Section - "?" => geomyidae(8) # Err bitreich.org 70 i+# Uncomment & define options (defaults are shown) # Err bitreich.org 70 i+##################################################### Err bitreich.org 70 i+# Err bitreich.org 70 i+#LOGFILE="-l /var/log/gopherd.log" Err bitreich.org 70 i+#LOGLEVEL="-v 15" Err bitreich.org 70 i+#HTDOCS="-b /var/gopher" Err bitreich.org 70 i+#PORT="-p 70" Err bitreich.org 70 i+#SPORT="-o 70" Err bitreich.org 70 i+#USR="-u $USER" Err bitreich.org 70 i+#GRP="-g $GROUP" Err bitreich.org 70 i+#HOST="-h localhost" Err bitreich.org 70 i+#IP="-i 127.0.0.1" Err bitreich.org 70 i+ Err bitreich.org 70 i+###################################################### Err bitreich.org 70 i+# Now remove any UNDEFINED options from line below: # Err bitreich.org 70 i+###################################################### Err bitreich.org 70 i+# Err bitreich.org 70 i+command_args="$LOGFILE $LOGLEVEL $HTDOCS $PORT $SPORT $USR $GRP $HOST $IP" Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+###################################################### Err bitreich.org 70 i+# Uncomment this section if a PID file is desired # Err bitreich.org 70 i+###################################################### Err bitreich.org 70 i+ Err bitreich.org 70 i+#pidfile="/var/run/${name}.pid" Err bitreich.org 70 i+#start_cmd="geomyidae_start" Err bitreich.org 70 i+# Err bitreich.org 70 i+#geomyidae_start() Err bitreich.org 70 i+#{ Err bitreich.org 70 i+# echo "Starting $name" Err bitreich.org 70 i+# $command $command_args Err bitreich.org 70 i+# pgrep -x $name > $pidfile Err bitreich.org 70 i+#} Err bitreich.org 70 i+ Err bitreich.org 70 i+###################################################### Err bitreich.org 70 i+# Lastly, add the following to /etc/rc.conf: # Err bitreich.org 70 i+# "geomyidae=YES" (without the quotes) # Err bitreich.org 70 i+###################################################### Err bitreich.org 70 i+ Err bitreich.org 70 i+load_rc_config $name Err bitreich.org 70 i+run_rc_command "$1" Err bitreich.org 70 .