/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 1988 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
#pragma ident "%Z%%M% %I% %E% SMI"
#include "uucp.h"
/*
* use shell to execute command with
* fi, fo, and fe as standard input/output/error
* cmd -> command to execute
* fi -> standard input
* fo -> standard output
* fe -> standard error
* return:
* 0 -> success
* non zero -> failure - status from child
(Note - -1 means the fork failed)
*/
int
shio(cmd, fi, fo, fe)
char *cmd, *fi, *fo, *fe;
{
register pid_t pid, ret;
int status;
if (fi == NULL)
fi = "/dev/null";
if (fo == NULL)
fo = "/dev/null";
if (fe == NULL)
fe = "/dev/null";
DEBUG(3, "shio - %s\n", cmd);
if ((pid = fork()) == 0) {
(void) signal(SIGINT, SIG_IGN);
(void) signal(SIGHUP, SIG_IGN);
(void) signal(SIGQUIT, SIG_IGN);
ucloselog();
(void) close(Ifn); /* close connection fd's */
(void) close(Ofn);
(void) close(0); /* get stdin from file fi */
if (open(fi, 0) != 0)
exit(errno);
(void) close(1); /* divert stdout to fo */
if (creat(fo, PUB_FILEMODE) != 1)
exit(errno);
(void) close(2); /* divert stderr to fe */
if (creat(fe, PUB_FILEMODE) != 2)
exit(errno);
(void) execle(SHELL, "sh", "-c", cmd, (char *) 0, Env);
exit(100);
}
/*
* the status returned from wait can never be -1
* see man page wait(2)
* So we use the -1 value to indicate fork failed
* or the wait failed.
*/
if (pid == -1)
return(-1);
while ((ret = wait(&status)) != pid)
if (ret == -1 && errno != EINTR)
return(-1);
DEBUG(3, "status %d\n", status);
return(status);
}