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