/*
* keydb_db2.c - Routines to store and fetch keys in a DB2 file (a la pksd)
*
- * Jonathan McDowell <noodles@earth.li>
+ * Copyright 2002-2004 Jonathan McDowell <noodles@earth.li>
*
- * 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 <sys/types.h>
#include <string.h>
#include <unistd.h>
+#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"
*/
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)
{
/*
* 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));
*/
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);
&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);
}
}
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));
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);
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"