summaryrefslogtreecommitdiffstats
path: root/usr.bin/less/lsystem.c
diff options
context:
space:
mode:
authornicm <nicm@openbsd.org>2015-11-05 22:08:43 +0000
committernicm <nicm@openbsd.org>2015-11-05 22:08:43 +0000
commit171bb95ef02ab888b255f8a2d9761d65084d09a0 (patch)
tree30c258d5091d73ff2b2fcbadb7db94c04d8f98f4 /usr.bin/less/lsystem.c
parentCast Td4[] values (which are uint8_t) to uint32_t before shifting them left by (diff)
downloadwireguard-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.c235
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