tprog = get_pool_memory(PM_FNAME);
pm_strcpy(&tprog, prog);
build_argc_argv(tprog, &bargc, bargv, MAX_ARGV);
-#ifdef xxxxxx
+#ifdef xxxxxx
printf("argc=%d\n", bargc);
int i;
for (i=0; i<bargc; i++) {
}
bpipe->worker_stime = time(NULL);
bpipe->wait = wait;
+ if (wait > 0) {
+ bpipe->timer_id = start_child_timer(bpipe->worker_pid, wait);
+ }
return bpipe;
}
int stat = 1;
if (bpipe->wfd) {
+ fflush(bpipe->wfd);
if (fclose(bpipe->wfd) != 0) {
stat = 0;
}
int close_bpipe(BPIPE *bpipe)
{
int chldstatus = 0;
- int stat = ETIME;
+ int stat = 0;
int wait_option;
int remaining_wait;
+ pid_t wpid = 0;
+
/* Close pipes */
if (bpipe->rfd) {
/* wait for worker child to exit */
for ( ;; ) {
- pid_t wpid;
wpid = waitpid(bpipe->worker_pid, &chldstatus, wait_option);
if (wpid == bpipe->worker_pid || (wpid == -1 && errno != EINTR)) {
break;
sleep(1); /* wait one second */
remaining_wait--;
} else {
+ stat = 1; /* set error status */
+ errno = ETIME; /* set timed out */
+ wpid = -1;
break; /* don't wait any longer */
}
}
- if (WIFEXITED(chldstatus)) {
- stat = WEXITSTATUS(chldstatus);
+ if (wpid > 0) {
+ if (WIFEXITED(chldstatus)) { /* process exit()ed */
+ stat = WEXITSTATUS(chldstatus);
+ } else if (WIFSIGNALED(chldstatus)) { /* process died */
+ stat = 1;
+ }
+ if (stat != 0) {
+ errno = ECHILD; /* set child errno */
+ }
+ }
+ if (bpipe->timer_id) {
+ stop_child_timer(bpipe->timer_id);
}
free(bpipe);
+#ifdef HAVE_FREEBSD_OS
+ stat = 0; /* kludge because FreeBSD doesn't seem to return valid status */
+#endif
return stat;
}
*/
static void build_argc_argv(char *cmd, int *bargc, char *bargv[], int max_argv)
{
- int i, quote;
- char *p, *q;
+ int i;
+ char *p, *q, quote;
int argc = 0;
argc = 0;
quote = 0;
while (*p && (*p == ' ' || *p == '\t'))
p++;
- if (*p == '\"') {
- quote = 1;
+ if (*p == '\"' || *p == '\'') {
+ quote = *p;
p++;
}
if (*p) {
while (*p && argc < MAX_ARGV) {
q = p;
if (quote) {
- while (*q && *q != '\"')
+ while (*q && *q != quote)
q++;
quote = 0;
} else {
p = q;
while (*p && (*p == ' ' || *p == '\t'))
p++;
- if (*p == '\"') {
- quote = 1;
+ if (*p == '\"' || *p == '\'') {
+ quote = *p;
p++;
}
}