|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.