Add -1 to Debian package version
[onak.git] / keyd.c
diff --git a/keyd.c b/keyd.c
index ccc47502f0fd0e86de306ead5a82ac927619d999..5d5b7ba8c883b68326361f7789bbb228e6ac1593 100644 (file)
--- a/keyd.c
+++ b/keyd.c
@@ -17,6 +17,7 @@
 #include <sys/socket.h>
 #include <sys/types.h>
 #include <sys/un.h>
+#include <time.h>
 #include <unistd.h>
 
 #include "charfuncs.h"
@@ -29,6 +30,9 @@
 #include "mem.h"
 #include "onak-conf.h"
 #include "parsekey.h"
+#include "version.h"
+
+static struct keyd_stats *stats;
 
 void daemonize(void)
 {
@@ -149,6 +153,11 @@ int sock_do(int fd)
        }
        
        if (ret == 0) {
+               if (cmd < KEYD_CMD_LAST) {
+                       stats->command_stats[cmd]++;
+               } else {
+                       stats->command_stats[KEYD_CMD_UNKNOWN]++;
+               }
                switch (cmd) {
                case KEYD_CMD_VERSION:
                        cmd = KEYD_REPLY_OK;
@@ -335,9 +344,19 @@ int sock_do(int fd)
                case KEYD_CMD_QUIT:
                        cmd = KEYD_REPLY_OK;
                        write(fd, &cmd, sizeof(cmd));
+                       logthing(LOGTHING_NOTICE,
+                               "Exiting due to quit request.");
                        ret = 1;
                        trytocleanup();
                        break;
+               case KEYD_CMD_STATS:
+                       cmd = KEYD_REPLY_OK;
+                       write(fd, &cmd, sizeof(cmd));
+                       cmd = sizeof(*stats);
+                       write(fd, &cmd, sizeof(cmd));
+                       write(fd, stats,
+                               sizeof(*stats));
+                       break;
                default:
                        logthing(LOGTHING_ERROR, "Got unknown command: %d",
                                        cmd);
@@ -369,6 +388,7 @@ int sock_accept(int fd)
        }
 
        if (ret != -1) {
+               stats->connects++;
                while (!sock_do(srv)) ;
                sock_close(srv);
        }
@@ -376,6 +396,19 @@ int sock_accept(int fd)
        return 1;
 }
 
+static void usage(void)
+{
+       puts("keyd " ONAK_VERSION " - backend key serving daemon for the "
+               "onak PGP keyserver.\n");
+       puts("Usage:\n");
+       puts("\tkeyd [options]\n");
+       puts("\tOptions:\n:");
+       puts("-c <file> - use <file> as the config file");
+       puts("-f        - run in the foreground");
+       puts("-h        - show this help text");
+       exit(EXIT_FAILURE);
+}
+
 int main(int argc, char *argv[])
 {
        int fd = -1;
@@ -385,7 +418,7 @@ int main(int argc, char *argv[])
        bool foreground = false;
        int optchar;
 
-       while ((optchar = getopt(argc, argv, "c:f")) != -1 ) {
+       while ((optchar = getopt(argc, argv, "c:fh")) != -1 ) {
                switch (optchar) {
                case 'c':
                        configfile = strdup(optarg);
@@ -393,6 +426,10 @@ int main(int argc, char *argv[])
                case 'f':
                        foreground = true;
                        break;
+               case 'h':
+               default:
+                       usage();
+                       break;
                }
        }
 
@@ -409,6 +446,15 @@ int main(int argc, char *argv[])
        catchsignals();
        signal(SIGPIPE, SIG_IGN);
 
+
+       stats = calloc(1, sizeof(*stats));
+       if (!stats) {
+               logthing(LOGTHING_ERROR,
+                       "Couldn't allocate memory for stats structure.");
+               exit(EXIT_FAILURE);
+       }
+       stats->started = time(NULL);
+
        snprintf(sockname, 1023, "%s/%s", config.db_dir, KEYD_SOCKET);
        fd = sock_init(sockname);
 
@@ -429,6 +475,8 @@ int main(int argc, char *argv[])
                unlink(sockname);
        }
 
+       free(stats);
+
        cleanuplogthing();
        cleanupconfig();