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
This commit is contained in:
parent
cbe865df7a
commit
65ed20b4f4
|
@ -33,6 +33,7 @@
|
||||||
#include <asterisk/app.h>
|
#include <asterisk/app.h>
|
||||||
#include <asterisk/musiconhold.h>
|
#include <asterisk/musiconhold.h>
|
||||||
#include <asterisk/manager.h>
|
#include <asterisk/manager.h>
|
||||||
|
#include <asterisk/parking.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -66,6 +67,8 @@ static char moh[80] = "default";
|
||||||
|
|
||||||
static int capability = -1;
|
static int capability = -1;
|
||||||
|
|
||||||
|
static unsigned int group;
|
||||||
|
|
||||||
static int usecnt =0;
|
static int usecnt =0;
|
||||||
static pthread_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
|
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 {
|
static struct agent_pvt {
|
||||||
pthread_mutex_t lock; /* Channel private lock */
|
pthread_mutex_t lock; /* Channel private lock */
|
||||||
int dead; /* Poised for destruction? */
|
int dead; /* Poised for destruction? */
|
||||||
|
unsigned int group; /* Group memberships */
|
||||||
char moh[80]; /* Which music on hold */
|
char moh[80]; /* Which music on hold */
|
||||||
char agent[AST_MAX_AGENT]; /* Agent ID */
|
char agent[AST_MAX_AGENT]; /* Agent ID */
|
||||||
char password[AST_MAX_AGENT]; /* Password for Agent login */
|
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 );
|
ast_pthread_mutex_init( &p->app_lock );
|
||||||
p->owning_app = -1;
|
p->owning_app = -1;
|
||||||
p->app_sleep_cond = 1;
|
p->app_sleep_cond = 1;
|
||||||
|
p->group = group;
|
||||||
p->next = agents;
|
p->next = agents;
|
||||||
agents = p;
|
agents = p;
|
||||||
|
|
||||||
|
@ -384,6 +389,7 @@ static int read_agent_config(void)
|
||||||
struct ast_config *cfg;
|
struct ast_config *cfg;
|
||||||
struct ast_variable *v;
|
struct ast_variable *v;
|
||||||
struct agent_pvt *p, *pl, *pn;
|
struct agent_pvt *p, *pl, *pn;
|
||||||
|
group = 0;
|
||||||
cfg = ast_load(config);
|
cfg = ast_load(config);
|
||||||
if (!cfg) {
|
if (!cfg) {
|
||||||
ast_log(LOG_NOTICE, "No agent configuration found -- agent support disabled\n");
|
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 */
|
/* Create the interface list */
|
||||||
if (!strcasecmp(v->name, "agent")) {
|
if (!strcasecmp(v->name, "agent")) {
|
||||||
add_agent(v);
|
add_agent(v);
|
||||||
|
} else if (!strcasecmp(v->name, "group")) {
|
||||||
|
group = ast_get_group(v->value);
|
||||||
} else if (!strcasecmp(v->name, "musiconhold")) {
|
} else if (!strcasecmp(v->name, "musiconhold")) {
|
||||||
strncpy(moh, v->value, sizeof(moh) - 1);
|
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 agent_pvt *p;
|
||||||
struct ast_channel *chan = NULL;
|
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);
|
ast_pthread_mutex_lock(&agentlock);
|
||||||
p = agents;
|
p = agents;
|
||||||
while(p) {
|
while(p) {
|
||||||
if (!strcmp(data, p->agent)) {
|
if ((groupmatch && (p->group & groupmatch)) || !strcmp(data, p->agent)) {
|
||||||
ast_pthread_mutex_lock(&p->lock);
|
ast_pthread_mutex_lock(&p->lock);
|
||||||
/* Agent must be registered, but not have any active call */
|
/* Agent must be registered, but not have any active call */
|
||||||
if (!p->owner && p->chan) {
|
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)
|
if (chan->_state != AST_STATE_UP)
|
||||||
res = ast_answer(chan);
|
res = ast_answer(chan);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
if( opt_user )
|
if( opt_user && strlen(opt_user))
|
||||||
strncpy( user, opt_user, AST_MAX_AGENT );
|
strncpy( user, opt_user, AST_MAX_AGENT );
|
||||||
else
|
else
|
||||||
res = ast_app_getdata(chan, "agent-user", user, sizeof(user) - 1, 0);
|
res = ast_app_getdata(chan, "agent-user", user, sizeof(user) - 1, 0);
|
||||||
|
|
2
config.c
2
config.c
|
@ -743,7 +743,7 @@ static struct ast_config *__ast_load(char *configfile, struct ast_config *tmp, s
|
||||||
if (option_debug)
|
if (option_debug)
|
||||||
ast_log(LOG_DEBUG, "No file to parse: %s\n", fn);
|
ast_log(LOG_DEBUG, "No file to parse: %s\n", fn);
|
||||||
else if (option_verbose > 1)
|
else if (option_verbose > 1)
|
||||||
ast_verbose( "Not found (%s)", strerror(errno));
|
ast_verbose( "Not found (%s)\n", strerror(errno));
|
||||||
}
|
}
|
||||||
#ifdef PRESERVE_COMMENTS
|
#ifdef PRESERVE_COMMENTS
|
||||||
if (master) {
|
if (master) {
|
||||||
|
|
Loading…
Reference in New Issue