X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/cfbbd6655346497ab28d50d2b5c34f0c5d9ce5ce..e1385087ec060568a966a5305a9d88c24a2a0a55:/onak.c diff --git a/onak.c b/onak.c index 15154c4..4e63720 100644 --- a/onak.c +++ b/onak.c @@ -6,18 +6,22 @@ * Jonathan McDowell * * Copyright 2002 Project Purple - * - * $Id: onak.c,v 1.22 2004/05/31 14:16:49 noodles Exp $ */ +#include +#include #include #include #include +#include +#include #include #include "armor.h" #include "charfuncs.h" #include "cleankey.h" +#include "cleanup.h" +#include "config.h" #include "keydb.h" #include "keyid.h" #include "keyindex.h" @@ -53,8 +57,43 @@ 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 " VERSION " - an OpenPGP keyserver.\n"); + puts("onak " PACKAGE_VERSION " - an OpenPGP keyserver.\n"); puts("Usage:\n"); puts("\tonak [options] \n"); puts("\tCommands:\n"); @@ -90,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) { @@ -114,12 +154,21 @@ int main(int argc, char *argv[]) readconfig(configfile); initlogthing("onak", config.logfile); + catchsignals(); if ((argc - optind) < 1) { 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) { @@ -143,7 +192,7 @@ int main(int argc, char *argv[]) initdb(false); logthing(LOGTHING_NOTICE, "Got %d new keys.", - update_keys(&keys)); + update_keys(&keys, false)); if (keys != NULL && update) { flatten_publickey(keys, &packets,