Annotation of 40BSD/cmd/chfn.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)chfn.c      4.1 (Berkeley) 10/1/80";
                      2: /*
                      3:  * chfn - change full name (or other info in gecos field)
                      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 != 3) {
                     36:                printf("Usage: chfn user full-name\n");
                     37:                goto bex;
                     38:        }
                     39:        if (index(argv[2], ':') || index(argv[2], '\n')) {
                     40:                printf("Illegal character in new string\n");
                     41:                exit(1);
                     42:        }
                     43:        while((pwd=getpwent()) != NULL){
                     44:                if(strcmp(pwd->pw_name,argv[1]) == 0){
                     45:                        u = getuid();
                     46:                        if(u!=0 && u != pwd->pw_uid){
                     47:                                printf("Permission denied.\n");
                     48:                                goto bex;
                     49:                                }
                     50:                        break;
                     51:                        }
                     52:                }
                     53:        endpwent();
                     54:        signal(SIGHUP, 1);
                     55:        signal(SIGINT, 1);
                     56:        signal(SIGQUIT, 1);
                     57:        signal(SIGTSTP, 1);
                     58: 
                     59:        if(access(temp, 0) >= 0) {
                     60:                printf("Temporary file busy -- try again\n");
                     61:                goto bex;
                     62:        }
                     63:        if((tf=fopen(temp,"w")) == NULL) {
                     64:                printf("Cannot create temporary file\n");
                     65:                goto bex;
                     66:        }
                     67: 
                     68: /*
                     69:  *     copy passwd to temp, replacing matching lines
                     70:  *     with new shell.
                     71:  */
                     72: 
                     73:        while((pwd=getpwent()) != NULL) {
                     74:                if(strcmp(pwd->pw_name,argv[1]) == 0) {
                     75:                        u = getuid();
                     76:                        if(u != 0 && u != pwd->pw_uid) {
                     77:                                printf("Permission denied.\n");
                     78:                                goto out;
                     79:                        }
                     80:                        pwd->pw_gecos = argv[2];
                     81:                }
                     82:                fprintf(tf,"%s:%s:%d:%d:%s:%s:%s\n",
                     83:                        pwd->pw_name,
                     84:                        pwd->pw_passwd,
                     85:                        pwd->pw_uid,
                     86:                        pwd->pw_gid,
                     87:                        pwd->pw_gecos,
                     88:                        pwd->pw_dir,
                     89:                        pwd->pw_shell);
                     90:        }
                     91:        endpwent();
                     92:        fclose(tf);
                     93: 
                     94: /*
                     95:  *     copy temp back to passwd file
                     96:  */
                     97: 
                     98:        if((fi=open(temp,0)) < 0) {
                     99:                printf("Temp file disappeared!\n");
                    100:                goto out;
                    101:        }
                    102:        if((fo=creat(passwd, 0644)) < 0) {
                    103:                printf("Cannot recreat passwd file.\n");
                    104:                goto out;
                    105:        }
                    106:        while((u=read(fi,buf,sizeof(buf))) > 0) write(fo,buf,u);
                    107: 
                    108: out:
                    109:        unlink(temp);
                    110: 
                    111: bex:
                    112:        exit(1);
                    113: }

unix.superglobalmegacorp.com

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