|
|
1.1 ! root 1: /* ! 2: * chsh ! 3: */ ! 4: #include <stdio.h> ! 5: #include <signal.h> ! 6: #include <pwd.h> ! 7: ! 8: char passwd[] = "/etc/passwd"; ! 9: char temp[] = "/etc/ptmp"; ! 10: struct passwd *pwd; ! 11: struct passwd *getpwent(); ! 12: int endpwent(); ! 13: char *crypt(); ! 14: char *getpass(); ! 15: char *pw; ! 16: char pwbuf[10]; ! 17: char buf[BUFSIZ]; ! 18: ! 19: main(argc, argv) ! 20: char *argv[]; ! 21: { ! 22: char *p; ! 23: int i; ! 24: char saltc[2]; ! 25: long salt; ! 26: int u,fi,fo; ! 27: int insist; ! 28: int ok, flags; ! 29: int c; ! 30: int pwlen; ! 31: FILE *tf; ! 32: ! 33: insist = 0; ! 34: if(argc < 2 || argc > 3) { ! 35: printf("Usage: chsh user [ /bin/csh ]\n"); ! 36: goto bex; ! 37: } ! 38: if (argc == 2) ! 39: argv[2] = ""; ! 40: else if (strcmp(argv[2], "/bin/csh") && getuid()) { ! 41: printf("Only /bin/csh may be specified\n"); ! 42: exit(1); ! 43: } ! 44: while((pwd=getpwent()) != NULL){ ! 45: if(strcmp(pwd->pw_name,argv[1]) == 0){ ! 46: u = getuid(); ! 47: if(u!=0 && u != pwd->pw_uid){ ! 48: printf("Permission denied.\n"); ! 49: goto bex; ! 50: } ! 51: break; ! 52: } ! 53: } ! 54: endpwent(); ! 55: signal(SIGHUP, 1); ! 56: signal(SIGINT, 1); ! 57: signal(SIGQUIT, 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_shell = 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.