idon't keep writing on a send failure (for example EPIPE) - 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 1c6dfdef1faabdb80161e5490526491e2a02c28c /scm/geomyidae/commit/1c6dfdef1faabdb80161e5490526491e2a02c28c.gph bitreich.org 70 1parent 60e5e4b10104014295dd9c9867900f4c72a8cffe /scm/geomyidae/commit/60e5e4b10104014295dd9c9867900f4c72a8cffe.gph bitreich.org 70 hAuthor: Hiltjo Posthuma URL:mailto:hiltjo@codemadness.org bitreich.org 70 iDate: Sat, 23 Sep 2017 13:05:54 +0200 Err bitreich.org 70 i Err bitreich.org 70 idon't keep writing on a send failure (for example EPIPE) Err bitreich.org 70 i Err bitreich.org 70 ialso close descriptor before wait(NULL), else the process will wait Err bitreich.org 70 iforever for example on EPIPE. Err bitreich.org 70 i Err bitreich.org 70 iSigned-off-by: Christoph Lohmann <20h@r-36.net> Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M handlr.c | 28 ++++++++++++++-------------- Err bitreich.org 70 i M ind.c | 13 +++++++------ Err bitreich.org 70 i M ind.h | 2 +- Err bitreich.org 70 i Err bitreich.org 70 i3 files changed, 22 insertions(+), 21 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@@ -25,7 +25,7 @@ handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i { Err bitreich.org 70 i char *pa, *file, *e, *par, *b; Err bitreich.org 70 i struct dirent **dirent; Err bitreich.org 70 i- int ndir, i; Err bitreich.org 70 i+ int ndir, i, ret = 0; Err bitreich.org 70 i struct stat st; Err bitreich.org 70 i filetype *type; Err bitreich.org 70 i Err bitreich.org 70 i@@ -52,7 +52,7 @@ handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i free(pa); Err bitreich.org 70 i return; Err bitreich.org 70 i } else { Err bitreich.org 70 i- for(i = 0; i < ndir; i++) { Err bitreich.org 70 i+ for(i = 0; i < ndir && ret >= 0; i++) { Err bitreich.org 70 i if(dirent[i]->d_name[0] == '.') { Err bitreich.org 70 i free(dirent[i]); Err bitreich.org 70 i continue; Err bitreich.org 70 i@@ -64,7 +64,7 @@ handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i if(stat(file, &st) >= 0 && S_ISDIR(st.st_mode)) Err bitreich.org 70 i type = gettype("index.gph"); Err bitreich.org 70 i e = file + strlen(base); Err bitreich.org 70 i- dprintf(sock, "%c%s\t%s\t%s\t%s\r\n", *type->type, Err bitreich.org 70 i+ ret = dprintf(sock, "%c%s\t%s\t%s\t%s\r\n", *type->type, Err bitreich.org 70 i dirent[i]->d_name, e, ohost, port); Err bitreich.org 70 i free(file); Err bitreich.org 70 i free(dirent[i]); Err bitreich.org 70 i@@ -81,7 +81,7 @@ handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i char *sear, char *ohost) Err bitreich.org 70 i { Err bitreich.org 70 i Indexs *act; Err bitreich.org 70 i- int i; Err bitreich.org 70 i+ int i, ret = 0; Err bitreich.org 70 i Err bitreich.org 70 i USED(base); Err bitreich.org 70 i USED(args); Err bitreich.org 70 i@@ -89,8 +89,8 @@ handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i Err bitreich.org 70 i act = scanfile(file); Err bitreich.org 70 i if(act != nil) { Err bitreich.org 70 i- for(i = 0; i < act->num; i++) { Err bitreich.org 70 i- printelem(sock, act->n[i], ohost, port); Err bitreich.org 70 i+ for(i = 0; i < act->num && ret >= 0; i++) { Err bitreich.org 70 i+ ret = printelem(sock, act->n[i], ohost, port); Err bitreich.org 70 i freeelem(act->n[i]); Err bitreich.org 70 i act->n[i] = nil; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -117,9 +117,10 @@ handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i if(fd >= 0) { Err bitreich.org 70 i while((len = read(fd, sendb, sizeof(sendb))) > 0) { Err bitreich.org 70 i while(len > 0) { Err bitreich.org 70 i- sent = send(sock, sendb, len, 0); Err bitreich.org 70 i- if(sent < 0) Err bitreich.org 70 i- break; Err bitreich.org 70 i+ if ((sent = send(sock, sendb, len, 0)) < 0) { Err bitreich.org 70 i+ close(fd); Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ } Err bitreich.org 70 i len -= sent; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i@@ -186,7 +187,7 @@ handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i char *p, *path, *ln = nil; Err bitreich.org 70 i size_t linesiz = 0; Err bitreich.org 70 i ssize_t n; Err bitreich.org 70 i- int outpipe[2]; Err bitreich.org 70 i+ int outpipe[2], ret = 0; Err bitreich.org 70 i Elems *el; Err bitreich.org 70 i Err bitreich.org 70 i USED(base); Err bitreich.org 70 i@@ -239,7 +240,7 @@ handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- while ((n = getline(&ln, &linesiz, fp)) > 0) { Err bitreich.org 70 i+ while ((n = getline(&ln, &linesiz, fp)) > 0 && ret >= 0) { Err bitreich.org 70 i if (ln[n - 1] == '\n') Err bitreich.org 70 i ln[--n] = '\0'; Err bitreich.org 70 i Err bitreich.org 70 i@@ -247,7 +248,7 @@ handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i if (el == nil) Err bitreich.org 70 i continue; Err bitreich.org 70 i Err bitreich.org 70 i- printelem(sock, el, ohost, port); Err bitreich.org 70 i+ ret = printelem(sock, el, ohost, port); Err bitreich.org 70 i freeelem(el); Err bitreich.org 70 i } Err bitreich.org 70 i if (ferror(fp)) Err bitreich.org 70 i@@ -256,9 +257,8 @@ handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i Err bitreich.org 70 i free(ln); Err bitreich.org 70 i free(path); Err bitreich.org 70 i- wait(NULL); Err bitreich.org 70 i fclose(fp); Err bitreich.org 70 i+ wait(NULL); 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 1diff --git a/ind.c b/ind.c /scm/geomyidae/file/ind.c.gph bitreich.org 70 i@@ -245,10 +245,9 @@ scanfile(char *fname) Err bitreich.org 70 i return ret; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-void Err bitreich.org 70 i+int Err bitreich.org 70 i printelem(int fd, Elems *el, char *addr, char *port) Err bitreich.org 70 i { Err bitreich.org 70 i- Err bitreich.org 70 i if(!strcmp(el->e[3], "server")) { Err bitreich.org 70 i free(el->e[3]); Err bitreich.org 70 i el->e[3] = xstrdup(addr); Err bitreich.org 70 i@@ -257,10 +256,12 @@ printelem(int fd, Elems *el, char *addr, char *port) Err bitreich.org 70 i free(el->e[4]); Err bitreich.org 70 i el->e[4] = xstrdup(port); Err bitreich.org 70 i } Err bitreich.org 70 i- dprintf(fd, "%.1s%s\t%s\t%s\t%s\r\n", el->e[0], el->e[1], el->e[2], Err bitreich.org 70 i- el->e[3], el->e[4]); Err bitreich.org 70 i- Err bitreich.org 70 i- return; Err bitreich.org 70 i+ if (dprintf(fd, "%.1s%s\t%s\t%s\t%s\r\n", el->e[0], el->e[1], el->e[2], Err bitreich.org 70 i+ el->e[3], el->e[4]) < 0) { Err bitreich.org 70 i+ perror("printelem: dprintf"); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 1diff --git a/ind.h b/ind.h /scm/geomyidae/file/ind.h.gph bitreich.org 70 i@@ -37,7 +37,7 @@ void *xrealloc(void *, size_t); Err bitreich.org 70 i char *xstrdup(const char *str); Err bitreich.org 70 i Indexs *scanfile(char *fname); Err bitreich.org 70 i Elems *getadv(char *str); Err bitreich.org 70 i-void printelem(int fd, Elems *el, char *addr, char *port); Err bitreich.org 70 i+int printelem(int fd, Elems *el, char *addr, char *port); Err bitreich.org 70 i void addindexs(Indexs *idx, Elems *el); Err bitreich.org 70 i void addelem(Elems *e, char *s); Err bitreich.org 70 i void freeindex(Indexs *i); Err bitreich.org 70 .