/*1* Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2008, 20092* The President and Fellows of Harvard College.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7* 1. Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9* 2. Redistributions in binary form must reproduce the above copyright10* notice, this list of conditions and the following disclaimer in the11* documentation and/or other materials provided with the distribution.12* 3. Neither the name of the University nor the names of its contributors13* may be used to endorse or promote products derived from this software14* without specific prior written permission.15*16* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND17* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE18* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE19* ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE20* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL21* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS22* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)23* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT24* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY25* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF26* SUCH DAMAGE.27*/2829#include <errno.h>30#include <stdlib.h>31#include <unistd.h>32#include <string.h>3334/*35* system(): ANSI C36*37* Run a command.38*/3940#define MAXCMDSIZE 204841#define MAXARGS 1284243int44system(const char *cmd)45{46/*47* Ordinarily, you call the shell to process the command.48* But we don't know that the shell can do that. So, do it49* ourselves.50*/5152char tmp[MAXCMDSIZE];53char *argv[MAXARGS+1];54int nargs=0;55char *s;56int pid, status;5758if (strlen(cmd) >= sizeof(tmp)) {59errno = E2BIG;60return -1;61}62strcpy(tmp, cmd);6364for (s = strtok(tmp, " \t"); s; s = strtok(NULL, " \t")) {65if (nargs < MAXARGS) {66argv[nargs++] = s;67}68else {69errno = E2BIG;70return 1;71}72}7374argv[nargs] = NULL;7576pid = fork();77switch (pid) {78case -1:79return -1;80case 0:81/* child */82execv(argv[0], argv);83/* exec only returns if it fails */84_exit(255);85default:86/* parent */87waitpid(pid, &status, 0);88return status;89}90}919293