Doxygen Updates - Title update
[asterisk/asterisk.git] / cdr / cdr_radius.c
index ed4d87b..92ec8a4 100644 (file)
  * at the top of the source tree.
  */
 
-/*! \file
- *
+/*!
+ * \file
  * \brief RADIUS CDR Support
+ *
  * \author Philippe Sultan
- * \extref The Radius Client Library - http://developer.berlios.de/projects/radiusclient-ng/
+ * The Radius Client Library
+ *     http://developer.berlios.de/projects/radiusclient-ng/
  *
  * \arg See also \ref AstCDR
  * \ingroup cdr_drivers
  */
 
+/*! \li \ref cdr_radius.c uses the configuration file \ref cdr.conf
+ * \addtogroup configuration_file Configuration Files
+ */
+
 /*** MODULEINFO
        <depend>radius</depend>
+       <support_level>extended</support_level>
  ***/
 
 #include "asterisk.h"
 
 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
-#include <time.h>
 #include <radiusclient-ng.h>
 
 #include "asterisk/channel.h"
@@ -77,9 +83,9 @@ enum {
        RADIUS_FLAG_LOGUSERFIELD = (1 << 2)
 };
 
-static char *desc = "RADIUS CDR Backend";
-static char *name = "radius";
-static char *cdr_config = "cdr.conf";
+static const char desc[] = "RADIUS CDR Backend";
+static const char name[] = "radius";
+static const char cdr_config[] = "cdr.conf";
 
 static char radiuscfg[PATH_MAX] = "/etc/radiusclient-ng/radiusclient.conf";
 
@@ -186,7 +192,8 @@ static int build_radius_record(VALUE_PAIR **tosend, struct ast_cdr *cdr)
        }
 
        /* Setting Acct-Session-Id & User-Name attributes for proper generation
-          of Acct-Unique-Session-Id on server side */
+        * of Acct-Unique-Session-Id on server side 
+        */
        /* Channel */
        if (!rc_avpair_add(rh, tosend, PW_USER_NAME, &cdr->channel, strlen(cdr->channel), 0))
                return -1;
@@ -224,6 +231,10 @@ return_cleanup:
 static int unload_module(void)
 {
        ast_cdr_unregister(name);
+       if (rh) {
+               rc_destroy(rh);
+               rh = NULL;
+       }
        return 0;
 }
 
@@ -231,7 +242,6 @@ static int load_module(void)
 {
        struct ast_config *cfg;
        struct ast_flags config_flags = { 0 };
-       int res;
        const char *tmp;
 
        if ((cfg = ast_config_load(cdr_config, config_flags)) && cfg != CONFIG_STATUS_FILEINVALID) {
@@ -244,8 +254,17 @@ static int load_module(void)
        } else
                return AST_MODULE_LOAD_DECLINE;
 
-       /* start logging */
-       rc_openlog("asterisk");
+       /*
+        * start logging
+        *
+        * NOTE: Yes this causes a slight memory leak if the module is
+        * unloaded.  However, it is better than a crash if cdr_radius
+        * and cel_radius are both loaded.
+        */
+       tmp = ast_strdup("asterisk");
+       if (tmp) {
+               rc_openlog((char *) tmp);
+       }
 
        /* read radiusclient-ng config file */
        if (!(rh = rc_read_config(radiuscfg))) {
@@ -256,11 +275,22 @@ static int load_module(void)
        /* read radiusclient-ng dictionaries */
        if (rc_read_dictionary(rh, rc_conf_str(rh, "dictionary"))) {
                ast_log(LOG_NOTICE, "Cannot load radiusclient-ng dictionary file.\n");
+               rc_destroy(rh);
+               rh = NULL;
                return AST_MODULE_LOAD_DECLINE;
        }
 
-       res = ast_cdr_register(name, desc, radius_log);
-       return AST_MODULE_LOAD_SUCCESS;
+       if (ast_cdr_register(name, desc, radius_log)) {
+               rc_destroy(rh);
+               rh = NULL;
+               return AST_MODULE_LOAD_DECLINE;
+       } else {
+               return AST_MODULE_LOAD_SUCCESS;
+       }
 }
 
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "RADIUS CDR Backend");
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "RADIUS CDR Backend",
+               .load = load_module,
+               .unload = unload_module,
+               .load_pri = AST_MODPRI_CDR_DRIVER,
+       );