X-Git-Url: http://the.earth.li/gitweb/?a=blobdiff_plain;f=keyd.c;h=b8b8ad37e6bf1eff136eb089807687cc51650958;hb=b2f2bc60555e2d953069c40d8d3cdecfcec9ac29;hp=4528c96fef874963542b56eccac17896887ab493;hpb=5b5ac2317e047dd77bf96a171a5e236973606a83;p=onak.git diff --git a/keyd.c b/keyd.c index 4528c96..b8b8ad3 100644 --- a/keyd.c +++ b/keyd.c @@ -65,7 +65,7 @@ void daemonize(void) exit(EXIT_SUCCESS); } - pid = setsid(); + setsid(); freopen("/dev/null", "r", stdin); freopen("/dev/null", "w", stdout); @@ -139,12 +139,16 @@ int sock_init(const char *sockname) if (ret != -1) { ret = listen(fd, 5); + if (ret == -1) { + close(fd); + fd = -1; + } } - + return fd; } -int sock_do(int fd) +int sock_do(struct onak_dbctx *dbctx, int fd) { uint32_t cmd = KEYD_CMD_UNKNOWN; ssize_t bytes = 0; @@ -157,6 +161,7 @@ int sock_do(int fd) struct openpgp_packet_list *list_end = NULL; struct buffer_ctx storebuf; struct skshash hash; + struct openpgp_fingerprint fingerprint; /* * Get the command from the client. @@ -183,7 +188,7 @@ int sock_do(int fd) write(fd, &cmd, sizeof(cmd)); write(fd, &keyd_version, sizeof(keyd_version)); break; - case KEYD_CMD_GET: + case KEYD_CMD_GET_ID: cmd = KEYD_REPLY_OK; write(fd, &cmd, sizeof(cmd)); bytes = read(fd, &keyid, sizeof(keyid)); @@ -196,8 +201,58 @@ int sock_do(int fd) "Fetching 0x%" PRIX64 ", result: %d", keyid, - config.dbbackend-> - fetch_key(keyid, &key, false)); + dbctx->fetch_key_id(dbctx, + keyid, + &key, false)); + if (key != NULL) { + storebuf.size = 8192; + storebuf.buffer = malloc(8192); + + flatten_publickey(key, + &packets, + &list_end); + write_openpgp_stream(buffer_putchar, + &storebuf, + packets); + logthing(LOGTHING_TRACE, + "Sending %d bytes.", + storebuf.offset); + write(fd, &storebuf.offset, + sizeof(storebuf.offset)); + 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; + free_publickey(key); + key = NULL; + } else { + write(fd, &storebuf.offset, + sizeof(storebuf.offset)); + } + } + break; + case KEYD_CMD_GET_FP: + cmd = KEYD_REPLY_OK; + write(fd, &cmd, sizeof(cmd)); + read(fd, &bytes, 1); + if (bytes > MAX_FINGERPRINT_LEN) { + ret = 1; + } else { + fingerprint.length = bytes; + read(fd, fingerprint.fp, bytes); + } + storebuf.offset = 0; + if (ret == 0) { + logthing(LOGTHING_INFO, + "Fetching by fingerprint" + ", result: %d", + dbctx->fetch_key_fp(dbctx, + &fingerprint, + &key, false)); if (key != NULL) { storebuf.size = 8192; storebuf.buffer = malloc(8192); @@ -229,7 +284,8 @@ int sock_do(int fd) } } break; - case KEYD_CMD_GETTEXT: + + case KEYD_CMD_GET_TEXT: cmd = KEYD_REPLY_OK; write(fd, &cmd, sizeof(cmd)); bytes = read(fd, &count, sizeof(count)); @@ -244,8 +300,8 @@ int sock_do(int fd) logthing(LOGTHING_INFO, "Fetching %s, result: %d", search, - config.dbbackend-> - fetch_key_text(search, &key)); + dbctx->fetch_key_text(dbctx, + search, &key)); if (key != NULL) { storebuf.size = 8192; storebuf.buffer = malloc(8192); @@ -275,6 +331,7 @@ int sock_do(int fd) write(fd, &storebuf.offset, sizeof(storebuf.offset)); } + free(search); } break; case KEYD_CMD_STORE: @@ -305,7 +362,7 @@ int sock_do(int fd) &packets, 0); parse_keys(packets, &key); - config.dbbackend->store_key(key, false, false); + dbctx->store_key(dbctx, key, false, false); free_packet_list(packets); packets = NULL; free_publickey(key); @@ -327,7 +384,7 @@ int sock_do(int fd) "Deleting 0x%" PRIX64 ", result: %d", keyid, - config.dbbackend->delete_key( + dbctx->delete_key(dbctx, keyid, false)); } break; @@ -339,7 +396,7 @@ int sock_do(int fd) ret = 1; } if (ret == 0) { - keyid = config.dbbackend->getfullkeyid(keyid); + keyid = dbctx->getfullkeyid(dbctx, keyid); cmd = sizeof(keyid); write(fd, &cmd, sizeof(cmd)); write(fd, &keyid, sizeof(keyid)); @@ -348,7 +405,7 @@ int sock_do(int fd) case KEYD_CMD_KEYITER: cmd = KEYD_REPLY_OK; write(fd, &cmd, sizeof(cmd)); - config.dbbackend->iterate_keys(iteratefunc, + dbctx->iterate_keys(dbctx, iteratefunc, &fd); bytes = 0; write(fd, &bytes, sizeof(bytes)); @@ -374,7 +431,7 @@ int sock_do(int fd) write(fd, stats, sizeof(*stats)); break; - case KEYD_CMD_GETSKSHASH: + case KEYD_CMD_GET_SKSHASH: cmd = KEYD_REPLY_OK; write(fd, &cmd, sizeof(cmd)); bytes = read(fd, hash.hash, sizeof(hash.hash)); @@ -386,9 +443,8 @@ int sock_do(int fd) logthing(LOGTHING_INFO, "Fetching by hash" ", result: %d", - config.dbbackend-> - fetch_key_skshash(&hash, - &key)); + dbctx->fetch_key_skshash(dbctx, + &hash, &key)); if (key != NULL) { storebuf.size = 8192; storebuf.buffer = malloc(8192); @@ -479,10 +535,14 @@ int main(int argc, char *argv[]) char *configfile = NULL; bool foreground = false; int optchar; + struct onak_dbctx *dbctx; while ((optchar = getopt(argc, argv, "c:fh")) != -1 ) { switch (optchar) { case 'c': + if (configfile != NULL) { + free(configfile); + } configfile = strdup(optarg); break; case 'f': @@ -526,7 +586,7 @@ int main(int argc, char *argv[]) maxfd = fd; memset(clients, -1, sizeof (clients)); - config.dbbackend->initdb(false); + dbctx = config.dbinit(false); logthing(LOGTHING_NOTICE, "Accepting connections."); while (!cleanup() && select(maxfd + 1, &rfds, NULL, NULL, NULL) != -1) { @@ -540,7 +600,7 @@ int main(int argc, char *argv[]) FD_ISSET(clients[i], &rfds)) { logthing(LOGTHING_DEBUG, "Handling connection for client %d.", i); - if (sock_do(clients[i])) { + if (sock_do(dbctx, clients[i])) { sock_close(clients[i]); clients[i] = -1; logthing(LOGTHING_DEBUG, @@ -574,7 +634,7 @@ int main(int argc, char *argv[]) } } } - config.dbbackend->cleanupdb(); + dbctx->cleanupdb(dbctx); sock_close(fd); unlink(sockname); }