|
|
|
|
@ -29,12 +29,12 @@ static char *app_group_count = "GetGroupCount";
|
|
|
|
|
static char *app_group_set = "SetGroup";
|
|
|
|
|
static char *app_group_check = "CheckGroup";
|
|
|
|
|
|
|
|
|
|
static char *group_count_synopsis = "GetGroupCount([groupname])";
|
|
|
|
|
static char *group_set_synopsis = "SetGroup([groupname])";
|
|
|
|
|
static char *group_check_synopsis = "CheckGroup(max)";
|
|
|
|
|
static char *group_count_synopsis = "GetGroupCount([groupname][@category])";
|
|
|
|
|
static char *group_set_synopsis = "SetGroup(groupname[@category])";
|
|
|
|
|
static char *group_check_synopsis = "CheckGroup(max[@category])";
|
|
|
|
|
|
|
|
|
|
static char *group_count_descrip =
|
|
|
|
|
"GetGroupCount([group])\n"
|
|
|
|
|
"GetGroupCount([group][@category])\n"
|
|
|
|
|
" Calculates the group count for the specified group, or uses\n"
|
|
|
|
|
"the current channel's group if not specifed (and non-empty).\n"
|
|
|
|
|
"Stores result in GROUPCOUNT. Always returns 0.\n";
|
|
|
|
|
@ -56,7 +56,9 @@ STANDARD_LOCAL_USER;
|
|
|
|
|
|
|
|
|
|
LOCAL_USER_DECL;
|
|
|
|
|
|
|
|
|
|
static int group_get_count(char *group)
|
|
|
|
|
#define DEFAULT_CATEGORY "GROUP"
|
|
|
|
|
|
|
|
|
|
static int group_get_count(char *group, char *category)
|
|
|
|
|
{
|
|
|
|
|
struct ast_channel *chan;
|
|
|
|
|
int count = 0;
|
|
|
|
|
@ -64,7 +66,7 @@ static int group_get_count(char *group)
|
|
|
|
|
if (group && !ast_strlen_zero(group)) {
|
|
|
|
|
chan = ast_channel_walk_locked(NULL);
|
|
|
|
|
while(chan) {
|
|
|
|
|
test = pbx_builtin_getvar_helper(chan, "GROUP");
|
|
|
|
|
test = pbx_builtin_getvar_helper(chan, category);
|
|
|
|
|
if (test && !strcasecmp(test, group))
|
|
|
|
|
count++;
|
|
|
|
|
ast_mutex_unlock(&chan->lock);
|
|
|
|
|
@ -80,17 +82,31 @@ static int group_count_exec(struct ast_channel *chan, void *data)
|
|
|
|
|
int count;
|
|
|
|
|
struct localuser *u;
|
|
|
|
|
char *group=NULL;
|
|
|
|
|
char ret[80];
|
|
|
|
|
char *cat = NULL;
|
|
|
|
|
char ret[80]="";
|
|
|
|
|
char tmp[256]="";
|
|
|
|
|
|
|
|
|
|
LOCAL_USER_ADD(u);
|
|
|
|
|
|
|
|
|
|
/* Check and parse arguments */
|
|
|
|
|
if (data && !ast_strlen_zero(data)) {
|
|
|
|
|
group = (char *)data;
|
|
|
|
|
} else {
|
|
|
|
|
group = pbx_builtin_getvar_helper(chan, "GROUP");
|
|
|
|
|
strncpy(tmp, data, sizeof(tmp) - 1);
|
|
|
|
|
group = tmp;
|
|
|
|
|
cat = strchr(tmp, '@');
|
|
|
|
|
if (cat) {
|
|
|
|
|
*cat = '\0';
|
|
|
|
|
cat++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (cat)
|
|
|
|
|
snprintf(ret, sizeof(ret), "GROUP_%s", cat);
|
|
|
|
|
else
|
|
|
|
|
strncpy(ret, DEFAULT_CATEGORY, sizeof(ret) - 1);
|
|
|
|
|
|
|
|
|
|
if (!group || ast_strlen_zero(group)) {
|
|
|
|
|
group = pbx_builtin_getvar_helper(chan, ret);
|
|
|
|
|
}
|
|
|
|
|
count = group_get_count(group);
|
|
|
|
|
count = group_get_count(group, ret);
|
|
|
|
|
snprintf(ret, sizeof(ret), "%d", count);
|
|
|
|
|
pbx_builtin_setvar_helper(chan, "GROUPCOUNT", ret);
|
|
|
|
|
LOCAL_USER_REMOVE(u);
|
|
|
|
|
@ -101,13 +117,31 @@ static int group_set_exec(struct ast_channel *chan, void *data)
|
|
|
|
|
{
|
|
|
|
|
int res=0;
|
|
|
|
|
struct localuser *u;
|
|
|
|
|
char ret[80] = "";
|
|
|
|
|
char tmp[256] = "";
|
|
|
|
|
char *cat=NULL, *group=NULL;
|
|
|
|
|
|
|
|
|
|
LOCAL_USER_ADD(u);
|
|
|
|
|
|
|
|
|
|
/* Check and parse arguments */
|
|
|
|
|
if (data && !ast_strlen_zero(data)) {
|
|
|
|
|
pbx_builtin_setvar_helper(chan, "GROUP", (char *)data);
|
|
|
|
|
strncpy(tmp, data, sizeof(tmp) - 1);
|
|
|
|
|
group = tmp;
|
|
|
|
|
cat = strchr(tmp, '@');
|
|
|
|
|
if (cat) {
|
|
|
|
|
*cat = '\0';
|
|
|
|
|
cat++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (cat)
|
|
|
|
|
snprintf(ret, sizeof(ret), "GROUP_%s", cat);
|
|
|
|
|
else
|
|
|
|
|
strncpy(ret, DEFAULT_CATEGORY, sizeof(ret) - 1);
|
|
|
|
|
|
|
|
|
|
if (group && !ast_strlen_zero(group)) {
|
|
|
|
|
pbx_builtin_setvar_helper(chan, ret, group);
|
|
|
|
|
} else
|
|
|
|
|
ast_log(LOG_WARNING, "GroupSet requires an argument (group name)\n");
|
|
|
|
|
ast_log(LOG_WARNING, "SetGroup requires an argument (group name)\n");
|
|
|
|
|
|
|
|
|
|
LOCAL_USER_REMOVE(u);
|
|
|
|
|
return res;
|
|
|
|
|
@ -118,19 +152,37 @@ static int group_check_exec(struct ast_channel *chan, void *data)
|
|
|
|
|
int res=0;
|
|
|
|
|
int max, count;
|
|
|
|
|
struct localuser *u;
|
|
|
|
|
char ret[80] = "";
|
|
|
|
|
char tmp[256] = "";
|
|
|
|
|
char *cat, *group;
|
|
|
|
|
|
|
|
|
|
LOCAL_USER_ADD(u);
|
|
|
|
|
|
|
|
|
|
if (data && (sscanf((char *)data, "%i", &max) == 1) && (max > -1)) {
|
|
|
|
|
count = group_get_count(pbx_builtin_getvar_helper(chan, "GROUP"));
|
|
|
|
|
if (count > max) {
|
|
|
|
|
if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->callerid))
|
|
|
|
|
chan->priority += 100;
|
|
|
|
|
else
|
|
|
|
|
res = -1;
|
|
|
|
|
if (data && !ast_strlen_zero(data)) {
|
|
|
|
|
strncpy(tmp, data, sizeof(tmp) - 1);
|
|
|
|
|
group = tmp;
|
|
|
|
|
cat = strchr(tmp, '@');
|
|
|
|
|
if (cat) {
|
|
|
|
|
*cat = '\0';
|
|
|
|
|
cat++;
|
|
|
|
|
}
|
|
|
|
|
if ((sscanf((char *)tmp, "%i", &max) == 1) && (max > -1)) {
|
|
|
|
|
if (cat)
|
|
|
|
|
snprintf(ret, sizeof(ret), "GROUP_%s", cat);
|
|
|
|
|
else
|
|
|
|
|
strncpy(ret, DEFAULT_CATEGORY, sizeof(ret) - 1);
|
|
|
|
|
|
|
|
|
|
count = group_get_count(pbx_builtin_getvar_helper(chan, ret), ret);
|
|
|
|
|
if (count > max) {
|
|
|
|
|
if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->callerid))
|
|
|
|
|
chan->priority += 100;
|
|
|
|
|
else
|
|
|
|
|
res = -1;
|
|
|
|
|
}
|
|
|
|
|
} else
|
|
|
|
|
ast_log(LOG_WARNING, "CheckGroup requires a positive integer argument (max)\n");
|
|
|
|
|
} else
|
|
|
|
|
ast_log(LOG_WARNING, "GroupCheck requires a positive integer argument (max)\n");
|
|
|
|
|
ast_log(LOG_WARNING, "CheckGroup requires an argument(max)\n");
|
|
|
|
|
LOCAL_USER_REMOVE(u);
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|