Annotation of 40BSD/cmd/chsh.c, revision 1.1.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.