aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--channels/chan_agent.c36
-rw-r--r--channels/chan_sip.c5
-rw-r--r--configs/agents.conf.sample4
3 files changed, 41 insertions, 4 deletions
diff --git a/channels/chan_agent.c b/channels/chan_agent.c
index 39fe4546c..8f3f1b9da 100644
--- a/channels/chan_agent.c
+++ b/channels/chan_agent.c
@@ -157,6 +157,7 @@ static ast_group_t group;
static int autologoff;
static int wrapuptime;
static int ackcall;
+static int multiplelogin = 1;
static int maxlogintries = 3;
static char agentgoodbye[AST_MAX_FILENAME_LEN] = "vm-goodbye";
@@ -1044,6 +1045,8 @@ static int read_agent_config(void)
/* Read in [general] section for persistance */
if ((general_val = ast_variable_retrieve(cfg, "general", "persistentagents")))
persistent_agents = ast_true(general_val);
+ if (ast_false(ast_variable_retrieve(cfg, "general", "multiplelogin") ) )
+ multiplelogin=0;
/* Read in the [agents] section */
v = ast_variable_browse(cfg, "agents");
@@ -1254,6 +1257,29 @@ static int check_beep(struct agent_pvt *newlyavailable, int needlock)
return res;
}
+/* return 1 if multiple login is fine, 0 if it is not and we find a match, -1 if multiplelogin is not allowed and we dont find a match. */
+static int allow_multiple_login(char *chan,char *context)
+{
+ struct agent_pvt *p;
+ char loginchan[80];
+ if(multiplelogin)
+ return 1;
+ if(!chan)
+ return 0;
+ if(!context)
+ context="default";
+
+ snprintf(loginchan, sizeof(loginchan), "%s@%s", chan, !ast_strlen_zero(context) ? context : "default");
+
+ p = agents;
+ while(p) {
+ if(!strcasecmp(chan, p->loginchan))
+ return 0;
+ p = p->next;
+ }
+ return -1;
+}
+
/*--- agent_request: Part of the Asterisk PBX interface ---*/
static struct ast_channel *agent_request(const char *type, int format, void *data, int *cause)
{
@@ -1822,9 +1848,15 @@ static int __login_exec(struct ast_channel *chan, void *data, int callbackmode)
res = 0;
} else
res = ast_app_getdata(chan, "agent-newlocation", tmpchan+pos, sizeof(tmpchan) - 2, 0);
- if (ast_strlen_zero(tmpchan) || ast_exists_extension(chan, !ast_strlen_zero(context) ? context : "default", tmpchan,
- 1, NULL))
+ if (ast_strlen_zero(tmpchan) )
break;
+ if(ast_exists_extension(chan, !ast_strlen_zero(context) ? context : "default", tmpchan,1, NULL) ) {
+ if(!allow_multiple_login(tmpchan,context) ) {
+ args.extension = NULL;
+ pos = 0;
+ } else
+ break;
+ }
if (args.extension) {
ast_log(LOG_WARNING, "Extension '%s' is not valid for automatic login of agent '%s'\n", args.extension, p->agent);
args.extension = NULL;
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 95819e5b5..d57c35b8c 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -2680,8 +2680,9 @@ static int sip_indicate(struct ast_channel *ast, int condition)
switch(condition) {
case AST_CONTROL_RINGING:
if (ast->_state == AST_STATE_RING) {
- if (!ast_test_flag(p, SIP_PROGRESS_SENT) ||
- (ast_test_flag(p, SIP_PROG_INBAND) == SIP_PROG_INBAND_NEVER)) {
+ if ((!ast_test_flag(p, SIP_PROGRESS_SENT) ||
+ (ast_test_flag(p, SIP_PROG_INBAND) == SIP_PROG_INBAND_NEVER)) &&
+ ast_test_flag(p, SIP_PROG_INBAND) != SIP_PROG_INBAND_YES) {
/* Send 180 ringing if out-of-band seems reasonable */
transmit_response(p, "180 Ringing", &p->initreq);
ast_set_flag(p, SIP_RINGING);
diff --git a/configs/agents.conf.sample b/configs/agents.conf.sample
index ac14e6dee..a9c4edfea 100644
--- a/configs/agents.conf.sample
+++ b/configs/agents.conf.sample
@@ -10,6 +10,10 @@
;
persistentagents=yes
+;enable or disable a single extension from longing in as multiple
+;agents, defaults to enabled
+;multiplelogin=yes
+
[agents]
;
; Define autologoff times if appropriate. This is how long