1 /* xsystem.c - system(3) with error messages
5 Copyright (C) 2001 University of Southern California
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2, or (at
10 your option) any later version.
12 This program is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
22 #include "libbb/libbb.h"
24 /* Like system(3), but with error messages printed if the fork fails
25 or if the child process dies due to an uncaught signal. Also, the
26 return value is a bit simpler:
28 -1 if there was any problem
29 Otherwise, the 8-bit return value of the program ala WEXITSTATUS
30 as defined in <sys/wait.h>.
33 xsystem(const char *argv[])
42 perror_msg("%s: %s: vfork", __FUNCTION__, argv[0]);
46 execvp(argv[0], (char*const*)argv);
53 if (waitpid(pid, &status, 0) == -1) {
54 perror_msg("%s: %s: waitpid", __FUNCTION__, argv[0]);
58 if (WIFSIGNALED(status)) {
59 error_msg("%s: %s: Child killed by signal %d\n",
60 __FUNCTION__, argv[0], WTERMSIG(status));
64 if (!WIFEXITED(status)) {
65 /* shouldn't happen */
66 error_msg("%s: %s: Your system is broken: got status %d "
67 "from waitpid\n", __FUNCTION__, argv[0], status);
71 return WEXITSTATUS(status);