Annotation of 42BSD/bin/su.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *sccsid = "@(#)su.c        4.6 (Berkeley) 7/6/83";
                      3: #endif
                      4: 
                      5: #include <stdio.h>
                      6: #include <pwd.h>
                      7: #include <sys/types.h>
                      8: #include <sys/time.h>
                      9: #include <sys/resource.h>
                     10: 
                     11: char   userbuf[16]     = "USER=";
                     12: char   homebuf[128]    = "HOME=";
                     13: char   shellbuf[128]   = "SHELL=";
                     14: char   pathbuf[128]    = "PATH=:/usr/ucb:/bin:/usr/bin";
                     15: char   *cleanenv[] = { userbuf, homebuf, shellbuf, pathbuf, 0, 0 };
                     16: char   *user = "root";
                     17: char   *shell = "/bin/sh";
                     18: int    fulllogin;
                     19: int    fastlogin;
                     20: 
                     21: extern char    **environ;
                     22: struct passwd *pwd,*getpwnam();
                     23: char   *crypt();
                     24: char   *getpass();
                     25: char   *getenv();
                     26: 
                     27: main(argc,argv)
                     28:        int argc;
                     29:        char *argv[];
                     30: {
                     31:        char *password;
                     32: 
                     33: again:
                     34:        if (argc > 1 && strcmp(argv[1], "-f") == 0) {
                     35:                fastlogin++;
                     36:                argc--, argv++;
                     37:                goto again;
                     38:        }
                     39:        if (argc > 1 && strcmp(argv[1], "-") == 0) {
                     40:                fulllogin++;
                     41:                argc--, argv++;
                     42:                goto again;
                     43:        }
                     44:        if (argc > 1 && argv[1][0] != '-') {
                     45:                user = argv[1];
                     46:                argc--, argv++;
                     47:        }
                     48:        if (strcmp(user, "root") == 0)
                     49:                setpriority(PRIO_PROCESS, 0, -2);
                     50:        if ((pwd = getpwnam(user)) == NULL) {
                     51:                fprintf(stderr, "Unknown login: %s\n", user);
                     52:                exit(1);
                     53:        }
                     54:        if (pwd->pw_passwd[0] == '\0' || getuid() == 0)
                     55:                goto ok;
                     56:        password = getpass("Password:");
                     57:        if (strcmp(pwd->pw_passwd, crypt(password, pwd->pw_passwd)) != 0) {
                     58:                fprintf(stderr, "Sorry\n");
                     59:                if (pwd->pw_uid == 0) {
                     60:                        FILE *console = fopen("/dev/console", "w");
                     61:                        if (console != NULL) {
                     62:                                fprintf(console, "BADSU: %s %s\r\n",
                     63:                                        getlogin(), ttyname(2));
                     64:                                fclose(console);
                     65:                        }
                     66:                }
                     67:                exit(2);
                     68:        }
                     69: ok:
                     70:        endpwent();
                     71:        if (pwd->pw_uid == 0) {
                     72:                FILE *console = fopen("/dev/console", "w");
                     73:                if (console != NULL) {
                     74:                        fprintf(console, "SU: %s %s\r\n",
                     75:                                getlogin(), ttyname(2));
                     76:                        fclose(console);
                     77:                }
                     78:        }
                     79:        if (setgid(pwd->pw_gid) < 0) {
                     80:                perror("su: setgid");
                     81:                exit(3);
                     82:        }
                     83:        if (initgroups(user, pwd->pw_gid)) {
                     84:                fprintf(stderr, "su: initgroups failed\n");
                     85:                exit(4);
                     86:        }
                     87:        if (setuid(pwd->pw_uid) < 0) {
                     88:                perror("su: setuid");
                     89:                exit(5);
                     90:        }
                     91:        if (pwd->pw_shell && *pwd->pw_shell)
                     92:                shell = pwd->pw_shell;
                     93:        if (fulllogin) {
                     94:                cleanenv[4] = getenv("TERM");
                     95:                environ = cleanenv;
                     96:        }
                     97:        if (strcmp(user, "root"))
                     98:                setenv("USER", pwd->pw_name, userbuf);
                     99:        setenv("SHELL", shell, shellbuf);
                    100:        setenv("HOME", pwd->pw_dir, homebuf);
                    101:        setpriority(PRIO_PROCESS, 0, 0);
                    102:        if (fastlogin) {
                    103:                *argv-- = "-f";
                    104:                *argv = "su";
                    105:        } else if (fulllogin) {
                    106:                if (chdir(pwd->pw_dir) < 0) {
                    107:                        fprintf(stderr, "No directory\n");
                    108:                        exit(6);
                    109:                }
                    110:                *argv = "-su";
                    111:        } else
                    112:                *argv = "su";
                    113:        execv(shell, argv);
                    114:        fprintf(stderr, "No shell\n");
                    115:        exit(7);
                    116: }
                    117: 
                    118: setenv(ename, eval, buf)
                    119:        char *ename, *eval, *buf;
                    120: {
                    121:        register char *cp, *dp;
                    122:        register char **ep = environ;
                    123: 
                    124:        /*
                    125:         * this assumes an environment variable "ename" already exists
                    126:         */
                    127:        while (dp = *ep++) {
                    128:                for (cp = ename; *cp == *dp && *cp; cp++, dp++)
                    129:                        continue;
                    130:                if (*cp == 0 && (*dp == '=' || *dp == 0)) {
                    131:                        strcat(buf, eval);
                    132:                        *--ep = buf;
                    133:                        return;
                    134:                }
                    135:        }
                    136: }
                    137: 
                    138: char *
                    139: getenv(ename)
                    140:        char *ename;
                    141: {
                    142:        register char *cp, *dp;
                    143:        register char **ep = environ;
                    144: 
                    145:        while (dp = *ep++) {
                    146:                for (cp = ename; *cp == *dp && *cp; cp++, dp++)
                    147:                        continue;
                    148:                if (*cp == 0 && (*dp == '=' || *dp == 0))
                    149:                        return (*--ep);
                    150:        }
                    151:        return ((char *)0);
                    152: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.