X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fconfig%2Ffile.c;h=305bbf8d731ee79d344b40724a1e0b34d36a22a1;hb=12ade3e3bc975d5426ba4af155b7372c31093b31;hp=6d47f321bafc89c63874b322c1357637cc5be1f5;hpb=d601e4ed290edf58e9ace5c28f06c77ebf072004;p=vlc diff --git a/src/config/file.c b/src/config/file.c index 6d47f321ba..305bbf8d73 100644 --- a/src/config/file.c +++ b/src/config/file.c @@ -40,7 +40,8 @@ #include "../libvlc.h" #include #include -#include "vlc_keys.h" +#include +#include #include "configuration.h" #include "modules/modules.h" @@ -76,7 +77,7 @@ static FILE *config_OpenConfigFile( vlc_object_t *p_obj ) msg_Dbg( p_obj, "opening config file (%s)", psz_filename ); - FILE *p_stream = utf8_fopen( psz_filename, "rt" ); + FILE *p_stream = vlc_fopen( psz_filename, "rt" ); if( p_stream == NULL && errno != ENOENT ) { msg_Err( p_obj, "cannot open config file (%s): %m", @@ -95,7 +96,7 @@ static FILE *config_OpenConfigFile( vlc_object_t *p_obj ) && asprintf( &psz_old, "%s/.vlc/" CONFIG_FILE, home ) != -1 ) { - p_stream = utf8_fopen( psz_old, "rt" ); + p_stream = vlc_fopen( psz_old, "rt" ); if( p_stream ) { /* Old config file found. We want to write it at the @@ -106,7 +107,7 @@ static FILE *config_OpenConfigFile( vlc_object_t *p_obj ) if( asprintf(&psz_readme,"%s/.vlc/README", home ) != -1 ) { - FILE *p_readme = utf8_fopen( psz_readme, "wt" ); + FILE *p_readme = vlc_fopen( psz_readme, "wt" ); if( p_readme ) { fprintf( p_readme, "The VLC media player " @@ -135,22 +136,25 @@ static FILE *config_OpenConfigFile( vlc_object_t *p_obj ) } -static int strtoi (const char *str) +static int64_t strtoi (const char *str) { char *end; - long l; + long long l; errno = 0; - l = strtol (str, &end, 0); + l = strtoll (str, &end, 0); if (!errno) { - if ((l > INT_MAX) || (l < INT_MIN)) +#if (LLONG_MAX > 0x7fffffffffffffffLL) + if (l > 0x7fffffffffffffffLL + || l < -0x8000000000000000LL) errno = ERANGE; +#endif if (*end) errno = EINVAL; } - return (int)l; + return l; } #undef config_LoadConfigFile @@ -270,12 +274,14 @@ int config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name ) case CONFIG_ITEM_BOOL: case CONFIG_ITEM_INTEGER: { - long l = strtoi (psz_option_value); + int64_t l = strtoi (psz_option_value); + if ((l > p_item->max.i) || (l < p_item->min.i)) + errno = ERANGE; if (errno) msg_Warn (p_this, "Integer value (%s) for %s: %m", psz_option_value, psz_option_name); else - p_item->saved.i = p_item->value.i = (int)l; + p_item->saved.i = p_item->value.i = l; break; } @@ -330,7 +336,7 @@ int config_CreateDir( vlc_object_t *p_this, const char *psz_dirname ) { if( !psz_dirname || !*psz_dirname ) return -1; - if( utf8_mkdir( psz_dirname, 0700 ) == 0 ) + if( vlc_mkdir( psz_dirname, 0700 ) == 0 ) return 0; switch( errno ) @@ -350,7 +356,7 @@ int config_CreateDir( vlc_object_t *p_this, const char *psz_dirname ) *psz_end = '\0'; if( config_CreateDir( p_this, psz_parent ) == 0 ) { - if( !utf8_mkdir( psz_dirname, 0700 ) ) + if( !vlc_mkdir( psz_dirname, 0700 ) ) return 0; } } @@ -432,7 +438,7 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, if( config_PrepareDir( p_this ) ) { msg_Err( p_this, "no configuration directory" ); - goto error; + return -1; } file = config_OpenConfigFile( p_this ); @@ -541,7 +547,7 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, static vlc_mutex_t lock = VLC_STATIC_MUTEX; vlc_mutex_lock (&lock); - int fd = utf8_open (temporary, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR|S_IWUSR); + int fd = vlc_open (temporary, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR|S_IWUSR); if (fd == -1) { vlc_rwlock_unlock (&config_lock); @@ -552,6 +558,7 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, file = fdopen (fd, "wt"); if (file == NULL) { + msg_Err (p_this, "cannot create configuration file: %m"); vlc_rwlock_unlock (&config_lock); close (fd); vlc_mutex_unlock (&lock); @@ -559,8 +566,15 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, goto error; } - fprintf( file, "\xEF\xBB\xBF###\n### " COPYRIGHT_MESSAGE "\n###\n\n" - "###\n### lines beginning with a '#' character are comments\n###\n\n" ); + fprintf( file, + "\xEF\xBB\xBF###\n" + "### "PACKAGE_NAME" "PACKAGE_VERSION"\n" + "###\n" + "\n" + "###\n" + "### lines beginning with a '#' character are comments\n" + "###\n" + "\n" ); /* Ensure consistent number formatting... */ locale_t loc = newlocale (LC_NUMERIC_MASK, "C", NULL); @@ -607,7 +621,7 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, if (IsConfigIntegerType (p_item->i_type)) { - int val = b_retain ? p_item->saved.i : p_item->value.i; + int64_t val = b_retain ? p_item->saved.i : p_item->value.i; if (p_item->i_type == CONFIG_ITEM_KEY) { char *psz_key = ConfigKeyToString (val); @@ -622,7 +636,7 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, (p_item->i_type == CONFIG_ITEM_BOOL) ? N_("boolean") : N_("integer"), val == p_item->orig.i, - p_item->psz_name, "%d", val); + p_item->psz_name, "%"PRId64, val); p_item->saved.i = val; } else @@ -692,6 +706,14 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, * Flush to disk and replace atomically */ fflush (file); /* Flush from run-time */ + if (ferror (file)) + { + vlc_unlink (temporary); + vlc_mutex_unlock (&lock); + msg_Err (p_this, "cannot write configuration file"); + clearerr (file); + goto error; + } #ifndef WIN32 #ifdef __APPLE__ fsync (fd); /* Flush from OS */ @@ -699,8 +721,8 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, fdatasync (fd); /* Flush from OS */ #endif /* Atomically replace the file... */ - if (utf8_rename (temporary, permanent)) - utf8_unlink (temporary); + if (vlc_rename (temporary, permanent)) + vlc_unlink (temporary); /* (...then synchronize the directory, err, TODO...) */ /* ...and finally close the file */ vlc_mutex_unlock (&lock); @@ -708,9 +730,9 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, fclose (file); #ifdef WIN32 /* Windows cannot remove open files nor overwrite existing ones */ - utf8_unlink (permanent); - if (utf8_rename (temporary, permanent)) - utf8_unlink (temporary); + vlc_unlink (permanent); + if (vlc_rename (temporary, permanent)) + vlc_unlink (temporary); vlc_mutex_unlock (&lock); #endif