@ -154,6 +154,8 @@ struct ast_conference {
static AST_LIST_HEAD_STATIC ( confs , ast_conference ) ;
static unsigned int conf_map [ 1024 ] = { 0 , } ;
struct volume {
int desired ; /* Desired volume adjustment */
int actual ; /* Actual volume adjustment (for channels that can't adjust) */
@ -442,6 +444,7 @@ static struct ast_conference *build_conf(char *confno, char *pin, char *pinadmin
{
struct ast_conference * cnf ;
struct zt_confinfo ztc ;
int confno_int = 0 ;
AST_LIST_LOCK ( & confs ) ;
AST_LIST_TRAVERSE ( & confs , cnf , list ) {
@ -493,6 +496,9 @@ static struct ast_conference *build_conf(char *confno, char *pin, char *pinadmin
if ( option_verbose > 2 )
ast_verbose ( VERBOSE_PREFIX_3 " Created MeetMe conference %d for conference '%s' \n " , cnf - > zapconf , cnf - > confno ) ;
AST_LIST_INSERT_HEAD ( & confs , cnf , list ) ;
/* Reserve conference number in map */
if ( ( sscanf ( cnf - > confno , " %d " , & confno_int ) = = 1 ) & & ( confno_int > = 0 & & confno_int < 1024 ) )
conf_map [ confno_int ] = 1 ;
} else
ast_log ( LOG_WARNING , " Out of memory \n " ) ;
}
@ -795,9 +801,13 @@ static int conf_free(struct ast_conference *conf)
static int dispose_conf ( struct ast_conference * conf )
{
int res = 0 ;
int confno_int = 0 ;
AST_LIST_LOCK ( & confs ) ;
if ( ast_atomic_dec_and_test ( & conf - > refcount ) ) {
/* Take the conference room number out of an inuse state */
if ( ( sscanf ( conf - > confno , " %d " , & confno_int ) = = 1 ) & & ( confno_int > = 0 & & confno_int < 1024 ) )
conf_map [ confno_int ] = 0 ;
conf_free ( conf ) ;
res = 1 ;
}
@ -1819,20 +1829,9 @@ static int conf_exec(struct ast_channel *chan, void *data)
if ( retrycnt > 3 )
allowretry = 0 ;
if ( empty ) {
int i , map [ 1024 ] = { 0 , } ;
struct ast_config * cfg ;
struct ast_variable * var ;
int confno_int ;
AST_LIST_LOCK ( & confs ) ;
AST_LIST_TRAVERSE ( & confs , cnf , list ) {
if ( sscanf ( cnf - > confno , " %d " , & confno_int ) = = 1 ) {
/* Disqualify in use conference */
if ( confno_int > = 0 & & confno_int < 1024 )
map [ confno_int ] + + ;
}
}
AST_LIST_UNLOCK ( & confs ) ;
int i = 0 , confno_int = 0 ;
/* We only need to load the config file for static and empty_no_pin (otherwise we don't care) */
if ( ( empty_no_pin ) | | ( ! dynamic ) ) {
@ -1845,13 +1844,6 @@ static int conf_exec(struct ast_channel *chan, void *data)
if ( stringp ) {
char * confno_tmp = strsep ( & stringp , " |, " ) ;
int found = 0 ;
if ( sscanf ( confno_tmp , " %d " , & confno_int ) = = 1 ) {
if ( ( confno_int > = 0 ) & & ( confno_int < 1024 ) ) {
if ( stringp & & empty_no_pin ) {
map [ confno_int ] + + ;
}
}
}
if ( ! dynamic ) {
/* For static: run through the list and see if this conference is empty */
AST_LIST_LOCK ( & confs ) ;
@ -1888,12 +1880,15 @@ static int conf_exec(struct ast_channel *chan, void *data)
/* Select first conference number not in use */
if ( ast_strlen_zero ( confno ) & & dynamic ) {
for ( i = 0 ; i < sizeof ( map ) / sizeof ( map [ 0 ] ) ; i + + ) {
if ( ! map [ i ] ) {
AST_LIST_LOCK ( & confs ) ;
for ( i = 0 ; i < sizeof ( conf_map ) / sizeof ( conf_map [ 0 ] ) ; i + + ) {
if ( ! conf_map [ i ] ) {
snprintf ( confno , sizeof ( confno ) , " %d " , i ) ;
conf_map [ i ] = 1 ;
break ;
}
}
AST_LIST_UNLOCK ( & confs ) ;
}
/* Not found? */