2 * Copyright 2005 Timo Hirvonen
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23 #include <sys/types.h>
30 int spawn(char *argv
[], int *status
)
35 if (pipe(err_pipe
) == -1)
42 } else if (pid
== 0) {
47 fcntl(err_pipe
[1], F_SETFD
, FD_CLOEXEC
);
49 /* redirect stdout and stderr to /dev/null if possible */
50 dev_null
= open("/dev/null", O_WRONLY
);
56 /* not interactive, close stdin */
59 /* close unused fds */
60 for (i
= 3; i
< 30; i
++)
63 execvp(argv
[0], argv
);
67 write_all(err_pipe
[1], &err
, sizeof(int));
71 int rc
, errno_save
, child_errno
;
74 rc
= read_all(err_pipe
[0], &child_errno
, sizeof(int));
78 waitpid(pid
, status
, 0);
84 if (rc
== sizeof(int)) {