Merged revisions 321926 via svnmerge from
[asterisk/asterisk.git] / cel / cel_radius.c
index c44044f..f5ccb5f 100644 (file)
@@ -186,9 +186,7 @@ static void radius_log(const struct ast_event *event, void *userdata)
        }
 
        if (build_radius_record(&send, &record)) {
-               if (option_debug) {
-                       ast_log(LOG_DEBUG, "Unable to create RADIUS record. CEL not recorded!\n");
-               }
+               ast_debug(1, "Unable to create RADIUS record. CEL not recorded!\n");
                goto return_cleanup;
        }
 
@@ -208,6 +206,10 @@ static int unload_module(void)
        if (event_sub) {
                event_sub = ast_event_unsubscribe(event_sub);
        }
+       if (rh) {
+               rc_destroy(rh);
+               rh = NULL;
+       }
        return AST_MODULE_LOAD_SUCCESS;
 }
 
@@ -227,8 +229,17 @@ static int load_module(void)
                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))) {
@@ -239,16 +250,23 @@ 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;
        }
 
        event_sub = ast_event_subscribe(AST_EVENT_CEL, radius_log, "CEL Radius Logging", NULL, AST_EVENT_IE_END);
-
        if (!event_sub) {
+               rc_destroy(rh);
+               rh = NULL;
                return AST_MODULE_LOAD_DECLINE;
        } else {
                return AST_MODULE_LOAD_SUCCESS;
        }
 }
 
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "RADIUS CEL Backend");
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "RADIUS CEL Backend",
+       .load = load_module,
+       .unload = unload_module,
+       .load_pri = AST_MODPRI_CDR_DRIVER,
+);