X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/78808f320d39f8c22622feb613706325222cfd59..b66594a4e361b7363ccec13680d158f90a71e04b:/keyd.c diff --git a/keyd.c b/keyd.c index 7b8a18f..eab3b54 100644 --- a/keyd.c +++ b/keyd.c @@ -2,11 +2,13 @@ * keyd.c - key retrieval daemon * * Jonathan McDowell - * + * * Copyright 2004 Project Purple */ +#include #include +#include #include #include #include @@ -27,6 +29,32 @@ #include "onak-conf.h" #include "parsekey.h" +void daemonize(void) +{ + pid_t pid; + + pid = fork(); + + if (pid < 0) { + logthing(LOGTHING_CRITICAL, + "Failed to fork into background: %d (%s)", + errno, + strerror(errno)); + exit(EXIT_FAILURE); + } else if (pid > 0) { + logthing(LOGTHING_INFO, "Backgrounded as pid %d.", pid); + exit(EXIT_SUCCESS); + } + + pid = setsid(); + + freopen("/dev/null", "r", stdin); + freopen("/dev/null", "w", stdout); + freopen("/dev/null", "w", stderr); + + return; +} + void iteratefunc(void *ctx, struct openpgp_publickey *key) { struct openpgp_packet_list *packets = NULL; @@ -41,7 +69,7 @@ void iteratefunc(void *ctx, struct openpgp_publickey *key) storebuf.buffer = malloc(8192); logthing(LOGTHING_TRACE, - "Iterating over 0x%016llX.", + "Iterating over 0x%016" PRIX64 ".", get_keyid(key)); flatten_publickey(key, @@ -136,7 +164,8 @@ int sock_do(int fd) storebuf.offset = 0; if (ret == 0) { logthing(LOGTHING_INFO, - "Fetching 0x%llX, result: %d", + "Fetching 0x%" PRIX64 + ", result: %d", keyid, config.dbbackend-> fetch_key(keyid, &key, false)); @@ -266,7 +295,8 @@ int sock_do(int fd) } if (ret == 0) { logthing(LOGTHING_INFO, - "Deleting 0x%llX, result: %d", + "Deleting 0x%" PRIX64 + ", result: %d", keyid, config.dbbackend->delete_key( keyid, false)); @@ -311,7 +341,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) @@ -340,9 +371,30 @@ int main(int argc, char *argv[]) int fd = -1; fd_set rfds; char sockname[1024]; + char *configfile = NULL; + bool foreground = false; + int optchar; + + while ((optchar = getopt(argc, argv, "c:f")) != -1 ) { + switch (optchar) { + case 'c': + configfile = strdup(optarg); + break; + case 'f': + foreground = true; + break; + } + } - readconfig(NULL); + readconfig(configfile); + free(configfile); + configfile = NULL; initlogthing("keyd", config.logfile); + config.use_keyd = false; + + if (!foreground) { + daemonize(); + } catchsignals(); @@ -368,6 +420,6 @@ int main(int argc, char *argv[]) cleanuplogthing(); cleanupconfig(); - + return(EXIT_SUCCESS); }