@ -1996,21 +1996,27 @@ static void inclfile_destroy(void *obj)
ast_free ( o - > fname ) ;
}
static struct inclfile * set_fn ( char * fn , int fn_size , const char * file , const char * configfile , struct ao2_container * fileset )
static void make_fn ( char * fn , size_t fn_size , const char * file , const char * configfile )
{
struct inclfile lookup ;
struct inclfile * fi ;
if ( ast_strlen_zero ( file ) ) {
if ( configfile [ 0 ] = = ' / ' )
if ( configfile [ 0 ] = = ' / ' ) {
ast_copy_string ( fn , configfile , fn_size ) ;
else
} else {
snprintf ( fn , fn_size , " %s/%s " , ast_config_AST_CONFIG_DIR , configfile ) ;
} else if ( file [ 0 ] = = ' / ' )
}
} else if ( file [ 0 ] = = ' / ' ) {
ast_copy_string ( fn , file , fn_size ) ;
else
} else {
snprintf ( fn , fn_size , " %s/%s " , ast_config_AST_CONFIG_DIR , file ) ;
}
}
static struct inclfile * set_fn ( char * fn , size_t fn_size , const char * file , const char * configfile , struct ao2_container * fileset )
{
struct inclfile lookup ;
struct inclfile * fi ;
make_fn ( fn , fn_size , file , configfile ) ;
lookup . fname = fn ;
fi = ao2_find ( fileset , & lookup , OBJ_POINTER ) ;
if ( fi ) {
@ -2119,11 +2125,29 @@ int ast_config_text_file_save(const char *configfile, const struct ast_config *c
return - 1 ;
}
/* reset all the output flags, in case this isn't our first time saving this data */
/* Check all the files for write access before attempting to modify any of them */
for ( incl = cfg - > includes ; incl ; incl = incl - > next ) {
/* reset all the output flags in case this isn't our first time saving this data */
incl - > output = 0 ;
/* now make sure we have write access */
if ( ! incl - > exec ) {
make_fn ( fn , sizeof ( fn ) , incl - > included_file , configfile ) ;
if ( access ( fn , R_OK | W_OK ) ) {
ast_log ( LOG_ERROR , " Unable to write %s (%s) \n " , fn , strerror ( errno ) ) ;
return - 1 ;
}
}
}
/* now make sure we have write access to the main config file */
make_fn ( fn , sizeof ( fn ) , 0 , configfile ) ;
if ( access ( fn , R_OK | W_OK ) ) {
ast_log ( LOG_ERROR , " Unable to write %s (%s) \n " , fn , strerror ( errno ) ) ;
return - 1 ;
}
/* Now that we know we have write access to all files, it's safe to start truncating them */
/* go thru all the inclusions and make sure all the files involved (configfile plus all its inclusions)
are all truncated to zero bytes and have that nice header */
for ( incl = cfg - > includes ; incl ; incl = incl - > next ) {
@ -2135,8 +2159,7 @@ int ast_config_text_file_save(const char *configfile, const struct ast_config *c
gen_header ( f , configfile , fn , generator ) ;
fclose ( f ) ; /* this should zero out the file */
} else {
ast_debug ( 1 , " Unable to open for writing: %s \n " , fn ) ;
ast_verb ( 2 , " Unable to write %s (%s) \n " , fn , strerror ( errno ) ) ;
ast_log ( LOG_ERROR , " Unable to write %s (%s) \n " , fn , strerror ( errno ) ) ;
}
if ( fi ) {
ao2_ref ( fi , - 1 ) ;
@ -2169,8 +2192,7 @@ int ast_config_text_file_save(const char *configfile, const struct ast_config *c
fi = set_fn ( fn , sizeof ( fn ) , cat - > file , configfile , fileset ) ;
f = fopen ( fn , " a " ) ;
if ( ! f ) {
ast_debug ( 1 , " Unable to open for writing: %s \n " , fn ) ;
ast_verb ( 2 , " Unable to write %s (%s) \n " , fn , strerror ( errno ) ) ;
ast_log ( LOG_ERROR , " Unable to write %s (%s) \n " , fn , strerror ( errno ) ) ;
if ( fi ) {
ao2_ref ( fi , - 1 ) ;
}