- alarm(60);
- signal(SIGQUIT, SIG_IGN);
- signal(SIGINT, SIG_IGN);
- nice(-100);
- nice(20);
- nice(0);
- if (argc > 0 && !strcmp(argv[1], "-r")) {
- rflag++;
- getstr(rusername, sizeof (rusername), "Username");
- getstr(rpassword, sizeof (rpassword), "Password");
- getstr(term+5, sizeof(term)-5, "Terminal type");
- }
-#ifdef TIOCLSET
- ioctl(0, TIOCLSET, 0);
-#endif
- ioctl(0, TIOCNXCL, 0);
- gtty(0, &ttyb);
- if (rflag) {
- char *cp = index(term, '/');
- if (cp) {
- int i;
- *cp++ = 0;
- for (i = 0; i < NSPEEDS; i++)
- if (!strcmp(speeds[i], cp)) {
- ttyb.sg_ispeed = ttyb.sg_ospeed = i;
- break;
- }
+ (void)signal(SIGALRM, timedout);
+ (void)alarm((u_int)timeout);
+ (void)signal(SIGQUIT, SIG_IGN);
+ (void)signal(SIGINT, SIG_IGN);
+ (void)setpriority(PRIO_PROCESS, 0, 0);
+
+ openlog("login", LOG_ODELAY, LOG_AUTH);
+
+ /*
+ * -p is used by getty to tell login not to destroy the environment
+ * -r is used by rlogind to cause the autologin protocol;
+ * -f is used to skip a second login authentication
+ * -h is used by other servers to pass the name of the remote
+ * host to login so that it may be placed in utmp and wtmp
+ */
+ domain = NULL;
+ if (gethostname(localhost, sizeof(localhost)) < 0)
+ syslog(LOG_ERR, "couldn't get local hostname: %m");
+ else
+ domain = index(localhost, '.');
+
+ fflag = hflag = pflag = rflag = 0;
+ passwd_req = 1;
+ uid = getuid();
+ while ((ch = getopt(argc, argv, "fh:pr:")) != EOF)
+ switch (ch) {
+ case 'f':
+ if (rflag) {
+ fprintf(stderr,
+ "login: only one of -r and -f allowed.\n");
+ exit(1);
+ }
+ fflag = 1;
+ break;
+ case 'h':
+ if (uid) {
+ (void)fprintf(stderr,
+ "login: -h for super-user only.\n");
+ exit(1);
+ }
+ if (rflag) {
+ fprintf(stderr,
+ "login: only one of -r and -h allowed.\n");
+ exit(1);
+ }
+ hflag = 1;
+ if (domain && (p = index(optarg, '.')) &&
+ strcasecmp(p, domain) == 0)
+ *p = 0;
+ hostname = optarg;
+ break;
+ case 'p':
+ pflag = 1;
+ break;
+ case 'r':
+ if (hflag || fflag) {
+ fprintf(stderr,
+ "login: -f and -h not allowed with -r.\n");
+ exit(1);
+ }
+ if (getuid()) {
+ fprintf(stderr,
+ "login: -r for super-user only.\n");
+ exit(1);
+ }
+ /* "-r hostname" must be last args */
+ if (optind != argc) {
+ fprintf(stderr, "Syntax error.\n");
+ exit(1);
+ }
+ rflag = 1;
+ passwd_req = (doremotelogin(optarg) == -1);
+ if (domain && (p = index(optarg, '.')) &&
+ !strcmp(p, domain))
+ *p = '\0';
+ hostname = optarg;
+ break;
+ case '?':
+ default:
+ if (!uid)
+ syslog(LOG_ERR, "invalid flag %c", ch);
+ (void)fprintf(stderr,
+ "usage: login [-fp] [username]\n");
+ exit(1);