if the first user hangs up while being prompted for a pin, don't hold the

conference open (bug #4656)


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/v1-0@6088 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.0
Russell Bryant 20 years ago
parent c2a39b5c64
commit 2faf30d730

@ -8,6 +8,9 @@
only, not requiring authentication on incoming invites, or both. Before, only, not requiring authentication on incoming invites, or both. Before,
to not require authentication on incoming invites also required matching to not require authentication on incoming invites also required matching
peers based on IP only. 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 -- app_zapras
-- We now ensure buffer policy is restored after RAS is done with a channel. -- 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 This could cause audio problems on the channel after zapras is done

@ -482,9 +482,39 @@ static int confnonzero(void *ptr)
return res; 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) 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)); struct ast_conf_user *user = malloc(sizeof(struct ast_conf_user));
int fd; int fd;
struct zt_confinfo ztc; struct zt_confinfo ztc;
@ -991,31 +1021,12 @@ outrun:
"Meetme: %s\r\n" "Meetme: %s\r\n"
"Usernum: %i\r\n", "Usernum: %i\r\n",
chan->name, chan->uniqueid, conf->confno, user->user_no); chan->name, chan->uniqueid, conf->confno, user->user_no);
prev = NULL;
conf->users--; conf->users--;
if (confflags & CONFFLAG_MARKEDUSER) if (confflags & CONFFLAG_MARKEDUSER)
conf->markedusers--; conf->markedusers--;
cur = confs;
if (!conf->users) { if (!conf->users) {
/* No more users -- close this one out */ /* No more users -- close this one out */
while(cur) { conf_free(conf);
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);
} else { } else {
/* Remove the user struct */ /* Remove the user struct */
if (user == conf->firstuser) { if (user == conf->firstuser) {
@ -1400,8 +1411,15 @@ static int conf_exec(struct ast_channel *chan, void *data)
confno[0] = '\0'; confno[0] = '\0';
} }
} else { } else {
/* failed when getting the pin */
res = -1; res = -1;
allowretry = 0; 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; break;
} }
@ -1420,8 +1438,9 @@ static int conf_exec(struct ast_channel *chan, void *data)
} }
} }
} while (allowretry); } while (allowretry);
/* Do the conference */
LOCAL_USER_REMOVE(u); LOCAL_USER_REMOVE(u);
return res; return res;
} }

Loading…
Cancel
Save