xref: /csrg-svn/old/mkpasswd/mkpasswd.c (revision 16509)
1 #ifndef lint
2 static	char *sccsid = "@(#)mkpasswd.c	4.4 (Berkeley) 84/05/17";
3 #endif
4 
5 #include <sys/file.h>
6 #include <stdio.h>
7 #include <pwd.h>
8 #include <ndbm.h>
9 
10 char	buf[BUFSIZ];
11 
12 struct	passwd *fgetpwent();
13 
14 main(argc, argv)
15 	char *argv[];
16 {
17 	DBM *dp;
18 	datum key, content;
19 	register char *cp, *tp;
20 	register struct passwd *pwd;
21 	int verbose = 0, entries = 0, maxlen = 0;
22 
23 	if (argc > 1 && strcmp(argv[1], "-v") == 0) {
24 		verbose++;
25 		argv++, argc--;
26 	}
27 	if (argc != 2) {
28 		fprintf(stderr, "usage: mkpasswd [ -v ] file\n");
29 		exit(1);
30 	}
31 	if (access(argv[1], R_OK) < 0) {
32 		fprintf(stderr, "mkpasswd: ");
33 		perror(argv[1]);
34 		exit(1);
35 	}
36 	umask(0);
37 	dp = ndbmopen(argv[1], O_WRONLY|O_CREAT|O_EXCL, 0644);
38 	if (dp == NULL) {
39 		fprintf(stderr, "mkpasswd: ");
40 		perror(argv[1]);
41 		exit(1);
42 	}
43 	dp->db_maxbno = 0;
44 	setpwfile(argv[1]);
45 	while (pwd = getpwent()) {
46 		cp = buf;
47 #define	COMPACT(e)	tp = pwd->pw_/**/e; while (*cp++ = *tp++);
48 		COMPACT(name);
49 		COMPACT(passwd);
50 		*(int *)cp = pwd->pw_uid; cp += sizeof (int);
51 		*(int *)cp = pwd->pw_gid; cp += sizeof (int);
52 		*(int *)cp = pwd->pw_quota; cp += sizeof (int);
53 		COMPACT(comment);
54 		COMPACT(gecos);
55 		COMPACT(dir);
56 		COMPACT(shell);
57 		content.dptr = buf;
58 		content.dsize = cp - buf;
59 		if (verbose)
60 			printf("store %s, uid %d\n", pwd->pw_name, pwd->pw_uid);
61 		key.dptr = pwd->pw_name;
62 		key.dsize = strlen(pwd->pw_name);
63 		dbmstore(dp, key, content, DB_INSERT);
64 		key.dptr = (char *)&pwd->pw_uid;
65 		key.dsize = sizeof (int);
66 		dbmstore(dp, key, content, DB_INSERT);
67 		entries++;
68 		if (cp - buf > maxlen)
69 			maxlen = cp - buf;
70 	}
71 	printf("%d password entries, maximum length %d\n", entries, maxlen);
72 	exit(0);
73 }
74