their use of strtoul. (Thanks to report from Peter Benie.)
+ * Close unwanted pipes in client-side cat subprocesses, to avoid
+ wedging at termination. (Thanks to patchlet from Peter Benie.)
if (alarm(timeout)<0) syscallerror("set up timeout alarm");
}
if (alarm(timeout)<0) syscallerror("set up timeout alarm");
}
+
+static void cat_close_unwanted_pipes(void) {
+ int fd;
+
+ for (fd=0; fd<fdsetupsize; fd++) {
+ if (!fdsetup[fd].filename) continue;
+ if (close(fdsetup[fd].pipefd)) fsyscallerror("close pipe fd for %d",fd);
+ if (fdsetup[fd].copyfd>2)
+ if (close(fdsetup[fd].copyfd))
+ if (errno != EBADF)
+ /* EBADF can be induced if cmd line specifies same fd twice */
+ fsyscallerror("close real fd for %d",fd);
+ }
+}
+
static void catdup(const char *which, int from, int to) {
if (dup2(from,to)<0) {
blocksignals(SIG_BLOCK);
static void catdup(const char *which, int from, int to) {
if (dup2(from,to)<0) {
blocksignals(SIG_BLOCK);
reading= fdsetup[fd].mods & fdm_read;
catdup(catnamebuf, fdsetup[fd].copyfd, reading ? 0 : 1);
catdup(catnamebuf, fdsetup[fd].pipefd, reading ? 1 : 0);
reading= fdsetup[fd].mods & fdm_read;
catdup(catnamebuf, fdsetup[fd].copyfd, reading ? 0 : 1);
catdup(catnamebuf, fdsetup[fd].pipefd, reading ? 1 : 0);
+ cat_close_unwanted_pipes();
execl("/bin/cat",catnamebuf,(char*)0);
fprintf(stderr,"userv: %s: cannot exec `cat': %s\n",catnamebuf,strerror(errno));
exit(-1);
execl("/bin/cat",catnamebuf,(char*)0);
fprintf(stderr,"userv: %s: cannot exec `cat': %s\n",catnamebuf,strerror(errno));
exit(-1);
* Actually ship uservd(8) !
* Fix fd modifier, signal, and exit status parsing to be rigourous in
their use of strtoul. (Thanks to report from Peter Benie.)
* Actually ship uservd(8) !
* Fix fd modifier, signal, and exit status parsing to be rigourous in
their use of strtoul. (Thanks to report from Peter Benie.)
+ * Close unwanted pipes in client-side cat subprocesses, to avoid
+ wedging at termination. (Thanks to patchlet from Peter Benie.)