|
|
1.1 root 1: /*
2: * login [ name ]
3: */
4:
5: #include <sys/types.h>
6: #include <sgtty.h>
7: #include <utmp.h>
8: #include <signal.h>
9: #include <pwd.h>
10: #include <stdio.h>
11: #include <sys/stat.h>
12: #include <lastlog.h>
13: #define SCPYN(a, b) strncpy(a, b, sizeof(a))
14:
15: char maildir[30] = "/usr/spool/mail/";
16: char lastlog[] = "/usr/adm/lastlog";
17: struct passwd nouser = {"", "nope"};
18: struct sgttyb ttyb;
19: struct utmp utmp;
20: char minusnam[16] = "-";
21: char homedir[64] = "HOME=";
22: char shell[64] = "SHELL=";
23: char term[64] = "TERM=";
24: char *envinit[] = {homedir, shell, "PATH=:/usr/ucb:/bin:/usr/bin", term, 0};
25: struct passwd *pwd;
26:
27: struct passwd *getpwnam();
28: char *strcat();
29: int setpwent();
30: char *ttyname();
31: char *crypt();
32: char *getpass();
33: char *rindex();
34: char *stypeof();
35: extern char **environ;
36:
37: main(argc, argv)
38: char **argv;
39: {
40: register char *namep;
41: int t, f, c;
42: char *ttyn;
43:
44: alarm(60);
45: signal(SIGQUIT, SIG_IGN);
46: signal(SIGINT, SIG_IGN);
47: nice(-100);
48: nice(20);
49: nice(0);
50: gtty(0, &ttyb);
51: ttyb.sg_erase = '#';
52: ttyb.sg_kill = '@';
53: stty(0, &ttyb);
54: for (t=3; t<20; t++)
55: close(t);
56: ttyn = ttyname(0);
57: if (ttyn==0)
58: ttyn = "/dev/tty??";
59:
60: loop:
61: SCPYN(utmp.ut_name, "");
62: if (argc>1) {
63: SCPYN(utmp.ut_name, argv[1]);
64: argc = 0;
65: }
66: while (utmp.ut_name[0] == '\0') {
67: namep = utmp.ut_name;
68: printf("login: ");
69: while ((c = getchar()) != '\n') {
70: if(c == ' ')
71: c = '_';
72: if (c == EOF)
73: exit(0);
74: if (namep < utmp.ut_name+8)
75: *namep++ = c;
76: }
77: }
78: setpwent();
79: if ((pwd = getpwnam(utmp.ut_name)) == NULL)
80: pwd = &nouser;
81: endpwent();
82: if (*pwd->pw_passwd != '\0') {
83: namep = crypt(getpass("Password:"),pwd->pw_passwd);
84: if (strcmp(namep, pwd->pw_passwd)) {
85: bad:
86: printf("Login incorrect\n");
87: if (ttyn[8] == 'd') {
88: FILE *console = fopen("/dev/console", "w");
89: if (console != NULL) {
90: fprintf(console, "\r\nBADDIALUP %s %s\r\n", ttyn+5, utmp.ut_name);
91: fclose(console);
92: }
93: }
94: goto loop;
95: }
96: }
97: /*
98: if (pwd->pw_uid == 0 && ttyn[5] != 'c')
99: goto bad;
100: */
101: if (ttyn[8] == 'd') {
102: FILE *console = fopen("/dev/console", "w");
103: if (console != NULL) {
104: fprintf(console, "\r\nDIALUP %s %s\r\n", ttyn+5, pwd->pw_name);
105: fclose(console);
106: }
107: }
108: if((f = open(lastlog, 2)) >= 0) {
109: struct lastlog ll;
110:
111: lseek(f, pwd->pw_uid * sizeof (struct lastlog), 0);
112: if (read(f, (char *) &ll, sizeof ll) == sizeof ll && ll.ll_time != 0) {
113: register char *ep = (char *) ctime(&ll.ll_time);
114: printf("Last login: ");
115: ep[24 - 5] = 0;
116: printf("%s on %.8s\n", ep, ll.ll_line);
117: }
118: lseek(f, pwd->pw_uid * sizeof (struct lastlog), 0);
119: time(&ll.ll_time);
120: strcpyn(ll.ll_line, ttyn+5, 8);
121: write(f, (char *) &ll, sizeof ll);
122: }
123: if(chdir(pwd->pw_dir) < 0) {
124: printf("No directory\n");
125: goto loop;
126: }
127: time(&utmp.ut_time);
128: t = ttyslot();
129: if (t>0 && (f = open("/etc/utmp", 1)) >= 0) {
130: lseek(f, (long)(t*sizeof(utmp)), 0);
131: SCPYN(utmp.ut_line, rindex(ttyn, '/')+1);
132: write(f, (char *)&utmp, sizeof(utmp));
133: close(f);
134: }
135: if (t>0 && (f = open("/usr/adm/wtmp", 1)) >= 0) {
136: lseek(f, 0L, 2);
137: write(f, (char *)&utmp, sizeof(utmp));
138: close(f);
139: }
140: chown(ttyn, pwd->pw_uid, pwd->pw_gid);
141: setgid(pwd->pw_gid);
142: setuid(pwd->pw_uid);
143: if (*pwd->pw_shell == '\0')
144: pwd->pw_shell = "/bin/sh";
145: environ = envinit;
146: strncat(homedir, pwd->pw_dir, sizeof(homedir)-6);
147: strncat(shell, pwd->pw_shell, sizeof(shell)-7);
148: strncat(term, stypeof(ttyn), sizeof(term)-6);
149: if ((namep = rindex(pwd->pw_shell, '/')) == NULL)
150: namep = pwd->pw_shell;
151: else
152: namep++;
153: strcat(minusnam, namep);
154: alarm(0);
155: umask(022);
156: showmotd();
157: strcat(maildir, pwd->pw_name);
158: if(access(maildir,4)==0) {
159: struct stat statb;
160: stat(maildir, &statb);
161: if (statb.st_size)
162: printf("You have mail.\n");
163: }
164: signal(SIGQUIT, SIG_DFL);
165: signal(SIGINT, SIG_DFL);
166: execlp(pwd->pw_shell, minusnam, 0);
167: printf("No shell\n");
168: exit(0);
169: }
170:
171: int stopmotd;
172: catch()
173: {
174: signal(SIGINT, SIG_IGN);
175: stopmotd++;
176: }
177:
178: showmotd()
179: {
180: FILE *mf;
181: register c;
182:
183: signal(SIGINT, catch);
184: if((mf = fopen("/etc/motd","r")) != NULL) {
185: while((c = getc(mf)) != EOF && stopmotd == 0)
186: putchar(c);
187: fclose(mf);
188: }
189: signal(SIGINT, SIG_IGN);
190: }
191:
192: #define UNKNOWN "su"
193:
194: char *
195: stypeof(ttyid)
196: char *ttyid;
197: {
198: static char typebuf[16];
199: char buf[50];
200: register FILE *f;
201: register char *p, *t, *q;
202:
203: if (ttyid == NULL)
204: return (UNKNOWN);
205: f = fopen("/etc/ttytype", "r");
206: if (f == NULL)
207: return (UNKNOWN);
208: /* split off end of name */
209: for (p = q = ttyid; *p != 0; p++)
210: if (*p == '/')
211: q = p + 1;
212:
213: /* scan the file */
214: while (fgets(buf, sizeof buf, f) != NULL)
215: {
216: for (t=buf; *t!=' '; t++)
217: ;
218: *t++ = 0;
219: for (p=t; *p>' '; p++)
220: ;
221: *p = 0;
222: if (strcmp(q,t)==0) {
223: strcpy(typebuf, buf);
224: fclose(f);
225: return (typebuf);
226: }
227: }
228: fclose (f);
229: return (UNKNOWN);
230: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.