xref: /original-bsd/usr.bin/passwd/chfn.sh (revision 55330032)
1static char *sccsid = "@(#)chfn.sh	4.1 (Berkeley) 10/01/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
9char	passwd[] = "/etc/passwd";
10char	temp[]	 = "/etc/ptmp";
11struct	passwd *pwd;
12struct	passwd *getpwent();
13int	endpwent();
14char	*crypt();
15char	*getpass();
16char	*pw;
17char	pwbuf[10];
18char	buf[BUFSIZ];
19
20main(argc, argv)
21char *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
108out:
109	unlink(temp);
110
111bex:
112	exit(1);
113}
114