diff options
author | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-02-20 22:39:14 +0000 |
---|---|---|
committer | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-02-20 22:39:14 +0000 |
commit | 1d1a115108d8ae01a7b4f843b2631e479bb52fca (patch) | |
tree | 6cec7ad4d9e602398cd0291ea7d455318432c570 /channels/chan_agent.c | |
parent | 5b1b39c012f6c3cea0b88085c0a96cf2ffcda70e (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/chan_agent.c')
-rw-r--r-- | channels/chan_agent.c | 12 |
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(); |