+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)
+{
+ int fd;
+
+ if ((fd = posix_openpt(O_RDWR | O_NOCTTY)) == -1) {
+ die("Unable to open master %s pseudo-tty: %s\n", desc, strerror(errno));
+ }
+ if (grantpt(fd) == -1) {
+ die("Unable to grant permissions to master %s pty: %s\n", desc,
+ strerror(errno));
+ }
+ if (unlockpt(fd) == -1) {
+ die("Unable to unlock master %s pty: %s\n", desc, strerror(errno));
+ }
+
+ return fd;
+}
+