-/*
- * runpty.c - Run a process under a pseudo-tty
+/* runpty.c - Run a process under a pseudo-tty
*
* This code is Copyright (c) 2017, by the authors of nmh. See the
* COPYRIGHT file in the root directory of the nmh distribution for
#define COMMAND_TIMEOUT 30
+static void run_command(char *argv[], int master_in, int master_out);
static int open_master_pty(const char *desc);
static void die(const char *fmt, ...);
int
main(int argc, char *argv[])
{
- int master_in, master_out, slave, cc, status;
+ int master_in, master_out, cc, status;
time_t starttime, now;
- const char *slavename;
pid_t child;
unsigned char readbuf[1024];
FILE *output;
if ((child = fork()) == -1) {
die("fork() failed: %s\n", strerror(errno));
}
-
- /*
- * Start the child process if we are in the child; open the two
- * slave pseudo-ttys and close the masters after we are done with them.
- */
-
if (child == 0) {
- if (!(slavename = ptsname(master_in))) {
- die("Unable to determine name of slave pty: %s\n",
- strerror(errno));
- }
-
- if ((slave = open(slavename, O_RDWR)) < 0) {
- die("Unable to open slave pty \"%s\": %s\n", slavename,
- strerror(errno));
- }
-
- dup2(slave, STDIN_FILENO);
- close(slave);
- close(master_in);
-
- if (!(slavename = ptsname(master_out))) {
- die("Unable to determine name of slave pty: %s\n",
- strerror(errno));
- }
-
- if ((slave = open(slavename, O_RDWR | O_NOCTTY)) < 0) {
- die("Unable to open slave pty \"%s\": %s\n", slavename,
- strerror(errno));
- }
-
- dup2(slave, STDOUT_FILENO);
- dup2(slave, STDERR_FILENO);
- close(slave);
- close(master_out);
-
- execvp(argv[2], argv + 2);
-
- die("execvp(%s) failed: %s\n", argv[2], strerror(errno));
+ run_command(argv + 2, master_in, master_out); /* Does not return. */
}
if (!(output = fopen(argv[1], "w"))) {
exit(0);
}
+static void
+run_command(char *argv[], int master_in, int master_out)
+{
+ const char *slavename;
+ int slave;
+
+ /* Open the two slave pseudo-ttys and close the masters after we are
+ * done with them. */
+
+ if (!(slavename = ptsname(master_in))) {
+ die("Unable to determine name of slave pty: %s\n",
+ strerror(errno));
+ }
+
+ if ((slave = open(slavename, O_RDWR)) == -1) {
+ die("Unable to open slave pty \"%s\": %s\n", slavename,
+ strerror(errno));
+ }
+
+ dup2(slave, STDIN_FILENO);
+ close(slave);
+ close(master_in);
+
+ if (!(slavename = ptsname(master_out))) {
+ die("Unable to determine name of slave pty: %s\n",
+ strerror(errno));
+ }
+
+ if ((slave = open(slavename, O_RDWR | O_NOCTTY)) < 0) {
+ die("Unable to open slave pty \"%s\": %s\n", slavename,
+ strerror(errno));
+ }
+
+ dup2(slave, STDOUT_FILENO);
+ dup2(slave, STDERR_FILENO);
+ close(slave);
+ close(master_out);
+
+ execvp(*argv, argv);
+
+ die("execvp(%s) failed: %s\n", *argv, strerror(errno));
+}
+
static int
open_master_pty(const char *desc)
{