=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/less/lsystem.c,v retrieving revision 1.9 retrieving revision 1.10 diff -c -r1.9 -r1.10 *** src/usr.bin/less/lsystem.c 2014/04/25 13:38:21 1.9 --- src/usr.bin/less/lsystem.c 2015/11/05 22:08:44 1.10 *************** *** 6,13 **** * * For more information, see the README file. */ - /* * Routines to execute other programs. * Necessarily very OS dependent. --- 6,16 ---- * * For more information, see the README file. */ + /* + * Modified for use with illumos. + * Copyright 2014 Garrett D'Amore + */ /* * Routines to execute other programs. * Necessarily very OS dependent. *************** *** 17,56 **** #include #include "position.h" - #if MSDOS_COMPILER - #include - #ifdef _MSC_VER - #include - #define setdisk(n) _chdrive((n)+1) - #else - #include - #endif - #endif - extern int screen_trashed; extern IFILE curr_ifile; - #if HAVE_SYSTEM - /* * Pass the specified command to a shell to be executed. * Like plain "system()", but handles resetting terminal modes, etc. */ ! public void ! lsystem(cmd, donemsg) ! char *cmd; ! char *donemsg; { ! register int inp; ! #if HAVE_SHELL ! register char *shell; ! register char *p; ! #endif IFILE save_ifile; - #if MSDOS_COMPILER && MSDOS_COMPILER!=WIN32C - char cwd[FILENAME_MAX+1]; - #endif /* * Print the command which is to be executed, --- 20,41 ---- #include #include "position.h" extern int screen_trashed; extern IFILE curr_ifile; + static int pipe_data(char *cmd, off_t spos, off_t epos); /* * Pass the specified command to a shell to be executed. * Like plain "system()", but handles resetting terminal modes, etc. */ ! void ! lsystem(const char *cmd, const char *donemsg) { ! int inp; ! char *shell; ! char *p; IFILE save_ifile; /* * Print the command which is to be executed, *************** *** 58,88 **** */ if (cmd[0] == '-') cmd++; ! else ! { clear_bot(); putstr("!"); putstr(cmd); putstr("\n"); } - #if MSDOS_COMPILER - #if MSDOS_COMPILER==WIN32C - if (*cmd == '\0') - cmd = getenv("COMSPEC"); - #else /* - * Working directory is global on MSDOS. - * The child might change the working directory, so we - * must save and restore CWD across calls to "system", - * or else we won't find our file when we return and - * try to "reedit_ifile" it. - */ - getcwd(cwd, FILENAME_MAX); - #endif - #endif - - /* * Close the current input file. */ save_ifile = save_curr_ifile(); --- 43,56 ---- */ if (cmd[0] == '-') cmd++; ! else { clear_bot(); putstr("!"); putstr(cmd); putstr("\n"); } /* * Close the current input file. */ save_ifile = save_curr_ifile(); *************** *** 94,124 **** deinit(); flush(); /* Make sure the deinit chars get out */ raw_mode(0); - #if MSDOS_COMPILER==WIN32C - close_getchr(); - #endif /* * Restore signals to their defaults. */ init_signals(0); - #if HAVE_DUP /* * Force standard input to be the user's terminal ! * (the normal standard input), even if less's standard input * is coming from a pipe. */ inp = dup(0); ! close(0); ! #if OS2 ! /* The __open() system call translates "/dev/tty" to "con". */ ! if (__open("/dev/tty", OPEN_READ) < 0) ! #else if (open("/dev/tty", OPEN_READ) < 0) ! #endif ! dup(inp); ! #endif /* * Pass the command to the system to be executed. --- 62,82 ---- deinit(); flush(); /* Make sure the deinit chars get out */ raw_mode(0); /* * Restore signals to their defaults. */ init_signals(0); /* * Force standard input to be the user's terminal ! * (the normal standard input), even if less's standard input * is coming from a pipe. */ inp = dup(0); ! (void) close(0); if (open("/dev/tty", OPEN_READ) < 0) ! (void) dup(inp); /* * Pass the command to the system to be executed. *************** *** 126,242 **** * <$SHELL -c "command"> instead of just . * If the command is empty, just invoke a shell. */ - #if HAVE_SHELL p = NULL; ! if ((shell = lgetenv("SHELL")) != NULL && *shell != '\0') ! { ! if (*cmd == '\0') p = save(shell); ! else ! { char *esccmd = shell_quote(cmd); ! if (esccmd != NULL) ! { ! size_t len = strlen(shell) + strlen(esccmd) + 5; ! p = (char *) ecalloc(len, sizeof(char)); ! SNPRINTF3(p, len, "%s %s %s", shell, shell_coption(), esccmd); free(esccmd); } } } ! if (p == NULL) ! { if (*cmd == '\0') p = save("sh"); else p = save(cmd); } ! system(p); free(p); - #else - #if MSDOS_COMPILER==DJGPPC - /* - * Make stdin of the child be in cooked mode. - */ - setmode(0, O_TEXT); - /* - * We don't need to catch signals of the child (it - * also makes trouble with some DPMI servers). - */ - __djgpp_exception_toggle(); - system(cmd); - __djgpp_exception_toggle(); - #else - system(cmd); - #endif - #endif - #if HAVE_DUP /* * Restore standard input, reset signals, raw mode, etc. */ ! close(0); ! dup(inp); ! close(inp); ! #endif - #if MSDOS_COMPILER==WIN32C - open_getchr(); - #endif init_signals(1); raw_mode(1); ! if (donemsg != NULL) ! { putstr(donemsg); putstr(" (press RETURN)"); get_return(); ! putchr('\n'); flush(); } init(); screen_trashed = 1; - #if MSDOS_COMPILER && MSDOS_COMPILER!=WIN32C /* - * Restore the previous directory (possibly - * changed by the child program we just ran). - */ - chdir(cwd); - #if MSDOS_COMPILER != DJGPPC - /* - * Some versions of chdir() don't change to the drive - * which is part of CWD. (DJGPP does this in chdir.) - */ - if (cwd[1] == ':') - { - if (cwd[0] >= 'a' && cwd[0] <= 'z') - setdisk(cwd[0] - 'a'); - else if (cwd[0] >= 'A' && cwd[0] <= 'Z') - setdisk(cwd[0] - 'A'); - } - #endif - #endif - - /* * Reopen the current input file. */ reedit_ifile(save_ifile); - #if defined(SIGWINCH) || defined(SIGWIND) /* * Since we were ignoring window change signals while we executed * the system command, we must assume the window changed. * Warning: this leaves a signal pending (in "sigs"), * so psignals() should be called soon after lsystem(). */ ! winch(0); ! #endif } - #endif - - #if PIPEC - /* * Pipe a section of the input file into the given shell command. * The section to be piped is the section "between" the current --- 84,143 ---- * <$SHELL -c "command"> instead of just . * If the command is empty, just invoke a shell. */ p = NULL; ! if ((shell = lgetenv("SHELL")) != NULL && *shell != '\0') { ! if (*cmd == '\0') { p = save(shell); ! } else { char *esccmd = shell_quote(cmd); ! if (esccmd != NULL) { ! p = easprintf("%s -c %s", shell, esccmd); free(esccmd); } } } ! if (p == NULL) { if (*cmd == '\0') p = save("sh"); else p = save(cmd); } ! (void) system(p); free(p); /* * Restore standard input, reset signals, raw mode, etc. */ ! (void) close(0); ! (void) dup(inp); ! (void) close(inp); init_signals(1); raw_mode(1); ! if (donemsg != NULL) { putstr(donemsg); putstr(" (press RETURN)"); get_return(); ! (void) putchr('\n'); flush(); } init(); screen_trashed = 1; /* * Reopen the current input file. */ reedit_ifile(save_ifile); /* * Since we were ignoring window change signals while we executed * the system command, we must assume the window changed. * Warning: this leaves a signal pending (in "sigs"), * so psignals() should be called soon after lsystem(). */ ! sigwinch(0); } /* * Pipe a section of the input file into the given shell command. * The section to be piped is the section "between" the current *************** *** 249,260 **** * If the mark is on the current screen, or if the mark is ".", * the whole current screen is piped. */ ! public int ! pipe_mark(c, cmd) ! int c; ! char *cmd; { ! POSITION mpos, tpos, bpos; /* * mpos = the marked position. --- 150,159 ---- * If the mark is on the current screen, or if the mark is ".", * the whole current screen is piped. */ ! int ! pipe_mark(int c, char *cmd) { ! off_t mpos, tpos, bpos; /* * mpos = the marked position. *************** *** 262,297 **** * bpos = bottom of screen. */ mpos = markpos(c); ! if (mpos == NULL_POSITION) return (-1); tpos = position(TOP); ! if (tpos == NULL_POSITION) tpos = ch_zero(); bpos = position(BOTTOM); ! if (c == '.') ! return (pipe_data(cmd, tpos, bpos)); ! else if (mpos <= tpos) ! return (pipe_data(cmd, mpos, bpos)); ! else if (bpos == NULL_POSITION) ! return (pipe_data(cmd, tpos, bpos)); ! else ! return (pipe_data(cmd, tpos, mpos)); } /* * Create a pipe to the given shell command. * Feed it the file contents between the positions spos and epos. */ ! public int ! pipe_data(cmd, spos, epos) ! char *cmd; ! POSITION spos; ! POSITION epos; { ! register FILE *f; ! register int c; ! extern FILE *popen(); /* * This is structured much like lsystem(). --- 161,192 ---- * bpos = bottom of screen. */ mpos = markpos(c); ! if (mpos == -1) return (-1); tpos = position(TOP); ! if (tpos == -1) tpos = ch_zero(); bpos = position(BOTTOM); ! if (c == '.') ! return (pipe_data(cmd, tpos, bpos)); ! else if (mpos <= tpos) ! return (pipe_data(cmd, mpos, bpos)); ! else if (bpos == -1) ! return (pipe_data(cmd, tpos, bpos)); ! else ! return (pipe_data(cmd, tpos, mpos)); } /* * Create a pipe to the given shell command. * Feed it the file contents between the positions spos and epos. */ ! static int ! pipe_data(char *cmd, off_t spos, off_t epos) { ! FILE *f; ! int c; /* * This is structured much like lsystem(). *************** *** 299,312 **** * to perform the necessary deinitialization before running * the command, and reinitialization after it. */ ! if (ch_seek(spos) != 0) ! { error("Cannot seek to start position", NULL_PARG); return (-1); } ! if ((f = popen(cmd, "w")) == NULL) ! { error("Cannot create pipe", NULL_PARG); return (-1); } --- 194,205 ---- * to perform the necessary deinitialization before running * the command, and reinitialization after it. */ ! if (ch_seek(spos) != 0) { error("Cannot seek to start position", NULL_PARG); return (-1); } ! if ((f = popen(cmd, "w")) == NULL) { error("Cannot create pipe", NULL_PARG); return (-1); } *************** *** 319,334 **** flush(); raw_mode(0); init_signals(0); - #if MSDOS_COMPILER==WIN32C - close_getchr(); - #endif - #ifdef SIGPIPE LSIGNAL(SIGPIPE, SIG_IGN); - #endif c = EOI; ! while (epos == NULL_POSITION || spos++ <= epos) ! { /* * Read a character from the file and give it to the pipe. */ --- 212,221 ---- flush(); raw_mode(0); init_signals(0); LSIGNAL(SIGPIPE, SIG_IGN); c = EOI; ! while (epos == -1 || spos++ <= epos) { /* * Read a character from the file and give it to the pipe. */ *************** *** 342,373 **** /* * Finish up the last line. */ ! while (c != '\n' && c != EOI ) ! { ! c = ch_forw_get(); ! if (c == EOI) ! break; ! if (putc(c, f) == EOF) ! break; ! } ! pclose(f); - #ifdef SIGPIPE LSIGNAL(SIGPIPE, SIG_DFL); - #endif - #if MSDOS_COMPILER==WIN32C - open_getchr(); - #endif init_signals(1); raw_mode(1); init(); screen_trashed = 1; - #if defined(SIGWINCH) || defined(SIGWIND) /* {{ Probably don't need this here. }} */ ! winch(0); ! #endif return (0); } - - #endif --- 229,250 ---- /* * Finish up the last line. */ ! while (c != '\n' && c != EOI) { ! c = ch_forw_get(); ! if (c == EOI) ! break; ! if (putc(c, f) == EOF) ! break; ! } ! (void) pclose(f); LSIGNAL(SIGPIPE, SIG_DFL); init_signals(1); raw_mode(1); init(); screen_trashed = 1; /* {{ Probably don't need this here. }} */ ! sigwinch(0); return (0); }