tdon't keep writing on a send failure (for example EPIPE) - geomyidae - A small C-based gopherd. (gopher://bitreich.org/1/scm/geomyidae)
 (HTM) git clone git://r-36.net/geomyidae
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 1c6dfdef1faabdb80161e5490526491e2a02c28c
 (DIR) parent 60e5e4b10104014295dd9c9867900f4c72a8cffe
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       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 <20h@r-36.net>
       
       Diffstat:
         handlr.c                            |      28 ++++++++++++++--------------
         ind.c                               |      13 +++++++------
         ind.h                               |       2 +-
       
       3 files changed, 22 insertions(+), 21 deletions(-)
       ---
 (DIR) diff --git a/handlr.c b/handlr.c
       t@@ -25,7 +25,7 @@ handledir(int sock, char *path, char *port, char *base, char *args,
        {
                char *pa, *file, *e, *par, *b;
                struct dirent **dirent;
       -        int ndir, i;
       +        int ndir, i, ret = 0;
                struct stat st;
                filetype *type;
        
       t@@ -52,7 +52,7 @@ handledir(int sock, char *path, char *port, char *base, char *args,
                        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;
       t@@ -64,7 +64,7 @@ handledir(int sock, char *path, char *port, char *base, char *args,
                                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->type,
                                        dirent[i]->d_name, e, ohost, port);
                                free(file);
                                free(dirent[i]);
       t@@ -81,7 +81,7 @@ handlegph(int sock, char *file, char *port, char *base, char *args,
                        char *sear, char *ohost)
        {
                Indexs *act;
       -        int i;
       +        int i, ret = 0;
        
                USED(base);
                USED(args);
       t@@ -89,8 +89,8 @@ handlegph(int sock, char *file, char *port, char *base, char *args,
        
                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;
                        }
       t@@ -117,9 +117,10 @@ handlebin(int sock, char *file, char *port, char *base, char *args,
                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;
                                }
                        }
       t@@ -186,7 +187,7 @@ handledcgi(int sock, char *file, char *port, char *base, char *args,
                char *p, *path, *ln = nil;
                size_t linesiz = 0;
                ssize_t n;
       -        int outpipe[2];
       +        int outpipe[2], ret = 0;
                Elems *el;
        
                USED(base);
       t@@ -239,7 +240,7 @@ handledcgi(int sock, char *file, char *port, char *base, char *args,
                                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';
        
       t@@ -247,7 +248,7 @@ handledcgi(int sock, char *file, char *port, char *base, char *args,
                                if (el == nil)
                                        continue;
        
       -                        printelem(sock, el, ohost, port);
       +                        ret = printelem(sock, el, ohost, port);
                                freeelem(el);
                        }
                        if (ferror(fp))
       t@@ -256,9 +257,8 @@ handledcgi(int sock, char *file, char *port, char *base, char *args,
        
                        free(ln);
                        free(path);
       -                wait(NULL);
                        fclose(fp);
       +                wait(NULL);
                        break;
                }
        }
       -
 (DIR) diff --git a/ind.c b/ind.c
       t@@ -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);
       t@@ -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
 (DIR) diff --git a/ind.h b/ind.h
       t@@ -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);