int main(int argc, char **argv) { int fd; sigset_t mask; /* Make sure std* are open, for suid safety. */ do fd = open("/dev/null", O_RDONLY); while (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO); close(fd); /* Block ^Z to prevent holding locks on the attachtab. */ sigemptyset(&mask); sigaddset(&mask, SIGTSTP); sigaddset(&mask, SIGTTOU); sigaddset(&mask, SIGTTIN); sigprocmask(SIG_BLOCK, &mask, NULL); if (argc > 1 && !strncmp(argv[1], "-P", 2)) { whoami = argv[1] + 2; argv++; argc--; } else { whoami = strrchr(argv[0], '/'); if (whoami) whoami++; else whoami = argv[0]; } if (!strcmp(whoami, "add")) exit(add_main(argc, argv)); else if (!strcmp(whoami, "attach")) exit(attach_main(argc, argv)); else if (!strcmp(whoami, "detach")) exit(detach_main(argc, argv)); else if (!strcmp(whoami, "fsid") || !strcmp(whoami, "nfsid")) exit(fsid_main(argc, argv)); else if (!strcmp(whoami, "zinit")) exit(zinit_main(argc, argv)); fprintf(stderr, "Not invoked with attach, detach, nfsid, fsid, zinit, add, or attachandrun!\n"); exit(1); }
int main(int argc, char **argv) { int mode = 0; /* Save the program name */ progname = argv[0]; ++argv; --argc; /* Parse the arguments */ if (argc >= 1 && **argv == '-') { if (strncmp(*argv, "--help", strlen(*argv)) == 0) usage(); else if (strncmp(*argv, "--version", strlen(*argv)) == 0) { printf("dtach - version %s, compiled on %s at %s.\n", PACKAGE_VERSION, __DATE__, __TIME__); return 0; } mode = argv[0][1]; if (mode == '?') usage(); else if (mode != 'a' && mode != 'c' && mode != 'n' && mode != 'A' && mode != 'N' && mode != 'p') { printf("%s: Invalid mode '-%c'\n", progname, mode); printf("Try '%s --help' for more information.\n", progname); return 1; } } if (!mode) { printf("%s: No mode was specified.\n", progname); printf("Try '%s --help' for more information.\n", progname); return 1; } ++argv; --argc; if (argc < 1) { printf("%s: No socket was specified.\n", progname); printf("Try '%s --help' for more information.\n", progname); return 1; } sockname = *argv; ++argv; --argc; if (mode == 'p') { if (argc > 0) { printf("%s: Invalid number of arguments.\n", progname); printf("Try '%s --help' for more information.\n", progname); return 1; } return push_main(); } while (argc >= 1 && **argv == '-') { char *p; for (p = argv[0] + 1; *p; ++p) { if (*p == 'E') detach_char = -1; else if (*p == 'z') no_suspend = 1; else if (*p == 't') no_ansiterm = 1; else if (*p == 'e') { ++argv; --argc; if (argc < 1) { printf("%s: No escape character " "specified.\n", progname); printf("Try '%s --help' for more " "information.\n", progname); return 1; } if (argv[0][0] == '^' && argv[0][1]) { if (argv[0][1] == '?') detach_char = '\177'; else detach_char = argv[0][1] & 037; } else detach_char = argv[0][0]; break; } else if (*p == 'r') { ++argv; --argc; if (argc < 1) { printf("%s: No redraw method " "specified.\n", progname); printf("Try '%s --help' for more " "information.\n", progname); return 1; } if (strcmp(argv[0], "none") == 0) redraw_method = REDRAW_NONE; else if (strcmp(argv[0], "ctrl_l") == 0) redraw_method = REDRAW_CTRL_L; else if (strcmp(argv[0], "winch") == 0) redraw_method = REDRAW_WINCH; else { printf("%s: Invalid redraw method " "specified.\n", progname); printf("Try '%s --help' for more " "information.\n", progname); return 1; } break; } else { printf("%s: Invalid option '-%c'\n", progname, *p); printf("Try '%s --help' for more information.\n", progname); return 1; } } ++argv; --argc; } if (mode != 'a' && argc < 1) { printf("%s: No command was specified.\n", progname); printf("Try '%s --help' for more information.\n", progname); return 1; } /* Save the original terminal settings. */ if (tcgetattr(0, &orig_term) < 0) { memset(&orig_term, 0, sizeof(struct termios)); dont_have_tty = 1; } if (dont_have_tty && mode != 'n' && mode != 'N') { printf("%s: Attaching to a session requires a terminal.\n", progname); return 1; } if (mode == 'a') { if (argc > 0) { printf("%s: Invalid number of arguments.\n", progname); printf("Try '%s --help' for more information.\n", progname); return 1; } return attach_main(0); } else if (mode == 'n') return master_main(argv, 0, 0); else if (mode == 'N') return master_main(argv, 0, 1); else if (mode == 'c') { if (master_main(argv, 1, 0) != 0) return 1; return attach_main(0); } else if (mode == 'A') { /* Try to attach first. If that doesn't work, create a new ** socket. */ if (attach_main(1) != 0) { if (errno == ECONNREFUSED || errno == ENOENT) { if (errno == ECONNREFUSED) unlink(sockname); if (master_main(argv, 1, 0) != 0) return 1; } return attach_main(0); } } return 0; }