=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mg/spawn.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- src/usr.bin/mg/spawn.c 2000/02/25 19:13:21 1.2 +++ src/usr.bin/mg/spawn.c 2000/03/03 19:31:26 1.3 @@ -1,116 +1,39 @@ /* - * Name: MicroGnuEmacs - * Spawn CLI for System V. - * - * Spawn for System V. + * Spawn. Actually just suspends Mg. + * Assumes POSIX job control. */ #include "def.h" #include +#include -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. + * This causes mg to send itself a stop signal. + * Assumes the parent shell supports POSIX job control. + * If the terminal supports an alternate screen, we will sitch to it. */ +/* ARGSUSED */ spawncli(f, n) { - register int pid; - register int wpid; - register void (*oqsig)(); - register void (*oisig)(); - int status; - int errp = FALSE; + sigset_t oset; + int ttputc __P((int)); /* XXX */ - 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; - - } + /* Very similar to what vttidy() does. */ ttcolor(CTEXT); ttnowindow(); - ttmove(nrow-1, 0); + 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); + if (ttcooked() == FALSE) + return (FALSE); + tttidy(); /* Exit application mode and tidy. */ + ttflush(); + (void) sigprocmask(SIG_SETMASK, NULL, &oset); (void) kill(0, SIGTSTP); - sigprocmask(SIG_SETMASK, &oldsig, NULL); -#else - getchar(); -#endif - ttopen(); - setttysize(); - ttwindow(); - - return ( 0 ); + (void) sigprocmask(SIG_SETMASK, &oset, NULL); + ttreinit(); + sgarbf = TRUE; /* Force repaint. */ + return ttraw(); }