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