/* * Copyright (c) 1999 * Steven G. Kargl. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * This software is provided by Steven G. Kargl and contributors ``as is'' and * any express or implied warranties, including, but not limited to, the implied * warranties of merchantability and fitness for a particular purpose are * disclaimed. In no event shall Steven G. Kargl or contributors be liable for * any direct, indirect, incidental, special, exemplary, or consequential * damages (including, but not limited to, procurement of substitute goods or * services; loss of use, data, or profits; or business interruption) however * caused and on any theory of liability, whether in contract, strict liability, * or tort (including negligence or otherwise) arising in any way out of the * use of this software, even if advised of the possibility of such damage. */ #include #include #include #include int phase(char *cmd, char **cmdline) { int retval = 0; int status; pid_t wait_pid, child_pid; switch((child_pid = fork())) { case -1: /* Problem creating child process */ retval = -4; break; case 0: execvp(cmd, cmdline); /* Child process returned! */ retval = -3; break; default: /* Parent should wait until the child returns */ do { wait_pid = wait(&status); /* Abnormal child status? */ if (wait_pid == -1) retval = -2; } while (wait_pid != child_pid); } /* Abnormal termination of child?*/ if (!WIFEXITED(status) || WIFSIGNALED(status)) retval = -1; return retval; }