diff options
Diffstat (limited to 'apps/app_queue.c')
-rw-r--r-- | apps/app_queue.c | 177 |
1 files changed, 117 insertions, 60 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c index 9cb24d94d..02394e053 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -313,6 +313,7 @@ struct queue_ent { struct member { char interface[80]; /*!< Technology/Location */ + char membername[80]; /*!< Member name to use in queue logs */ int penalty; /*!< Are we a last resort? */ int calls; /*!< Number of calls serviced by this member */ int dynamic; /*!< Are we dynamically added? */ @@ -554,13 +555,14 @@ static void *changethread(void *data) manager_event(EVENT_FLAG_AGENT, "QueueMemberStatus", "Queue: %s\r\n" "Location: %s\r\n" + "MemberName: %s\r\n" "Membership: %s\r\n" "Penalty: %d\r\n" "CallsTaken: %d\r\n" "LastCall: %d\r\n" "Status: %d\r\n" "Paused: %d\r\n", - q->name, cur->interface, cur->dynamic ? "dynamic" : "static", + q->name, cur->interface, cur->membername, cur->dynamic ? "dynamic" : "static", cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused); } } @@ -594,7 +596,7 @@ static int statechange_queue(const char *dev, int state, void *ign) return 0; } -static struct member *create_queue_member(char *interface, int penalty, int paused) +static struct member *create_queue_member(char *interface, char *membername, int penalty, int paused) { struct member *cur; @@ -602,6 +604,7 @@ static struct member *create_queue_member(char *interface, int penalty, int paus cur->penalty = penalty; cur->paused = paused; ast_copy_string(cur->interface, interface, sizeof(cur->interface)); + ast_copy_string(cur->membername, membername, sizeof(cur->membername)); if (!strchr(cur->interface, '/')) ast_log(LOG_WARNING, "No location at interface '%s'\n", interface); cur->status = ast_device_state(interface); @@ -909,7 +912,7 @@ static void queue_set_param(struct call_queue *q, const char *param, const char } } -static void rt_handle_member_record(struct call_queue *q, char *interface, const char *penalty_str) +static void rt_handle_member_record(struct call_queue *q, char *interface, char *membername, const char *penalty_str) { struct member *m, *prev_m; int penalty = 0; @@ -927,7 +930,7 @@ static void rt_handle_member_record(struct call_queue *q, char *interface, const /* Create a new one if not found, else update penalty */ if (!m) { - if ((m = create_queue_member(interface, penalty, 0))) { + if ((m = create_queue_member(interface, membername, penalty, 0))) { m->dead = 0; add_to_interfaces(interface); if (prev_m) { @@ -1058,8 +1061,11 @@ static struct call_queue *find_queue_by_name_rt(const char *queuename, struct as m->dead = 1; } - while ((interface = ast_category_browse(member_config, interface))) - rt_handle_member_record(q, interface, ast_variable_retrieve(member_config, interface, "penalty")); + while ((interface = ast_category_browse(member_config, interface))) { + rt_handle_member_record(q, interface, + ast_variable_retrieve(member_config, interface, "membername"), + ast_variable_retrieve(member_config, interface, "penalty")); + } /* Delete all realtime members that have been deleted in DB. */ m = q->members; @@ -1441,13 +1447,14 @@ static int update_status(struct call_queue *q, struct member *member, int status manager_event(EVENT_FLAG_AGENT, "QueueMemberStatus", "Queue: %s\r\n" "Location: %s\r\n" + "MemberName: %s\r\n" "Membership: %s\r\n" "Penalty: %d\r\n" "CallsTaken: %d\r\n" "LastCall: %d\r\n" "Status: %d\r\n" "Paused: %d\r\n", - q->name, cur->interface, cur->dynamic ? "dynamic" : "static", + q->name, cur->interface, cur->membername, cur->dynamic ? "dynamic" : "static", cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused); } } @@ -1814,18 +1821,18 @@ static void record_abandoned(struct queue_ent *qe) } /*! \brief RNA == Ring No Answer. Common code that is executed when we try a queue member and they don't answer. */ -static void rna(int rnatime, struct queue_ent *qe, char *membername) +static void rna(int rnatime, struct queue_ent *qe, char *interface, char *membername) { if (option_verbose > 2) ast_verbose( VERBOSE_PREFIX_3 "Nobody picked up in %d ms\n", rnatime); ast_queue_log(qe->parent->name, qe->chan->uniqueid, membername, "RINGNOANSWER", "%d", rnatime); if (qe->parent->autopause) { - if (!set_member_paused(qe->parent->name, membername, 1)) { + if (!set_member_paused(qe->parent->name, interface, 1)) { if (option_verbose > 2) - ast_verbose( VERBOSE_PREFIX_3 "Auto-Pausing Queue Member %s in queue %s since they failed to answer.\n", membername, qe->parent->name); + ast_verbose( VERBOSE_PREFIX_3 "Auto-Pausing Queue Member %s in queue %s since they failed to answer.\n", interface, qe->parent->name); } else { if (option_verbose > 2) - ast_verbose( VERBOSE_PREFIX_3 "Failed to pause Queue Member %s in queue %s!\n", membername, qe->parent->name); + ast_verbose( VERBOSE_PREFIX_3 "Failed to pause Queue Member %s in queue %s!\n", interface, qe->parent->name); } } return; @@ -1847,7 +1854,8 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte struct callattempt *peer = NULL; struct ast_channel *winner; struct ast_channel *in = qe->chan; - char on[256] = ""; + char on[80] = ""; + char membername[80] = ""; long starttime = 0; long endtime = 0; @@ -1896,6 +1904,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte } else if (o->chan && (o->chan == winner)) { if (!ast_strlen_zero(o->chan->call_forward) && !forwardsallowed) { ast_copy_string(on, o->member->interface, sizeof(on)); + ast_copy_string(membername, o->member->membername, sizeof(membername)); if (option_verbose > 2) ast_verbose(VERBOSE_PREFIX_3 "Forwarding %s to '%s' prevented.\n", in->name, o->chan->call_forward); winner = o->chan = NULL; @@ -1975,7 +1984,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte do_hang(o); endtime = (long)time(NULL); endtime -= starttime; - rna(endtime*1000, qe, on); + rna(endtime*1000, qe, on, membername); if (qe->parent->strategy != QUEUE_STRATEGY_RINGALL) { if (qe->parent->timeoutrestart) *to = orig; @@ -1990,7 +1999,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte ast_cdr_busy(in->cdr); endtime = (long)time(NULL); endtime -= starttime; - rna(endtime*1000, qe, on); + rna(endtime*1000, qe, on, membername); do_hang(o); if (qe->parent->strategy != QUEUE_STRATEGY_RINGALL) { if (qe->parent->timeoutrestart) @@ -2019,7 +2028,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte ast_frfree(f); } else { endtime = (long) time(NULL) - starttime; - rna(endtime * 1000, qe, on); + rna(endtime * 1000, qe, on, membername); do_hang(o); if (qe->parent->strategy != QUEUE_STRATEGY_RINGALL) { if (qe->parent->timeoutrestart) @@ -2056,7 +2065,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte ast_frfree(f); } if (!*to) - rna(orig, qe, on); + rna(orig, qe, on, membername); } return peer; @@ -2442,7 +2451,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce if (peer->_softhangup) { /* Agent must have hung up */ ast_log(LOG_WARNING, "Agent on %s hungup on the customer. They're going to be pissed.\n", peer->name); - ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "AGENTDUMP", "%s", ""); + ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "AGENTDUMP", "%s", ""); record_abandoned(qe); if (qe->parent->eventwhencalled) manager_event(EVENT_FLAG_AGENT, "AgentDump", @@ -2450,15 +2459,16 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce "Uniqueid: %s\r\n" "Channel: %s\r\n" "Member: %s\r\n" + "MemberName: %s\r\n" "%s", - queuename, qe->chan->uniqueid, peer->name, member->interface, + queuename, qe->chan->uniqueid, peer->name, member->interface, member->membername, qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, sizeof(vars)) : ""); ast_hangup(peer); goto out; } else if (res2) { /* Caller must have hung up just before being connected*/ ast_log(LOG_NOTICE, "Caller was about to talk to agent on %s but the caller hungup.\n", peer->name); - ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "ABANDON", "%d|%d|%ld", qe->pos, qe->opos, (long)time(NULL) - qe->start); + ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "ABANDON", "%d|%d|%ld", qe->pos, qe->opos, (long)time(NULL) - qe->start); record_abandoned(qe); ast_hangup(peer); return -1; @@ -2472,7 +2482,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce /* Make sure channels are compatible */ res = ast_channel_make_compatible(qe->chan, peer); if (res < 0) { - ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "SYSCOMPAT", "%s", ""); + ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "SYSCOMPAT", "%s", ""); ast_log(LOG_WARNING, "Had to drop call because I couldn't make %s compatible with %s\n", qe->chan->name, peer->name); record_abandoned(qe); ast_hangup(peer); @@ -2587,17 +2597,18 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce } else ast_log(LOG_WARNING, "Asked to execute an AGI on this channel, but could not find application (agi)!\n"); } - ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "CONNECT", "%ld|%s", (long)time(NULL) - qe->start, peer->uniqueid); + ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "CONNECT", "%ld|%s", (long)time(NULL) - qe->start, peer->uniqueid); if (qe->parent->eventwhencalled) manager_event(EVENT_FLAG_AGENT, "AgentConnect", "Queue: %s\r\n" "Uniqueid: %s\r\n" "Channel: %s\r\n" "Member: %s\r\n" + "MemberName: %s\r\n" "Holdtime: %ld\r\n" "BridgedChannel: %s\r\n" "%s", - queuename, qe->chan->uniqueid, peer->name, member->interface, + queuename, qe->chan->uniqueid, peer->name, member->interface, member->membername, (long)time(NULL) - qe->start, peer->uniqueid, qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, sizeof(vars)) : ""); ast_copy_string(oldcontext, qe->chan->context, sizeof(oldcontext)); @@ -2607,7 +2618,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce bridge = ast_bridge_call(qe->chan,peer, &bridge_config); if (strcasecmp(oldcontext, qe->chan->context) || strcasecmp(oldexten, qe->chan->exten)) { - ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "TRANSFER", "%s|%s|%ld|%ld", + ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "TRANSFER", "%s|%s|%ld|%ld", qe->chan->exten, qe->chan->context, (long) (callstart - qe->start), (long) (time(NULL) - callstart)); } else if (qe->chan->_softhangup) { @@ -2619,26 +2630,28 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce "Uniqueid: %s\r\n" "Channel: %s\r\n" "Member: %s\r\n" + "MemberName: %s\r\n" "HoldTime: %ld\r\n" "TalkTime: %ld\r\n" "Reason: caller\r\n" "%s", - queuename, qe->chan->uniqueid, peer->name, member->interface, + queuename, qe->chan->uniqueid, peer->name, member->interface, member->membername, (long)(callstart - qe->start), (long)(time(NULL) - callstart), qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, sizeof(vars)) : ""); } else { - ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "COMPLETEAGENT", "%ld|%ld", + ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "COMPLETEAGENT", "%ld|%ld", (long) (callstart - qe->start), (long) (time(NULL) - callstart)); if (qe->parent->eventwhencalled) manager_event(EVENT_FLAG_AGENT, "AgentComplete", "Queue: %s\r\n" "Uniqueid: %s\r\n" "Channel: %s\r\n" + "MemberName: %s\r\n" "HoldTime: %ld\r\n" "TalkTime: %ld\r\n" "Reason: agent\r\n" "%s", - queuename, qe->chan->uniqueid, peer->name, (long)(callstart - qe->start), + queuename, qe->chan->uniqueid, peer->name, member->membername, (long)(callstart - qe->start), (long)(time(NULL) - callstart), qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, sizeof(vars)) : ""); } @@ -2746,8 +2759,9 @@ static int remove_from_queue(char *queuename, char *interface) } manager_event(EVENT_FLAG_AGENT, "QueueMemberRemoved", "Queue: %s\r\n" - "Location: %s\r\n", - q->name, last_member->interface); + "Location: %s\r\n" + "MemberName: %s\r\n", + q->name, last_member->interface, last_member->membername); free(last_member); if (queue_persistent_members) @@ -2770,7 +2784,7 @@ static int remove_from_queue(char *queuename, char *interface) } -static int add_to_queue(char *queuename, char *interface, int penalty, int paused, int dump) +static int add_to_queue(char *queuename, char *interface, char *membername, int penalty, int paused, int dump) { struct call_queue *q; struct member *new_member; @@ -2786,20 +2800,22 @@ static int add_to_queue(char *queuename, char *interface, int penalty, int pause ast_mutex_lock(&q->lock); if (interface_exists(q, interface) == NULL) { add_to_interfaces(interface); - if ((new_member = create_queue_member(interface, penalty, paused))) { + if ((new_member = create_queue_member(interface, membername, penalty, paused))) { new_member->dynamic = 1; new_member->next = q->members; q->members = new_member; manager_event(EVENT_FLAG_AGENT, "QueueMemberAdded", "Queue: %s\r\n" "Location: %s\r\n" + "MemberName: %s\r\n" "Membership: %s\r\n" "Penalty: %d\r\n" "CallsTaken: %d\r\n" "LastCall: %d\r\n" "Status: %d\r\n" "Paused: %d\r\n", - q->name, new_member->interface, new_member->dynamic ? "dynamic" : "static", + q->name, new_member->interface, new_member->membername, + new_member->dynamic ? "dynamic" : "static", new_member->penalty, new_member->calls, (int) new_member->lastcall, new_member->status, new_member->paused); @@ -2826,7 +2842,7 @@ static int set_member_paused(char *queuename, char *interface, int paused) struct member *mem; /* Special event for when all queues are paused - individual events still generated */ - + /* XXX In all other cases, we use the membername, but since this affects all queues, we cannot */ if (ast_strlen_zero(queuename)) ast_queue_log("NONE", "NONE", interface, (paused ? "PAUSEALL" : "UNPAUSEALL"), "%s", ""); @@ -2843,13 +2859,14 @@ static int set_member_paused(char *queuename, char *interface, int paused) if (queue_persistent_members) dump_queue_members(q); - ast_queue_log(q->name, "NONE", interface, (paused ? "PAUSE" : "UNPAUSE"), "%s", ""); + ast_queue_log(q->name, "NONE", mem->membername, (paused ? "PAUSE" : "UNPAUSE"), "%s", ""); manager_event(EVENT_FLAG_AGENT, "QueueMemberPaused", "Queue: %s\r\n" "Location: %s\r\n" + "MemberName: %s\r\n" "Paused: %d\r\n", - q->name, mem->interface, paused); + q->name, mem->interface, mem->membername, paused); } } ast_mutex_unlock(&q->lock); @@ -2866,6 +2883,7 @@ static void reload_queue_members(void) char *queue_name; char *member; char *interface; + char *membername; char *penalty_tok; int penalty = 0; char *paused_tok; @@ -2909,6 +2927,7 @@ static void reload_queue_members(void) interface = strsep(&member, ";"); penalty_tok = strsep(&member, ";"); paused_tok = strsep(&member, ";"); + membername = strsep(&member, ";"); if (!penalty_tok) { ast_log(LOG_WARNING, "Error parsing persistent member string for '%s' (penalty)\n", queue_name); @@ -2929,11 +2948,13 @@ static void reload_queue_members(void) ast_log(LOG_WARNING, "Error converting paused: %s: Expected 0 or 1.\n", paused_tok); break; } + if (ast_strlen_zero(membername)) + membername = interface; if (option_debug) - ast_log(LOG_DEBUG, "Reload Members: Queue: %s Member: %s Penalty: %d Paused: %d\n", queue_name, interface, penalty, paused); + ast_log(LOG_DEBUG, "Reload Members: Queue: %s Member: %s Name: %s Penalty: %d Paused: %d\n", queue_name, interface, membername, penalty, paused); - if (add_to_queue(queue_name, interface, penalty, paused, 0) == RES_OUTOFMEMORY) { + if (add_to_queue(queue_name, membername, interface, penalty, paused, 0) == RES_OUTOFMEMORY) { ast_log(LOG_ERROR, "Out of Memory when reloading persistent queue member\n"); break; } @@ -3125,11 +3146,12 @@ static int aqm_exec(struct ast_channel *chan, void *data) AST_APP_ARG(interface); AST_APP_ARG(penalty); AST_APP_ARG(options); + AST_APP_ARG(membername); ); int penalty = 0; if (ast_strlen_zero(data)) { - ast_log(LOG_WARNING, "AddQueueMember requires an argument (queuename[|[interface]|[penalty][|options]])\n"); + ast_log(LOG_WARNING, "AddQueueMember requires an argument (queuename[|[interface]|[penalty][|options][|membername]])\n"); return -1; } @@ -3158,8 +3180,11 @@ static int aqm_exec(struct ast_channel *chan, void *data) priority_jump = 1; } + if (ast_strlen_zero(args.membername)) + args.membername = args.interface; - switch (add_to_queue(args.queuename, args.interface, penalty, 0, queue_persistent_members)) { + + switch (add_to_queue(args.queuename, args.interface, args.membername, penalty, 0, queue_persistent_members)) { case RES_OKAY: ast_log(LOG_NOTICE, "Added interface '%s' to queue '%s'\n", args.interface, args.queuename); pbx_builtin_setvar_helper(chan, "AQMSTATUS", "ADDED"); @@ -3195,13 +3220,13 @@ static int ql_exec(struct ast_channel *chan, void *data) AST_DECLARE_APP_ARGS(args, AST_APP_ARG(queuename); AST_APP_ARG(uniqueid); - AST_APP_ARG(peer); + AST_APP_ARG(membername); AST_APP_ARG(event); AST_APP_ARG(params); ); if (ast_strlen_zero(data)) { - ast_log(LOG_WARNING, "QueueLog requires arguments (queuename|uniqueid|peer|event[|additionalinfo]\n"); + ast_log(LOG_WARNING, "QueueLog requires arguments (queuename|uniqueid|membername|event[|additionalinfo]\n"); return -1; } @@ -3212,13 +3237,13 @@ static int ql_exec(struct ast_channel *chan, void *data) AST_STANDARD_APP_ARGS(args, parse); if (ast_strlen_zero(args.queuename) || ast_strlen_zero(args.uniqueid) - || ast_strlen_zero(args.peer) || ast_strlen_zero(args.event)) { - ast_log(LOG_WARNING, "QueueLog requires arguments (queuename|uniqueid|peer|event[|additionalinfo])\n"); + || ast_strlen_zero(args.membername) || ast_strlen_zero(args.event)) { + ast_log(LOG_WARNING, "QueueLog requires arguments (queuename|uniqueid|membername|event[|additionalinfo])\n"); ast_module_user_remove(u); return -1; } - ast_queue_log(args.queuename, args.uniqueid, args.peer, args.event, + ast_queue_log(args.queuename, args.uniqueid, args.membername, args.event, "%s", args.params ? args.params : ""); ast_module_user_remove(u); @@ -3365,7 +3390,7 @@ check_turns: record_abandoned(&qe); reason = QUEUE_TIMEOUT; res = 0; - ast_queue_log(args.queuename, chan->uniqueid,"NONE", "EXITWITHTIMEOUT", "%d", qe.pos); + ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos); break; } @@ -3427,7 +3452,7 @@ check_turns: record_abandoned(&qe); reason = QUEUE_TIMEOUT; res = 0; - ast_queue_log(args.queuename, chan->uniqueid,"NONE", "EXITWITHTIMEOUT", "%d", qe.pos); + ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos); break; } @@ -3667,14 +3692,20 @@ static int reload_queues(void) struct member *prev, *cur, *newm; int new; char *general_val = NULL; - char interface[80]; + char parse[80]; + char *interface; + char *membername; int penalty; + AST_DECLARE_APP_ARGS(args, + AST_APP_ARG(interface); + AST_APP_ARG(penalty); + AST_APP_ARG(membername); + ); if (!(cfg = ast_config_load("queues.conf"))) { ast_log(LOG_NOTICE, "No call queueing config file (queues.conf), so no call queues\n"); return 0; } - memset(interface, 0, sizeof(interface)); AST_LIST_LOCK(&queues); use_weight=0; /* Mark all queues as dead for the moment */ @@ -3724,10 +3755,14 @@ static int reload_queues(void) for (var = ast_variable_browse(cfg, cat); var; var = var->next) { if (!strcasecmp(var->name, "member")) { /* Add a new member */ - ast_copy_string(interface, var->value, sizeof(interface)); - if ((tmp = strchr(interface, ','))) { - *tmp = '\0'; - tmp++; + ast_copy_string(parse, var->value, sizeof(parse)); + + AST_NONSTANDARD_APP_ARGS(args, parse, ','); + + interface = args.interface; + if(!ast_strlen_zero(args.penalty)) { + tmp = args.penalty; + while (*tmp && *tmp < 33) tmp++; penalty = atoi(tmp); if (penalty < 0) { penalty = 0; @@ -3735,6 +3770,12 @@ static int reload_queues(void) } else penalty = 0; + if (!ast_strlen_zero(args.membername)) { + membername = args.membername; + while (*membername && *membername < 33) membername++; + } else + membername = interface; + /* Find the old position in the list */ for (prev = NULL, cur = q->members; cur; prev = cur, cur = cur->next) { if (!strcmp(cur->interface, interface)) { @@ -3742,7 +3783,7 @@ static int reload_queues(void) } } - newm = create_queue_member(interface, penalty, cur ? cur->paused : 0); + newm = create_queue_member(interface, membername, penalty, cur ? cur->paused : 0); if (cur) { /* Delete it now */ @@ -4076,13 +4117,14 @@ static int manager_queues_status( struct mansession *s, struct message *m ) static int manager_add_queue_member(struct mansession *s, struct message *m) { - char *queuename, *interface, *penalty_s, *paused_s; + char *queuename, *interface, *penalty_s, *paused_s, *membername; int paused, penalty = 0; queuename = astman_get_header(m, "Queue"); interface = astman_get_header(m, "Interface"); penalty_s = astman_get_header(m, "Penalty"); paused_s = astman_get_header(m, "Paused"); + membername = astman_get_header(m, "MemberName"); if (ast_strlen_zero(queuename)) { astman_send_error(s, m, "'Queue' not specified."); @@ -4104,7 +4146,10 @@ static int manager_add_queue_member(struct mansession *s, struct message *m) else paused = abs(ast_true(paused_s)); - switch (add_to_queue(queuename, interface, penalty, paused, queue_persistent_members)) { + if (ast_strlen_zero(membername)) + membername = interface; + + switch (add_to_queue(queuename, interface, membername, penalty, paused, queue_persistent_members)) { case RES_OKAY: astman_send_ack(s, m, "Added interface to queue"); break; @@ -4177,20 +4222,22 @@ static int manager_pause_queue_member(struct mansession *s, struct message *m) static int handle_queue_add_member(int fd, int argc, char *argv[]) { - char *queuename, *interface; + char *queuename, *interface, *membername; int penalty; - if ((argc != 6) && (argc != 8)) { + if ((argc != 6) && (argc != 8) && (argc != 10)) { return RESULT_SHOWUSAGE; } else if (strcmp(argv[4], "to")) { return RESULT_SHOWUSAGE; } else if ((argc == 8) && strcmp(argv[6], "penalty")) { return RESULT_SHOWUSAGE; + } else if ((argc == 10) && strcmp(argv[8], "as")) { + return RESULT_SHOWUSAGE; } queuename = argv[5]; interface = argv[3]; - if (argc == 8) { + if (argc >= 8) { if (sscanf(argv[7], "%d", &penalty) == 1) { if (penalty < 0) { ast_cli(fd, "Penalty must be >= 0\n"); @@ -4204,7 +4251,13 @@ static int handle_queue_add_member(int fd, int argc, char *argv[]) penalty = 0; } - switch (add_to_queue(queuename, interface, penalty, 0, queue_persistent_members)) { + if (argc >= 10) { + membername = argv[9]; + } else { + membername = interface; + } + + switch (add_to_queue(queuename, interface, membername, penalty, 0, queue_persistent_members)) { case RES_OKAY: ast_cli(fd, "Added interface '%s' to queue '%s'\n", interface, queuename); return RESULT_SUCCESS; @@ -4224,9 +4277,9 @@ static int handle_queue_add_member(int fd, int argc, char *argv[]) static char *complete_queue_add_member(const char *line, const char *word, int pos, int state) { - /* 0 - queue; 1 - add; 2 - member; 3 - <member>; 4 - to; 5 - <queue>; 6 - penalty; 7 - <penalty> */ + /* 0 - queue; 1 - add; 2 - member; 3 - <interface>; 4 - to; 5 - <queue>; 6 - penalty; 7 - <penalty>; 8 - as; 9 - <membername> */ switch (pos) { - case 3: /* Don't attempt to complete name of member (infinite possibilities) */ + case 3: /* Don't attempt to complete name of interface (infinite possibilities) */ return NULL; case 4: /* only one possible match, "to" */ return state == 0 ? ast_strdup("to") : NULL; @@ -4244,6 +4297,10 @@ static char *complete_queue_add_member(const char *line, const char *word, int p } else { return NULL; } + case 8: /* only one possible match, "as" */ + return state == 0 ? ast_strdup("as") : NULL; + case 9: /* Don't attempt to complete name of member (infinite possibilities) */ + return NULL; default: return NULL; } |