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