/* ARGSUSED */ int spawncli(int f, int n) { /* i never thought i'd see an ifdef like this one... strange bedfellows */ #if DISP_X11 || SYS_WIN31 mlforce("[This version of vile cannot spawn an interactive shell]"); return FALSE; #else #if SYS_UNIX bottomleft(); ttclean(TRUE); TTputc('\n'); (void)system_SHELL((char *)0); TTflush(); ttunclean(); sgarbf = TRUE; return AfterShell(); #endif /* SYS_UNIX */ #if SYS_VMS bottomleft(); mlforce("[Starting DCL]\r\n"); TTflush(); /* Ignore "ttcol". */ sgarbf = TRUE; return sys(NULL); /* NULL => DCL. */ #endif #if SYS_MSDOS || SYS_OS2 || SYS_WINNT bottomleft(); TTflush(); TTkclose(); { char *shell; if ((shell = getenv("COMSPEC")) == NULL) { #if SYS_OS2 shell = "cmd.exe"; #else shell = "command.com"; #endif system(shell); /* Will search path */ } else { #if SYS_OS2 /* * spawn it if we know it. Some 3rd party command processors fail * if they system themselves (eg 4OS2). CCM 24-MAR-94 */ spawnl( P_WAIT, shell, shell, NULL); #else system(shell); #endif } } TTkopen(); sgarbf = TRUE; return AfterShell(); #endif #endif }
/*ARGSUSED*/ SIGT rtfrmshell(int ACTUAL_SIG_ARGS) { #if SYS_UNIX && defined(SIGTSTP) # if ! DISP_X11 ttunclean(); sgarbf = TRUE; # if SYS_APOLLO (void)TTgetc(); /* have to skip a character */ ttunclean(); /* ...so that I can finally suppress echo */ # endif TTkopen(); setup_handler(SIGCONT,rtfrmshell); /* suspend & restart */ (void)update(TRUE); # endif #endif #ifdef MDCHK_MODTIME (void)check_visible_modtimes(); #endif SIGRET; }
/* the #ifdefs have been totally separated, for readability */ static int spawn1(int rerun, int pressret) { #if DISP_IBMPC int closed; #endif #if COMMON_SH_PROMPT register int s; char line[NLINE]; /* command line send to shell */ if ((s = ShellPrompt(&save_shell[0], line, rerun)) != TRUE) return s; #endif /* COMMON_SH_PROMPT */ /* take care of autowrite */ if (writeall(FALSE,1,FALSE,TRUE,TRUE) != TRUE) return FALSE; #if SYS_UNIX #if DISP_X11 (void)system_SHELL(line); #else ttclean(TRUE); (void)system_SHELL(line); TTflush(); ttunclean(); if (pressret) pressreturn(); TTopen(); TTkopen(); TTflush(); sgarbf = TRUE; #endif /* DISP_X11 */ return AfterShell(); #endif /* SYS_UNIX */ #if SYS_VMS TTputc('\n'); /* Already have '\r' */ TTflush(); s = sys(line); /* Run the command. */ mlforce("\r\n\n[End]"); /* Pause. */ TTflush(); (void)keystroke(); sgarbf = TRUE; return (s); #endif #if SYS_WIN31 mlforce("[Not in Windows 3.1]"); return FALSE; #endif #if SYS_MSDOS || SYS_OS2 || SYS_WINNT bottomleft(); TTputc('\n'); TTflush(); TTkclose(); #if DISP_IBMPC /* If we don't reset to 80x25, parts of the shell-output will go * astray. */ closed = term.t_ncol != 80 || term.t_nrow != 25; if (closed) TTclose(); #endif system(line); TTkopen(); /* if we are interactive, pause here */ if (pressret) { pressreturn(); } #if DISP_IBMPC /* Reopen the display _after_ the prompt, to keep the shell-output * in the same type of screen as the prompt. */ if (closed) TTopen(); #endif sgarbf = TRUE; return AfterShell(); #endif }
void ttopen() { int s; s = tcgetattr(0, &otermios); if (s < 0) { perror("ttopen tcgetattr"); ExitProgram(BAD(1)); } /* the "|| USG" below is to support SVR4 -- let me know if it conflicts on other systems */ #if ODT || ISC || USG setvbuf(stdout, tobuf, _IOLBF, TBUFSIZ); #else setbuffer(stdout, tobuf, TBUFSIZ); #endif suspc = otermios.c_cc[VSUSP]; intrc = otermios.c_cc[VINTR]; killc = otermios.c_cc[VKILL]; startc = otermios.c_cc[VSTART]; stopc = otermios.c_cc[VSTOP]; backspc = otermios.c_cc[VERASE]; #ifdef VWERASE /* Sun has it. any others? */ wkillc = otermios.c_cc[VWERASE]; #else wkillc = tocntrl('W'); #endif /* this could probably be done more POSIX'ish? */ (void)signal(SIGTSTP,SIG_DFL); /* set signals so that we can */ (void)signal(SIGCONT,rtfrmshell); /* suspend & restart */ (void)signal(SIGTTOU,SIG_IGN); /* ignore output prevention */ #if USE_FCNTL kbd_flags = fcntl( 0, F_GETFL, 0 ); kbd_is_polled = FALSE; #endif #if ! X11 ntermios = otermios; /* setup new settings, preserve flow control, and allow BREAK */ ntermios.c_iflag = BRKINT|(otermios.c_iflag & (IXON|IXANY|IXOFF)); ntermios.c_oflag = 0; ntermios.c_lflag = ISIG; ntermios.c_cc[VMIN] = 1; ntermios.c_cc[VTIME] = 0; #ifdef VSWTCH ntermios.c_cc[VSWTCH] = -1; #endif ntermios.c_cc[VSUSP] = -1; ntermios.c_cc[VSTART] = -1; ntermios.c_cc[VSTOP] = -1; #endif ttmiscinit(); ttunclean(); }