Merged revisions 89536 via svnmerge from
[asterisk/asterisk.git] / res / res_crypto.c
index cdb027a..caaea5a 100644 (file)
 
 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
-#include <sys/types.h>
+#include "asterisk/paths.h"    /* use ast_config_AST_KEY_DIR */
 #include <openssl/ssl.h>
 #include <openssl/err.h>
-#include <stdio.h>
 #include <dirent.h>
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#include "asterisk/file.h"
-#include "asterisk/channel.h"
-#include "asterisk/logger.h"
-#include "asterisk/say.h"
+
 #include "asterisk/module.h"
-#include "asterisk/options.h"
 #include "asterisk/crypto.h"
 #include "asterisk/md5.h"
 #include "asterisk/cli.h"
@@ -247,8 +237,7 @@ static struct ast_key *try_load_key(char *dir, char *fname, int ifd, int ofd, in
                if (RSA_size(key->rsa) == 128) {
                        /* Key loaded okay */
                        key->ktype &= ~KEY_NEEDS_PASSCODE;
-                       if (option_verbose > 2)
-                               ast_verbose(VERBOSE_PREFIX_3 "Loaded %s key '%s'\n", key->ktype == AST_KEY_PUBLIC ? "PUBLIC" : "PRIVATE", key->name);
+                       ast_verb(3, "Loaded %s key '%s'\n", key->ktype == AST_KEY_PUBLIC ? "PUBLIC" : "PRIVATE", key->name);
                        ast_debug(1, "Key '%s' loaded OK\n", key->name);
                        key->delme = 0;
                } else
@@ -475,13 +464,13 @@ static void crypto_load(int ifd, int ofd)
        AST_RWLIST_TRAVERSE_SAFE_BEGIN(&keys, key, list) {
                if (key->delme) {
                        ast_debug(1, "Deleting key %s type %d\n", key->name, key->ktype);
-                       AST_RWLIST_REMOVE_CURRENT(&keys, list);
+                       AST_RWLIST_REMOVE_CURRENT(list);
                        if (key->rsa)
                                RSA_free(key->rsa);
                        ast_free(key);
                }
        }
-       AST_RWLIST_TRAVERSE_SAFE_END
+       AST_RWLIST_TRAVERSE_SAFE_END;
 
        AST_RWLIST_UNLOCK(&keys);
 }
@@ -495,78 +484,96 @@ static void md52sum(char *sum, unsigned char *md5)
 
 /*! 
  * \brief show the list of RSA keys 
- * \param fd file descriptor
- * \param argc no of arguements
- * \param argv list of arguements
+ * \param e CLI command
+ * \param cmd
+ * \param a list of CLI arguments
  * \return RESULT_SUCCESS
 */
-static int show_keys(int fd, int argc, char *argv[])
+static char *handle_cli_keys_show(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
+#define FORMAT "%-18s %-8s %-16s %-33s\n"
+
        struct ast_key *key;
        char sum[16 * 2 + 1];
        int count_keys = 0;
 
-       ast_cli(fd, "%-18s %-8s %-16s %-33s\n", "Key Name", "Type", "Status", "Sum");
+       switch (cmd) {
+       case CLI_INIT:
+               e->command = "keys show";
+               e->usage =
+                       "Usage: keys show\n"
+                       "       Displays information about RSA keys known by Asterisk\n";
+               return NULL;
+       case CLI_GENERATE:
+               return NULL;
+       }
+
+       ast_cli(a->fd, FORMAT, "Key Name", "Type", "Status", "Sum");
+       ast_cli(a->fd, FORMAT, "------------------", "--------", "----------------", "--------------------------------");
 
        AST_RWLIST_RDLOCK(&keys);
        AST_RWLIST_TRAVERSE(&keys, key, list) {
                md52sum(sum, key->digest);
-               ast_cli(fd, "%-18s %-8s %-16s %-33s\n", key->name, 
+               ast_cli(a->fd, FORMAT, key->name, 
                        (key->ktype & 0xf) == AST_KEY_PUBLIC ? "PUBLIC" : "PRIVATE",
                        key->ktype & KEY_NEEDS_PASSCODE ? "[Needs Passcode]" : "[Loaded]", sum);
                count_keys++;
        }
        AST_RWLIST_UNLOCK(&keys);
 
-       ast_cli(fd, "%d known RSA keys.\n", count_keys);
+       ast_cli(a->fd, "\n%d known RSA keys.\n", count_keys);
 
-       return RESULT_SUCCESS;
+       return CLI_SUCCESS;
+
+#undef FORMAT
 }
 
 /*! 
  * \brief initialize all RSA keys  
- * \param fd file descriptor
- * \param argc no of arguements
- * \param argv list of arguements
+ * \param e CLI command
+ * \param cmd 
+ * \param a list of CLI arguments
  * \return RESULT_SUCCESS
 */
-static int init_keys(int fd, int argc, char *argv[])
+static char *handle_cli_keys_init(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
        struct ast_key *key;
        int ign;
        char *kn, tmp[256] = "";
 
+       switch (cmd) {
+       case CLI_INIT:
+               e->command = "keys init";
+               e->usage =
+                       "Usage: keys init\n"
+                       "       Initializes private keys (by reading in pass code from\n"
+                       "       the user)\n";
+               return NULL;
+       case CLI_GENERATE:
+               return NULL;
+       }
+
+       if (a->argc != 2)
+               return CLI_SHOWUSAGE;
+
        AST_RWLIST_WRLOCK(&keys);
        AST_RWLIST_TRAVERSE_SAFE_BEGIN(&keys, key, list) {
                /* Reload keys that need pass codes now */
                if (key->ktype & KEY_NEEDS_PASSCODE) {
                        kn = key->fn + strlen(ast_config_AST_KEY_DIR) + 1;
                        ast_copy_string(tmp, kn, sizeof(tmp));
-                       try_load_key((char *)ast_config_AST_KEY_DIR, tmp, fd, fd, &ign);
+                       try_load_key((char *) ast_config_AST_KEY_DIR, tmp, a->fd, a->fd, &ign);
                }
        }
        AST_RWLIST_TRAVERSE_SAFE_END
        AST_RWLIST_UNLOCK(&keys);
 
-       return RESULT_SUCCESS;
+       return CLI_SUCCESS;
 }
 
-static const char show_key_usage[] =
-"Usage: keys show\n"
-"       Displays information about RSA keys known by Asterisk\n";
-
-static const char init_keys_usage[] =
-"Usage: keys init\n"
-"       Initializes private keys (by reading in pass code from the user)\n";
-
 static struct ast_cli_entry cli_crypto[] = {
-       { { "keys", "show", NULL },
-       show_keys, "Displays RSA key information",
-       show_key_usage },
-
-       { { "keys", "init", NULL },
-       init_keys, "Initialize RSA key passcodes",
-       init_keys_usage },
+       AST_CLI_DEFINE(handle_cli_keys_show, "Displays RSA key information"),
+       AST_CLI_DEFINE(handle_cli_keys_init, "Initialize RSA key passcodes")
 };
 
 /*! \brief initialise the res_crypto module */
@@ -600,7 +607,7 @@ static int load_module(void)
                crypto_load(STDIN_FILENO, STDOUT_FILENO);
        else
                crypto_load(-1, -1);
-       return 0;
+       return AST_MODULE_LOAD_SUCCESS;
 }
 
 static int unload_module(void)