summaryrefslogtreecommitdiffstats
path: root/src/libopkg/.svn/text-base/xsystem.c.svn-base
diff options
context:
space:
mode:
Diffstat (limited to 'src/libopkg/.svn/text-base/xsystem.c.svn-base')
-rw-r--r--src/libopkg/.svn/text-base/xsystem.c.svn-base73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/libopkg/.svn/text-base/xsystem.c.svn-base b/src/libopkg/.svn/text-base/xsystem.c.svn-base
new file mode 100644
index 0000000..ae7ca87
--- /dev/null
+++ b/src/libopkg/.svn/text-base/xsystem.c.svn-base
@@ -0,0 +1,73 @@
+/* xsystem.c - system(3) with error messages
+
+ Carl D. Worth
+
+ Copyright (C) 2001 University of Southern California
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+*/
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include "xsystem.h"
+#include "libbb/libbb.h"
+
+/* Like system(3), but with error messages printed if the fork fails
+ or if the child process dies due to an uncaught signal. Also, the
+ return value is a bit simpler:
+
+ -1 if there was any problem
+ Otherwise, the 8-bit return value of the program ala WEXITSTATUS
+ as defined in <sys/wait.h>.
+*/
+int
+xsystem(const char *argv[])
+{
+ int status;
+ pid_t pid;
+
+ pid = vfork();
+
+ switch (pid) {
+ case -1:
+ opkg_perror(ERROR, "%s: vfork", argv[0]);
+ return -1;
+ case 0:
+ /* child */
+ execvp(argv[0], (char*const*)argv);
+ _exit(-1);
+ default:
+ /* parent */
+ break;
+ }
+
+ if (waitpid(pid, &status, 0) == -1) {
+ opkg_perror(ERROR, "%s: waitpid", argv[0]);
+ return -1;
+ }
+
+ if (WIFSIGNALED(status)) {
+ opkg_msg(ERROR, "%s: Child killed by signal %d.\n",
+ argv[0], WTERMSIG(status));
+ return -1;
+ }
+
+ if (!WIFEXITED(status)) {
+ /* shouldn't happen */
+ opkg_msg(ERROR, "%s: Your system is broken: got status %d "
+ "from waitpid.\n", argv[0], status);
+ return -1;
+ }
+
+ return WEXITSTATUS(status);
+}