/*
* 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 <sys/param.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
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;
}
syntax highlighted by Code2HTML, v. 0.9.1