📄 login.c
字号:
/* committed to login turn off timeout */ alarm(0);#ifdef QUOTA if (quota(Q_SETUID, pwd->pw_uid, 0, 0) < 0 && errno != EINVAL) { if (errno == EUSERS) printf("%s.\n%s.\n", "Too many users logged on already", "Try again later"); else if (errno == EPROCLIM) printf("You have too many processes running.\n"); else perror("quota (Q_SETUID)"); sleep(5); exit(0); }#endif time(&utmp.ut_time); t = ttyslot(); if (t > 0 && (f = open("/etc/utmp", O_WRONLY)) >= 0) { lseek(f, (long)(t*sizeof(utmp)), 0); SCPYN(utmp.ut_line, tty); write(f, (char *)&utmp, sizeof(utmp)); close(f); } if ((f = open("/usr/adm/wtmp", O_WRONLY|O_APPEND)) >= 0) { write(f, (char *)&utmp, sizeof(utmp)); close(f); } quietlog = access(qlog, F_OK) == 0; if ((f = open(lastlog, O_RDWR)) >= 0) { struct lastlog ll; lseek(f, (long)pwd->pw_uid * sizeof (struct lastlog), 0); if (read(f, (char *) &ll, sizeof ll) == sizeof ll && ll.ll_time != 0 && !quietlog) { printf("Last login: %.*s ", 24-5, (char *)ctime(&ll.ll_time)); if (*ll.ll_host != '\0') printf("from %.*s\n", sizeof (ll.ll_host), ll.ll_host); else printf("on %.*s\n", sizeof (ll.ll_line), ll.ll_line); } lseek(f, (long)pwd->pw_uid * sizeof (struct lastlog), 0); time(&ll.ll_time); SCPYN(ll.ll_line, tty); SCPYN(ll.ll_host, utmp.ut_host); write(f, (char *) &ll, sizeof ll); close(f); } chown(ttyn, pwd->pw_uid, TTYGID(pwd->pw_gid)); if (!hflag && !rflag) /* XXX */ ioctl(0, TIOCSWINSZ, &win); chmod(ttyn, 0620); setgid(pwd->pw_gid); strncpy(name, utmp.ut_name, NMAX); name[NMAX] = '\0'; initgroups(name, pwd->pw_gid);#ifdef QUOTA quota(Q_DOWARN, pwd->pw_uid, (dev_t)-1, 0);#endif setuid(pwd->pw_uid); /* destroy environment unless user has asked to preserve it */ if (!pflag) environ = envinit; setenv("HOME", pwd->pw_dir, 1); setenv("SHELL", pwd->pw_shell, 1); if (term[0] == '\0') strncpy(term, stypeof(tty), sizeof(term)); setenv("TERM", term, 0); setenv("USER", pwd->pw_name, 1); setenv("PATH", ":/usr/ucb:/bin:/usr/bin", 0); if ((namep = rindex(pwd->pw_shell, '/')) == NULL) namep = pwd->pw_shell; else namep++; strcat(minusnam, namep); if (tty[sizeof("tty")-1] == 'd') syslog(LOG_INFO, "DIALUP %s, %s", tty, pwd->pw_name); if (pwd->pw_uid == 0) if (utmp.ut_host[0]) syslog(LOG_NOTICE, "ROOT LOGIN %s FROM %.*s", tty, HMAX, utmp.ut_host); else syslog(LOG_NOTICE, "ROOT LOGIN %s", tty); if (!quietlog) { struct stat st; showmotd(); strcat(maildir, pwd->pw_name); if (stat(maildir, &st) == 0 && st.st_size != 0) printf("You have %smail.\n", (st.st_mtime > st.st_atime) ? "new " : ""); } signal(SIGALRM, SIG_DFL); signal(SIGQUIT, SIG_DFL); signal(SIGINT, SIG_DFL); signal(SIGTSTP, SIG_IGN); execlp(pwd->pw_shell, minusnam, 0); perror(pwd->pw_shell); printf("No shell\n"); exit(0);}getloginname(up) register struct utmp *up;{ register char *namep; char c; while (up->ut_name[0] == '\0') { namep = up->ut_name; printf("login: "); while (1) { c = getchar() ; if (feof(stdin)) exit(0); if (c == EOF ) exit(0); c = c & 0x7f ; if( c == '\n' || c == '\r') break; if (c == ' ') c = '_'; if (namep < up->ut_name+NMAX) *namep++ = c; } } strncpy(lusername, up->ut_name, NMAX); lusername[NMAX] = 0; if ((pwd = getpwnam(lusername)) == NULL) pwd = &nouser;}timedout(){ printf("Login timed out after %d seconds\n", timeout); exit(0);}int stopmotd;catch(){ signal(SIGINT, SIG_IGN); stopmotd++;}rootterm(tty) char *tty;{ register struct ttyent *t; if ((t = getttynam(tty)) != NULL) { if (t->ty_status & TTY_SECURE) return (1); } return (0);}showmotd(){ FILE *mf; register c; signal(SIGINT, catch); if ((mf = fopen("/etc/motd", "r")) != NULL) { while ((c = getc(mf)) != EOF && stopmotd == 0) putchar(c); fclose(mf); } signal(SIGINT, SIG_IGN);}#undef UNKNOWN#define UNKNOWN "su"char *stypeof(ttyid) char *ttyid;{ register struct ttyent *t; if (ttyid == NULL || (t = getttynam(ttyid)) == NULL) return (UNKNOWN); return (t->ty_type);}doremotelogin(host) char *host;{ int rc; getstr(rusername, sizeof (rusername), "remuser"); getstr(lusername, sizeof (lusername), "locuser"); getstr(term, sizeof(term), "Terminal type"); if (getuid()) { pwd = &nouser; syslog(LOG_ERR, "getuid() failed"); return(-1); } pwd = getpwnam(lusername); if (pwd == NULL) { pwd = &nouser; syslog(LOG_ERR, "getpwname() failed for user %s", lusername); return(-1); } rc = ruserok(host, (pwd->pw_uid == 0), rusername, lusername); if (rc == -1) { syslog(LOG_ERR, "ruserok failed, host=%s, uid=%d, remote username=%s, local username=%s", host, pwd->pw_uid, rusername, lusername); } return rc;}getstr(buf, cnt, err) char *buf; int cnt; char *err;{ char c; do { if (read(0, &c, 1) != 1) exit(1); if (--cnt < 0) { printf("%s too long\r\n", err); exit(1); } *buf++ = c; } while (c != 0);}char *speeds[] = { "0", "50", "75", "110", "134", "150", "200", "300", "600", "1200", "1800", "2400", "4800", "9600", "19200", "38400" };#define NSPEEDS (sizeof (speeds) / sizeof (speeds[0]))doremoteterm(term, tp) char *term; struct sgttyb *tp;{ register char *cp = index(term, '/'), **cpp; char *speed; if (cp) { *cp++ = '\0'; speed = cp; cp = index(speed, '/'); if (cp) *cp++ = '\0'; for (cpp = speeds; cpp < &speeds[NSPEEDS]; cpp++) if (strcmp(*cpp, speed) == 0) { tp->sg_ispeed = tp->sg_ospeed = cpp-speeds; break; } } tp->sg_flags = ECHO|CRMOD|ANYP|XTABS;}tty_gid(default_gid) int default_gid;{ struct group *getgrnam(), *gr; int gid = default_gid; gr = getgrnam(TTYGRPNAME); if (gr != (struct group *) 0) gid = gr->gr_gid; endgrent(); return (gid);}/* Turn host into an IP address and then look it up in the authorization * database to determine if ordinary password logins are OK */authfile(host)char *host;{ static int isaddr(); long aton(),n; struct hostent *hp; FILE *fp; char buf[128],**lp; if(strlen(host) == 0){ /* Local login, okay */ return 1; } if(isaddr(host)){ n = aton(host); return rdnets(n); } else { hp = gethostbyname(host); if(hp == NULL){ printf("Unknown host %s\n",host); return 0; } for(lp = hp->h_addr_list;*lp != NULL;lp++){ memcpy((char *)&n,*lp,sizeof(n)); n = ntohl(n); if(rdnets(n)) return 1; } return 0; }}intrdnets(host)long host;{ FILE *fp; char buf[128],*cp; long pattern,mask; char *strtok(); int permit_it; fp = fopen("/etc/skey.access","r"); if(fp == NULL) return 0; while(fgets(buf,sizeof(buf),fp),!feof(fp)){ if(buf[0] == '#') continue; /* Comment */ cp = strtok(buf," \t"); if(cp == NULL) continue; /*two choices permit of deny*/ if( strncasecmp(cp, "permit", 4) == 0){ permit_it = 1; } else { if( strncasecmp(cp, "deny" , 4) == 0){ permit_it = 0; } else{ continue; /* ignore this it is not permit/deny */ } } cp = strtok(NULL," \t"); if(cp == NULL) continue; /* Invalid line */ pattern = aton(cp); cp = strtok(NULL," \t"); if(cp == NULL) continue; /* Invalid line */ mask = aton(cp); if((host & mask) == pattern){ fclose(fp); return permit_it; } } fclose(fp); return 0;}/* Return TRUE if string appears to be an IP address in dotted decimal; * return FALSE otherwise (i.e., if string is a domain name) */intisaddr(s)register char *s;{ char c; if(s == NULL) return 1; /* Can't happen */ while((c = *s++) != '\0'){ if(c != '[' && c != ']' && !isdigit(c) && c != '.') return 0; } return 1;}/* Convert Internet address in ascii dotted-decimal format (44.0.0.1) to * binary IP address */longaton(s)register char *s;{ long n; register int i; char *strchr(); n = 0; if(s == NULL) return 0; for(i=24;i>=0;i -= 8){ /* Skip any leading stuff (e.g., spaces, '[') */ while(*s != '\0' && !isdigit(*s)) s++; if(*s == '\0') break; n |= (long)atoi(s) << i; if((s = strchr(s,'.')) == NULL) break; s++; } return n;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -