#define NDBM /* * build_pwfile.c --- build a table of bad passwords, keyed by their * des equivalents. * * Written by Theodore Ts'o * * Copyright 1988 by the Massachusetts Institute of Technology. * * For copying and distribution information, please see the file * . */ #ifndef lint static char rcsid_build_pwfile_c[] = "$Id: build_pwfile.c,v 1.2 1998/10/30 02:52:45 marc Exp $"; #endif lint #include #include #include #include #include #ifdef NDBM #include #else /*NDBM*/ #include #endif /*NDBM*/ #include #include #include #include "kadm_server.h" /* Macros to convert ndbm names to dbm names. * Note that dbm_nextkey() cannot be simply converted using a macro, since * it is invoked giving the database, and nextkey() needs the previous key. * * Instead, all routines call "dbm_next" instead. */ #ifndef NDBM typedef char DBM; #define dbm_open(file, flags, mode) ((dbminit(file) == 0)?"":((char *)0)) #define dbm_fetch(db, key) fetch(key) #define dbm_store(db, key, content, flag) store(key, content) #define dbm_firstkey(db) firstkey() #define dbm_next(db,key) nextkey(key) #define dbm_close(db) dbmclose() #else #define dbm_next(db,key) dbm_nextkey(db) #endif main(argc, argv) int argc; char **argv; { DBM *pwfile; FILE *f; datum passwd, entry; des_cblock key; char word[1024]; int len, filenum, i; int wptr; if (argc != 2) { fprintf(stderr,"%s: Usage: %s filename\n", argv[0], argv[0]); exit(1); } if (!(f = fopen(argv[1], "r"))) { perror(argv[1]); exit(1); } pwfile = dbm_open(PW_CHECK_FILE, O_RDWR|O_CREAT, 0644); if (!pwfile) { fprintf(stderr, "Couldn't open %s for writing.\n", PW_CHECK_FILE); perror("dbm_open"); exit(1); } filenum = 0; do { filenum++; passwd.dptr = (char *) &filenum; passwd.dsize = sizeof(filenum); entry.dptr = argv[1]; entry.dsize = strlen(argv[1])+1; } while (dbm_store(pwfile, passwd, entry, DBM_INSERT)); i = 0; while (!feof(f)) { i++; wptr = (filenum << 24) + i; fgets(word, sizeof(word), f); len = strlen(word); if (len > 0 && word[len-1] == '\n') word[--len] = '\0'; #ifdef NOENCRYPTION bzero((char *) key, sizeof(des_cblock)); key[0] = (unsigned char) 1; #else (void) des_string_to_key(word, key); #endif passwd.dptr = (char *) key; passwd.dsize = 8; entry.dptr = (char *) &wptr; #ifdef notdef entry.dsize = sizeof(wptr); #else entry.dsize = 0; #endif dbm_store(pwfile, passwd, entry, DBM_REPLACE); } dbm_close(pwfile); exit(0); }