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