*
* Copyright 2002 Project Purple
*
- * $Id: keydb_db3.c,v 1.17 2003/09/28 14:54:57 noodles Exp $
+ * $Id: keydb_db3.c,v 1.26 2004/05/27 03:33:24 noodles Exp $
*/
#include <assert.h>
#include "log.h"
#include "onak-conf.h"
#include "parsekey.h"
+#include "wordlist.h"
/**
* dbenv - our database environment.
DB *keydb(uint64_t keyid)
{
- return(dbconns[keyid % numdbs]);
-}
+ uint64_t keytrun;
-/**
- * makewordlist - Takes a string and splits it into a set of unique words.
- * @wordlist: The current word list.
- * @words: The string to split and add.
- *
- * We take words and split it on non alpha numeric characters. These get
- * added to the word list if they're not already present. If the wordlist
- * is NULL then we start a new list, otherwise it's search for already
- * added words. Note that words is modified in the process of scanning.
- *
- * Returns the new word list.
- */
-struct ll *makewordlist(struct ll *wordlist, char *word)
-{
- char *start = NULL;
- char *end = NULL;
-
- /*
- * Walk through the words string, spliting on non alphanumerics and
- * then checking if the word already exists in the list. If not then
- * we add it.
- */
- end = word;
- while (end != NULL && *end != 0) {
- start = end;
- while (*start != 0 && !isalnum(*start)) {
- start++;
- }
- end = start;
- while (*end != 0 && isalnum(*end)) {
- *end = tolower(*end);
- end++;
- }
- if (end - start > 1) {
- if (*end != 0) {
- *end = 0;
- end++;
- }
-
- if (llfind(wordlist, start,
- strcmp) == NULL) {
- wordlist = lladd(wordlist,
- start);
- }
- }
- }
+ keytrun = keyid >> 8;
- return wordlist;
+ return(dbconns[keytrun % numdbs]);
}
/**
* 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");
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);
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);
}
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,
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,
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;
*/
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++) {
- starttrans();
-
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;
-
- endtrans();
}
return 0;