#include "../libvlc.h"
#include <vlc_charset.h>
#include <vlc_fs.h>
-#include "vlc_keys.h"
+#include <vlc_keys.h>
+#include <vlc_modules.h>
#include "configuration.h"
#include "modules/modules.h"
}
-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
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;
}
if( config_PrepareDir( p_this ) )
{
msg_Err( p_this, "no configuration directory" );
- goto error;
+ return -1;
}
file = config_OpenConfigFile( p_this );
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);
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);
(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
* 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 */