xref: /original-bsd/old/mkpasswd/mkpasswd.c (revision 0f30d223)
1 #ifndef lint
2 static	char *sccsid = "@(#)mkpasswd.c	4.6 (Berkeley) 85/01/10";
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 = dbm_open(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 	setpwfile(argv[1]);
44 	while (pwd = getpwent()) {
45 		cp = buf;
46 #define	COMPACT(e)	tp = pwd->pw_/**/e; while (*cp++ = *tp++);
47 		COMPACT(name);
48 		COMPACT(passwd);
49 		bcopy((char *)&pwd->pw_uid, cp, sizeof (int));
50 		cp += sizeof (int);
51 		bcopy((char *)&pwd->pw_gid, cp, sizeof (int));
52 		cp += sizeof (int);
53 		bcopy((char *)&pwd->pw_quota, cp, sizeof (int));
54 		cp += sizeof (int);
55 		COMPACT(comment);
56 		COMPACT(gecos);
57 		COMPACT(dir);
58 		COMPACT(shell);
59 		content.dptr = buf;
60 		content.dsize = cp - buf;
61 		if (verbose)
62 			printf("store %s, uid %d\n", pwd->pw_name, pwd->pw_uid);
63 		key.dptr = pwd->pw_name;
64 		key.dsize = strlen(pwd->pw_name);
65 		if (dbm_store(dp, key, content, DBM_INSERT) < 0) {
66 			fprintf(stderr, "mkpasswd: ");
67 			perror("dbm_store failed");
68 			exit(1);
69 		}
70 		key.dptr = (char *)&pwd->pw_uid;
71 		key.dsize = sizeof (int);
72 		if (dbm_store(dp, key, content, DBM_INSERT) < 0) {
73 			fprintf(stderr, "mkpasswd: ");
74 			perror("dbm_store failed");
75 			exit(1);
76 		}
77 		entries++;
78 		if (cp - buf > maxlen)
79 			maxlen = cp - buf;
80 	}
81 	dbm_close(dp);
82 	printf("%d password entries, maximum length %d\n", entries, maxlen);
83 	exit(0);
84 }
85