diff options
author | Mark Spencer <markster@digium.com> | 2003-07-01 04:08:25 +0000 |
---|---|---|
committer | Mark Spencer <markster@digium.com> | 2003-07-01 04:08:25 +0000 |
commit | 65ed20b4f47d177d4999d1b8f4908fa7dfb64fe0 (patch) | |
tree | e3369be843a0ad42fa0f17a3f945afcc51b7d603 | |
parent | cbe865df7a4aba9df5e5bb3b3568fb64ede27013 (diff) |
Add agent groupings, fix the "incorrect" message on first login attempt
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1144 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rwxr-xr-x | channels/chan_agent.c | 20 | ||||
-rwxr-xr-x | config.c | 2 |
2 files changed, 19 insertions, 3 deletions
diff --git a/channels/chan_agent.c b/channels/chan_agent.c index a79814777..d2165445a 100755 --- a/channels/chan_agent.c +++ b/channels/chan_agent.c @@ -33,6 +33,7 @@ #include <asterisk/app.h> #include <asterisk/musiconhold.h> #include <asterisk/manager.h> +#include <asterisk/parking.h> #include <sys/socket.h> #include <errno.h> #include <unistd.h> @@ -66,6 +67,8 @@ static char moh[80] = "default"; static int capability = -1; +static unsigned int group; + static int usecnt =0; static pthread_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER; @@ -75,6 +78,7 @@ static pthread_mutex_t agentlock = AST_MUTEX_INITIALIZER; static struct agent_pvt { pthread_mutex_t lock; /* Channel private lock */ int dead; /* Poised for destruction? */ + unsigned int group; /* Group memberships */ char moh[80]; /* Which music on hold */ char agent[AST_MAX_AGENT]; /* Agent ID */ char password[AST_MAX_AGENT]; /* Password for Agent login */ @@ -128,6 +132,7 @@ static int add_agent(struct ast_variable *var) ast_pthread_mutex_init( &p->app_lock ); p->owning_app = -1; p->app_sleep_cond = 1; + p->group = group; p->next = agents; agents = p; @@ -384,6 +389,7 @@ static int read_agent_config(void) struct ast_config *cfg; struct ast_variable *v; struct agent_pvt *p, *pl, *pn; + group = 0; cfg = ast_load(config); if (!cfg) { ast_log(LOG_NOTICE, "No agent configuration found -- agent support disabled\n"); @@ -401,6 +407,8 @@ static int read_agent_config(void) /* Create the interface list */ if (!strcasecmp(v->name, "agent")) { add_agent(v); + } else if (!strcasecmp(v->name, "group")) { + group = ast_get_group(v->value); } else if (!strcasecmp(v->name, "musiconhold")) { strncpy(moh, v->value, sizeof(moh) - 1); } @@ -438,10 +446,18 @@ static struct ast_channel *agent_request(char *type, int format, void *data) { struct agent_pvt *p; struct ast_channel *chan = NULL; + char *s; + unsigned int groupmatch; + s = data; + if ((s[0] == '@') && (sscanf(s + 1, "%d", &groupmatch) == 1)) { + groupmatch = (1 << groupmatch); + } else { + groupmatch = 0; + } ast_pthread_mutex_lock(&agentlock); p = agents; while(p) { - if (!strcmp(data, p->agent)) { + if ((groupmatch && (p->group & groupmatch)) || !strcmp(data, p->agent)) { ast_pthread_mutex_lock(&p->lock); /* Agent must be registered, but not have any active call */ if (!p->owner && p->chan) { @@ -535,7 +551,7 @@ static int login_exec(struct ast_channel *chan, void *data) if (chan->_state != AST_STATE_UP) res = ast_answer(chan); if (!res) { - if( opt_user ) + if( opt_user && strlen(opt_user)) strncpy( user, opt_user, AST_MAX_AGENT ); else res = ast_app_getdata(chan, "agent-user", user, sizeof(user) - 1, 0); @@ -743,7 +743,7 @@ static struct ast_config *__ast_load(char *configfile, struct ast_config *tmp, s if (option_debug) ast_log(LOG_DEBUG, "No file to parse: %s\n", fn); else if (option_verbose > 1) - ast_verbose( "Not found (%s)", strerror(errno)); + ast_verbose( "Not found (%s)\n", strerror(errno)); } #ifdef PRESERVE_COMMENTS if (master) { |