Merge "AST-2018-005: Fix tdata leaks when calling pjsip_endpt_send_response(2)"
[asterisk/asterisk.git] / apps / app_playback.c
index 12b1ff6..5303bb4 100644 (file)
@@ -21,7 +21,7 @@
  * \brief Trivial application to playback a sound file
  *
  * \author Mark Spencer <markster@digium.com>
- * 
+ *
  * \ingroup applications
  */
 
@@ -31,8 +31,6 @@
 
 #include "asterisk.h"
 
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
 #include "asterisk/file.h"
 #include "asterisk/pbx.h"
 #include "asterisk/module.h"
@@ -165,7 +163,7 @@ static int s_streamwait3(const say_args_t *a, const char *fn)
        ast_waitstream_full(a->chan, a->ints, a->audiofd, a->ctrlfd) :
        ast_waitstream(a->chan, a->ints);
        ast_stopstream(a->chan);
-       return res;  
+       return res;
 }
 
 /*! \brief
@@ -176,7 +174,7 @@ static int do_say(say_args_t *a, const char *s, const char *options, int depth)
 {
        struct ast_variable *v;
        char *lang, *x, *rule = NULL;
-       int ret = 0;   
+       int ret = 0;
        struct varshead head = { .first = NULL, .last = NULL };
        struct ast_var_t *n;
 
@@ -220,6 +218,10 @@ static int do_say(say_args_t *a, const char *s, const char *options, int depth)
                s = x + 1;
        ast_debug(2, "value is <%s>\n", s);
        n = ast_var_assign("SAY", s);
+       if (!n) {
+               ast_log(LOG_ERROR, "Memory allocation error in do_say\n");
+               return -1;
+       }
        AST_LIST_INSERT_HEAD(&head, n, entries);
 
        /* scan the body, one piece at a time */
@@ -272,7 +274,7 @@ static int do_say(say_args_t *a, const char *s, const char *options, int depth)
                                strcpy(fn2 + l, data);
                                ret = do_say(a, fn2, options, depth);
                        }
-                       
+
                        if (ret) {
                                break;
                        }
@@ -320,7 +322,7 @@ static int say_date_generic(struct ast_channel *chan, time_t t,
        if (format == NULL)
                format = "";
 
-       ast_localtime(&when, &tm, NULL);
+       ast_localtime(&when, &tm, timezonename);
        snprintf(buf, sizeof(buf), "%s:%s:%04d%02d%02d%02d%02d.%02d-%d-%3d",
                prefix,
                format,
@@ -370,9 +372,9 @@ static int say_init_mode(const char *mode) {
 
                ast_say_enumeration_full = say_enumeration_full;
 #if 0
-               /*! \todo XXX 
+               /*! \todo XXX
                   These functions doesn't exist.
-                  say.conf.sample indicates this is working... 
+                  say.conf.sample indicates this is working...
                */
                ast_say_digits_full = say_digits_full;
                ast_say_digit_str_full = say_digit_str_full;
@@ -390,7 +392,7 @@ static int say_init_mode(const char *mode) {
                ast_log(LOG_WARNING, "unrecognized mode %s\n", mode);
                return -1;
        }
-       
+
        return 0;
 }
 
@@ -401,7 +403,7 @@ static char *__say_cli_init(struct ast_cli_entry *e, int cmd, struct ast_cli_arg
        switch (cmd) {
        case CLI_INIT:
                e->command = "say load [new|old]";
-               e->usage = 
+               e->usage =
                        "Usage: say load [new|old]\n"
                        "       say load\n"
                        "           Report status of current say mode\n"
@@ -445,7 +447,7 @@ static int playback_exec(struct ast_channel *chan, const char *data)
                AST_APP_ARG(filenames);
                AST_APP_ARG(options);
        );
-       
+
        if (ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "Playback requires an argument (filename)\n");
                return -1;
@@ -461,7 +463,7 @@ static int playback_exec(struct ast_channel *chan, const char *data)
                        option_say = 1;
                if (strcasestr(args.options, "noanswer"))
                        option_noanswer = 1;
-       } 
+       }
        if (ast_channel_state(chan) != AST_STATE_UP) {
                if (option_skip) {
                        /* At the user's option, skip if the line is not up */
@@ -486,7 +488,9 @@ static int playback_exec(struct ast_channel *chan, const char *data)
                                ast_stopstream(chan);
                        }
                        if (res) {
-                               ast_log(LOG_WARNING, "Playback failed on %s for %s\n", ast_channel_name(chan), (char *)data);
+                               if (!ast_check_hangup(chan)) {
+                                       ast_log(LOG_WARNING, "Playback failed on %s for %s\n", ast_channel_name(chan), (char *)data);
+                               }
                                res = 0;
                                mres = 1;
                        }
@@ -513,8 +517,8 @@ static int reload(void)
        if (say_cfg) {
                ast_config_destroy(say_cfg);
                ast_log(LOG_NOTICE, "Reloading say.conf\n");
-               say_cfg = newcfg;
        }
+       say_cfg = newcfg;
 
        if (say_cfg) {
                for (v = ast_variable_browse(say_cfg, "general"); v ; v = v->next) {
@@ -524,7 +528,7 @@ static int reload(void)
                        }
                }
        }
-       
+
        /*! \todo
         * XXX here we should sort rules according to the same order
         * we have in pbx.c so we have the same matching behaviour.
@@ -543,7 +547,7 @@ static int unload_module(void)
        if (say_cfg)
                ast_config_destroy(say_cfg);
 
-       return res;     
+       return res;
 }
 
 static int load_module(void)
@@ -566,7 +570,8 @@ static int load_module(void)
 }
 
 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Sound File Playback Application",
-               .load = load_module,
-               .unload = unload_module,
-               .reload = reload,
-              );
+       .support_level = AST_MODULE_SUPPORT_CORE,
+       .load = load_module,
+       .unload = unload_module,
+       .reload = reload,
+);