Commit c0c771be authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Factorize code to open configuration file

parent e219a085
...@@ -762,6 +762,42 @@ void __config_ResetAll( vlc_object_t *p_this ) ...@@ -762,6 +762,42 @@ void __config_ResetAll( vlc_object_t *p_this )
vlc_mutex_unlock( &p_this->p_libvlc->config_lock ); vlc_mutex_unlock( &p_this->p_libvlc->config_lock );
} }
static FILE *config_OpenConfigFile (vlc_object_t *obj, const char *mode)
{
static const char subpath[] = DIR_SEP CONFIG_DIR DIR_SEP CONFIG_FILE;
const char *filename = obj->p_libvlc->psz_configfile;
const char *homedir;
size_t buflen = 0;
if (filename == NULL)
{
homedir = obj->p_libvlc->psz_homedir;
if (homedir == NULL)
{
msg_Err (obj, "no home directory defined");
return NULL;
}
buflen = strlen (homedir) + sizeof (subpath);
}
char buf[buflen];
if (filename == NULL)
{
sprintf (buf, "%s%s", homedir, subpath);
filename = buf;
}
msg_Dbg (obj, "opening config file (%s)", filename);
FILE *stream = utf8_fopen (filename, mode);
if ((stream == NULL) && (errno != ENOENT))
msg_Err (obj, "cannot open config file (%s): %s", strerror (errno));
return stream;
}
/***************************************************************************** /*****************************************************************************
* config_LoadConfigFile: loads the configuration file. * config_LoadConfigFile: loads the configuration file.
***************************************************************************** *****************************************************************************
...@@ -773,49 +809,15 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name ) ...@@ -773,49 +809,15 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name )
vlc_list_t *p_list; vlc_list_t *p_list;
FILE *file; FILE *file;
char *p_index; char *p_index;
char *psz_filename;
int i_index; int i_index;
const char *psz_configfile = p_this->p_libvlc->psz_configfile; file = config_OpenConfigFile (p_this, "rt");
if( !psz_configfile || !psz_configfile ) if (file == NULL)
{ return VLC_EGENERIC;
const char *psz_homedir = p_this->p_libvlc->psz_homedir;
if( !psz_homedir )
{
msg_Err( p_this, "psz_homedir is null" );
return -1;
}
if( asprintf( &psz_filename, "%s" DIR_SEP CONFIG_DIR DIR_SEP CONFIG_FILE,
psz_homedir ) == -1 )
psz_filename = NULL;
}
else
{
psz_filename = strdup( psz_configfile );
}
if( !psz_filename )
{
msg_Err( p_this, "out of memory" );
return -1;
}
msg_Dbg( p_this, "opening config file %s", psz_filename );
/* Acquire config file lock */ /* Acquire config file lock */
vlc_mutex_lock( &p_this->p_libvlc->config_lock ); vlc_mutex_lock( &p_this->p_libvlc->config_lock );
file = utf8_fopen( psz_filename, "rt" );
if( file == NULL )
{
msg_Warn( p_this, "config file %s does not exist yet", psz_filename );
free( psz_filename );
vlc_mutex_unlock( &p_this->p_libvlc->config_lock );
return -1;
}
free( psz_filename );
/* Look for the selected module, if NULL then save everything */ /* Look for the selected module, if NULL then save everything */
p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE ); p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
...@@ -972,7 +974,6 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name ) ...@@ -972,7 +974,6 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name )
fclose( file ); fclose( file );
vlc_mutex_unlock( &p_this->p_libvlc->config_lock ); vlc_mutex_unlock( &p_this->p_libvlc->config_lock );
return 0; return 0;
} }
...@@ -1022,58 +1023,28 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, ...@@ -1022,58 +1023,28 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name,
int i_sizebuf = 0; int i_sizebuf = 0;
char *p_bigbuffer, *p_index; char *p_bigbuffer, *p_index;
vlc_bool_t b_backup; vlc_bool_t b_backup;
char *psz_filename, *psz_homedir, *psz_configfile;
int i_index; int i_index;
/* Acquire config file lock */ /* Acquire config file lock */
vlc_mutex_lock( &p_this->p_libvlc->config_lock ); vlc_mutex_lock( &p_this->p_libvlc->config_lock );
psz_configfile = p_this->p_libvlc->psz_configfile; if (p_this->p_libvlc->psz_configfile == NULL)
if( !psz_configfile || !psz_configfile )
{ {
psz_homedir = p_this->p_libvlc->psz_homedir; const char *psz_homedir = p_this->p_libvlc->psz_homedir;
if( !psz_homedir ) if( !psz_homedir )
{ {
msg_Err( p_this, "psz_homedir is null" ); msg_Err( p_this, "no home directory defined" );
vlc_mutex_unlock( &p_this->p_libvlc->config_lock );
return -1;
}
psz_filename = (char *)malloc( sizeof("/" CONFIG_DIR "/" CONFIG_FILE) +
strlen(psz_homedir) );
if( psz_filename )
sprintf( psz_filename, "%s" DIR_SEP CONFIG_DIR, psz_homedir );
if( !psz_filename )
{
msg_Err( p_this, "out of memory" );
vlc_mutex_unlock( &p_this->p_libvlc->config_lock ); vlc_mutex_unlock( &p_this->p_libvlc->config_lock );
return -1; return -1;
} }
config_CreateDir( p_this, psz_filename ); char dirname[strlen (psz_homedir) + sizeof (DIR_SEP CONFIG_DIR)];
sprintf (dirname, "%s" DIR_SEP CONFIG_DIR, psz_homedir);
strcat( psz_filename, DIR_SEP CONFIG_FILE ); config_CreateDir (p_this, dirname);
}
else
{
psz_filename = strdup( psz_configfile );
if( !psz_filename )
{
msg_Err( p_this, "out of memory" );
vlc_mutex_unlock( &p_this->p_libvlc->config_lock );
return -1;
}
} }
msg_Dbg( p_this, "opening config file %s", psz_filename ); file = config_OpenConfigFile (p_this, "rt");
if (file != NULL)
file = utf8_fopen( psz_filename, "rt" );
if( !file )
{
msg_Warn( p_this, "config file %s does not exist yet", psz_filename );
}
else
{ {
/* look for file size */ /* look for file size */
fseek( file, 0L, SEEK_END ); fseek( file, 0L, SEEK_END );
...@@ -1086,7 +1057,6 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, ...@@ -1086,7 +1057,6 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name,
{ {
msg_Err( p_this, "out of memory" ); msg_Err( p_this, "out of memory" );
if( file ) fclose( file ); if( file ) fclose( file );
free( psz_filename );
vlc_mutex_unlock( &p_this->p_libvlc->config_lock ); vlc_mutex_unlock( &p_this->p_libvlc->config_lock );
return -1; return -1;
} }
...@@ -1156,12 +1126,9 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, ...@@ -1156,12 +1126,9 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name,
* Save module config in file * Save module config in file
*/ */
file = utf8_fopen( psz_filename, "wt" ); file = config_OpenConfigFile (p_this, "wt");
if( !file ) if( !file )
{ {
msg_Warn( p_this, "could not open config file %s for writing",
psz_filename );
free( psz_filename );
vlc_list_release( p_list ); vlc_list_release( p_list );
vlc_mutex_unlock( &p_this->p_libvlc->config_lock ); vlc_mutex_unlock( &p_this->p_libvlc->config_lock );
return -1; return -1;
...@@ -1299,7 +1266,6 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, ...@@ -1299,7 +1266,6 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name,
free( p_bigbuffer ); free( p_bigbuffer );
fclose( file ); fclose( file );
free( psz_filename );
vlc_mutex_unlock( &p_this->p_libvlc->config_lock ); vlc_mutex_unlock( &p_this->p_libvlc->config_lock );
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment