tweaks: use the standard symbols for the three standard file descriptors

Also, take into account (as elsewhere) that dup2() could fail,
and harmonize their error checks.
master
Benno Schulenberg 2020-10-10 11:43:55 +02:00
parent bc14fc35d7
commit e1601d2eb5
4 changed files with 24 additions and 24 deletions

View File

@ -135,8 +135,6 @@
#define BAD_COLOR -2 #define BAD_COLOR -2
#endif #endif
#define STANDARD_INPUT 0
/* Enumeration types. */ /* Enumeration types. */
typedef enum { typedef enum {
NIX_FILE, DOS_FILE, MAC_FILE NIX_FILE, DOS_FILE, MAC_FILE

View File

@ -722,7 +722,7 @@ void read_file(FILE *f, int fd, const char *filename, bool undoable)
/* When reading from stdin, restore the terminal and reenter curses mode. */ /* When reading from stdin, restore the terminal and reenter curses mode. */
if (isendwin()) { if (isendwin()) {
if (!isatty(STANDARD_INPUT)) if (!isatty(STDIN_FILENO))
reconnect_and_store_state(); reconnect_and_store_state();
terminal_init(); terminal_init();
doupdate(); doupdate();
@ -966,13 +966,16 @@ bool execute_command(const char *command)
close(from_fd[0]); close(from_fd[0]);
/* Connect the write end of the output pipe to the process' output streams. */ /* Connect the write end of the output pipe to the process' output streams. */
dup2(from_fd[1], fileno(stdout)); if (dup2(from_fd[1], STDOUT_FILENO) < 0)
dup2(from_fd[1], fileno(stderr)); exit(3);
if (dup2(from_fd[1], STDERR_FILENO) < 0)
exit(4);
/* If the parent sends text, connect the read end of the /* If the parent sends text, connect the read end of the
* feeding pipe to the child's input stream. */ * feeding pipe to the child's input stream. */
if (should_pipe) { if (should_pipe) {
dup2(to_fd[0], fileno(stdin)); if (dup2(to_fd[0], STDIN_FILENO) < 0)
exit(5);
close(to_fd[1]); close(to_fd[1]);
} }
@ -980,7 +983,7 @@ bool execute_command(const char *command)
execl(theshell, tail(theshell), "-c", should_pipe ? &command[1] : command, NULL); execl(theshell, tail(theshell), "-c", should_pipe ? &command[1] : command, NULL);
/* If the exec call returns, there was an error. */ /* If the exec call returns, there was an error. */
exit(1); exit(6);
} }
/* Parent: close the unused write end of the pipe. */ /* Parent: close the unused write end of the pipe. */

View File

@ -225,7 +225,7 @@ void restore_terminal(void)
printf("\x1B[?2004l"); printf("\x1B[?2004l");
fflush(stdout); fflush(stdout);
#endif #endif
tcsetattr(0, TCSANOW, &original_state); tcsetattr(STDIN_FILENO, TCSANOW, &original_state);
} }
/* Exit normally: restore terminal state and report any startup errors. */ /* Exit normally: restore terminal state and report any startup errors. */
@ -813,15 +813,14 @@ void reconnect_and_store_state(void)
{ {
int thetty = open("/dev/tty", O_RDONLY); int thetty = open("/dev/tty", O_RDONLY);
if (thetty < 1) if (thetty < 0 || dup2(thetty, STDIN_FILENO) < 0)
die(_("Could not reconnect stdin to keyboard\n")); die(_("Could not reconnect stdin to keyboard\n"));
dup2(thetty, STANDARD_INPUT);
close(thetty); close(thetty);
/* If input was not cut short, store the current state of the terminal. */ /* If input was not cut short, store the current state of the terminal. */
if (!control_C_was_pressed) if (!control_C_was_pressed)
tcgetattr(0, &original_state); tcgetattr(STDIN_FILENO, &original_state);
} }
/* Read whatever comes from standard input into a new buffer. */ /* Read whatever comes from standard input into a new buffer. */
@ -832,7 +831,7 @@ bool scoop_stdin(void)
restore_terminal(); restore_terminal();
/* When input comes from a terminal, show a helpful message. */ /* When input comes from a terminal, show a helpful message. */
if (isatty(STANDARD_INPUT)) if (isatty(STDIN_FILENO))
fprintf(stderr, _("Reading data from keyboard; " fprintf(stderr, _("Reading data from keyboard; "
"type ^D or ^D^D to finish.\n")); "type ^D or ^D^D to finish.\n"));
@ -1801,16 +1800,16 @@ int main(int argc, char **argv)
struct vt_stat dummy; struct vt_stat dummy;
/* Check whether we're running on a Linux console. */ /* Check whether we're running on a Linux console. */
on_a_vt = (ioctl(1, VT_GETSTATE, &dummy) == 0); on_a_vt = (ioctl(STDOUT_FILENO, VT_GETSTATE, &dummy) == 0);
#endif #endif
/* Back up the terminal settings so that they can be restored. */ /* Back up the terminal settings so that they can be restored. */
tcgetattr(0, &original_state); tcgetattr(STDIN_FILENO, &original_state);
/* Get the state of standard input and ensure it uses blocking mode. */ /* Get the state of standard input and ensure it uses blocking mode. */
stdin_flags = fcntl(0, F_GETFL, 0); stdin_flags = fcntl(STDIN_FILENO, F_GETFL, 0);
if (stdin_flags != -1) if (stdin_flags != -1)
fcntl(0, F_SETFL, stdin_flags & ~O_NONBLOCK); fcntl(STDIN_FILENO, F_SETFL, stdin_flags & ~O_NONBLOCK);
#ifdef ENABLE_UTF8 #ifdef ENABLE_UTF8
/* If setting the locale is successful and it uses UTF-8, we need /* If setting the locale is successful and it uses UTF-8, we need

View File

@ -2340,11 +2340,11 @@ void do_int_speller(const char *tempfile_name)
exit(6); exit(6);
/* Connect standard input to the temporary file. */ /* Connect standard input to the temporary file. */
if (dup2(tempfile_fd, STDIN_FILENO) != STDIN_FILENO) if (dup2(tempfile_fd, STDIN_FILENO) < 0)
exit(7); exit(7);
/* Connect standard output to the write end of the first pipe. */ /* Connect standard output to the write end of the first pipe. */
if (dup2(spell_fd[1], STDOUT_FILENO) != STDOUT_FILENO) if (dup2(spell_fd[1], STDOUT_FILENO) < 0)
exit(8); exit(8);
close(tempfile_fd); close(tempfile_fd);
@ -2365,11 +2365,11 @@ void do_int_speller(const char *tempfile_name)
/* Fork a process to run sort in. */ /* Fork a process to run sort in. */
if ((pid_sort = fork()) == 0) { if ((pid_sort = fork()) == 0) {
/* Connect standard input to the read end of the first pipe. */ /* Connect standard input to the read end of the first pipe. */
if (dup2(spell_fd[0], STDIN_FILENO) != STDIN_FILENO) if (dup2(spell_fd[0], STDIN_FILENO) < 0)
exit(7); exit(7);
/* Connect standard output to the write end of the second pipe. */ /* Connect standard output to the write end of the second pipe. */
if (dup2(sort_fd[1], STDOUT_FILENO) != STDOUT_FILENO) if (dup2(sort_fd[1], STDOUT_FILENO) < 0)
exit(8); exit(8);
close(spell_fd[0]); close(spell_fd[0]);
@ -2387,10 +2387,10 @@ void do_int_speller(const char *tempfile_name)
/* Fork a process to run uniq in. */ /* Fork a process to run uniq in. */
if ((pid_uniq = fork()) == 0) { if ((pid_uniq = fork()) == 0) {
if (dup2(sort_fd[0], STDIN_FILENO) != STDIN_FILENO) if (dup2(sort_fd[0], STDIN_FILENO) < 0)
exit(7); exit(7);
if (dup2(uniq_fd[1], STDOUT_FILENO) != STDOUT_FILENO) if (dup2(uniq_fd[1], STDOUT_FILENO) < 0)
exit(8); exit(8);
close(sort_fd[0]); close(sort_fd[0]);
@ -2607,9 +2607,9 @@ void do_linter(void)
/* Fork a process to run the linter in. */ /* Fork a process to run the linter in. */
if ((pid_lint = fork()) == 0) { if ((pid_lint = fork()) == 0) {
/* Redirect standard output and standard error into the pipe. */ /* Redirect standard output and standard error into the pipe. */
if (dup2(lint_fd[1], STDOUT_FILENO) != STDOUT_FILENO) if (dup2(lint_fd[1], STDOUT_FILENO) < 0)
exit(7); exit(7);
if (dup2(lint_fd[1], STDERR_FILENO) != STDERR_FILENO) if (dup2(lint_fd[1], STDERR_FILENO) < 0)
exit(8); exit(8);
close(lint_fd[0]); close(lint_fd[0]);