summaryrefslogtreecommitdiff
path: root/usr.sbin/sup/lib/run.c
diff options
context:
space:
mode:
authorPeter Wemm <peter@FreeBSD.org>1995-12-26 04:54:48 +0000
committerPeter Wemm <peter@FreeBSD.org>1995-12-26 04:54:48 +0000
commitd14071a4b3f94fc0205683a8186f924d8afa6357 (patch)
tree2df06c65b06de43fedf640ab5766a1459303b33b /usr.sbin/sup/lib/run.c
parent98542945540416173425248242bf3f110f59e694 (diff)
Notes
Diffstat (limited to 'usr.sbin/sup/lib/run.c')
-rw-r--r--usr.sbin/sup/lib/run.c181
1 files changed, 181 insertions, 0 deletions
diff --git a/usr.sbin/sup/lib/run.c b/usr.sbin/sup/lib/run.c
new file mode 100644
index 000000000000..9072ebedc7dc
--- /dev/null
+++ b/usr.sbin/sup/lib/run.c
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 1991 Carnegie Mellon University
+ * All Rights Reserved.
+ *
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie the rights
+ * to redistribute these changes.
+ */
+/* run, runv, runp, runvp -- execute process and wait for it to exit
+ *
+ * Usage:
+ * i = run (file, arg1, arg2, ..., argn, 0);
+ * i = runv (file, arglist);
+ * i = runp (file, arg1, arg2, ..., argn, 0);
+ * i = runvp (file, arglist);
+ *
+ * Run, runv, runp and runvp have argument lists exactly like the
+ * corresponding routines, execl, execv, execlp, execvp. The run
+ * routines perform a fork, then:
+ * IN THE NEW PROCESS, an execl[p] or execv[p] is performed with the
+ * specified arguments. The process returns with a -1 code if the
+ * exec was not successful.
+ * IN THE PARENT PROCESS, the signals SIGQUIT and SIGINT are disabled,
+ * the process waits until the newly forked process exits, the
+ * signals are restored to their original status, and the return
+ * status of the process is analyzed.
+ * All run routines return: -1 if the exec failed or if the child was
+ * terminated abnormally; otherwise, the exit code of the child is
+ * returned.
+ *
+ **********************************************************************
+ * HISTORY
+ * $Log: run.c,v $
+ * Revision 1.1.1.1 1993/08/21 00:46:33 jkh
+ * Current sup with compression support.
+ *
+ * Revision 1.1.1.1 1993/05/21 14:52:17 cgd
+ * initial import of CMU's SUP to NetBSD
+ *
+ * Revision 1.1 89/10/14 19:53:39 rvb
+ * Initial revision
+ *
+ * Revision 1.2 89/08/03 14:36:46 mja
+ * Update run() and runp() to use <varargs.h>.
+ * [89/04/19 mja]
+ *
+ * 23-Sep-86 Glenn Marcy (gm0w) at Carnegie-Mellon University
+ * Merged old runv and runvp modules.
+ *
+ * 22-Nov-85 Glenn Marcy (gm0w) at Carnegie-Mellon University
+ * Added check and kill if child process was stopped.
+ *
+ * 30-Apr-85 Steven Shafer (sas) at Carnegie-Mellon University
+ * Adapted for 4.2 BSD UNIX: Conforms to new signals and wait.
+ *
+ * 15-July-82 Mike Accetta (mja) and Neal Friedman (naf)
+ * at Carnegie-Mellon University
+ * Added a return(-1) if vfork fails. This should only happen
+ * if there are no more processes available.
+ *
+ * 28-Jan-80 Steven Shafer (sas) at Carnegie-Mellon University
+ * Added setuid and setgid for system programs' use.
+ *
+ * 21-Jan-80 Steven Shafer (sas) at Carnegie-Mellon University
+ * Changed fork to vfork.
+ *
+ * 20-Nov-79 Steven Shafer (sas) at Carnegie-Mellon University
+ * Created for VAX. The proper way to fork-and-execute a system
+ * program is now by "runvp" or "runp", with the program name
+ * (rather than an absolute pathname) as the first argument;
+ * that way, the "PATH" variable in the environment does the right
+ * thing. Too bad execvp and execlp (hence runvp and runp) don't
+ * accept a pathlist as an explicit argument.
+ *
+ **********************************************************************
+ */
+
+#include <stdio.h>
+#include <signal.h>
+#include <sys/wait.h>
+#include <varargs.h>
+
+static int dorun();
+
+int run (name,va_alist)
+char *name;
+va_dcl
+{
+ int val;
+ va_list ap;
+
+ va_start(ap);
+ val = runv (name,ap);
+ va_end(ap);
+ return(val);
+}
+
+int runv (name,argv)
+char *name,**argv;
+{
+ return (dorun (name, argv, 0));
+}
+
+int runp (name,va_alist)
+char *name;
+va_dcl
+{
+ int val;
+ va_list ap;
+
+ va_start(ap);
+ val = runvp (name,ap);
+ va_end(ap);
+ return (val);
+}
+
+int runvp (name,argv)
+char *name,**argv;
+{
+ return (dorun (name, argv, 1));
+}
+
+static
+int dorun (name,argv,usepath)
+char *name,**argv;
+int usepath;
+{
+ int wpid;
+ register int pid;
+ struct sigvec ignoresig,intsig,quitsig;
+ union wait status;
+ int execvp(), execv();
+ int (*execrtn)() = usepath ? execvp : execv;
+
+ if ((pid = vfork()) == -1)
+ return(-1); /* no more process's, so exit with error */
+
+ if (pid == 0) { /* child process */
+ setgid (getgid());
+ setuid (getuid());
+ (*execrtn) (name,argv);
+ fprintf (stderr,"run: can't exec %s\n",name);
+ _exit (0377);
+ }
+
+ ignoresig.sv_handler = SIG_IGN; /* ignore INT and QUIT signals */
+ ignoresig.sv_mask = 0;
+ ignoresig.sv_onstack = 0;
+ sigvec (SIGINT,&ignoresig,&intsig);
+ sigvec (SIGQUIT,&ignoresig,&quitsig);
+ do {
+ wpid = wait3 (&status.w_status, WUNTRACED, 0);
+ if (WIFSTOPPED (status)) {
+ kill (0,SIGTSTP);
+ wpid = 0;
+ }
+ } while (wpid != pid && wpid != -1);
+ sigvec (SIGINT,&intsig,0); /* restore signals */
+ sigvec (SIGQUIT,&quitsig,0);
+
+ if (WIFSIGNALED (status) || status.w_retcode == 0377)
+ return (-1);
+
+ return (status.w_retcode);
+}