X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/e02c731dfbb288c736f2cd09a9b6df0507c59ddd..HEAD:/keydb_db2.c diff --git a/keydb_db2.c b/keydb_db2.c index 3d66c5a..4ba31e8 100644 --- a/keydb_db2.c +++ b/keydb_db2.c @@ -1,9 +1,20 @@ /* * keydb_db2.c - Routines to store and fetch keys in a DB2 file (a la pksd) * - * Jonathan McDowell + * Copyright 2002-2004 Jonathan McDowell * - * Copyright 2002 Project Purple + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include @@ -16,10 +27,12 @@ #include #include +#include "charfuncs.h" #include "keydb.h" #include "keyid.h" #include "keyindex.h" #include "keystructs.h" +#include "log.h" #include "mem.h" #include "onak-conf.h" #include "parsekey.h" @@ -41,40 +54,6 @@ static DB **db2_keydbfiles = NULL; */ static DB_ENV db2_env; -/* - * Shared with CGI buffer stuff... - */ -struct db2_get_ctx { - char *buffer; - int offset; - int size; -}; - -/** - * keydb_fetchchar - Fetches a char from a buffer. - */ -int keydb_fetchchar(void *ctx, int count, unsigned char *c) -{ - struct db2_get_ctx *buf = NULL; - int i; - - buf = (struct db2_get_ctx *) ctx; - for (i = 0; i < count; i++) { - c[i] = buf->buffer[buf->offset++]; - } - - return (((buf->offset) == (buf->size)) ? 1 : 0); -} - -/** - * keydb_putchar - Puts a char to a file. - */ -static int keydb_putchar(void *fd, unsigned char c) -{ -// return !(lo_write(dbconn, *(int *) fd, &c, sizeof(c))); - return 1; -} - DB *keydb(DBT *key) { /* @@ -95,12 +74,26 @@ DB *keydb(DBT *key) * this file are called in order to allow the DB to be initialized ready * for access. */ -void initdb(void) +void initdb(bool readonly) { DB_INFO keydbinfo; int i; int ret; char keydbname[20]; + char buf[1024]; + FILE *numdb = NULL; + + snprintf(buf, sizeof(buf) - 1, "%s/num_keydb", config.db_dir); + numdb = fopen(buf, "r"); + if (numdb != NULL) { + if (fgets(buf, sizeof(buf), numdb) != NULL) { + db2_numdb = atoi(buf); + } + fclose(numdb); + } else { + logthing(LOGTHING_ERROR, "Couldn't open num_keydb: %s", + strerror(errno)); + } memset(&db2_env, 0, sizeof(db2_env)); @@ -111,7 +104,7 @@ void initdb(void) */ db2_env.mp_size = 20 * 1024 * 1024; - ret = db_appinit(config.db2_dbpath, NULL, + ret = db_appinit(config.db_dir, NULL, &db2_env, DB_INIT_MPOOL|DB_INIT_LOCK); if (!ret) { db2_keydbfiles = (DB **) malloc(sizeof (DB *) * db2_numdb); @@ -124,13 +117,15 @@ void initdb(void) &db2_env, &keydbinfo, &db2_keydbfiles[i]); if (ret) { - fprintf(stderr, "Error opening db file %d (errno %d)\n", + logthing(LOGTHING_CRITICAL, + "Error opening db file %d (errno %d)", i, ret); exit(1); } } } else { - fprintf(stderr, "Error initializing db (%d).\n", ret); + logthing(LOGTHING_CRITICAL, "Error initializing db (%d).", + ret); exit(1); } } @@ -196,7 +191,7 @@ int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey, int ret; DBT key, data; char id[KEYDB_KEYID_BYTES]; - struct db2_get_ctx fetchbuf; + struct buffer_ctx fetchbuf; memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data)); @@ -214,8 +209,10 @@ int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey, fetchbuf.buffer = data.data; fetchbuf.offset = 0; fetchbuf.size = data.size; - read_openpgp_stream(keydb_fetchchar, &fetchbuf, &packets); + read_openpgp_stream(buffer_fetchchar, &fetchbuf, &packets, 0); parse_keys(packets, publickey); + free_packet_list(packets); + packets = NULL; } return (!ret); @@ -263,10 +260,28 @@ int delete_key(uint64_t keyid, bool intrans) return (1); } +/** + * iterate_keys - call a function once for each key in the db. + * @iterfunc: The function to call. + * @ctx: A context pointer + * + * Calls iterfunc once for each key in the database. ctx is passed + * unaltered to iterfunc. This function is intended to aid database dumps + * and statistic calculations. + * + * Returns the number of keys we iterated over. + */ +int iterate_keys(void (*iterfunc)(void *ctx, struct openpgp_publickey *key), + void *ctx) +{ + return 0; +} + /* * Include the basic keydb routines. */ #define NEED_KEYID2UID 1 #define NEED_GETKEYSIGS 1 #define NEED_GETFULLKEYID 1 +#define NEED_UPDATEKEYS 1 #include "keydb.c"