Annotation of 40BSD/cmd/chsh.c, revision 1.1

1.1     ! root        1: static char *sccsid = "@(#)chsh.c      4.1 (Berkeley) 10/1/80";
        !             2: /*
        !             3:  * chsh
        !             4:  */
        !             5: #include <stdio.h>
        !             6: #include <signal.h>
        !             7: #include <pwd.h>
        !             8: 
        !             9: char   passwd[] = "/etc/passwd";
        !            10: char   temp[]   = "/etc/ptmp";
        !            11: struct passwd *pwd;
        !            12: struct passwd *getpwent();
        !            13: int    endpwent();
        !            14: char   *crypt();
        !            15: char   *getpass();
        !            16: char   *pw;
        !            17: char   pwbuf[10];
        !            18: char   buf[BUFSIZ];
        !            19: 
        !            20: main(argc, argv)
        !            21: char *argv[];
        !            22: {
        !            23:        char *p;
        !            24:        int i;
        !            25:        char saltc[2];
        !            26:        long salt;
        !            27:        int u,fi,fo;
        !            28:        int insist;
        !            29:        int ok, flags;
        !            30:        int c;
        !            31:        int pwlen;
        !            32:        FILE *tf;
        !            33: 
        !            34:        insist = 0;
        !            35:        if(argc < 2 || argc > 3) {
        !            36:                printf("Usage: chsh user [ /bin/oldcsh ] [ /bin/csh ]\n");
        !            37:                goto bex;
        !            38:        }
        !            39:        if (argc == 2)
        !            40:                argv[2] = "";
        !            41:        else if (strcmp(argv[2], "/bin/oldcsh") && strcmp(argv[2], "/bin/csh") && getuid()) {
        !            42:                printf("Only /bin/oldcsh or /bin/csh may be specified\n");
        !            43:                exit(1);
        !            44:        }
        !            45:        while((pwd=getpwent()) != NULL){
        !            46:                if(strcmp(pwd->pw_name,argv[1]) == 0){
        !            47:                        u = getuid();
        !            48:                        if(u!=0 && u != pwd->pw_uid){
        !            49:                                printf("Permission denied.\n");
        !            50:                                goto bex;
        !            51:                                }
        !            52:                        break;
        !            53:                        }
        !            54:                }
        !            55:        endpwent();
        !            56:        signal(SIGHUP, 1);
        !            57:        signal(SIGINT, 1);
        !            58:        signal(SIGQUIT, 1);
        !            59:        signal(SIGTSTP, 1);
        !            60: 
        !            61:        if(access(temp, 0) >= 0) {
        !            62:                printf("Temporary file busy -- try again\n");
        !            63:                goto bex;
        !            64:        }
        !            65:        if((tf=fopen(temp,"w")) == NULL) {
        !            66:                printf("Cannot create temporary file\n");
        !            67:                goto bex;
        !            68:        }
        !            69: 
        !            70: /*
        !            71:  *     copy passwd to temp, replacing matching lines
        !            72:  *     with new shell.
        !            73:  */
        !            74: 
        !            75:        while((pwd=getpwent()) != NULL) {
        !            76:                if(strcmp(pwd->pw_name,argv[1]) == 0) {
        !            77:                        u = getuid();
        !            78:                        if(u != 0 && u != pwd->pw_uid) {
        !            79:                                printf("Permission denied.\n");
        !            80:                                goto out;
        !            81:                        }
        !            82:                        pwd->pw_shell = argv[2];
        !            83:                }
        !            84:                fprintf(tf,"%s:%s:%d:%d:%s:%s:%s\n",
        !            85:                        pwd->pw_name,
        !            86:                        pwd->pw_passwd,
        !            87:                        pwd->pw_uid,
        !            88:                        pwd->pw_gid,
        !            89:                        pwd->pw_gecos,
        !            90:                        pwd->pw_dir,
        !            91:                        pwd->pw_shell);
        !            92:        }
        !            93:        endpwent();
        !            94:        fclose(tf);
        !            95: 
        !            96: /*
        !            97:  *     copy temp back to passwd file
        !            98:  */
        !            99: 
        !           100:        if((fi=open(temp,0)) < 0) {
        !           101:                printf("Temp file disappeared!\n");
        !           102:                goto out;
        !           103:        }
        !           104:        if((fo=creat(passwd, 0644)) < 0) {
        !           105:                printf("Cannot recreat passwd file.\n");
        !           106:                goto out;
        !           107:        }
        !           108:        while((u=read(fi,buf,sizeof(buf))) > 0) write(fo,buf,u);
        !           109: 
        !           110: out:
        !           111:        unlink(temp);
        !           112: 
        !           113: bex:
        !           114:        exit(1);
        !           115: }

unix.superglobalmegacorp.com

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