Annotation of researchv9/cmd/su.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <pwd.h>
                      3: #include <time.h>
                      4: #include <signal.h>
                      5: #define SULOG "/dev/console"
                      6: 
                      7: struct passwd *pwd,*getpwnam();
                      8: char   *crypt();
                      9: char   *getpass();
                     10: char   **environ;
                     11: 
                     12: main(argc,argv)
                     13: int    argc;
                     14: char   **argv;
                     15: {
                     16:        register char **p;
                     17:        char *nptr;
                     18:        char *password;
                     19:        int badsw = 0;
                     20:        int newgid, newuid;
                     21:        char *shell = "/bin/sh";
                     22: 
                     23: 
                     24:        if(argv[0][0] != '/'){
                     25:                fprintf(stderr, "su must be invoked with a full path\n");
                     26:                exit(1);
                     27:        }
                     28: 
                     29:        if(argc > 1)
                     30:                nptr = argv[1];
                     31:        else
                     32:                nptr = "root";
                     33:        if((pwd=getpwnam(nptr)) == NULL) {
                     34:                printf("Unknown id: %s\n",nptr);
                     35:                exit(1);
                     36:        }
                     37:        if(pwd->pw_passwd[0] == '\0' || getuid() == 0)
                     38:                goto ok;
                     39:        password = getpass("Password:");
                     40:        if(badsw || (strcmp(pwd->pw_passwd, crypt(password, pwd->pw_passwd)) != 0)) {
                     41:                log(SULOG,nptr,0);
                     42:                printf("Sorry\n");
                     43:                exit(2);
                     44:        }
                     45: 
                     46: ok:
                     47:        newgid = pwd->pw_gid;
                     48:        newuid = pwd->pw_uid;
                     49:        log(SULOG,nptr,1);
                     50:        endpwent();
                     51:        setgid(newgid);
                     52:        setuid(newuid);
                     53:        if (pwd->pw_shell && *pwd->pw_shell)
                     54:                shell = pwd->pw_shell;
                     55:        if (newuid == 0)
                     56:                for (p=environ; *p; p++) {
                     57:                        if (strncmp("PS1=", *p, 4) == 0)
                     58:                                *p = "PS1=# ";
                     59:                        else if (strncmp("PATH=", *p, 5) == 0)
                     60:                                *p = "PATH=/bin:/usr/bin:/etc";
                     61:                }
                     62:        execl(shell, "su", "-p", 0);
                     63:        printf("No shell\n");
                     64:        exit(3);
                     65: }
                     66: log(where, towho, how)
                     67: char *where, *towho;
                     68: int how;
                     69: {
                     70:        int catch();
                     71:        FILE *logf;
                     72:        long now, time();
                     73:        char *cuserid(), *strrchr();
                     74:        char *ttyn, *ttyname();
                     75:        struct tm *tmp, *localtime();
                     76: 
                     77:        if((ttyn=ttyname(0))==NULL)
                     78:                if((ttyn=ttyname(1))==NULL)
                     79:                        if((ttyn=ttyname(2))==NULL)
                     80:                                if((ttyn=ttyname(3))==NULL)
                     81:                                        ttyn="/dev/tty??";
                     82:        now = time((long *)0);
                     83:        tmp = localtime(&now);
                     84:        signal(SIGALRM, catch);
                     85:        alarm(5);
                     86:        if((logf=fopen(where,"a")) == NULL) return;
                     87:        fprintf(logf,"\r\nSU %.2d/%.2d %.2d:%.2d %c %s %s-%s\r\n",
                     88:                tmp->tm_mon+1,tmp->tm_mday,tmp->tm_hour,tmp->tm_min,
                     89:                how?'+':'-',(strrchr(ttyn,'/')+1),cuserid((char *)0),towho);
                     90:        fclose(logf);
                     91:        alarm(0);
                     92: }
                     93: char *cuserid(x)
                     94: char *x;
                     95: {
                     96:        struct passwd *getpwuid();
                     97: 
                     98:        return getpwuid(getuid())->pw_name;
                     99: }
                    100: catch(){}

unix.superglobalmegacorp.com

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