[BACK]Return to spawn.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / mg

File: [local] / src / usr.bin / mg / spawn.c (download)

Revision 1.2, Fri Feb 25 19:13:21 2000 UTC (24 years, 3 months ago) by deraadt
Branch: MAIN
Changes since 1.1: +2 -6 lines

further pruning

/*
 * Name:	MicroGnuEmacs
 *		Spawn CLI for System V.
 *
 * Spawn for System V.
 */
#include	"def.h"

#include	<signal.h>

char	*shellp	= NULL;			/* Saved "SHELL" program.	*/
char	*shname = NULL;			/* Saved shell name		*/

/*
 * On System V, we no gots job control, so always run
 * a subshell using fork/exec. Bound to "C-C", and used
 * as a subcommand by "C-Z". (daveb)
 *
 * Returns 0 if the shell executed OK, something else if
 * we couldn't start shell or it exited badly.
 */
spawncli(f, n)
{
	register int	pid;
	register int	wpid;
	register void	(*oqsig)();
	register void	(*oisig)();
	int		status;
	int		errp = FALSE;

	if (shellp == NULL) {
		shellp = getenv("SHELL");
		if (shellp == NULL)
			shellp = getenv("shell");
		if (shellp == NULL)
			shellp = "/bin/sh";	/* Safer.		*/
		shname = strrchr( shellp, '/' ); 
		shname = shname ? shname++ : shellp;
		
	}
	ttcolor(CTEXT);
	ttnowindow();
	ttmove(nrow-1, 0);
	if (epresf != FALSE) {
		tteeol();
		epresf = FALSE;
	}
	ttclose();
	sgarbf = TRUE;				/* Force repaint.	*/
	oqsig = signal(SIGQUIT, SIG_IGN);
	oisig = signal(SIGINT,  SIG_IGN);
	if ((pid=fork()) == 0) {
		(void) signal(SIGINT, oisig);
		(void) signal(SIGQUIT, oqsig);
		execlp(shellp, shname, "-i", (char *)NULL);
		_exit(1);			/* Should do better!	*/
	}
	else if (pid > 0) {
		while ((wpid=wait(&status))>=0 && wpid!=pid)
			;
	}
	else errp = TRUE;

	signal(SIGINT,  oisig);
	signal(SIGQUIT, oqsig);
	ttopen();
	setttysize();
	ttwindow();

	if(errp)
		ewprintf("Failed to create process");

	return ( errp | status );
}

/*
 * Put the tty in normal mode, so he can do a second ^Z.  Then
 * wait for a char.  To use ^Z^Z to suspend and "fg %mg CR CR"
 * to continue;
 *
 * Returns 0 if it works, which presumably it must.
 */
attachtoparent(f, n)
{
	register int	pid;
	register int	wpid;
	register int	(*oqsig)();
	register int	(*oisig)();
	int		status;
	int		errp = FALSE;
	int		omask;
	sigset_t	newsig,oldsig;

	ttcolor(CTEXT);
	ttnowindow();
	ttmove(nrow-1, 0);
	if (epresf != FALSE) {
		tteeol();
		epresf = FALSE;
	}
	ttclose();
	sgarbf = TRUE;				/* Force repaint.	*/
#ifdef SIGTSTP
	sigemptyset(&newsig);
	sigprocmask(SIG_SETMASK, &newsig, &oldsig);
	(void) kill(0, SIGTSTP);
	sigprocmask(SIG_SETMASK, &oldsig, NULL);
#else
	getchar();
#endif
	ttopen();
	setttysize();
	ttwindow();

	return ( 0 );
}