|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: * ! 6: * @(#)system_.c 5.1 6/7/85 ! 7: */ ! 8: ! 9: /* ! 10: * execute a unix command ! 11: * ! 12: * calling sequence: ! 13: * iexit = system(command) ! 14: * where: ! 15: * iexit will return the exit status of the command ! 16: * command is a character string containing the command to be executed ! 17: */ ! 18: ! 19: #include "../libI77/fiodefs.h" ! 20: #include "../libI77/f_errno.h" ! 21: #include <sys/param.h> ! 22: #ifndef NCARGS ! 23: #define NCARGS 256 ! 24: #endif ! 25: ! 26: ! 27: long system_(s, n) ! 28: char *s; ! 29: long n; ! 30: { ! 31: char buf[NCARGS - 50]; ! 32: long i; ! 33: ! 34: if (n >= sizeof buf) ! 35: return(-(long)(errno=F_ERARG)); ! 36: for (i = 0; i < MXUNIT; i++) ! 37: flush_(&i); ! 38: g_char(s, n, buf); ! 39: return((long)system(buf)); ! 40: } ! 41: ! 42: /* ! 43: * this is a sane version of the libc/stdio routine. ! 44: */ ! 45: ! 46: #include <signal.h> ! 47: ! 48: char *getenv(); ! 49: char *rindex(); ! 50: ! 51: system(s) ! 52: char *s; ! 53: { ! 54: register int (*istat)(), (*qstat)(); ! 55: int status, pid, w; ! 56: char *shname, *shell; ! 57: ! 58: if ((shell = getenv("SHELL")) == NULL) ! 59: shell = "/bin/sh"; ! 60: ! 61: if (shname = rindex(shell, '/')) ! 62: shname++; ! 63: else ! 64: shname = shell; ! 65: ! 66: if ((pid = fork()) == 0) { ! 67: execl(shell, shname, "-c", s, 0); ! 68: _exit(127); ! 69: } ! 70: istat = signal(SIGINT, SIG_IGN); ! 71: qstat = signal(SIGQUIT, SIG_IGN); ! 72: while ((w = wait(&status)) != pid && w != -1) ! 73: ; ! 74: if (w == -1) ! 75: status = -1; ! 76: signal(SIGINT, istat); ! 77: signal(SIGQUIT, qstat); ! 78: return(status); ! 79: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.