X-Git-Url: https://the.earth.li/gitweb/?a=blobdiff_plain;f=keydb_db3.c;h=247cbabf3e89f88250be67f9de74da254f6e0efb;hb=9a96aa6edb1d8033124fe81b945c7e76f37d6087;hp=a50643d30769071e1ca097494ebb71c0427b0a95;hpb=2ffd5444d8c7a73b12039f3a6cf336872f2558c4;p=onak.git diff --git a/keydb_db3.c b/keydb_db3.c index a50643d..247cbab 100644 --- a/keydb_db3.c +++ b/keydb_db3.c @@ -5,7 +5,7 @@ * * Copyright 2002 Project Purple * - * $Id: keydb_db3.c,v 1.18 2003/09/28 14:56:32 noodles Exp $ + * $Id: keydb_db3.c,v 1.24 2004/03/28 21:27:03 noodles Exp $ */ #include @@ -58,7 +58,11 @@ static DB_TXN *txn = NULL; DB *keydb(uint64_t keyid) { - return(dbconns[keyid % numdbs]); + uint64_t keytrun; + + keytrun = keyid >> 8; + + return(dbconns[keytrun % numdbs]); } /** @@ -118,12 +122,13 @@ struct ll *makewordlist(struct ll *wordlist, char *word) * this file are called in order to allow the DB to be initialized ready * for access. */ -void initdb(void) +void initdb(bool readonly) { - char buf[1024]; - FILE *numdb = NULL; - int ret = 0; - int i = 0; + char buf[1024]; + FILE *numdb = NULL; + int ret = 0; + int i = 0; + u_int32_t flags = 0; snprintf(buf, sizeof(buf) - 1, "%s/num_keydb", config.db_dir); numdb = fopen(buf, "r"); @@ -132,9 +137,18 @@ void initdb(void) numdbs = atoi(buf); } fclose(numdb); - } else { + } else if (!readonly) { logthing(LOGTHING_ERROR, "Couldn't open num_keydb: %s", strerror(errno)); + numdb = fopen(buf, "w"); + if (numdb != NULL) { + fprintf(numdb, "%d", numdbs); + fclose(numdb); + } else { + logthing(LOGTHING_ERROR, + "Couldn't write num_keydb: %s", + strerror(errno)); + } } dbconns = malloc(sizeof (DB *) * numdbs); @@ -170,7 +184,7 @@ void initdb(void) 0); if (ret != 0) { logthing(LOGTHING_CRITICAL, - "Erroring opening db environment: %s (%s)", + "Error opening db environment: %s (%s)", config.db_dir, db_strerror(ret)); exit(1); @@ -185,10 +199,14 @@ void initdb(void) } snprintf(buf, 1023, "keydb.%d.db", i); + flags = DB_CREATE; + if (readonly) { + flags |= DB_RDONLY; + } ret = dbconns[i]->open(dbconns[i], buf, NULL, DB_HASH, - DB_CREATE, + flags, 0664); if (ret != 0) { logthing(LOGTHING_CRITICAL, @@ -207,7 +225,7 @@ void initdb(void) ret = worddb->set_flags(worddb, DB_DUP); ret = worddb->open(worddb, "worddb", NULL, DB_BTREE, - DB_CREATE, + flags, 0664); if (ret != 0) { logthing(LOGTHING_CRITICAL, @@ -340,7 +358,7 @@ int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey, fetchbuf.offset = 0; fetchbuf.size = data.size; read_openpgp_stream(buffer_fetchchar, &fetchbuf, - &packets); + &packets, 0); parse_keys(packets, publickey); free_packet_list(packets); packets = NULL; @@ -778,35 +796,46 @@ int delete_key(uint64_t keyid, bool intrans) */ int dumpdb(char *filenamebase) { - DBT key, data; - DBC *cursor = NULL; - int ret = 0; - int fd = -1; - int i; + DBT key, data; + DBC *cursor = NULL; + int ret = 0; + int fd = -1; + int i = 0; + char filename[1024]; + filename[1023] = 0; for (i = 0; i < numdbs; i++) { ret = dbconns[i]->cursor(dbconns[i], NULL, &cursor, 0); /* flags */ - fd = open(filenamebase, O_CREAT | O_WRONLY | O_TRUNC, 0640); - memset(&key, 0, sizeof(key)); - memset(&data, 0, sizeof(data)); - ret = cursor->c_get(cursor, &key, &data, DB_NEXT); - while (ret == 0) { - write(fd, data.data, data.size); + snprintf(filename, 1023, "%s.%d.pgp", filenamebase, i); + fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0640); + if (fd == -1) { + logthing(LOGTHING_ERROR, + "Error opening keydump file (%s): %s", + filename, + strerror(errno)); + } else { memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data)); ret = cursor->c_get(cursor, &key, &data, DB_NEXT); - } - if (ret != DB_NOTFOUND) { - logthing(LOGTHING_ERROR, "Problem reading key: %s", + while (ret == 0) { + write(fd, data.data, data.size); + memset(&key, 0, sizeof(key)); + memset(&data, 0, sizeof(data)); + ret = cursor->c_get(cursor, &key, &data, + DB_NEXT); + } + if (ret != DB_NOTFOUND) { + logthing(LOGTHING_ERROR, + "Problem reading key: %s", db_strerror(ret)); + } + close(fd); } - close(fd); - ret = cursor->c_close(cursor); cursor = NULL; }