From d1602327475bad9da4795ddf9326507161b08b7a Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Fri, 4 Oct 2013 16:08:19 +0200 Subject: mothra: run page in own note group, close unneeded filedescriptors after forking running page in own note group avoids killing it when we exit mothra. copypaste dupfds() function from page and use it to close unneeded file descriptors. --- sys/src/cmd/mothra/mothra.c | 43 ++++++++++++++++++++++++++++++++----------- sys/src/cmd/mothra/mothra.h | 1 + 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/sys/src/cmd/mothra/mothra.c b/sys/src/cmd/mothra/mothra.c index 29e9219fd..6ea1b850e 100644 --- a/sys/src/cmd/mothra/mothra.c +++ b/sys/src/cmd/mothra/mothra.c @@ -748,14 +748,12 @@ void dolink(Panel *p, int buttons, Rtext *word){ } void filter(char *cmd, int fd){ - switch(rfork(RFFDG|RFPROC|RFMEM|RFNOWAIT)){ + switch(rfork(RFFDG|RFPROC|RFMEM|RFNOWAIT|RFNOTEG)){ case -1: message("Can't fork!"); break; case 0: - close(0); - dup(fd, 0); - close(fd); + dupfds(fd, 1, 2, -1); execl("/bin/rc", "rc", "-c", cmd, 0); _exits(0); } @@ -796,6 +794,32 @@ void freetext(Rtext *t){ plrtfree(tt); } +void +dupfds(int fd, ...) +{ + int mfd, n, i; + va_list arg; + Dir *dir; + + va_start(arg, fd); + for(mfd = 0; fd >= 0; fd = va_arg(arg, int), mfd++) + if(fd != mfd) + if(dup(fd, mfd) < 0) + sysfatal("dup: %r"); + va_end(arg); + if((fd = open("/fd", OREAD)) < 0) + sysfatal("open: %r"); + n = dirreadall(fd, &dir); + for(i=0; i= mfd) + close(fd); + } + free(dir); +} + int pipeline(char *cmd, int fd) { int pfd[2]; @@ -806,22 +830,19 @@ Err: werrstr("pipeline for %s failed: %r", cmd); return -1; } - switch(fork()){ + switch(rfork(RFFDG|RFPROC|RFMEM|RFNOWAIT)){ case -1: close(pfd[0]); close(pfd[1]); goto Err; case 0: - dup(fd, 0); - dup(pfd[0], 1); - close(pfd[0]); - close(pfd[1]); + dupfds(fd, pfd[1], 2, -1); execl("/bin/rc", "rc", "-c", cmd, 0); _exits(0); } - close(pfd[0]); close(fd); - return pfd[1]; + close(pfd[1]); + return pfd[0]; } char* diff --git a/sys/src/cmd/mothra/mothra.h b/sys/src/cmd/mothra/mothra.h index 2588d99f8..b38391338 100644 --- a/sys/src/cmd/mothra/mothra.h +++ b/sys/src/cmd/mothra/mothra.h @@ -87,6 +87,7 @@ Url *selurl(char *); void getpix(Rtext *, Www *); ulong countpix(void *p); void freepix(void *p); +void dupfds(int fd, ...); int pipeline(char *, int); void getfonts(void); void *emalloc(int); -- cgit v1.2.3