|
|
1.1 root 1: static char *sccsid = "@(#)su.c 4.1 (Berkeley) 10/1/80";
2: #include <stdio.h>
3: #include <pwd.h>
4:
5: struct passwd *pwd,*getpwnam();
6: char *crypt();
7: char *getpass();
8:
9: main(argc,argv)
10: int argc;
11: char **argv;
12: {
13: char *nptr;
14: char *password;
15: int badsw = 0;
16: char *shell = "/bin/sh";
17: int niced = 0;
18:
19: if(argc > 1)
20: nptr = argv[1];
21: else {
22: nptr = "root";
23: nice(-4);
24: niced = -4;
25: }
26: if((pwd=getpwnam(nptr)) == NULL) {
27: printf("Unknown id: %s\n",nptr);
28: exit(1);
29: }
30: if(pwd->pw_passwd[0] == '\0' || getuid() == 0)
31: goto ok;
32: password = getpass("Password:");
33: if(badsw || (strcmp(pwd->pw_passwd, crypt(password, pwd->pw_passwd)) != 0)) {
34: bad:
35: printf("Sorry\n");
36: if(pwd->pw_uid == 0) {
37: FILE *console = fopen("/dev/console", "w");
38: if (console != NULL) {
39: fprintf(console, "BADSU: %s %s\r\n", getlogin(), ttyname(2));
40: fclose(console);
41: }
42: }
43: exit(2);
44: }
45: ok:
46: endpwent();
47: if(pwd->pw_uid == 0) {
48: FILE *console = fopen("/dev/console", "w");
49: if (console != NULL) {
50: fprintf(console, "SU: %s %s\r\n", getlogin(), ttyname(2));
51: fclose(console);
52: }
53: }
54: setgid(pwd->pw_gid);
55: setuid(pwd->pw_uid);
56: if (pwd->pw_shell && *pwd->pw_shell)
57: shell = pwd->pw_shell;
58: homeis(pwd->pw_dir);
59: shellis(shell);
60: nice(-niced);
61: execl(shell, "su", 0);
62: printf("No shell\n");
63: exit(3);
64: }
65:
66: char **environ;
67:
68: homeis(hp)
69: char *hp;
70: {
71: register char *cp, *dp;
72: register char **ep = environ;
73: static char homebuf[128];
74:
75: while (dp = *ep++) {
76: for (cp = "HOME"; *cp == *dp && *cp; cp++, dp++)
77: continue;
78: if (*cp == 0 && (*dp == '=' || *dp == 0)) {
79: strcpy(homebuf, "HOME=");
80: strcat(homebuf, hp);
81: *--ep = homebuf;
82: return;
83: }
84: }
85: }
86:
87: shellis(sp)
88: char *sp;
89: {
90: register char *cp, *dp;
91: register char **ep = environ;
92: static char shellbuf[128];
93:
94: while (dp = *ep++) {
95: for (cp = "SHELL"; *cp == *dp && *cp; cp++, dp++)
96: continue;
97: if (*cp == 0 && (*dp == '=' || *dp == 0)) {
98: strcpy(shellbuf, "SHELL=");
99: strcat(shellbuf, sp);
100: *--ep = shellbuf;
101: return;
102: }
103: }
104: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.