]> jfr.im git - solanum.git/blobdiff - authd/authd.c
Merge pull request #326 from edk0/filter-part
[solanum.git] / authd / authd.c
index 1432a54587fc6b840785b42589cb4ebcbd206ab1..974b6a020d672b9b6827bf18dbf25da839c72ca0 100644 (file)
@@ -25,6 +25,7 @@
 
 #define MAXPARA 10
 
+static void error_cb(rb_helper *helper) __attribute__((noreturn));
 static void handle_reload(int parc, char *parv[]);
 static void handle_stat(int parc, char *parv[]);
 static void handle_options(int parc, char *parv[]);
@@ -32,7 +33,8 @@ static void handle_options(int parc, char *parv[]);
 rb_helper *authd_helper = NULL;
 authd_cmd_handler authd_cmd_handlers[256] = {
        ['C'] = handle_new_connection,
-       ['D'] = resolve_dns,
+       ['D'] = handle_resolve_dns,
+       ['E'] = handle_cancel_connection,
        ['O'] = handle_options,
        ['R'] = handle_reload,
        ['S'] = handle_stat,
@@ -52,6 +54,7 @@ static void
 handle_stat(int parc, char *parv[])
 {
        authd_stat_handler handler;
+       unsigned long long rid;
 
        if(parc < 3)
        {
@@ -59,10 +62,16 @@ handle_stat(int parc, char *parv[])
                return;
        }
 
+       if((rid = strtoull(parv[1], NULL, 16)) > UINT32_MAX)
+       {
+               warn_opers(L_CRIT, "BUG: handle_stat got a rid that was too large: %s", parv[1]);
+               return;
+       }
+
        if (!(handler = authd_stat_handlers[(unsigned char)parv[2][0]]))
                return;
 
-       handler(parv[1], parv[2][0]);
+       handler((uint32_t)rid, parv[2][0]);
 }
 
 static void
@@ -70,9 +79,9 @@ handle_options(int parc, char *parv[])
 {
        struct auth_opts_handler *handler;
 
-       if(parc < 4)
+       if(parc < 2)
        {
-               warn_opers(L_CRIT, "BUG: handle_options received too few parameters (at least 4 expected, got %d)", parc);
+               warn_opers(L_CRIT, "BUG: handle_options received too few parameters (at least 2 expected, got %d)", parc);
                return;
        }
 
@@ -96,13 +105,13 @@ handle_reload(int parc, char *parv[])
 {
        authd_reload_handler handler;
 
-       if(parc < 2)
+       if(parc <= 2)
        {
                /* Reload all handlers */
                for(size_t i = 0; i < 256; i++)
                {
                        if ((handler = authd_reload_handlers[(unsigned char) i]) != NULL)
-                               handler(parv[1][0]);
+                               handler('\0');
                }
 
                return;
@@ -139,7 +148,7 @@ parse_request(rb_helper *helper)
 static void
 error_cb(rb_helper *helper)
 {
-       exit(1);
+       exit(EX_ERROR);
 }
 
 #ifndef _WIN32
@@ -188,13 +197,13 @@ main(int argc, char *argv[])
        if(authd_helper == NULL)
        {
                fprintf(stderr, "authd is not meant to be invoked by end users\n");
-               exit(1);
+               exit(EX_ERROR);
        }
 
        rb_set_time();
        setup_signals();
 
-       authd_option_handlers = rb_dictionary_create("authd options handlers", strcasecmp);
+       authd_option_handlers = rb_dictionary_create("authd options handlers", rb_strcasecmp);
 
        init_resolver();
        init_providers();
@@ -202,6 +211,9 @@ main(int argc, char *argv[])
 
        rb_helper_loop(authd_helper, 0);
 
+       /*
+        * XXX this function will never be called from here -- is it necessary?
+        */
        destroy_providers();
 
        return 0;