Commit | Line | Data |
---|---|---|
64504187 BJ |
1 | static char *sccsid = "@(#)chfn.sh 4.1 (Berkeley) %G%"; |
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 | } |