diff options
-rw-r--r-- | funcs/func_cdr.c | 127 | ||||
-rw-r--r-- | funcs/func_channel.c | 19 | ||||
-rw-r--r-- | res/res_pjsip/pjsip_cli.c | 24 | ||||
-rw-r--r-- | res/res_pjsip/pjsip_configuration.c | 17 |
4 files changed, 111 insertions, 76 deletions
diff --git a/funcs/func_cdr.c b/funcs/func_cdr.c index 573431237..2dd9f1578 100644 --- a/funcs/func_cdr.c +++ b/funcs/func_cdr.c @@ -356,7 +356,7 @@ static void cdr_read_callback(void *data, struct stasis_subscription *sub, struc static void cdr_write_callback(void *data, struct stasis_subscription *sub, struct stasis_message *message) { - struct cdr_func_payload *payload = stasis_message_data(message); + struct cdr_func_payload *payload; struct ast_flags flags = { 0 }; AST_DECLARE_APP_ARGS(args, AST_APP_ARG(variable); @@ -367,21 +367,17 @@ static void cdr_write_callback(void *data, struct stasis_subscription *sub, stru if (cdr_write_message_type() != stasis_message_type(message)) { return; } - + payload = stasis_message_data(message); if (!payload) { return; } - - if (ast_strlen_zero(payload->arguments)) { - ast_log(AST_LOG_WARNING, "%s requires a variable (%s(variable)=value)\n)", - payload->cmd, payload->cmd); - return; - } - if (!payload->value) { - ast_log(AST_LOG_WARNING, "%s requires a value (%s(variable)=value)\n)", - payload->cmd, payload->cmd); + if (ast_strlen_zero(payload->arguments) + || !payload->value) { + /* Sanity check. cdr_write() could never send these bad messages */ + ast_assert(0); return; } + parse = ast_strdupa(payload->arguments); AST_STANDARD_APP_ARGS(args, parse); @@ -389,32 +385,16 @@ static void cdr_write_callback(void *data, struct stasis_subscription *sub, stru ast_app_parse_options(cdr_func_options, &flags, NULL, args.options); } - if (!strcasecmp(args.variable, "accountcode")) { - ast_log(AST_LOG_WARNING, "Using the CDR function to set 'accountcode' is deprecated. Please use the CHANNEL function instead.\n"); - ast_channel_lock(payload->chan); - ast_channel_accountcode_set(payload->chan, payload->value); - ast_channel_unlock(payload->chan); - } else if (!strcasecmp(args.variable, "peeraccount")) { - ast_log(AST_LOG_WARNING, "The 'peeraccount' setting is not supported. Please set the 'accountcode' on the appropriate channel using the CHANNEL function.\n"); - } else if (!strcasecmp(args.variable, "userfield")) { + /* These are already handled by cdr_write() */ + ast_assert(strcasecmp(args.variable, "accountcode") + && strcasecmp(args.variable, "peeraccount") + && strcasecmp(args.variable, "amaflags")); + + if (!strcasecmp(args.variable, "userfield")) { ast_cdr_setuserfield(ast_channel_name(payload->chan), payload->value); - } else if (!strcasecmp(args.variable, "amaflags")) { - ast_log(AST_LOG_WARNING, "Using the CDR function to set 'amaflags' is deprecated. Please use the CHANNEL function instead.\n"); - if (isdigit(*payload->value)) { - int amaflags; - sscanf(payload->value, "%30d", &amaflags); - ast_channel_lock(payload->chan); - ast_channel_amaflags_set(payload->chan, amaflags); - ast_channel_unlock(payload->chan); - } else { - ast_channel_lock(payload->chan); - ast_channel_amaflags_set(payload->chan, ast_channel_string2amaflag(payload->value)); - ast_channel_unlock(payload->chan); - } } else { ast_cdr_setvar(ast_channel_name(payload->chan), args.variable, payload->value); } - return; } static void cdr_prop_write_callback(void *data, struct stasis_subscription *sub, struct stasis_message *message) @@ -523,27 +503,70 @@ static int cdr_read(struct ast_channel *chan, const char *cmd, char *parse, return 0; } -static int cdr_write(struct ast_channel *chan, const char *cmd, char *parse, - const char *value) +static int cdr_write(struct ast_channel *chan, const char *cmd, char *arguments, + const char *value) { - RAII_VAR(struct stasis_message *, message, NULL, ao2_cleanup); - RAII_VAR(struct cdr_func_payload *, payload, NULL, ao2_cleanup); - RAII_VAR(struct stasis_message_router *, router, - ast_cdr_message_router(), ao2_cleanup); + struct stasis_message *message; + struct cdr_func_payload *payload; + struct stasis_message_router *router; + AST_DECLARE_APP_ARGS(args, + AST_APP_ARG(variable); + AST_APP_ARG(options); + ); + char *parse; if (!chan) { ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd); return -1; } - - if (!router) { - ast_log(AST_LOG_WARNING, "Failed to manipulate CDR for channel %s: no message router\n", - ast_channel_name(chan)); + if (ast_strlen_zero(arguments)) { + ast_log(LOG_WARNING, "%s requires a variable (%s(variable)=value)\n)", + cmd, cmd); + return -1; + } + if (!value) { + ast_log(LOG_WARNING, "%s requires a value (%s(variable)=value)\n)", + cmd, cmd); return -1; } + parse = ast_strdupa(arguments); + AST_STANDARD_APP_ARGS(args, parse); + + /* These CDR variables are no longer supported or set directly on the channel */ + if (!strcasecmp(args.variable, "accountcode")) { + ast_log(LOG_WARNING, "Using the %s function to set 'accountcode' is deprecated. Please use the CHANNEL function instead.\n", + cmd); + ast_channel_lock(chan); + ast_channel_accountcode_set(chan, value); + ast_channel_unlock(chan); + return 0; + } + if (!strcasecmp(args.variable, "amaflags")) { + int amaflags; + + ast_log(LOG_WARNING, "Using the %s function to set 'amaflags' is deprecated. Please use the CHANNEL function instead.\n", + cmd); + if (isdigit(*value)) { + if (sscanf(value, "%30d", &amaflags) != 1) { + amaflags = AST_AMA_NONE; + } + } else { + amaflags = ast_channel_string2amaflag(value); + } + ast_channel_lock(chan); + ast_channel_amaflags_set(chan, amaflags); + ast_channel_unlock(chan); + return 0; + } + if (!strcasecmp(args.variable, "peeraccount")) { + ast_log(LOG_WARNING, "The 'peeraccount' setting is not supported. Please set the 'accountcode' on the appropriate channel using the CHANNEL function.\n"); + return 0; + } + + /* The remaining CDR variables are handled by CDR processing code */ if (!cdr_write_message_type()) { - ast_log(AST_LOG_WARNING, "Failed to manipulate CDR for channel %s: message type not available\n", + ast_log(LOG_WARNING, "Failed to manipulate CDR for channel %s: message type not available\n", ast_channel_name(chan)); return -1; } @@ -554,16 +577,26 @@ static int cdr_write(struct ast_channel *chan, const char *cmd, char *parse, } payload->chan = chan; payload->cmd = cmd; - payload->arguments = parse; + payload->arguments = arguments; payload->value = value; message = stasis_message_create(cdr_write_message_type(), payload); + ao2_ref(payload, -1); if (!message) { - ast_log(AST_LOG_WARNING, "Failed to manipulate CDR for channel %s: unable to create message\n", + ast_log(LOG_WARNING, "Failed to manipulate CDR for channel %s: unable to create message\n", ast_channel_name(chan)); return -1; } + router = ast_cdr_message_router(); + if (!router) { + ast_log(LOG_WARNING, "Failed to manipulate CDR for channel %s: no message router\n", + ast_channel_name(chan)); + ao2_ref(message, -1); + return -1; + } stasis_message_router_publish_sync(router, message); + ao2_ref(router, -1); + ao2_ref(message, -1); return 0; } @@ -586,7 +619,7 @@ static int cdr_prop_write(struct ast_channel *chan, const char *cmd, char *parse return -1; } - if (!cdr_write_message_type()) { + if (!cdr_prop_write_message_type()) { ast_log(AST_LOG_WARNING, "Failed to manipulate CDR for channel %s: message type not available\n", ast_channel_name(chan)); return -1; diff --git a/funcs/func_channel.c b/funcs/func_channel.c index eb3ceddb4..b72cb141e 100644 --- a/funcs/func_channel.c +++ b/funcs/func_channel.c @@ -495,18 +495,17 @@ static int func_channel_write_real(struct ast_channel *chan, const char *functio ast_bridge_set_after_go_on(chan, ast_channel_context(chan), ast_channel_exten(chan), ast_channel_priority(chan), value); } } else if (!strcasecmp(data, "amaflags")) { - ast_channel_lock(chan); + int amaflags; + if (isdigit(*value)) { - int amaflags; - sscanf(value, "%30d", &amaflags); - ast_channel_amaflags_set(chan, amaflags); - } else if (!strcasecmp(value,"OMIT")){ - ast_channel_amaflags_set(chan, 1); - } else if (!strcasecmp(value,"BILLING")){ - ast_channel_amaflags_set(chan, 2); - } else if (!strcasecmp(value,"DOCUMENTATION")){ - ast_channel_amaflags_set(chan, 3); + if (sscanf(value, "%30d", &amaflags) != 1) { + amaflags = AST_AMA_NONE; + } + } else { + amaflags = ast_channel_string2amaflag(value); } + ast_channel_lock(chan); + ast_channel_amaflags_set(chan, amaflags); ast_channel_unlock(chan); } else if (!strcasecmp(data, "peeraccount")) locked_string_field_set(chan, peeraccount, value); diff --git a/res/res_pjsip/pjsip_cli.c b/res/res_pjsip/pjsip_cli.c index 56ec191ed..4544a1717 100644 --- a/res/res_pjsip/pjsip_cli.c +++ b/res/res_pjsip/pjsip_cli.c @@ -82,31 +82,22 @@ int ast_sip_cli_print_sorcery_objectset(void *obj, void *arg, int flags) return 0; } -static char *complete_show_sorcery_object(struct ao2_container *container, +static void complete_show_sorcery_object(struct ao2_container *container, struct ast_sip_cli_formatter_entry *formatter_entry, - const char *word, int state) + const char *word) { - char *result = NULL; - int wordlen = strlen(word); - int which = 0; - - struct ao2_iterator i = ao2_iterator_init(container, 0); + size_t wordlen = strlen(word); void *object; + struct ao2_iterator i = ao2_iterator_init(container, 0); while ((object = ao2_t_iterator_next(&i, "iterate thru endpoints table"))) { const char *id = formatter_entry->get_id(object); - if (!strncasecmp(word, id, wordlen) - && ++which > state) { - result = ast_strdup(id); + if (!strncasecmp(word, id, wordlen)) { + ast_cli_completion_add(ast_strdup(id)); } ao2_t_ref(object, -1, "toss iterator endpoint ptr before break"); - if (result) { - break; - } } ao2_iterator_destroy(&i); - - return result; } static void dump_str_and_free(int fd, struct ast_str *buf) @@ -211,7 +202,8 @@ char *ast_sip_cli_traverse_objects(struct ast_cli_entry *e, int cmd, struct ast_ if (cmd == CLI_GENERATE) { ast_free(context.output_buffer); - return complete_show_sorcery_object(container, formatter_entry, a->word, a->n); + complete_show_sorcery_object(container, formatter_entry, a->word); + return NULL; } if (is_container) { diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c index e63e158c4..76cf528eb 100644 --- a/res/res_pjsip/pjsip_configuration.c +++ b/res/res_pjsip/pjsip_configuration.c @@ -1,8 +1,19 @@ /* - * sip_cli_commands.c + * Asterisk -- An open source telephony toolkit. * - * Created on: Jan 25, 2013 - * Author: mjordan + * Copyright (C) 2013, Digium, Inc. + * + * Matt Jordan <mjordan@digium.com> + * + * See http://www.asterisk.org for more information about + * the Asterisk project. Please do not directly contact + * any of the maintainers of this project for assistance; + * the project provides a web site, mailing lists and IRC + * channels for your use. + * + * This program is free software, distributed under the terms of + * the GNU General Public License Version 2. See the LICENSE file + * at the top of the source tree. */ #include "asterisk.h" |