diff --git a/CHANGES b/CHANGES index 01b44cae00..1f98a1082d 100755 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,9 @@ only, not requiring authentication on incoming invites, or both. Before, to not require authentication on incoming invites also required matching peers based on IP only. + -- app_meetme + -- If the first caller into a conference hangs up while being prompted for + the conference pin number, the conference will no longer be held open. -- app_zapras -- We now ensure buffer policy is restored after RAS is done with a channel. This could cause audio problems on the channel after zapras is done diff --git a/apps/app_meetme.c b/apps/app_meetme.c index 51a8da6183..47d05e5a40 100755 --- a/apps/app_meetme.c +++ b/apps/app_meetme.c @@ -482,9 +482,39 @@ static int confnonzero(void *ptr) return res; } +/* Remove the conference from the list and free it. + We assume that this was called while holding conflock. */ +static int conf_free(struct ast_conference *conf) +{ + struct ast_conference *prev = NULL, *cur = confs; + + while(cur) { + if (cur == conf) { + if (prev) + prev->next = conf->next; + else + confs = conf->next; + break; + } + prev = cur; + cur = cur->next; + } + + if (!cur) + ast_log(LOG_WARNING, "Conference not found\n"); + + if (conf->chan) + ast_hangup(conf->chan); + else + close(conf->fd); + + free(conf); + + return 0; +} + static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int confflags) { - struct ast_conference *prev=NULL, *cur; struct ast_conf_user *user = malloc(sizeof(struct ast_conf_user)); int fd; struct zt_confinfo ztc; @@ -991,31 +1021,12 @@ outrun: "Meetme: %s\r\n" "Usernum: %i\r\n", chan->name, chan->uniqueid, conf->confno, user->user_no); - prev = NULL; conf->users--; if (confflags & CONFFLAG_MARKEDUSER) conf->markedusers--; - cur = confs; if (!conf->users) { /* No more users -- close this one out */ - while(cur) { - if (cur == conf) { - if (prev) - prev->next = conf->next; - else - confs = conf->next; - break; - } - prev = cur; - cur = cur->next; - } - if (!cur) - ast_log(LOG_WARNING, "Conference not found\n"); - if (conf->chan) - ast_hangup(conf->chan); - else - close(conf->fd); - free(conf); + conf_free(conf); } else { /* Remove the user struct */ if (user == conf->firstuser) { @@ -1400,8 +1411,15 @@ static int conf_exec(struct ast_channel *chan, void *data) confno[0] = '\0'; } } else { + /* failed when getting the pin */ res = -1; allowretry = 0; + /* see if we need to get rid of the conference */ + ast_mutex_lock(&conflock); + if (!cnf->users) { + conf_free(cnf); + } + ast_mutex_unlock(&conflock); break; } @@ -1420,8 +1438,9 @@ static int conf_exec(struct ast_channel *chan, void *data) } } } while (allowretry); - /* Do the conference */ + LOCAL_USER_REMOVE(u); + return res; }