* Version $Id$
*/
/*
- Copyright (C) 2002-2005 Kern Sibbald
+ Copyright (C) 2002-2006 Kern Sibbald
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
#include "bacula.h"
#include "jcr.h"
-int execvp_errors[] = {EACCES, ENOEXEC, EFAULT, EINTR, E2BIG,
- ENAMETOOLONG, ENOMEM, ETXTBSY, ENOENT};
+int execvp_errors[] = {
+ EACCES,
+ ENOEXEC,
+ EFAULT,
+ EINTR,
+ E2BIG,
+ ENAMETOOLONG,
+ ENOMEM,
+#ifndef HAVE_WIN32
+ ETXTBSY,
+#endif
+ ENOENT
+};
int num_execvp_errors = (int)(sizeof(execvp_errors)/sizeof(int));
printf("argc=%d argv=%s:\n", i, bargv[i]);
}
#endif
- free_pool_memory(tprog);
/* Each pipe is one way, write one end, read the other, so we need two */
if (mode_write && pipe(writep) == -1) {
save_errno = errno;
free(bpipe);
errno = save_errno;
+ free_pool_memory(tprog);
return NULL;
}
if (mode_read && pipe(readp) == -1) {
}
free(bpipe);
errno = save_errno;
+ free_pool_memory(tprog);
return NULL;
}
/* Start worker process */
}
free(bpipe);
errno = save_errno;
+ free_pool_memory(tprog);
return NULL;
case 0: /* child */
}
exit(255); /* unknown errno */
-
-
default: /* parent */
break;
}
+ free_pool_memory(tprog);
if (mode_read) {
close(readp[1]); /* close unused parent fds */
bpipe->rfd = fdopen(readp[0], "r"); /* open file descriptor */
}
Dmsg1(800, "child status=%d\n", stat & ~b_errno_exit);
} else if (WIFSIGNALED(chldstatus)) { /* process died */
+#ifndef HAVE_WIN32
stat = WTERMSIG(chldstatus);
- Dmsg1(800, "Child died from signale %d\n", stat);
+#else
+#warning "WTERMSIG undefined in Win32 !!!"
+#endif
+ Dmsg1(800, "Child died from signal %d\n", stat);
stat |= b_errno_signal; /* exit signal returned */
}
}
stat1 = ferror(bpipe->rfd);
}
if (stat1 < 0) {
- Dmsg2(100, "Run program fgets stat=%d ERR=%s\n", stat1, strerror(errno));
+ Dmsg2(150, "Run program fgets stat=%d ERR=%s\n", stat1, strerror(errno));
} else if (stat1 != 0) {
- Dmsg1(100, "Run program fgets stat=%d\n", stat1);
+ Dmsg1(150, "Run program fgets stat=%d\n", stat1);
if (bpipe->timer_id) {
- Dmsg1(100, "Run program fgets killed=%d\n", bpipe->timer_id->killed);
+ Dmsg1(150, "Run program fgets killed=%d\n", bpipe->timer_id->killed);
/* NB: I'm not sure it is really useful for run_program. Without the
* following lines run_program would not detect if the program was killed
* by the watchdog. */
}
stat2 = close_bpipe(bpipe);
stat1 = stat2 != 0 ? stat2 : stat1;
- Dmsg1(100, "Run program returning %d\n", stat1);
+ Dmsg1(150, "Run program returning %d\n", stat1);
return stat1;
}
sm_check(__FILE__, __LINE__, false);
tmp[0] = 0;
while (1) {
+ buf[0] = 0;
fgets(buf, bufsize, bpipe->rfd);
+ buf[bufsize] = 0;
pm_strcat(tmp, buf);
if (feof(bpipe->rfd)) {
stat1 = 0;
} else if (stat1 != 0) {
Dmsg1(900, "Run program fgets stat=%d\n", stat1);
if (bpipe->timer_id) {
- Dmsg1(100, "Run program fgets killed=%d\n", bpipe->timer_id->killed);
+ Dmsg1(150, "Run program fgets killed=%d\n", bpipe->timer_id->killed);
if (bpipe->timer_id->killed) {
pm_strcat(tmp, _("Program killed by Bacula watchdog (timeout)\n"));
stat1 = ETIME;
stat2 = close_bpipe(bpipe);
stat1 = stat2 != 0 ? stat2 : stat1;
- Dmsg1(900, "Run program returning %d\n", stat);
+ Dmsg1(900, "Run program returning %d\n", stat1);
free_pool_memory(tmp);
free(buf);
return stat1;