int dont_fork = 0;
char *cmdline;
+ ignore_value (chdir ("/"));
+
if (winsock_init () == -1)
error (EXIT_FAILURE, 0, "winsock initialization failed");
"output to the libguestfs developers, either in a bug report\n"
"or on the libguestfs redhat com mailing list.\n"
"\n");
+ perror ("/dev/virtio-ports/org.libguestfs.channel.0");
exit (EXIT_FAILURE);
}
xdrmem_create (&xdr, lenbuf, sizeof lenbuf, XDR_ENCODE);
xdr_u_int (&xdr, &len);
- if (xwrite (sock, lenbuf, sizeof lenbuf) == -1)
+ if (xwrite (sock, lenbuf, sizeof lenbuf) == -1) {
+ perror ("xwrite");
exit (EXIT_FAILURE);
+ }
xdr_destroy (&xdr);
if (new_str == NULL) {
reply_with_perror ("strdup");
free_strings (*argv);
+ return -1;
}
} else
new_str = NULL;
}
if (pid == 0) { /* Child process running the command. */
+ signal (SIGPIPE, SIG_DFL);
close (0);
if (flag_copy_stdin) {
dup2 (stdin_fd[0], 0);
close (stdin_fd[1]);
} else {
/* Set stdin to /dev/null (ignore failure) */
- open ("/dev/null", O_RDONLY);
+ ignore_value (open ("/dev/null", O_RDONLY));
}
close (so_fd[0]);
close (se_fd[0]);
quit = 0;
while (quit < 2) {
+ again:
rset2 = rset;
r = select (MAX (so_fd[0], se_fd[0]) + 1, &rset2, NULL, NULL, NULL);
if (r == -1) {
+ if (errno == EINTR)
+ goto again;
+
perror ("select");
quit:
- if (stdoutput) free (*stdoutput);
- if (stderror) free (*stderror);
+ if (stdoutput) {
+ free (*stdoutput);
+ *stdoutput = NULL;
+ }
+ if (stderror) {
+ free (*stderror);
+ /* Need to return non-NULL *stderror here since most callers
+ * will try to print and then free the err string.
+ * Unfortunately recovery from strdup failure here is not
+ * possible.
+ */
+ *stderror = strdup ("error running external command, "
+ "see debug output for details");
+ }
close (so_fd[0]);
close (se_fd[0]);
waitpid (pid, NULL, 0);