diff options
| -rw-r--r-- | dtach.h | 1 | ||||
| -rw-r--r-- | main.c | 20 | ||||
| -rw-r--r-- | master.c | 5 |
3 files changed, 23 insertions, 3 deletions
@@ -76,6 +76,7 @@ extern char *progname, *sockname; extern int detach_char, no_suspend, redraw_method; extern struct termios orig_term; +extern int dont_have_tty; enum { @@ -44,6 +44,7 @@ int redraw_method = REDRAW_UNSPEC; ** it to restore the original settings. */ struct termios orig_term; +int dont_have_tty; static void usage() @@ -210,10 +211,25 @@ main(int argc, char **argv) /* Save the original terminal settings. */ if (tcgetattr(0, &orig_term) < 0) { - printf("%s: tcgetattr: %s\n", progname, strerror(errno)); - return 1; + if (errno == ENOTTY) + { + memset(&orig_term, 0, sizeof(struct termios)); + dont_have_tty = 1; + } + else + { + printf("%s: tcgetattr: %s\n", progname, + strerror(errno)); + return 1; + } } + if (dont_have_tty && mode != 'n') + { + printf("%s: Attaching to a session requires a terminal.\n", + progname); + return 1; + } if (mode == 'a') { if (argc > 0) @@ -114,7 +114,10 @@ init_pty(char **argv) memset(&the_pty.ws, 0, sizeof(struct winsize)); /* Create the pty process */ - the_pty.pid = forkpty(&the_pty.fd, NULL, &the_pty.term, NULL); + if (!dont_have_tty) + the_pty.pid = forkpty(&the_pty.fd, NULL, &the_pty.term, NULL); + else + the_pty.pid = forkpty(&the_pty.fd, NULL, NULL, NULL); if (the_pty.pid < 0) return -1; else if (the_pty.pid == 0) |
