aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2007-02-20 22:39:14 +0000
committerfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2007-02-20 22:39:14 +0000
commit1d1a115108d8ae01a7b4f843b2631e479bb52fca (patch)
tree6cec7ad4d9e602398cd0291ea7d455318432c570 /channels
parent5b1b39c012f6c3cea0b88085c0a96cf2ffcda70e (diff)
Defer clearing callback information if channels are up until they are hung up. This ensures the hangup process goes smoothly and no channels get hung in limbo. (issue #8088 reported by kebl0155)
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2@55669 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_agent.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/channels/chan_agent.c b/channels/chan_agent.c
index f1c2de9ae..964413281 100644
--- a/channels/chan_agent.c
+++ b/channels/chan_agent.c
@@ -790,6 +790,9 @@ static int agent_hangup(struct ast_channel *ast)
p->logincallerid[0] = '\0';
if (persistent_agents)
dump_agents();
+ } else if (!p->loginstart) {
+ p->loginchan[0] = '\0';
+ p->logincallerid[0] = '\0';
}
} else if (p->dead) {
ast_mutex_lock(&p->chan->lock);
@@ -1473,14 +1476,17 @@ static int agent_logoff(char *agent, int soft)
struct agent_pvt *p;
long logintime;
int ret = -1; /* Return -1 if no agent if found */
+ int defer = 0;
for (p=agents; p; p=p->next) {
if (!strcasecmp(p->agent, agent)) {
if (!soft) {
if (p->owner) {
+ defer = 1;
ast_softhangup(p->owner, AST_SOFTHANGUP_EXPLICIT);
}
if (p->chan) {
+ defer = 1;
ast_softhangup(p->chan, AST_SOFTHANGUP_EXPLICIT);
}
}
@@ -1495,8 +1501,10 @@ static int agent_logoff(char *agent, int soft)
p->agent, p->loginchan, logintime);
ast_queue_log("NONE", "NONE", agent, "AGENTCALLBACKLOGOFF", "%s|%ld|%s", p->loginchan, logintime, "CommandLogoff");
set_agentbycallerid(p->logincallerid, NULL);
- p->loginchan[0] = '\0';
- p->logincallerid[0] = '\0';
+ if (!defer) {
+ p->loginchan[0] = '\0';
+ p->logincallerid[0] = '\0';
+ }
ast_device_state_changed("Agent/%s", p->agent);
if (persistent_agents)
dump_agents();