]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[core] expand vars on execute_on and api_on
authorAnthony Minessale <anthm@signalwire.com>
Sun, 19 Apr 2020 22:59:42 +0000 (22:59 +0000)
committerAndrey Volk <andywolk@gmail.com>
Sat, 23 Oct 2021 19:00:27 +0000 (22:00 +0300)
src/switch_channel.c

index d6c0e6488391db92dce166621b6722a038ad1558..5a901ec199c19f2904ba7da2cb313b8c84dfb4ea 100644 (file)
@@ -3699,6 +3699,7 @@ static void do_api_on(switch_channel_t *channel, const char *variable)
 {
        char *app;
        char *arg = NULL;
+       char *expanded = NULL;
        switch_stream_handle_t stream = { 0 };
 
        app = switch_core_session_strdup(channel->session, variable);
@@ -3707,10 +3708,21 @@ static void do_api_on(switch_channel_t *channel, const char *variable)
                *arg++ = '\0';
        }
 
+       if (zstr(arg)) {
+               expanded = arg;
+       } else {
+               expanded = switch_channel_expand_variables(channel, arg);
+       }
+       
        SWITCH_STANDARD_STREAM(stream);
+       switch_api_execute(app, expanded, NULL, &stream);
        switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "%s process %s: %s(%s)\n%s\n",
-                                         channel->name, variable, app, switch_str_nil(arg), (char *) stream.data);
-       switch_api_execute(app, arg, NULL, &stream);
+                                         channel->name, variable, app, switch_str_nil(expanded), (char *) stream.data);
+
+       if (expanded && expanded != arg) {
+               free(expanded);
+       }
+
        free(stream.data);
 }
 
@@ -3753,7 +3765,8 @@ static void do_execute_on(switch_channel_t *channel, const char *variable)
        char *p;
        int bg = 0;
        char *app;
-
+       char *expanded = NULL;
+       
        app = switch_core_session_strdup(channel->session, variable);
 
        for(p = app; p && *p; p++) {
@@ -3772,11 +3785,21 @@ static void do_execute_on(switch_channel_t *channel, const char *variable)
                bg++;
        }
 
+       if (zstr(arg)) {
+               expanded = arg;
+       } else {
+               expanded = switch_channel_expand_variables(channel, arg);
+       }
+       
        if (bg) {
                switch_core_session_execute_application_async(channel->session, app, arg);
        } else {
                switch_core_session_execute_application(channel->session, app, arg);
        }
+
+       if (expanded && expanded != arg) {
+               free(expanded);
+       }
 }
 
 SWITCH_DECLARE(switch_status_t) switch_channel_execute_on(switch_channel_t *channel, const char *variable_prefix)