diff options
author | 2015-11-05 22:08:43 +0000 | |
---|---|---|
committer | 2015-11-05 22:08:43 +0000 | |
commit | 171bb95ef02ab888b255f8a2d9761d65084d09a0 (patch) | |
tree | 30c258d5091d73ff2b2fcbadb7db94c04d8f98f4 /usr.bin/less/lsystem.c | |
parent | Cast Td4[] values (which are uint8_t) to uint32_t before shifting them left by (diff) | |
download | wireguard-openbsd-171bb95ef02ab888b255f8a2d9761d65084d09a0.tar.xz wireguard-openbsd-171bb95ef02ab888b255f8a2d9761d65084d09a0.zip |
Replace less with the cleaned-up fork of less 458 maintained by Garrett
D'Amore at https://github.com/gdamore/less-fork. This has significantly
less portability goop, has a tidied up code style, uses terminfo instead
of termcap, and is has stricter POSIX compliance.
Many of our local changes have been accepted upstream: substantial
remaining local changes are code to read help files from /usr/share
rather than compiling them in, man page and help improvements, and some
tweaks to the default options.
Review and testing by millert, ok deraadt
Diffstat (limited to 'usr.bin/less/lsystem.c')
-rw-r--r-- | usr.bin/less/lsystem.c | 235 |
1 files changed, 56 insertions, 179 deletions
diff --git a/usr.bin/less/lsystem.c b/usr.bin/less/lsystem.c index 7662d2c26a5..4cc9d54f117 100644 --- a/usr.bin/less/lsystem.c +++ b/usr.bin/less/lsystem.c @@ -6,7 +6,10 @@ * * For more information, see the README file. */ - +/* + * Modified for use with illumos. + * Copyright 2014 Garrett D'Amore <garrett@damore.org> + */ /* * Routines to execute other programs. @@ -17,40 +20,22 @@ #include <signal.h> #include "position.h" -#if MSDOS_COMPILER -#include <dos.h> -#ifdef _MSC_VER -#include <direct.h> -#define setdisk(n) _chdrive((n)+1) -#else -#include <dir.h> -#endif -#endif - extern int screen_trashed; extern IFILE curr_ifile; - -#if HAVE_SYSTEM +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. */ - public void -lsystem(cmd, donemsg) - char *cmd; - char *donemsg; +void +lsystem(const char *cmd, const char *donemsg) { - register int inp; -#if HAVE_SHELL - register char *shell; - register char *p; -#endif + int inp; + char *shell; + char *p; IFILE save_ifile; -#if MSDOS_COMPILER && MSDOS_COMPILER!=WIN32C - char cwd[FILENAME_MAX+1]; -#endif /* * Print the command which is to be executed, @@ -58,30 +43,13 @@ lsystem(cmd, donemsg) */ if (cmd[0] == '-') cmd++; - else - { + 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. */ @@ -94,31 +62,21 @@ lsystem(cmd, donemsg) 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 + * (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 + (void) close(0); if (open("/dev/tty", OPEN_READ) < 0) -#endif - dup(inp); -#endif + (void) dup(inp); /* * Pass the command to the system to be executed. @@ -126,117 +84,60 @@ lsystem(cmd, donemsg) * <$SHELL -c "command"> instead of just <command>. * If the command is empty, just invoke a shell. */ -#if HAVE_SHELL p = NULL; - if ((shell = lgetenv("SHELL")) != NULL && *shell != '\0') - { - if (*cmd == '\0') + if ((shell = lgetenv("SHELL")) != NULL && *shell != '\0') { + if (*cmd == '\0') { p = save(shell); - else - { + } 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); + if (esccmd != NULL) { + p = easprintf("%s -c %s", shell, esccmd); free(esccmd); } } } - if (p == NULL) - { + if (p == NULL) { if (*cmd == '\0') p = save("sh"); else p = save(cmd); } - system(p); + (void) 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 + (void) close(0); + (void) dup(inp); + (void) close(inp); -#if MSDOS_COMPILER==WIN32C - open_getchr(); -#endif init_signals(1); raw_mode(1); - if (donemsg != NULL) - { + if (donemsg != NULL) { putstr(donemsg); putstr(" (press RETURN)"); get_return(); - putchr('\n'); + (void) 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 + sigwinch(0); } -#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 @@ -249,12 +150,10 @@ lsystem(cmd, donemsg) * 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; +int +pipe_mark(int c, char *cmd) { - POSITION mpos, tpos, bpos; + off_t mpos, tpos, bpos; /* * mpos = the marked position. @@ -262,36 +161,32 @@ pipe_mark(c, cmd) * bpos = bottom of screen. */ mpos = markpos(c); - if (mpos == NULL_POSITION) + if (mpos == -1) return (-1); tpos = position(TOP); - if (tpos == NULL_POSITION) + 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 == NULL_POSITION) - return (pipe_data(cmd, tpos, bpos)); - else - return (pipe_data(cmd, tpos, mpos)); + 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. */ - public int -pipe_data(cmd, spos, epos) - char *cmd; - POSITION spos; - POSITION epos; +static int +pipe_data(char *cmd, off_t spos, off_t epos) { - register FILE *f; - register int c; - extern FILE *popen(); + FILE *f; + int c; /* * This is structured much like lsystem(). @@ -299,14 +194,12 @@ pipe_data(cmd, spos, epos) * to perform the necessary deinitialization before running * the command, and reinitialization after it. */ - if (ch_seek(spos) != 0) - { + if (ch_seek(spos) != 0) { error("Cannot seek to start position", NULL_PARG); return (-1); } - if ((f = popen(cmd, "w")) == NULL) - { + if ((f = popen(cmd, "w")) == NULL) { error("Cannot create pipe", NULL_PARG); return (-1); } @@ -319,16 +212,10 @@ pipe_data(cmd, spos, epos) 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) - { + while (epos == -1 || spos++ <= epos) { /* * Read a character from the file and give it to the pipe. */ @@ -342,32 +229,22 @@ pipe_data(cmd, spos, epos) /* * Finish up the last line. */ - while (c != '\n' && c != EOI ) - { - c = ch_forw_get(); - if (c == EOI) - break; - if (putc(c, f) == EOF) - break; - } + while (c != '\n' && c != EOI) { + c = ch_forw_get(); + if (c == EOI) + break; + if (putc(c, f) == EOF) + break; + } - pclose(f); + (void) 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 + sigwinch(0); return (0); } - -#endif |