50 #include <dahdi/user.h> 642 #define CONFIG_FILE_NAME "meetme.conf" 643 #define SLA_CONFIG_FILE "sla.conf" 644 #define STR_CONCISE "concise" 647 #define DEFAULT_AUDIO_BUFFERS 32 650 #define DATE_FORMAT "%Y-%m-%d %H:%M:%S" 661 #define MEETME_DELAYDETECTTALK 300 662 #define MEETME_DELAYDETECTENDTALK 1000 664 #define AST_FRAME_BITS 32 683 #define CONF_SIZE 320 747 #define CONFFLAG_NO_AUDIO_UNTIL_UP (1ULL << 31) 748 #define CONFFLAG_INTROMSG (1ULL << 32) 749 #define CONFFLAG_INTROUSER_VMREC (1ULL << 33) 751 #define CONFFLAG_KILL_LAST_MAN_STANDING (1ULL << 34) 753 #define CONFFLAG_DONT_DENOISE (1ULL << 35) 802 static const char *
const app =
"MeetMe";
803 static const char *
const app2 =
"MeetMeCount";
804 static const char *
const app3 =
"MeetMeAdmin";
805 static const char *
const app4 =
"MeetMeChannelAdmin";
819 #define MAX_CONFNUM 80 821 #define OPTIONS_LEN 100 824 #define MAX_SETTINGS (MAX_CONFNUM + MAX_PIN + MAX_PIN + 3) 907 struct timeval start_time;
1058 struct timeval last_try;
1066 struct timeval ring_begin;
1080 struct timeval ring_begin;
1144 if (meetme_event_message_router) {
1146 meetme_event_message_router =
NULL;
1170 if (!meetme_event_message_router) {
1184 meetme_leave_type(),
1208 meetme_talking_type(),
1216 meetme_talk_request_type(),
1232 const char *conference_num;
1238 if (!channel_blob) {
1245 if (!message_type) {
1250 if (message_type == meetme_join_type()) {
1251 event =
"MeetmeJoin";
1252 }
else if (message_type == meetme_leave_type()) {
1253 event =
"MeetmeLeave";
1254 }
else if (message_type == meetme_end_type()) {
1255 event =
"MeetmeEnd";
1256 }
else if (message_type == meetme_mute_type()) {
1257 event =
"MeetmeMute";
1258 }
else if (message_type == meetme_talking_type()) {
1259 event =
"MeetmeTalking";
1260 }
else if (message_type == meetme_talk_request_type()) {
1261 event =
"MeetmeTalkRequest";
1273 if (!conference_num) {
1290 if (!user_prop_str) {
1294 ast_str_set(&user_prop_str, 0,
"%d", user_number);
1327 "status", on ?
"on" :
"off");
1350 "Meetme", meetme_conference->
confno);
1362 long duration = (long)(now.tv_sec - user->
jointime);
1364 struct ast_json *json_user_duration;
1373 if (!json_user_duration
1403 return "(unmonitored)";
1405 return "(not talking)";
1415 x = DAHDI_IOMUX_WRITE | DAHDI_IOMUX_SIGEVENT;
1416 res = ioctl(fd, DAHDI_IOMUX, &x);
1420 res = write(fd, data, len);
1422 if (
errno != EAGAIN) {
1442 gain_adjust = gain_map[volume + 5];
1454 gain_adjust = gain_map[volume + 5];
1520 signed char zero_volume = 0;
1528 unsigned char *data;
1533 "Conference: %s\r\n" 1547 len =
sizeof(
enter);
1551 len =
sizeof(
leave);
1572 if (user->
user_no == *user_no) {
1584 if (user->
user_no > *max_no) {
1611 struct dahdi_confinfo dahdic = { 0, };
1618 if (!strcmp(confno, cnf->
confno))
1622 if (cnf || (!make && !dynamic) || !cap_slin)
1651 dahdic.confmode = DAHDI_CONF_CONFANN | DAHDI_CONF_CONFANNMON;
1652 cnf->
fd = open(
"/dev/dahdi/pseudo", O_RDWR);
1653 if (cnf->
fd < 0 || ioctl(cnf->
fd, DAHDI_SETCONF, &dahdic)) {
1683 dahdic.confmode = DAHDI_CONF_CONFANN | DAHDI_CONF_CONFANNMON;
1712 if ((sscanf(cnf->
confno,
"%30d", &confno_int) == 1) && (confno_int >= 0 && confno_int < 1024))
1713 conf_map[confno_int] = 1;
1730 int len = strlen(word);
1734 if (!strncmp(word, cnf->
confno, len) && ++which > state) {
1751 int len = strlen(word);
1755 snprintf(usrno,
sizeof(usrno),
"%d", usr->
user_no);
1756 if (!strncmp(word, usrno, len) && ++which > state) {
1772 int len = strlen(word);
1779 if (!strncasecmp(word,
"all", len)) {
1788 strtok_r(myline,
" ", &saved);
1789 strtok_r(
NULL,
" ", &saved);
1790 confno = strtok_r(
NULL,
" ", &saved);
1794 if (!strcmp(confno, cnf->
confno)) {
1829 if (pos == 3 && state == 0) {
1836 strtok_r(myline,
" ", &saved);
1837 strtok_r(
NULL,
" ", &saved);
1838 confno = strtok_r(
NULL,
" ", &saved);
1861 #define MC_HEADER_FORMAT "%-14s %-14s %-10s %-8s %-8s %-6s\n" 1862 #define MC_DATA_FORMAT "%-12.12s %4.4d %4.4s %02d:%02d:%02d %-8s %-6s\n" 1868 "Usage: meetme list [<confno>] [" STR_CONCISE "]\n" 1869 " List all conferences or a specific conference.\n";
1877 int concise = (a->
argc == 3);
1888 ast_cli(a->
fd,
"No active MeetMe conferences.\n");
1898 hr = (now - cnf->
start) / 3600;
1899 min = ((now - cnf->
start) % 3600) / 60;
1900 sec = (now - cnf->
start) % 60;
1911 ast_cli(a->
fd,
"%s!%d!%d!%02d:%02d:%02d!%d!%d\n",
1920 total += cnf->
users;
1924 ast_cli(a->
fd,
"* Total number of MeetMe users: %d\n", total);
1931 int concise = (a->
argc == 4);
1936 ast_cli(a->
fd,
"No active MeetMe conferences.\n");
1957 hr = (now - user->
jointime) / 3600;
1958 min = ((now - user->
jointime) % 3600) / 60;
1961 ast_cli(a->
fd,
"User #: %-2.2d %12.12s %-20.20s Channel: %s %s %s %s %s %s %02d:%02d:%02d\n",
1972 ast_cli(a->
fd,
"%d!%s!%s!%s!%s!%s!%s!%s!%d!%02d:%02d:%02d\n",
2008 if (strcasecmp(a->
argv[1],
"lock") == 0) {
2016 if (strcasecmp(a->
argv[1],
"mute") == 0) {
2018 if (strcasecmp(a->
argv[3],
"all") == 0) {
2025 if (strcasecmp(a->
argv[3],
"all") == 0) {
2031 }
else if (strcasecmp(a->
argv[1],
"kick") == 0) {
2032 if (strcasecmp(a->
argv[3],
"all") == 0) {
2060 e->
command =
"meetme {lock|unlock}";
2062 "Usage: meetme lock|unlock <confno>\n" 2063 " Lock or unlock a conference to new users.\n";
2082 "Usage: meetme kick <confno> all|<userno>\n" 2083 " Kick a conference or a user in a conference.\n";
2100 e->
command =
"meetme {mute|unmute}";
2102 "Usage: meetme mute|unmute <confno> all|<userno>\n" 2103 " Mute or unmute a conference or a user in a conference.\n";
2118 const char *
hold =
"Unknown";
2120 switch (hold_access) {
2140 e->
command =
"sla show trunks";
2142 "Usage: sla show trunks\n" 2143 " This will list all trunks defined in sla.conf\n";
2150 "=============================================================\n" 2151 "=== Configured SLA Trunks ===================================\n" 2152 "=============================================================\n" 2157 char ring_timeout[16] =
"(none)";
2162 snprintf(ring_timeout,
sizeof(ring_timeout),
"%u Seconds", trunk->
ring_timeout);
2165 ast_cli(a->
fd,
"=== ---------------------------------------------------------\n" 2166 "=== Trunk Name: %s\n" 2167 "=== ==> Device: %s\n" 2168 "=== ==> AutoContext: %s\n" 2169 "=== ==> RingTimeout: %s\n" 2170 "=== ==> BargeAllowed: %s\n" 2171 "=== ==> HoldAccess: %s\n" 2172 "=== ==> Stations ...\n",
2183 ast_cli(a->
fd,
"=== ---------------------------------------------------------\n===\n");
2188 ast_cli(a->
fd,
"=============================================================\n\n");
2195 #define S(e) case e: return # e; 2203 return "Uknown State";
2214 e->
command =
"sla show stations";
2216 "Usage: sla show stations\n" 2217 " This will list all stations defined in sla.conf\n";
2224 "=============================================================\n" 2225 "=== Configured SLA Stations =================================\n" 2226 "=============================================================\n" 2237 snprintf(ring_timeout,
sizeof(ring_timeout),
2241 snprintf(ring_delay,
sizeof(ring_delay),
2244 ast_cli(a->
fd,
"=== ---------------------------------------------------------\n" 2245 "=== Station Name: %s\n" 2246 "=== ==> Device: %s\n" 2247 "=== ==> AutoContext: %s\n" 2248 "=== ==> RingTimeout: %s\n" 2249 "=== ==> RingDelay: %s\n" 2250 "=== ==> HoldAccess: %s\n" 2251 "=== ==> Trunks ...\n",
2252 station->name, station->device,
2253 S_OR(station->autocontext,
"(none)"),
2254 ring_timeout, ring_delay,
2258 snprintf(ring_timeout,
sizeof(ring_timeout),
2261 strcpy(ring_timeout,
"(none)");
2264 snprintf(ring_delay,
sizeof(ring_delay),
2267 strcpy(ring_delay,
"(none)");
2270 ast_cli(a->
fd,
"=== ==> Trunk Name: %s\n" 2271 "=== ==> State: %s\n" 2272 "=== ==> RingTimeout: %s\n" 2273 "=== ==> RingDelay: %s\n",
2276 ring_timeout, ring_delay);
2278 ast_cli(a->
fd,
"=== ---------------------------------------------------------\n" 2284 ast_cli(a->
fd,
"============================================================\n" 2322 x = DAHDI_FLUSH_ALL;
2323 if (ioctl(fd, DAHDI_FLUSH, &x))
2408 if (user == sender) {
2430 if (!(event =
ast_calloc(1,
sizeof(*event)))) {
2471 strsep(&trunk_name,
"_");
2481 if (trunk_ref->
chan == chan && !strcmp(trunk_ref->
trunk->
name, trunk_name)) {
2496 ast_debug(1,
"Trunk not found for event!\n");
2512 if ((sscanf(conf->
confno,
"%4d", &confno_int) == 1) && (confno_int >= 0 && confno_int < 1024)) {
2513 conf_map[confno_int] = 0;
2525 char currenttime[32];
2542 confno,
"startTime<= ", currenttime,
2543 "endtime>= ", currenttime,
NULL);
2549 if (!strcasecmp(var->
name,
"bookid")) {
2552 if (!strcasecmp(var->
name,
"endtime")) {
2567 strcat(currenttime,
"0");
2570 confno,
"startTime<= ", currenttime,
2571 "endtime>= ", currenttime,
NULL);
2575 ast_debug(3,
"Trying to update the endtime of Conference %s to %s\n", confno, currenttime);
2591 ast_channel_musicclass_set(chan, musicclass);
2597 ast_channel_musicclass_set(chan, original_moh);
2605 return "conf-hasleft";
2608 return "conf-hasjoin";
2664 if (!current->
vmrec) {
2689 int last_talking = user->
talking;
2690 if (last_talking == talking)
2697 int was_talking = (last_talking > 0);
2698 int now_talking = (talking > 0);
2699 if (was_talking != now_talking) {
2981 if (conf->
users == 1) {
2989 }
else if (conf->
users == 2) {
3047 if (conf->
users == 1) {
3096 ast_verb(4,
"Starting recording of MeetMe Conference %s into file %s.%s.\n",
3102 struct dahdi_confinfo dahdic;
3108 dahdic.confmode = DAHDI_CONF_CONFANN | DAHDI_CONF_CONFANNMON;
3158 switch (*menu_mode) {
3172 recordingtmp, recordingtmp_size, cap_slin);
3181 struct dahdi_confinfo dahdic, dahdic_empty;
3191 int musiconhold = 0, mohtempstopped = 0;
3194 int currentmarked = 0;
3198 int talkreq_manager = 0;
3199 int using_pseudo = 0;
3203 int announcement_played = 0;
3208 const char *agifiledefault =
"conf-background.agi", *tmpvar;
3209 char meetmesecs[30] =
"";
3212 char members[10] =
"";
3213 int dtmf = 0, opt_waitmarked_timeout = 0;
3215 struct dahdi_bufferinfo bi;
3218 char *exitkeys =
NULL;
3219 unsigned int calldurationlimit = 0;
3221 long play_warning = 0;
3222 long warning_freq = 0;
3223 const char *warning_sound =
NULL;
3224 const char *end_sound =
NULL;
3226 long time_left_ms = 0;
3227 struct timeval nexteventts = { 0, };
3229 int setusercount = 0;
3230 int confsilence = 0, totalsilence = 0;
3235 goto conf_run_cleanup;
3240 goto conf_run_cleanup;
3246 (sscanf(optargs[OPT_ARG_WAITMARKED],
"%30d", &opt_waitmarked_timeout) == 1) &&
3247 (opt_waitmarked_timeout > 0)) {
3248 timeout = time(
NULL) + opt_waitmarked_timeout;
3252 calldurationlimit = atoi(optargs[OPT_ARG_DURATION_STOP]);
3253 ast_verb(3,
"Setting call duration limit to %u seconds.\n", calldurationlimit);
3257 char *limit_str, *warning_str, *warnfreq_str;
3261 limit_str =
strsep(&parse,
":");
3262 warning_str =
strsep(&parse,
":");
3263 warnfreq_str =
parse;
3265 timelimit = atol(limit_str);
3267 play_warning = atol(warning_str);
3269 warning_freq = atol(warnfreq_str);
3272 timelimit = play_warning = warning_freq = 0;
3273 warning_sound =
NULL;
3274 }
else if (play_warning > timelimit) {
3275 if (!warning_freq) {
3278 while (play_warning > timelimit)
3279 play_warning -= warning_freq;
3280 if (play_warning < 1)
3281 play_warning = warning_freq = 0;
3285 ast_verb(3,
"Setting conference duration limit to: %ldms.\n", timelimit);
3287 ast_verb(3,
"Setting warning time to %ldms from the conference duration limit.\n", play_warning);
3290 ast_verb(3,
"Setting warning frequency to %ldms.\n", warning_freq);
3299 warning_sound = var ?
var :
"timeleft";
3310 calldurationlimit = 0;
3312 if (!play_warning && !end_sound && timelimit) {
3313 calldurationlimit = timelimit / 1000;
3314 timelimit = play_warning = warning_freq = 0;
3316 ast_debug(2,
"Limit Data for this call:\n");
3317 ast_debug(2,
"- timelimit = %ld\n", timelimit);
3318 ast_debug(2,
"- play_warning = %ld\n", play_warning);
3319 ast_debug(2,
"- warning_freq = %ld\n", warning_freq);
3320 ast_debug(2,
"- warning_sound = %s\n", warning_sound ? warning_sound :
"UNDEF");
3321 ast_debug(2,
"- end_sound = %s\n", end_sound ? end_sound :
"UNDEF");
3328 exitkeys =
ast_strdupa(optargs[OPT_ARG_EXITKEYS]);
3351 ast_verb(4,
"Starting recording of MeetMe Conference %s into file %s.%s.\n",
3363 dahdic.confmode = DAHDI_CONF_CONFANN | DAHDI_CONF_CONFANNMON;
3391 if (calldurationlimit > 0) {
3414 if (rt_schedule && conf->
maxusers) {
3452 mailbox =
strsep(&context,
"@");
3460 context =
"default";
3469 "%s/meetme-username-%s-%d", destdir,
3476 "%s/meetme-username-%s-%d", destdir,
3495 if (rt_log_members) {
3497 snprintf(members,
sizeof(members),
"%d", conf->
users);
3507 if (conf->
users == 1)
3545 int keepplaying = 1;
3547 if (conf->
users == 2) {
3610 fd = open(
"/dev/dahdi/pseudo", O_RDWR | O_NONBLOCK);
3617 memset(&bi, 0,
sizeof(bi));
3619 bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
3620 bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
3622 if (ioctl(fd, DAHDI_SET_BUFINFO, &bi)) {
3628 if (ioctl(fd, DAHDI_SETLINEAR, &x)) {
3639 memset(&dahdic, 0,
sizeof(dahdic));
3640 memset(&dahdic_empty, 0,
sizeof(dahdic_empty));
3643 if (ioctl(fd, DAHDI_GETCONF, &dahdic)) {
3648 if (dahdic.confmode) {
3651 ast_debug(1,
"DAHDI channel is in a conference already, retrying with pseudo\n");
3656 memset(&dahdic, 0,
sizeof(dahdic));
3687 dahdic.confmode = DAHDI_CONF_CONF;
3689 dahdic.confmode = DAHDI_CONF_CONFMON | DAHDI_CONF_LISTENER;
3691 dahdic.confmode = DAHDI_CONF_CONF | DAHDI_CONF_TALKER;
3693 dahdic.confmode = DAHDI_CONF_CONF | DAHDI_CONF_TALKER | DAHDI_CONF_LISTENER;
3695 if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
3747 ret =
pbx_exec(chan, agi_app, agifile);
3758 int lastusers = conf->
users;
3766 int menu_was_active = 0;
3772 if (rt_schedule && conf->
endtime) {
3773 char currenttime[32];
3774 long localendtime = 0;
3780 if (now.tv_sec % 60 == 0) {
3785 conf->
confno,
"starttime <=", currenttime,
3786 "endtime >=", currenttime,
NULL);
3788 for ( ;
var; var = var->
next) {
3789 if (!strcasecmp(var->
name,
"endtime")) {
3790 struct ast_tm endtime_tm;
3793 localendtime = tmp.tv_sec;
3800 if (localendtime > conf->
endtime){
3810 if (!announcement_played && conf->
endalert) {
3820 announcement_played = 1;
3825 announcement_played = 0;
3846 int minutes = 0, seconds = 0, remain = 0;
3853 if (time_left_ms < to) {
3857 if (time_left_ms <= 0) {
3871 if (time_left_ms >= 5000) {
3873 remain = (time_left_ms + 500) / 1000;
3874 if (remain / 60 >= 1) {
3875 minutes = remain / 60;
3876 seconds = remain % 60;
3915 if (timeout && now.tv_sec >= timeout) {
3931 menu_was_active = menu_mode;
3938 if (currentmarked == 1 && conf->
users > 1) {
3940 if (conf->
users - 1 == 1) {
3961 if (currentmarked == 0) {
3962 if (lastmarked != 0) {
3974 dahdic.confmode = DAHDI_CONF_CONF;
3975 if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
3986 }
else if (currentmarked >= 1 && lastmarked == 0) {
3990 dahdic.confmode = DAHDI_CONF_CONFMON | DAHDI_CONF_LISTENER;
3992 dahdic.confmode = DAHDI_CONF_CONF | DAHDI_CONF_TALKER;
3994 dahdic.confmode = DAHDI_CONF_CONF | DAHDI_CONF_TALKER | DAHDI_CONF_LISTENER;
3996 if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
4017 if (conf->
users == 1) {
4041 if (conf->
users != lastusers) {
4042 if (conf->
users < lastusers) {
4045 lastusers = conf->
users;
4053 dahdic.confmode ^= DAHDI_CONF_TALKER;
4054 if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
4070 dahdic.confmode |= DAHDI_CONF_TALKER;
4071 if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
4083 talkreq_manager = 1;
4090 talkreq_manager = 0;
4127 ast_debug(1,
"Ooh, something swapped out under us, starting over\n");
4186 if (ioctl(fd, DAHDI_SETCONF, &dahdic_empty)) {
4202 }
else if (!menu_mode) {
4206 menu_to_play =
"conf-adminmenu-18";
4209 menu_to_play =
"conf-usermenu-162";
4224 chan, user, recordingtmp,
sizeof(recordingtmp), cap_slin);
4227 if (musiconhold && !menu_mode) {
4232 if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
4250 ast_debug(1,
"Got DTMF %c, goto context %s\n", dtmfstr[0], exitcontext);
4255 ast_debug(2,
"Exit by single digit did not work in meetme. Extension %s does not exist in context %s\n", dtmfstr, exitcontext);
4289 "Got ignored control frame on channel %s, f->frametype=%u,f->subclass=%d\n",
4294 "Got unrecognized frame on channel %s, f->frametype=%u,f->subclass=%d\n",
4298 }
else if (outfd > -1) {
4301 memset(&fr, 0,
sizeof(fr));
4319 if (idx >= AST_FRAME_BITS) {
4320 goto bailoutandtrynormal;
4363 goto bailoutandtrynormal;
4367 bailoutandtrynormal:
4390 lastmarked = currentmarked;
4404 dahdic.confmode = 0;
4405 if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
4455 if (rt_log_members) {
4457 snprintf(members,
sizeof(members),
"%d", conf->
users);
4482 snprintf(meetmesecs,
sizeof(meetmesecs),
"%d", (
int) (time(
NULL) - user->
jointime));
4501 char *dynamic_pin,
size_t pin_buf_len,
int refcount,
struct ast_flags64 *confflags,
int *too_early,
char **optargs)
4511 if (!strcmp(confno, cnf->
confno)) {
4524 char recordingfilename[256] =
"";
4525 char recordingformat[11] =
"";
4526 char currenttime[32] =
"";
4527 char eatime[32] =
"";
4528 char bookid[51] =
"";
4533 struct timeval endtime = { .tv_sec = 0 };
4542 ast_debug(1,
"Looking for conference %s that starts after %s\n", confno, currenttime);
4545 confno,
"starttime <= ", currenttime,
"endtime >= ",
4548 if (!var && fuzzystart) {
4555 confno,
"starttime <= ", currenttime,
"endtime >= ",
4559 if (!var && earlyalert) {
4565 confno,
"starttime <= ", eatime,
"endtime >= ",
4580 if (rt_schedule && *too_early) {
4589 for (origvar = var;
var; var = var->
next) {
4590 if (!strcasecmp(var->
name,
"pin")) {
4592 }
else if (!strcasecmp(var->
name,
"adminpin")) {
4594 }
else if (!strcasecmp(var->
name,
"bookId")) {
4596 }
else if (!strcasecmp(var->
name,
"opts")) {
4598 }
else if (!strcasecmp(var->
name,
"maxusers")) {
4599 maxusers = atoi(var->
value);
4600 }
else if (!strcasecmp(var->
name,
"adminopts")) {
4602 }
else if (!strcasecmp(var->
name,
"recordingfilename")) {
4604 }
else if (!strcasecmp(var->
name,
"recordingformat")) {
4606 }
else if (!strcasecmp(var->
name,
"endtime")) {
4607 struct ast_tm endtime_tm;
4615 cnf =
build_conf(confno, pin ? pin :
"", pinadmin ? pinadmin :
"", make, dynamic, refcount, chan,
NULL);
4622 cnf->
endtime = endtime.tv_sec;
4673 ast_log(
LOG_WARNING,
"No DAHDI channel available for conference, user introduction disabled (is chan_dahdi loaded?)\n");
4677 if (confflags && !cnf->
chan &&
4679 ast_log(
LOG_WARNING,
"No DAHDI channel available for conference, conference recording disabled (is chan_dahdi loaded?)\n");
4703 ast_debug(1,
"The requested confno is '%s'?\n", confno);
4707 if (!strcmp(confno, cnf->
confno))
4718 ast_debug(1,
"Building dynamic conference '%s'\n", confno);
4720 if (dynamic_pin[0] ==
'q') {
4722 if (
ast_app_getdata(chan,
"conf-getpin", dynamic_pin, pin_buf_len - 1, 0) < 0)
4725 cnf =
build_conf(confno, dynamic_pin,
"", make, dynamic, refcount, chan,
NULL);
4727 cnf =
build_conf(confno,
"",
"", make, dynamic, refcount, chan,
NULL);
4743 if (strcasecmp(var->
name,
"conf"))
4749 ast_debug(3,
"Will conf %s match %s?\n", confno, args.confno);
4750 if (!strcasecmp(args.confno, confno)) {
4754 S_OR(args.pinadmin,
""),
4755 make, dynamic, refcount, chan,
NULL);
4760 ast_debug(1,
"%s isn't a valid conference\n", confno);
4764 }
else if (dynamic_pin) {
4768 if (dynamic_pin[0] ==
'q') {
4769 dynamic_pin[0] =
'\0';
4774 if (confflags && !cnf->
chan &&
4777 ast_log(
LOG_WARNING,
"No DAHDI channel available for conference, user introduction disabled (is chan_dahdi loaded?)\n");
4781 if (confflags && !cnf->
chan &&
4783 ast_log(
LOG_WARNING,
"No DAHDI channel available for conference, conference recording disabled (is chan_dahdi loaded?)\n");
4816 count = conf->
users;
4824 snprintf(val,
sizeof(val),
"%d", count);
4847 int empty = 0, empty_no_pin = 0;
4848 int always_prompt = 0;
4849 const char *notdata;
4886 strcpy(the_pin,
"q");
4903 if ((empty_no_pin) || (!dynamic)) {
4909 if (!strcasecmp(var->
name,
"conf")) {
4912 confno_tmp =
strsep(&stringp,
"|,");
4917 if (!strcmp(confno_tmp, cnf->
confno)) {