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.
23 /* XXX: FEATURE: I shouldn't actually use system(3) at all. I don't
24 really need the /bin/sh invocation which takes resources and
25 introduces security problems. I should switch all of this to a sort
26 of execl() or execv() interface/implementation.
29 /* Like system(3), but with error messages printed if the fork fails
30 or if the child process dies due to an uncaught signal. Also, the
31 return value is a bit simpler:
33 -1 if there was any problem
34 Otherwise, the 8-bit return value of the program ala WEXITSTATUS
35 as defined in <sys/wait.h>.
37 int xsystem(const char *cmd
)
44 fprintf(stderr
, "%s: ERROR: fork failed before execution: `%s'\n",
49 if (WIFSIGNALED(err
)) {
50 fprintf(stderr
, "%s: ERROR: Child process died due to signal %d: `%s'\n",
51 __FUNCTION__
, WTERMSIG(err
), cmd
);
56 /* Normal child exit */
57 return WEXITSTATUS(err
);
60 fprintf(stderr
, "%s: ERROR: Received unintelligible return value from system: %d",