예제 #1
0
static struct cw_channel *my_cw_get_channel_by_name_locked(char *channame) {
	struct cw_channel *chan;
	chan = cw_channel_walk_locked(NULL);
	while(chan) {
		if (!strncasecmp(chan->name, channame, strlen(channame)))
			return chan;
		cw_mutex_unlock(&chan->lock);
		chan = cw_channel_walk_locked(chan);
	}
	return NULL;
}
예제 #2
0
static int softhangup_exec(struct cw_channel *chan, int argc, char **argv)
{
	struct localuser *u;
	struct cw_channel *c=NULL;
	char *cut;
	char name[CW_CHANNEL_NAME] = "";
	int all = 0;
	
	if (argc == 0) {
		if (chan){
			cw_log(LOG_WARNING, "Soft hanging %s up.\n",chan->name);
			cw_softhangup(chan, CW_SOFTHANGUP_EXPLICIT);
			/* To allow other possible threads finish their work */
			/*usleep(50000);*/
		}
		return 0;
	}
	
	LOCAL_USER_ADD(u);

	all = (argc > 1 && strchr(argv[1], 'a'));

	c = cw_channel_walk_locked(NULL);
	while (c) {
		strncpy(name, c->name, sizeof(name)-1);
		if (all) {
			/* CAPI is set up like CAPI[foo/bar]/clcnt */ 
			if (!strcmp(c->type,"CAPI")) 
				cut = strrchr(name,'/');
			/* Basically everything else is Foo/Bar-Z */
			else
				cut = strchr(name,'-');
			/* Get rid of what we've cut */
			if (cut)
				*cut = 0;
		}
		cw_mutex_unlock(&c->lock);
		if (!strcasecmp(name, argv[0])) {
			cw_log(LOG_WARNING, "Soft hanging %s up.\n",c->name);
			cw_softhangup(c, CW_SOFTHANGUP_EXPLICIT);
			if(!all)
				break;
		}
		c = cw_channel_walk_locked(c);
	}
	
	LOCAL_USER_REMOVE(u);

	return 0;
}
예제 #3
0
int cw_app_group_match_get_count(char *groupmatch, char *category)
{
	regex_t regexbuf;
	struct cw_channel *chan;
	int count = 0;
	char *test;
	char cat[80];
	char *s;

	if (cw_strlen_zero(groupmatch))
		return 0;

	/* if regex compilation fails, return zero matches */
	if (regcomp(&regexbuf, groupmatch, REG_EXTENDED | REG_NOSUB))
		return 0;

	s = (!cw_strlen_zero(category)) ? category : GROUP_CATEGORY_PREFIX;
	cw_copy_string(cat, s, sizeof(cat));

	chan = NULL;
	while ((chan = cw_channel_walk_locked(chan)) != NULL) {
		test = pbx_builtin_getvar_helper(chan, cat);
		if (test && !regexec(&regexbuf, test, 0, NULL, 0))
			count++;
		cw_mutex_unlock(&chan->lock);
	}

	regfree(&regexbuf);

	return count;
}
예제 #4
0
static char *complete_ch_helper(char *line, char *word, int pos, int state)
{
    struct cw_channel *c;
    int which=0;
    char *ret;

    c = cw_channel_walk_locked(NULL);
    while(c) {
        if (!strncasecmp(word, c->name, strlen(word))) {
            if (++which > state)
                break;
        }
        cw_mutex_unlock(&c->lock);
        c = cw_channel_walk_locked(c);
    }
    if (c) {
        ret = strdup(c->name);
        cw_mutex_unlock(&c->lock);
    } else
        ret = NULL;
    return ret;
}
예제 #5
0
int cw_app_group_get_count(char *group, char *category)
{
	struct cw_channel *chan;
	int count = 0;
	char *test;
	char cat[80];
	char *s;

	if (cw_strlen_zero(group))
		return 0;

 	s = (!cw_strlen_zero(category)) ? category : GROUP_CATEGORY_PREFIX;
	cw_copy_string(cat, s, sizeof(cat));

	chan = NULL;
	while ((chan = cw_channel_walk_locked(chan)) != NULL) {
 		test = pbx_builtin_getvar_helper(chan, cat);
		if (test && !strcasecmp(test, group))
 			count++;
		cw_mutex_unlock(&chan->lock);
	}

	return count;
}