]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Unused realtime MOH classes not purged on 'moh reload'
authorDaniel Journo <dan@keshercommunications.com>
Sun, 26 Mar 2017 00:01:06 +0000 (00:01 +0000)
committerDaniel Journo <dan@keshercommunications.com>
Mon, 3 Apr 2017 22:29:50 +0000 (23:29 +0100)
Purge Realtime MOH classes on 'moh reload' even when musiconhold.conf
hasn't changed.

ASTERISK-25974 #close

Change-Id: I42c78ea76528473a656f204595956c9eedcf3246

res/res_musiconhold.c

index 6b0f00abf7ef0de7ce869011d850a8c019b479ed..4f8c735d0da9776533215d070806aee90b783012 100644 (file)
@@ -154,6 +154,7 @@ struct moh_files_state {
 
 /* Custom astobj2 flag */
 #define MOH_NOTDELETED          (1 << 30)       /*!< Find only records that aren't deleted? */
+#define MOH_REALTIME          (1 << 31)       /*!< Find only records that are realtime */
 
 static struct ast_flags global_flags[1] = {{0}};        /*!< global MOH_ flags */
 
@@ -1683,7 +1684,9 @@ static int moh_class_mark(void *obj, void *arg, int flags)
 {
        struct mohclass *class = obj;
 
-       class->delete = 1;
+       if ( ((flags & MOH_REALTIME) && class->realtime) || !(flags & MOH_REALTIME) ) {
+               class->delete = 1;
+       }
 
        return 0;
 }
@@ -1699,22 +1702,27 @@ static int load_moh_classes(int reload)
 {
        struct ast_config *cfg;
        struct ast_variable *var;
-       struct mohclass *class; 
+       struct mohclass *class;
        char *cat;
        int numclasses = 0;
        struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
 
        cfg = ast_config_load("musiconhold.conf", config_flags);
 
-       if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEINVALID) {
+       if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
                if (ast_check_realtime("musiconhold") && reload) {
-                       ao2_t_callback(mohclasses, OBJ_NODATA, moh_class_mark, NULL, "Mark deleted classes");
+                       ao2_t_callback(mohclasses, OBJ_NODATA | MOH_REALTIME, moh_class_mark, NULL, "Mark realtime classes for deletion");
                        ao2_t_callback(mohclasses, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, moh_classes_delete_marked, NULL, "Purge marked classes");
                }
+               moh_rescan_files();
                return 0;
        }
-       if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
-               moh_rescan_files();
+
+       if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEINVALID) {
+               if (ast_check_realtime("musiconhold") && reload) {
+                       ao2_t_callback(mohclasses, OBJ_NODATA, moh_class_mark, NULL, "Mark deleted classes");
+                       ao2_t_callback(mohclasses, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, moh_classes_delete_marked, NULL, "Purge marked classes");
+               }
                return 0;
        }