Replace direct access to channel name with accessor functions
[asterisk/asterisk.git] / apps / app_queue.c
index d4644a3..ec9ad39 100644 (file)
@@ -2197,9 +2197,9 @@ static void rt_handle_member_record(struct call_queue *q, char *interface, struc
                        m->ignorebusy = ignorebusy;
                        ast_copy_string(m->rt_uniqueid, rt_uniqueid, sizeof(m->rt_uniqueid));
                        if (!log_membername_as_agent) {
-                               ast_queue_log(q->name, "REALTIME", m->interface, "ADDMEMBER", "%s", "");
+                               ast_queue_log(q->name, "REALTIME", m->interface, "ADDMEMBER", "%s", paused ? "PAUSED" : "");
                        } else {
-                               ast_queue_log(q->name, "REALTIME", m->membername, "ADDMEMBER", "%s", "");
+                               ast_queue_log(q->name, "REALTIME", m->membername, "ADDMEMBER", "%s", paused ? "PAUSED" : "");
                        }
                        ao2_link(q->members, m);
                        ao2_ref(m, -1);
@@ -2395,8 +2395,18 @@ static struct call_queue *find_queue_by_name_rt(const char *queuename, struct as
        return q;
 }
 
-/*! \note Returns a reference to the loaded realtime queue. */
-static struct call_queue *load_realtime_queue(const char *queuename)
+/*!
+ * note  */
+
+/*!
+ * \internal
+ * \brief Returns reference to the named queue. If the queue is realtime, it will load the queue as well.
+ * \param queuename - name of the desired queue
+ *
+ * \retval the queue
+ * \retval NULL if it doesn't exist
+ */
+static struct call_queue *find_load_queue_rt_friendly(const char *queuename)
 {
        struct ast_variable *queue_vars;
        struct ast_config *member_config = NULL;
@@ -2520,7 +2530,7 @@ static int join_queue(char *queuename, struct queue_ent *qe, enum queue_result *
        int pos = 0;
        int inserted = 0;
 
-       if (!(q = load_realtime_queue(queuename))) {
+       if (!(q = find_load_queue_rt_friendly(queuename))) {
                return res;
        }
        ao2_lock(q);
@@ -2585,13 +2595,13 @@ static int join_queue(char *queuename, struct queue_ent *qe, enum queue_result *
                        "Position: %d\r\n"
                        "Count: %d\r\n"
                        "Uniqueid: %s\r\n",
-                       qe->chan->name,
+                       ast_channel_name(qe->chan),
                        S_COR(qe->chan->caller.id.number.valid, qe->chan->caller.id.number.str, "unknown"),/* XXX somewhere else it is <unknown> */
                        S_COR(qe->chan->caller.id.name.valid, qe->chan->caller.id.name.str, "unknown"),
                        S_COR(qe->chan->connected.id.number.valid, qe->chan->connected.id.number.str, "unknown"),/* XXX somewhere else it is <unknown> */
                        S_COR(qe->chan->connected.id.name.valid, qe->chan->connected.id.name.str, "unknown"),
                        q->name, qe->pos, q->count, qe->chan->uniqueid );
-               ast_debug(1, "Queue '%s' Join, Channel '%s', Position '%d'\n", q->name, qe->chan->name, qe->pos );
+               ast_debug(1, "Queue '%s' Join, Channel '%s', Position '%d'\n", q->name, ast_channel_name(qe->chan), qe->pos );
        }
        ao2_unlock(q);
        queue_t_unref(q, "Done with realtime queue");
@@ -2780,7 +2790,7 @@ static int say_position(struct queue_ent *qe, int ringing)
 posout:
        if (qe->parent->announceposition) {
                ast_verb(3, "Told %s in %s their queue position (which was %d)\n",
-                       qe->chan->name, qe->parent->name, qe->pos);
+                       ast_channel_name(qe->chan), qe->parent->name, qe->pos);
        }
        if (say_thanks) {
                res = play_file(qe->chan, qe->parent->sound_thanks);
@@ -2846,8 +2856,8 @@ static void leave_queue(struct queue_ent *qe)
                        /* Take us out of the queue */
                        ast_manager_event(qe->chan, EVENT_FLAG_CALL, "Leave",
                                "Channel: %s\r\nQueue: %s\r\nCount: %d\r\nPosition: %d\r\nUniqueid: %s\r\n",
-                               qe->chan->name, q->name,  q->count, qe->pos, qe->chan->uniqueid);
-                       ast_debug(1, "Queue '%s' Leave, Channel '%s'\n", q->name, qe->chan->name );
+                               ast_channel_name(qe->chan), q->name,  q->count, qe->pos, qe->chan->uniqueid);
+                       ast_debug(1, "Queue '%s' Leave, Channel '%s'\n", q->name, ast_channel_name(qe->chan));
                        /* Take us out of the queue */
                        if (prev)
                                prev->next = current->next;
@@ -3209,7 +3219,7 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies
        if (ast_cdr_isset_unanswered()) {
                /* they want to see the unanswered dial attempts! */
                /* set up the CDR fields on all the CDRs to give sensical information */
-               ast_cdr_setdestchan(tmp->chan->cdr, tmp->chan->name);
+               ast_cdr_setdestchan(tmp->chan->cdr, ast_channel_name(tmp->chan));
                strcpy(tmp->chan->cdr->clid, qe->chan->cdr->clid);
                strcpy(tmp->chan->cdr->channel, qe->chan->cdr->channel);
                strcpy(tmp->chan->cdr->src, qe->chan->cdr->src);
@@ -3254,7 +3264,7 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies
                        "Priority: %d\r\n"
                        "Uniqueid: %s\r\n"
                        "%s",
-                       qe->parent->name, tmp->interface, tmp->member->membername, qe->chan->name, tmp->chan->name,
+                       qe->parent->name, tmp->interface, tmp->member->membername, ast_channel_name(qe->chan), ast_channel_name(tmp->chan),
                        S_COR(qe->chan->caller.id.number.valid, qe->chan->caller.id.number.str, "unknown"),
                        S_COR(qe->chan->caller.id.name.valid, qe->chan->caller.id.name.str, "unknown"),
                        S_COR(qe->chan->connected.id.number.valid, qe->chan->connected.id.number.str, "unknown"),
@@ -3479,7 +3489,7 @@ static void rna(int rnatime, struct queue_ent *qe, char *interface, char *member
                                                "%s",
                                                qe->parent->name,
                                                qe->chan->uniqueid,
-                                               qe->chan->name,
+                                               ast_channel_name(qe->chan),
                                                interface,
                                                membername,
                                                rnatime,
@@ -3564,7 +3574,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
        ast_party_connected_line_init(&connected_caller);
 
        ast_channel_lock(qe->chan);
-       inchan_name = ast_strdupa(qe->chan->name);
+       inchan_name = ast_strdupa(ast_channel_name(qe->chan));
        ast_channel_unlock(qe->chan);
 
        starttime = (long) time(NULL);
@@ -3628,7 +3638,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
                        char ochan_name[AST_CHANNEL_NAME];
                        if (o->chan) {
                                ast_channel_lock(o->chan);
-                               ast_copy_string(ochan_name, o->chan->name, sizeof(ochan_name));
+                               ast_copy_string(ochan_name, ast_channel_name(o->chan), sizeof(ochan_name));
                                ast_channel_unlock(o->chan);
                        }
                        if (o->stillgoing && (o->chan) &&  (o->chan->_state == AST_STATE_UP)) {
@@ -3980,10 +3990,10 @@ static int is_our_turn(struct queue_ent *qe)
         * from the front of the queue are valid when autofill is disabled)
         */
        if (ch && idx < avl && (qe->parent->autofill || qe->pos == 1)) {
-               ast_debug(1, "It's our turn (%s).\n", qe->chan->name);
+               ast_debug(1, "It's our turn (%s).\n", ast_channel_name(qe->chan));
                res = 1;
        } else {
-               ast_debug(1, "It's not our turn (%s).\n", qe->chan->name);
+               ast_debug(1, "It's not our turn (%s).\n", ast_channel_name(qe->chan));
                res = 0;
        }
 
@@ -4014,7 +4024,7 @@ static void update_qe_rule(struct queue_ent *qe)
        pbx_builtin_setvar_helper(qe->chan, "QUEUE_MIN_PENALTY", min_penalty_str);
        qe->max_penalty = max_penalty;
        qe->min_penalty = min_penalty;
-       ast_debug(3, "Setting max penalty to %d and min penalty to %d for caller %s since %d seconds have elapsed\n", qe->max_penalty, qe->min_penalty, qe->chan->name, qe->pr->time);
+       ast_debug(3, "Setting max penalty to %d and min penalty to %d for caller %s since %d seconds have elapsed\n", qe->max_penalty, qe->min_penalty, ast_channel_name(qe->chan), qe->pr->time);
        qe->pr = AST_LIST_NEXT(qe->pr, list);
 }
 
@@ -4259,7 +4269,7 @@ static void send_agent_complete(const struct queue_ent *qe, const char *queuenam
                "TalkTime: %ld\r\n"
                "Reason: %s\r\n"
                "%s",
-               queuename, qe->chan->uniqueid, peer->name, member->interface, member->membername,
+               queuename, qe->chan->uniqueid, ast_channel_name(peer), member->interface, member->membername,
                (long)(callstart - qe->start), (long)(time(NULL) - callstart), reason,
                qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, vars_len) : "");
 }
@@ -4537,7 +4547,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
 
        ao2_lock(qe->parent);
        ast_debug(1, "%s is trying to call a queue member.\n",
-                                                       qe->chan->name);
+                                                       ast_channel_name(qe->chan));
        ast_copy_string(queuename, qe->parent->name, sizeof(queuename));
        if (!ast_strlen_zero(qe->announce))
                announce = qe->announce;
@@ -4698,7 +4708,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
                        res = digit;
                }
                if (res == -1)
-                       ast_debug(1, "%s: Nobody answered.\n", qe->chan->name);
+                       ast_debug(1, "%s: Nobody answered.\n", ast_channel_name(qe->chan));
                if (ast_cdr_isset_unanswered()) {
                        /* channel contains the name of one of the outgoing channels
                           in its CDR; zero out this CDR to avoid a dual-posting */
@@ -4765,7 +4775,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
                        res2 |= ast_autoservice_stop(qe->chan);
                        if (ast_check_hangup(peer)) {
                                /* Agent must have hung up */
-                               ast_log(LOG_WARNING, "Agent on %s hungup on the customer.\n", peer->name);
+                               ast_log(LOG_WARNING, "Agent on %s hungup on the customer.\n", ast_channel_name(peer));
                                ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "AGENTDUMP", "%s", "");
                                if (qe->parent->eventwhencalled)
                                        manager_event(EVENT_FLAG_AGENT, "AgentDump",
@@ -4775,14 +4785,14 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
                                                        "Member: %s\r\n"
                                                        "MemberName: %s\r\n"
                                                        "%s",
-                                                       queuename, qe->chan->uniqueid, peer->name, member->interface, member->membername,
+                                                       queuename, qe->chan->uniqueid, ast_channel_name(peer), member->interface, member->membername,
                                                        qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, sizeof(vars)) : "");
                                ast_hangup(peer);
                                ao2_ref(member, -1);
                                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_log(LOG_NOTICE, "Caller was about to talk to agent on %s but the caller hungup.\n", ast_channel_name(peer));
                                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);
@@ -4797,13 +4807,13 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
                        ast_moh_stop(qe->chan);
                /* If appropriate, log that we have a destination channel */
                if (qe->chan->cdr) {
-                       ast_cdr_setdestchan(qe->chan->cdr, peer->name);
+                       ast_cdr_setdestchan(qe->chan->cdr, ast_channel_name(peer));
                }
                /* Make sure channels are compatible */
                res = ast_channel_make_compatible(qe->chan, peer);
                if (res < 0) {
                        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);
+                       ast_log(LOG_WARNING, "Had to drop call because I couldn't make %s compatible with %s\n", ast_channel_name(qe->chan), ast_channel_name(peer));
                        record_abandoned(qe);
                        ast_cdr_failed(qe->chan->cdr);
                        ast_hangup(peer);
@@ -5106,9 +5116,9 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
                        if ((strcasecmp(cdr->uniqueid, qe->chan->uniqueid)) &&
                            (strcasecmp(cdr->linkedid, qe->chan->uniqueid)) &&
                            (newcdr = ast_cdr_dup(cdr))) {
+                               ast_channel_lock(qe->chan);
                                ast_cdr_init(newcdr, qe->chan);
                                ast_cdr_reset(newcdr, 0);
-                               ast_channel_lock(qe->chan);
                                cdr = ast_cdr_append(cdr, newcdr);
                                cdr = cdr->next;
                                ast_channel_unlock(qe->chan);
@@ -5130,7 +5140,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
                                        "BridgedChannel: %s\r\n"
                                        "Ringtime: %ld\r\n"
                                        "%s",
-                                       queuename, qe->chan->uniqueid, peer->name, member->interface, member->membername,
+                                       queuename, qe->chan->uniqueid, ast_channel_name(peer), member->interface, member->membername,
                                        (long) time(NULL) - qe->start, peer->uniqueid, (long)(orig - to > 0 ? (orig - to) / 1000 : 0),
                                        qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, sizeof(vars)) : "");
                ast_copy_string(oldcontext, qe->chan->context, sizeof(oldcontext));
@@ -5345,7 +5355,7 @@ static int add_to_queue(const char *queuename, const char *interface, const char
 
        /*! \note Ensure the appropriate realtime queue is loaded.  Note that this
         * short-circuits if the queue is already in memory. */
-       if (!(q = load_realtime_queue(queuename))) {
+       if (!(q = find_load_queue_rt_friendly(queuename))) {
                return res;
        }
 
@@ -5467,45 +5477,95 @@ static int set_member_paused(const char *queuename, const char *interface, const
        return found ? RESULT_SUCCESS : RESULT_FAILURE;
 }
 
-/* \brief Sets members penalty, if queuename=NULL we set member penalty in all the queues. */
+/*!
+ * \internal
+ * \brief helper function for set_member_penalty - given a queue, sets all member penalties with the interface
+ * \param[in] q queue which is having its member's penalty changed - must be unlocked prior to calling
+ * \param[in] interface String of interface used to search for queue members being changed
+ * \param[in] penalty Value penalty is being changed to for the member.
+ * \retval 0 if the there is no member with interface belonging to q and no change is made
+ * \retval 1 if the there is a member with interface belonging to q and changes are made
+ */
+static int set_member_penalty_help_members(struct call_queue *q, const char *interface, int penalty)
+{
+       struct member *mem;
+       int foundinterface = 0;
+       char rtpenalty[80];
+
+       ao2_lock(q);
+       if ((mem = interface_exists(q, interface))) {
+               foundinterface++;
+               if (!mem->realtime) {
+                       mem->penalty = penalty;
+               } else {
+                       sprintf(rtpenalty, "%i", penalty);
+                       update_realtime_member_field(mem, q->name, "penalty", rtpenalty);
+               }
+               ast_queue_log(q->name, "NONE", interface, "PENALTY", "%d", penalty);
+               manager_event(EVENT_FLAG_AGENT, "QueueMemberPenalty",
+                       "Queue: %s\r\n"
+                       "Location: %s\r\n"
+                       "Penalty: %d\r\n",
+                       q->name, mem->interface, penalty);
+               ao2_ref(mem, -1);
+       }
+       ao2_unlock(q);
+
+       return foundinterface;
+}
+
+/*!
+ * \internal
+ * \brief Sets members penalty, if queuename=NULL we set member penalty in all the queues.
+ * \param[in] queuename If specified, only act on a member if it belongs to this queue
+ * \param[in] interface Interface of queue member(s) having priority set.
+ * \param[in] penalty Value penalty is being changed to for each member
+ */
 static int set_member_penalty(const char *queuename, const char *interface, int penalty)
 {
        int foundinterface = 0, foundqueue = 0;
        struct call_queue *q;
-       struct member *mem;
-       char rtpenalty[80];
+       struct ast_config *queue_config = NULL;
+       struct ao2_iterator queue_iter;
 
        if (penalty < 0 && !negative_penalty_invalid) {
                ast_log(LOG_ERROR, "Invalid penalty (%d)\n", penalty);
                return RESULT_FAILURE;
        }
 
-       if ((q = load_realtime_queue(queuename))) {
-               foundqueue++;
-               ao2_lock(q);
-               if ((mem = interface_exists(q, interface))) {
-                       foundinterface++;
-                       if (!mem->realtime) {
-                               mem->penalty = penalty;
-                       } else {
-                               sprintf(rtpenalty,"%i", penalty);
-                               update_realtime_member_field(mem, q->name, "penalty", rtpenalty);
+       if (ast_strlen_zero(queuename)) { /* This means we need to iterate through all the queues. */
+               if (ast_check_realtime("queues")) {
+                       char *queuename;
+                       queue_config = ast_load_realtime_multientry("queues", "name LIKE", "%", SENTINEL);
+                       if (queue_config) {
+                               for (queuename = ast_category_browse(queue_config, NULL); !ast_strlen_zero(queuename); queuename = ast_category_browse(queue_config, queuename)) {
+                                       if ((q = find_load_queue_rt_friendly(queuename))) {
+                                               foundqueue++;
+                                               foundinterface += set_member_penalty_help_members(q, interface, penalty);
+                                       }
+                               }
                        }
-                       ast_queue_log(q->name, "NONE", interface, "PENALTY", "%d", penalty);
-                       manager_event(EVENT_FLAG_AGENT, "QueueMemberPenalty",
-                               "Queue: %s\r\n"
-                               "Location: %s\r\n"
-                               "Penalty: %d\r\n",
-                               q->name, mem->interface, penalty);
-                       ao2_ref(mem, -1);
                }
-               ao2_unlock(q);
+
+               /* After hitting realtime queues, go back and get the regular ones. */
+               queue_iter = ao2_iterator_init(queues, 0);
+
+               while ((q = ao2_t_iterator_next(&queue_iter, "Iterate through queues"))) {
+                       foundqueue++;
+                       foundinterface += set_member_penalty_help_members(q, interface, penalty);
+               }
+
+       } else { /* We actually have a queuename, so we can just act on the single queue. */
+               if ((q = find_load_queue_rt_friendly(queuename))) {
+                       foundqueue++;
+                       foundinterface += set_member_penalty_help_members(q, interface, penalty);
+               }
        }
 
        if (foundinterface) {
                return RESULT_SUCCESS;
        } else if (!foundqueue) {
-               ast_log (LOG_ERROR, "Invalid queuename\n"); 
+               ast_log (LOG_ERROR, "Invalid queuename\n");
        } else {
                ast_log (LOG_ERROR, "Invalid interface\n");
        }
@@ -5580,7 +5640,7 @@ static void reload_queue_members(void)
                }
 
                if (!cur_queue) {
-                       cur_queue = load_realtime_queue(queue_name);
+                       cur_queue = find_load_queue_rt_friendly(queue_name);
                }
 
                if (!cur_queue) {
@@ -5739,7 +5799,7 @@ static int rqm_exec(struct ast_channel *chan, const char *data)
        AST_STANDARD_APP_ARGS(args, parse);
 
        if (ast_strlen_zero(args.interface)) {
-               args.interface = ast_strdupa(chan->name);
+               args.interface = ast_strdupa(ast_channel_name(chan));
                temppos = strrchr(args.interface, '-');
                if (temppos)
                        *temppos = '\0';
@@ -5811,7 +5871,7 @@ static int aqm_exec(struct ast_channel *chan, const char *data)
        AST_STANDARD_APP_ARGS(args, parse);
 
        if (ast_strlen_zero(args.interface)) {
-               args.interface = ast_strdupa(chan->name);
+               args.interface = ast_strdupa(ast_channel_name(chan));
                temppos = strrchr(args.interface, '-');
                if (temppos)
                        *temppos = '\0';
@@ -5982,10 +6042,10 @@ static int queue_exec(struct ast_channel *chan, const char *data)
        user_priority = pbx_builtin_getvar_helper(chan, "QUEUE_PRIO");
        if (user_priority) {
                if (sscanf(user_priority, "%30d", &prio) == 1) {
-                       ast_debug(1, "%s: Got priority %d from ${QUEUE_PRIO}.\n", chan->name, prio);
+                       ast_debug(1, "%s: Got priority %d from ${QUEUE_PRIO}.\n", ast_channel_name(chan), prio);
                } else {
                        ast_log(LOG_WARNING, "${QUEUE_PRIO}: Invalid value (%s), channel %s.\n",
-                               user_priority, chan->name);
+                               user_priority, ast_channel_name(chan));
                        prio = 0;
                }
        } else {
@@ -5997,10 +6057,10 @@ static int queue_exec(struct ast_channel *chan, const char *data)
 
        if ((max_penalty_str = pbx_builtin_getvar_helper(chan, "QUEUE_MAX_PENALTY"))) {
                if (sscanf(max_penalty_str, "%30d", &max_penalty) == 1) {
-                       ast_debug(1, "%s: Got max penalty %d from ${QUEUE_MAX_PENALTY}.\n", chan->name, max_penalty);
+                       ast_debug(1, "%s: Got max penalty %d from ${QUEUE_MAX_PENALTY}.\n", ast_channel_name(chan), max_penalty);
                } else {
                        ast_log(LOG_WARNING, "${QUEUE_MAX_PENALTY}: Invalid value (%s), channel %s.\n",
-                               max_penalty_str, chan->name);
+                               max_penalty_str, ast_channel_name(chan));
                        max_penalty = 0;
                }
        } else {
@@ -6009,10 +6069,10 @@ static int queue_exec(struct ast_channel *chan, const char *data)
 
        if ((min_penalty_str = pbx_builtin_getvar_helper(chan, "QUEUE_MIN_PENALTY"))) {
                if (sscanf(min_penalty_str, "%30d", &min_penalty) == 1) {
-                       ast_debug(1, "%s: Got min penalty %d from ${QUEUE_MIN_PENALTY}.\n", chan->name, min_penalty);
+                       ast_debug(1, "%s: Got min penalty %d from ${QUEUE_MIN_PENALTY}.\n", ast_channel_name(chan), min_penalty);
                } else {
                        ast_log(LOG_WARNING, "${QUEUE_MIN_PENALTY}: Invalid value (%s), channel %s.\n",
-                               min_penalty_str, chan->name);
+                               min_penalty_str, ast_channel_name(chan));
                        min_penalty = 0;
                }
        } else {
@@ -6168,7 +6228,7 @@ check_turns:
                 * of the queue, go and check for our turn again.
                 */
                if (!is_our_turn(&qe)) {
-                       ast_debug(1, "Darn priorities, going back in queue (%s)!\n", qe.chan->name);
+                       ast_debug(1, "Darn priorities, going back in queue (%s)!\n", ast_channel_name(qe.chan));
                        goto check_turns;
                }
        }
@@ -6281,7 +6341,7 @@ static int queue_function_exists(struct ast_channel *chan, const char *cmd, char
                ast_log(LOG_ERROR, "%s requires an argument: queuename\n", cmd);
                return -1;
        }
-       q = load_realtime_queue(data);
+       q = find_load_queue_rt_friendly(data);
        snprintf(buf, len, "%d", q != NULL? 1 : 0);
        if (q) {
                queue_t_unref(q, "Done with temporary reference in QUEUE_EXISTS()");
@@ -6312,13 +6372,18 @@ static int queue_function_mem_read(struct ast_channel *chan, const char *cmd, ch
        buf[0] = '\0';
 
        if (ast_strlen_zero(data)) {
-               ast_log(LOG_ERROR, "%s requires an argument: queuename\n", cmd);
+               ast_log(LOG_ERROR, "Missing required argument. %s(<queuename>,<option>[<interface>])\n", cmd);
                return -1;
        }
 
        AST_STANDARD_APP_ARGS(args, data);
 
-       if ((q = load_realtime_queue(args.queuename))) {
+       if (args.argc < 2) {
+               ast_log(LOG_ERROR, "Missing required argument. %s(<queuename>,<option>[<interface>])\n", cmd);
+               return -1;
+       }
+
+       if ((q = find_load_queue_rt_friendly(args.queuename))) {
                ao2_lock(q);
                if (!strcasecmp(args.option, "logged")) {
                        mem_iter = ao2_iterator_init(q->members, 0);
@@ -6367,6 +6432,9 @@ static int queue_function_mem_read(struct ast_channel *chan, const char *cmd, ch
                           ((m = interface_exists(q, args.interface)))) {
                        count = m->ignorebusy;
                        ao2_ref(m, -1);
+               } else {
+                       ast_log(LOG_ERROR, "Unknown option %s provided to %s, valid values are: "
+                               "logged, free, ready, count, penalty, paused, ignorebusy\n", args.option, cmd);
                }
                ao2_unlock(q);
                queue_t_unref(q, "Done with temporary reference in QUEUE_MEMBER()");
@@ -6418,7 +6486,7 @@ static int queue_function_mem_write(struct ast_channel *chan, const char *cmd, c
                        ast_log(LOG_ERROR, "Invalid interface, queue or penalty\n");
                        return -1;
                }
-       } else if ((q = load_realtime_queue(args.queuename))) {
+       } else if ((q = find_load_queue_rt_friendly(args.queuename))) {
                ao2_lock(q);
                if ((m = interface_exists(q, args.interface))) {
                        sprintf(rtvalue, "%s",(memvalue <= 0) ? "0" : "1");
@@ -6480,7 +6548,7 @@ static int queue_function_qac_dep(struct ast_channel *chan, const char *cmd, cha
                return -1;
        }
        
-       if ((q = load_realtime_queue(data))) {
+       if ((q = find_load_queue_rt_friendly(data))) {
                ao2_lock(q);
                mem_iter = ao2_iterator_init(q->members, 0);
                while ((m = ao2_iterator_next(&mem_iter))) {
@@ -7151,7 +7219,7 @@ static char *__queues_show(struct mansession *s, int fd, int argc, const char *
        }
 
        if (argc == 3)  { /* specific queue */
-               if ((q = load_realtime_queue(argv[2]))) {
+               if ((q = find_load_queue_rt_friendly(argv[2]))) {
                        queue_t_unref(q, "Done with temporary pointer");
                }
        } else if (ast_check_realtime("queues")) {
@@ -7162,7 +7230,7 @@ static char *__queues_show(struct mansession *s, int fd, int argc, const char *
                char *queuename;
                if (cfg) {
                        for (queuename = ast_category_browse(cfg, NULL); !ast_strlen_zero(queuename); queuename = ast_category_browse(cfg, queuename)) {
-                               if ((q = load_realtime_queue(queuename))) {
+                               if ((q = find_load_queue_rt_friendly(queuename))) {
                                        queue_t_unref(q, "Done with temporary pointer");
                                }
                        }
@@ -7182,7 +7250,7 @@ static char *__queues_show(struct mansession *s, int fd, int argc, const char *
                 * been deleted from the in-core container
                 */
                if (q->realtime) {
-                       realtime_queue = load_realtime_queue(q->name);
+                       realtime_queue = find_load_queue_rt_friendly(q->name);
                        if (!realtime_queue) {
                                ao2_unlock(q);
                                queue_t_unref(q, "Done with iterator");
@@ -7254,7 +7322,7 @@ static char *__queues_show(struct mansession *s, int fd, int argc, const char *
                        do_print(s, fd, "   Callers: ");
                        for (qe = q->head; qe; qe = qe->next) {
                                ast_str_set(&out, 0, "      %d. %s (wait: %ld:%2.2ld, prio: %d)",
-                                       pos++, qe->chan->name, (long) (now - qe->start) / 60,
+                                       pos++, ast_channel_name(qe->chan), (long) (now - qe->start) / 60,
                                        (long) (now - qe->start) % 60, qe->prio);
                                do_print(s, fd, ast_str_buffer(out));
                        }
@@ -7525,7 +7593,7 @@ static int manager_queues_status(struct mansession *s, const struct message *m)
                                        "Wait: %ld\r\n"
                                        "%s"
                                        "\r\n",
-                                       q->name, pos++, qe->chan->name, qe->chan->uniqueid,
+                                       q->name, pos++, ast_channel_name(qe->chan), qe->chan->uniqueid,
                                        S_COR(qe->chan->caller.id.number.valid, qe->chan->caller.id.number.str, "unknown"),
                                        S_COR(qe->chan->caller.id.name.valid, qe->chan->caller.id.name.str, "unknown"),
                                        S_COR(qe->chan->connected.id.number.valid, qe->chan->connected.id.number.str, "unknown"),
@@ -7581,9 +7649,9 @@ static int manager_add_queue_member(struct mansession *s, const struct message *
        switch (add_to_queue(queuename, interface, membername, penalty, paused, queue_persistent_members, state_interface)) {
        case RES_OKAY:
                if (ast_strlen_zero(membername) || !log_membername_as_agent) {
-                       ast_queue_log(queuename, "MANAGER", interface, "ADDMEMBER", "%s", "");
+                       ast_queue_log(queuename, "MANAGER", interface, "ADDMEMBER", "%s", paused ? "PAUSED" : "");
                } else {
-                       ast_queue_log(queuename, "MANAGER", membername, "ADDMEMBER", "%s", "");
+                       ast_queue_log(queuename, "MANAGER", membername, "ADDMEMBER", "%s", paused ? "PAUSED" : "");
                }
                astman_send_ack(s, m, "Added interface to queue");
                break;
@@ -8512,7 +8580,7 @@ static int queues_data_provider_get(const struct ast_data_search *search,
                for (queuename = ast_category_browse(cfg, NULL);
                                !ast_strlen_zero(queuename);
                                queuename = ast_category_browse(cfg, queuename)) {
-                       if ((queue = load_realtime_queue(queuename))) {
+                       if ((queue = find_load_queue_rt_friendly(queuename))) {
                                queue_unref(queue);
                        }
                }
@@ -8524,7 +8592,7 @@ static int queues_data_provider_get(const struct ast_data_search *search,
        while ((queue = ao2_iterator_next(&i))) {
                ao2_lock(queue);
                if (queue->realtime) {
-                       queue_realtime = load_realtime_queue(queue->name);
+                       queue_realtime = find_load_queue_rt_friendly(queue->name);
                        if (!queue_realtime) {
                                ao2_unlock(queue);
                                queue_unref(queue);
@@ -8688,7 +8756,7 @@ static struct member *find_member_by_queuename_and_interface(const char *queuena
        struct member *mem = NULL;
        struct call_queue *q;
 
-       if ((q = load_realtime_queue(queuename))) {
+       if ((q = find_load_queue_rt_friendly(queuename))) {
                ao2_lock(q);
                mem = ao2_find(q->members, interface, OBJ_KEY);
                ao2_unlock(q);