Introduction
Introduction Statistics Contact Development Disclaimer Help
Fixing various major bugs. - geomyidae - A small C-based gopherd.
git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfri…
Log
Files
Refs
Tags
README
LICENSE
---
commit 451a9fae7303cc2457d025d51c6c153413020211
parent a4c4ddaceafa6d22ee03502b6b4d764c51ba8d49
Author: Christoph Lohmann <[email protected]>
Date: Sun, 6 Mar 2011 10:48:45 +0100
Fixing various major bugs.
Diffstat:
M handlr.c | 14 --------------
M ind.c | 2 +-
M main.c | 45 +++++++++++++++++++----------…
M rc.d/NetBSD.rc.d | 110 ++++++++++++++++-------------…
4 files changed, 84 insertions(+), 87 deletions(-)
---
diff --git a/handlr.c b/handlr.c
@@ -40,7 +40,6 @@ handledir(int sock, char *path, char *port, char *base, char …
addr = gmallocz(512, 2);
if(gethostname(addr, 512) == -1) {
perror("gethostname");
- close(sock);
free(addr);
free(pa);
return;
@@ -60,7 +59,6 @@ handledir(int sock, char *path, char *port, char *base, char …
ndir = scandir(pa, &dirent, 0, alphasort);
if(ndir < 0) {
perror("scandir");
- close(sock);
free(addr);
free(pa);
return;
@@ -90,8 +88,6 @@ handledir(int sock, char *path, char *port, char *base, char …
if(addr != nil)
free(addr);
free(pa);
- close(sock);
- return;
}
void
@@ -111,7 +107,6 @@ handlegph(int sock, char *file, char *port, char *base, cha…
if(args == nil) {
if(gethostname(addr, sizeof(addr)) == -1) {
perror("gethostname");
- close(sock);
return;
}
} else
@@ -139,9 +134,6 @@ handlegph(int sock, char *file, char *port, char *base, cha…
freeindex(act);
}
-
- close(sock);
- return;
}
void
@@ -163,9 +155,6 @@ handlebin(int sock, char *file, char *port, char *base, cha…
send(sock, sendb, len, 0);
close(fd);
}
-
- close(sock);
- return;
}
void
@@ -189,8 +178,5 @@ handlecgi(int sock, char *file, char *port, char *base, cha…
sear = "";
execl(file, p, sear, args, (char *)nil);
-
- close(sock);
- return;
}
diff --git a/ind.c b/ind.c
@@ -148,7 +148,7 @@ addelem(Elems *e, char *s)
e->num++;
e->e = realloc(e->e, sizeof(char *) * e->num);
- e->e[e->num - 1] = gmallocz(slen, 0);
+ e->e[e->num - 1] = gmallocz(slen, 2);
strncpy(e->e[e->num - 1], s, slen - 1);
return;
diff --git a/main.c b/main.c
@@ -38,6 +38,7 @@ enum {
int glfd = -1;
int loglvl = 15;
int running = 1;
+int listfd = -1;
char *logfile = nil;
char *argv0;
@@ -129,7 +130,7 @@ handlerequest(int sock, char *base, char *ohost, char *port…
char *clientp)
{
struct stat dir;
- char recvc[1024], recvb[1024], path[1024], *args, *sear, *c;
+ char recvc[1025], recvb[1025], path[1025], *args, *sear, *c;
int len, fd;
filetype *type;
@@ -137,14 +138,14 @@ handlerequest(int sock, char *base, char *ohost, char *po…
bzero(recvb, sizeof(recvb));
bzero(recvc, sizeof(recvc));
- len = recv(sock, recvb, sizeof(recvb), 0);
- if(len > 1) {
+ len = recv(sock, recvb, sizeof(recvb)-1, 0);
+ if(len > 0) {
if(recvb[len - 2] == '\r')
recvb[len - 2] = '\0';
if(recvb[len - 1] == '\n')
recvb[len - 1] = '\0';
}
- strncpy(recvc, recvb, sizeof(recvc) - 1);
+ memmove(recvc, recvb, len+1);
if(!strncmp(recvb, "URL:", 4)) {
len = snprintf(path, sizeof(path), htredir,
@@ -194,7 +195,6 @@ handlerequest(int sock, char *base, char *ohost, char *port…
send(sock, err, strlen(err), 0);
if(loglvl & ERRORS)
logentry(clienth, clientp, recvc, "not found");
- close(sock);
}
return;
@@ -214,6 +214,8 @@ sighandler(int sig)
case SIGTERM:
if(logfile != nil)
stoplogging(glfd);
+ if(listfd >= 0)
+ close(listfd);
exit(EXIT_SUCCESS);
break;
default:
@@ -250,7 +252,7 @@ main(int argc, char *argv[])
struct addrinfo hints, *ai, *rp;
struct sockaddr_storage clt;
socklen_t cltlen;
- int sock, list, opt, dofork;
+ int sock, opt, dofork;
char *port, *base, clienth[NI_MAXHOST], clientp[NI_MAXSERV];
char *user, *group, *bindip, *ohost, *sport;
struct passwd *us;
@@ -342,33 +344,36 @@ main(int argc, char *argv[])
}
for(rp = ai; rp != nil; rp = rp->ai_next) {
- list = socket(rp->ai_family, rp->ai_socktype,
+ listfd = socket(rp->ai_family, rp->ai_socktype,
rp->ai_protocol);
- if(list < 0)
+ if(listfd < 0)
continue;
- if(bind(list, rp->ai_addr, rp->ai_addrlen) == 0)
+ if(bind(listfd, rp->ai_addr, rp->ai_addrlen) == 0)
break;
- close(list);
+ close(listfd);
}
if(rp == nil) {
- perror("Could not find any suitable bindable address.");
+ perror("getaddrinfo");
return 1;
}
freeaddrinfo(ai);
opt = 1;
- if(setsockopt(list, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
+ if(setsockopt(listfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
perror("setsockopt");
+ close(listfd);
return 1;
}
- if(listen(list, 255)) {
+ if(listen(listfd, 255)) {
perror("listen");
+ close(listfd);
return 1;
}
if(dropprivileges(gr, us) < 0) {
- perror("cannot drop privileges");
+ perror("dropprivileges");
+ close(listfd);
return 1;
}
@@ -376,15 +381,19 @@ main(int argc, char *argv[])
cltlen = sizeof(clt);
while(running) {
- sock = accept(list, (struct sockaddr *)&clt, &cltlen);
+ sock = accept(listfd, (struct sockaddr *)&clt, &cltlen);
if(sock < 0) {
switch(errno) {
case ECONNABORTED:
case EINTR:
+ if (!running) {
+ close(listfd);
+ return 0;
+ }
continue;
default:
perror("accept");
- close(list);
+ close(listfd);
return 1;
}
}
@@ -401,13 +410,15 @@ main(int argc, char *argv[])
case 0:
handlerequest(sock, base, ohost, sport, clienth,
clientp);
+ shutdown(sock, SHUT_RDWR);
+ close(sock);
return 0;
default:
break;
}
}
- close(list);
+ close(listfd);
if(logfile != nil)
stoplogging(glfd);
return 0;
diff --git a/rc.d/NetBSD.rc.d b/rc.d/NetBSD.rc.d
@@ -1,55 +1,55 @@
-#!/bin/sh
-#
-
-# REQUIRE: local
-# PROVIDE: geomyidae
-
-$_rc_subr_loaded . /etc/rc.subr
-
-name="geomyidae"
-rcvar=$name
-command="/usr/pkg/sbin/${name}"
-
-#####################################################
-# Geomyidae Options Section - "?" => geomyidae(8) #
-# Uncomment & define options (defaults are shown) #
-#####################################################
-#
-#LOGFILE="-l /var/log/gopherd.log"
-#LOGLEVEL="-v 15"
-#HTDOCS="-b /var/gopher"
-#PORT="-p 70"
-#SPORT="-o 70"
-#USR="-u $USER"
-#GRP="-g $GROUP"
-#HOST="-h localhost"
-#IP="-i 127.0.0.1"
-
-######################################################
-# Now remove any UNDEFINED options from line below: #
-######################################################
-#
-command_args="$LOGFILE $LOGLEVEL $HTDOCS $PORT $SPORT $USR $GRP $HOST $IP"
-
-
-######################################################
-# Uncomment this section if a PID file is desired #
-######################################################
-
-#pidfile="/var/run/${name}.pid"
-#start_cmd="geomyidae_start"
-#
-#geomyidae_start()
-#{
-# echo "Starting $name"
-# $command $command_args
-# pgrep -x $name > $pidfile
-#}
-
-######################################################
-# Lastly, add the following to /etc/rc.conf: #
-# "geomyidae=YES" (without the quotes) #
-######################################################
-
-load_rc_config $name
-run_rc_command "$1"
+#!/bin/sh
+#
+
+# REQUIRE: local
+# PROVIDE: geomyidae
+
+$_rc_subr_loaded . /etc/rc.subr
+
+name="geomyidae"
+rcvar=$name
+command="/usr/pkg/sbin/${name}"
+
+#####################################################
+# Geomyidae Options Section - "?" => geomyidae(8) #
+# Uncomment & define options (defaults are shown) #
+#####################################################
+#
+#LOGFILE="-l /var/log/gopherd.log"
+#LOGLEVEL="-v 15"
+#HTDOCS="-b /var/gopher"
+#PORT="-p 70"
+#SPORT="-o 70"
+#USR="-u $USER"
+#GRP="-g $GROUP"
+#HOST="-h localhost"
+#IP="-i 127.0.0.1"
+
+######################################################
+# Now remove any UNDEFINED options from line below: #
+######################################################
+#
+command_args="$LOGFILE $LOGLEVEL $HTDOCS $PORT $SPORT $USR $GRP $HOST $IP"
+
+
+######################################################
+# Uncomment this section if a PID file is desired #
+######################################################
+
+#pidfile="/var/run/${name}.pid"
+#start_cmd="geomyidae_start"
+#
+#geomyidae_start()
+#{
+# echo "Starting $name"
+# $command $command_args
+# pgrep -x $name > $pidfile
+#}
+
+######################################################
+# Lastly, add the following to /etc/rc.conf: #
+# "geomyidae=YES" (without the quotes) #
+######################################################
+
+load_rc_config $name
+run_rc_command "$1"
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.