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; }
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; }
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(®exbuf, 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(®exbuf, test, 0, NULL, 0)) count++; cw_mutex_unlock(&chan->lock); } regfree(®exbuf); return count; }
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; }
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; }