Introduction
Introduction Statistics Contact Development Disclaimer Help
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);
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.