int main(int argc, char **argv) { register char *s; char name[30]; struct sigaction sa; /* Don't let QUIT dump core. */ sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = exit; sigaction(SIGQUIT, &sa, NULL); tty_name = ttyname(0); if (tty_name == NULL) { std_out("getty: tty name unknown\n"); pause(); return(1); } chown(tty_name, 0, 0); /* set owner of TTY to root */ chmod(tty_name, 0600); /* mode to max secure */ do_getty(name, sizeof(name), argv+1, tty_name); /* handle getty() */ name[29] = '\0'; /* make sure the name fits! */ do_login(name); /* and call login(1) if OK */ return(1); /* never executed */ }
int getty(char *tty, speed_t speed, char *term, char *user) { int fd; char name[30]; /* Detach from initial controlling TTY */ vhangup(); fd = open(tty, O_RDWR); if (fd < 0) err(1, "Failed opening %s", tty); dup2(fd, STDIN_FILENO); dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); if (ioctl(STDIN_FILENO, TIOCSCTTY, 1) < 0) warn("Failed TIOCSCTTY"); /* The getty process is responsible for the UTMP login record */ utmp_set_login(tty, NULL); if (!user) do_getty(tty, name, sizeof(name)); else strlcpy(name, user, sizeof(name)); /* Set up TTY, re-enabling ISIG et al. */ stty(fd, speed); close(fd); if (term && term[0]) setenv("TERM", term, 1); return do_login(name); }