]> the.earth.li Git - onak.git/commitdiff
Move dumpdb over to using iterate_keys.
authorJonathan McDowell <noodles@earth.li>
Sat, 23 Oct 2004 16:58:31 +0000 (16:58 +0000)
committerJonathan McDowell <noodles@earth.li>
Sat, 23 Oct 2004 16:58:31 +0000 (16:58 +0000)
iterate_keys provides a generic way to do stuff with every key in the
DB, so use it instead for dumping the database and remove the old
dumpdb function.

keydb.h
keydb_db2.c
keydb_db4.c
keydb_file.c
keydb_fs.c
keydb_keyd.c
keydb_pg.c
onak.c

diff --git a/keydb.h b/keydb.h
index 98cf34dd7fa11dbdad6ebe5ad08f8e254867ebd3..44062234d28714cbe672a06f1193340fd366f398 100644 (file)
--- a/keydb.h
+++ b/keydb.h
@@ -151,18 +151,6 @@ struct ll *cached_getkeysigs(uint64_t keyid);
  */
 uint64_t getfullkeyid(uint64_t keyid);
 
-/**
- *     dumpdb - dump the key database
- *     @filenamebase: The base filename to use for the dump.
- *
- *     Dumps the database into one or more files, which contain pure OpenPGP
- *     that can be reimported into onak or gpg. filenamebase provides a base
- *     file name for the dump; several files may be created, all of which will
- *     begin with this string and then have a unique number and a .pgp
- *     extension.
- */
-int dumpdb(char *filenamebase);
-
 /**
  *     iterate_keys - call a function once for each key in the db.
  *     @iterfunc: The function to call.
index f9ca04b5f4a3081151db6432009e744dd8ee9f4b..affdc4b147682c55ab739d432c91283a695645db 100644 (file)
@@ -249,21 +249,6 @@ int delete_key(uint64_t keyid, bool intrans)
        return (1);
 }
 
-/**
- *     dumpdb - dump the key database
- *     @filenamebase: The base filename to use for the dump.
- *
- *     Dumps the database into one or more files, which contain pure OpenPGP
- *     that can be reimported into onak or gpg. filenamebase provides a base
- *     file name for the dump; several files may be created, all of which will
- *     begin with this string and then have a unique number and a .pgp
- *     extension.
- *          */
-int dumpdb(char *filenamebase)
-{
-       return 0;
-}
-
 /**
  *     iterate_keys - call a function once for each key in the db.
  *     @iterfunc: The function to call.
index 1daf00bed8f91d016d55938848f2f92ce8101399..6d57cd312b938b76d46a5f29875122a0a18d3db1 100644 (file)
@@ -939,65 +939,6 @@ int delete_key(uint64_t keyid, bool intrans)
        return deadlock ? (-1) : (ret == DB_NOTFOUND);
 }
 
-/**
- *     dumpdb - dump the key database
- *     @filenamebase: The base filename to use for the dump.
- *
- *     Dumps the database into one or more files, which contain pure OpenPGP
- *     that can be reimported into onak or gpg. filenamebase provides a base
- *     file name for the dump; several files may be created, all of which will
- *     begin with this string and then have a unique number and a .pgp
- *     extension.
- */
-int dumpdb(char *filenamebase)
-{
-       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 */
-
-               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);
-                       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);
-               }
-
-               ret = cursor->c_close(cursor);
-               cursor = NULL;
-       }
-       
-       return 0;
-}
-
 /**
  *     iterate_keys - call a function once for each key in the db.
  *     @iterfunc: The function to call.
index 1ef81b473825818123d5c633cdeb10ae672383be..a0c90327bf9a978525e17ab6860a430e2a227de9 100644 (file)
@@ -228,22 +228,6 @@ int iterate_keys(void (*iterfunc)(void *ctx, struct openpgp_publickey *key),
        return numkeys;
 }
 
-
-/**
- *     dumpdb - dump the key database
- *     @filenamebase: The base filename to use for the dump.
- *
- *     Dumps the database into one or more files, which contain pure OpenPGP
- *     that can be reimported into onak or gpg. filenamebase provides a base
- *     file name for the dump; several files may be created, all of which will
- *     begin with this string and then have a unique number and a .pgp
- *     extension.
- *          */
-int dumpdb(char *filenamebase)
-{
-       return 0;
-}
-
 /*
  * Include the basic keydb routines.
  */
index 1c5d14c9990cbb905beb4100483ba2757532011d..14220d14e6c51c2642f69756fc7b289742ec047f 100644 (file)
@@ -485,15 +485,6 @@ int fetch_key_text(const char *search,
        return addedkeys;
 }
 
-/*
- *     dumpdb - dump the key database
- *     @filenamebase: The base filename to use for the dump.
- */
-int dumpdb(char *filenamebase)
-{
-       return 0;
-}
-
 uint64_t getfullkeyid(uint64_t keyid)
 {
        static char buffer[PATH_MAX];
index fac5548481af7e6fc82a6762744b6663ce4f029b..26cb326f758ae332bd5c9b9bb5e75a6cca6cc532 100644 (file)
@@ -341,21 +341,6 @@ uint64_t getfullkeyid(uint64_t keyid)
        return keyid;
 }
 
-/**
- *     dumpdb - dump the key database
- *     @filenamebase: The base filename to use for the dump.
- *
- *     Dumps the database into one or more files, which contain pure OpenPGP
- *     that can be reimported into onak or gpg. filenamebase provides a base
- *     file name for the dump; several files may be created, all of which will
- *     begin with this string and then have a unique number and a .pgp
- *     extension.
- */
-int dumpdb(char *filenamebase)
-{
-       return 0;
-}
-
 /**
  *     iterate_keys - call a function once for each key in the db.
  *     @iterfunc: The function to call.
index afdbb23ce931209a5924c7ebd09c2fd17588a03a..5933c91381647f4fb837c3de4ea859aafb9d59f9 100644 (file)
@@ -567,21 +567,6 @@ struct ll *getkeysigs(uint64_t keyid, bool *revoked)
        return sigs;
 }
 
-/**
- *     dumpdb - dump the key database
- *     @filenamebase: The base filename to use for the dump.
- *
- *     Dumps the database into one or more files, which contain pure OpenPGP
- *     that can be reimported into onak or gpg. filenamebase provides a base
- *     file name for the dump; several files may be created, all of which will
- *     begin with this string and then have a unique number and a .pgp
- *     extension.
- *          */
-int dumpdb(char *filenamebase)
-{
-       return 0;
-}
-
 /**
  *     iterate_keys - call a function once for each key in the db.
  *     @iterfunc: The function to call.
diff --git a/onak.c b/onak.c
index e79e565a79779c08218101ea0c806f3ccedf6011..4e63720afea4519c81828159adcfaae942d4be90 100644 (file)
--- a/onak.c
+++ b/onak.c
@@ -8,10 +8,13 @@
  * Copyright 2002 Project Purple
  */
 
+#include <fcntl.h>
 #include <getopt.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 #include <unistd.h>
 
 #include "armor.h"
@@ -54,6 +57,41 @@ void find_keys(char *search, uint64_t keyid, bool ishex,
        }
 }
 
+struct dump_ctx {
+       int count;
+       int maxcount;
+       int fd;
+       int filenum;
+       char *filebase;
+};
+
+void dump_func(void *ctx, struct openpgp_publickey *key)
+{
+       struct openpgp_packet_list *packets = NULL;
+       struct openpgp_packet_list *list_end = NULL;
+       struct dump_ctx *state;
+       char filename[1024];
+
+       state = (struct dump_ctx *) ctx;
+
+       if (state->fd == -1 || state->count > state->maxcount) {
+               if (state->fd != -1) {
+                       close(state->fd);
+                       state->fd = -1;
+               }
+               snprintf(filename, 1023, state->filebase, state->filenum);
+               state->fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0640);
+               state->filenum++;
+               state->count = 0;
+       }
+       flatten_publickey(key, &packets, &list_end);
+       write_openpgp_stream(file_putchar, &state->fd, packets);
+       free_packet_list(packets);
+       packets = list_end = NULL;
+
+       return;
+}
+
 void usage(void) {
        puts("onak " PACKAGE_VERSION " - an OpenPGP keyserver.\n");
        puts("Usage:\n");
@@ -91,6 +129,7 @@ int main(int argc, char *argv[])
        bool                             binary = false;
        bool                             fingerprint = false;
        int                              optchar;
+       struct dump_ctx                  dumpstate;
 
        while ((optchar = getopt(argc, argv, "bc:fuv")) != -1 ) {
                switch (optchar) {
@@ -121,7 +160,15 @@ int main(int argc, char *argv[])
                usage();
        } else if (!strcmp("dump", argv[optind])) {
                initdb(true);
-               dumpdb("keydump");
+               dumpstate.count = dumpstate.filenum = 0;
+               dumpstate.maxcount = 1000000;
+               dumpstate.fd = -1;
+               dumpstate.filebase = "keydump.%d.pgp";
+               iterate_keys(dump_func, &dumpstate);
+               if (dumpstate.fd != -1) {
+                       close(dumpstate.fd);
+                       dumpstate.fd = -1;
+               }
                cleanupdb();
        } else if (!strcmp("add", argv[optind])) {
                if (binary) {