X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/66748d60571a5ebbbc0f0cb84c061f9c62f5aef7..a534b3b856a1e3cbfe60bc0bca432e802f9718be:/keyd.c?ds=inline diff --git a/keyd.c b/keyd.c index 7b6226e..33af8ea 100644 --- a/keyd.c +++ b/keyd.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -19,12 +20,56 @@ #include "cleanup.h" #include "keyd.h" #include "keydb.h" +#include "keyid.h" #include "keystructs.h" #include "log.h" #include "mem.h" #include "onak-conf.h" #include "parsekey.h" +void iteratefunc(void *ctx, struct openpgp_publickey *key) +{ + struct openpgp_packet_list *packets = NULL; + struct openpgp_packet_list *list_end = NULL; + struct buffer_ctx storebuf; + int ret = 0; + int *fd = (int *) ctx; + + if (key != NULL) { + storebuf.offset = 0; + storebuf.size = 8192; + storebuf.buffer = malloc(8192); + + logthing(LOGTHING_TRACE, + "Iterating over 0x%016llX.", + get_keyid(key)); + + flatten_publickey(key, + &packets, + &list_end); + write_openpgp_stream(buffer_putchar, + &storebuf, + packets); + logthing(LOGTHING_TRACE, + "Sending %d bytes.", + storebuf.offset); + ret = write(*fd, &storebuf.offset, + sizeof(storebuf.offset)); + if (ret != 0) { + write(*fd, storebuf.buffer, + storebuf.offset); + } + + free(storebuf.buffer); + storebuf.buffer = NULL; + storebuf.size = storebuf.offset = 0; + free_packet_list(packets); + packets = list_end = NULL; + } + + return; +} + int sock_init(const char *sockname) { struct sockaddr_un sock; @@ -93,6 +138,7 @@ int sock_do(int fd) logthing(LOGTHING_INFO, "Fetching 0x%llX, result: %d", keyid, + config.dbbackend-> fetch_key(keyid, &key, false)); if (key != NULL) { storebuf.size = 8192; @@ -140,6 +186,7 @@ int sock_do(int fd) logthing(LOGTHING_INFO, "Fetching %s, result: %d", search, + config.dbbackend-> fetch_key_text(search, &key)); if (key != NULL) { storebuf.size = 8192; @@ -200,7 +247,7 @@ int sock_do(int fd) &packets, 0); parse_keys(packets, &key); - store_key(key, false, false); + config.dbbackend->store_key(key, false, false); free_packet_list(packets); packets = NULL; free_publickey(key); @@ -221,7 +268,8 @@ int sock_do(int fd) logthing(LOGTHING_INFO, "Deleting 0x%llX, result: %d", keyid, - delete_key(keyid, false)); + config.dbbackend->delete_key( + keyid, false)); } break; case KEYD_CMD_GETFULLKEYID: @@ -232,10 +280,18 @@ int sock_do(int fd) ret = 1; } if (ret == 0) { - keyid = getfullkeyid(keyid); + keyid = config.dbbackend->getfullkeyid(keyid); write(fd, &keyid, sizeof(keyid)); } break; + case KEYD_CMD_KEYITER: + cmd = KEYD_REPLY_OK; + write(fd, &cmd, sizeof(cmd)); + config.dbbackend->iterate_keys(iteratefunc, + &fd); + bytes = 0; + write(fd, &bytes, sizeof(bytes)); + break; case KEYD_CMD_CLOSE: ret = 1; break; @@ -255,7 +311,8 @@ int sock_do(int fd) int sock_close(int fd) { - return shutdown(fd, SHUT_RDWR); + shutdown(fd, SHUT_RDWR); + return close(fd); } int sock_accept(int fd) @@ -297,7 +354,7 @@ int main(int argc, char *argv[]) FD_ZERO(&rfds); FD_SET(fd, &rfds); - initdb(false); + config.dbbackend->initdb(false); logthing(LOGTHING_NOTICE, "Accepting connections."); while (!cleanup() && select(fd + 1, &rfds, NULL, NULL, NULL) != -1) { @@ -305,7 +362,7 @@ int main(int argc, char *argv[]) sock_accept(fd); FD_SET(fd, &rfds); } - cleanupdb(); + config.dbbackend->cleanupdb(); sock_close(fd); unlink(sockname); }