src/config.c: Add missing configuration variables
Append missing configuration variables to the end of our configuration file instead of keeping them undefined. Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
parent
8aba3be1e8
commit
47ceb96e13
57
src/config.c
57
src/config.c
@ -106,6 +106,11 @@ static const struct confvar confmap[] = {
|
||||
{ "notify-daemon_log", CONFIG_HANDLER_BOOL (dmon.log) }
|
||||
};
|
||||
|
||||
struct config_save_status {
|
||||
FILE *fp;
|
||||
int done[sizeof (confmap) / sizeof (confmap[0])];
|
||||
};
|
||||
|
||||
typedef int (*config_fn_walk_cb_t) (const char *, const char *, void *);
|
||||
typedef int (*config_fn_walk_junk_cb_t) (const char *, void *);
|
||||
|
||||
@ -415,7 +420,8 @@ config_serialize_input_datefmt (char *buf, void *dummy)
|
||||
|
||||
/* Serialize the value of a configuration variable. */
|
||||
static int
|
||||
config_serialize_conf (char *buf, const char *key)
|
||||
config_serialize_conf (char *buf, const char *key,
|
||||
struct config_save_status *status)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -425,7 +431,16 @@ config_serialize_conf (char *buf, const char *key)
|
||||
for (i = 0; i < sizeof (confmap) / sizeof (confmap[0]); i++)
|
||||
{
|
||||
if (!strcmp (confmap[i].key, key))
|
||||
return confmap[i].fn_serialize (buf, confmap[i].target);
|
||||
{
|
||||
if (confmap[i].fn_serialize (buf, confmap[i].target))
|
||||
{
|
||||
if (status)
|
||||
status->done[i] = 1;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
@ -510,10 +525,10 @@ config_load (void)
|
||||
}
|
||||
|
||||
static int
|
||||
config_save_cb (const char *key, const char *value, void *fp)
|
||||
config_save_cb (const char *key, const char *value, void *status)
|
||||
{
|
||||
char buf[BUFSIZ];
|
||||
int result = config_serialize_conf (buf, key);
|
||||
int result = config_serialize_conf (buf, key, (struct config_save_status *) status);
|
||||
|
||||
if (result < 0)
|
||||
EXIT (_("configuration variable unknown: \"%s\""), key);
|
||||
@ -522,18 +537,18 @@ config_save_cb (const char *key, const char *value, void *fp)
|
||||
EXIT (_("wrong configuration variable format for \"%s\""), key);
|
||||
/* NOTREACHED */
|
||||
|
||||
fputs (key, (FILE *) fp);
|
||||
fputc ('=', (FILE *) fp);
|
||||
fputs (buf, (FILE *) fp);
|
||||
fputc ('\n', (FILE *) fp);
|
||||
fputs (key, ((struct config_save_status *) status)->fp);
|
||||
fputc ('=', ((struct config_save_status *) status)->fp);
|
||||
fputs (buf, ((struct config_save_status *) status)->fp);
|
||||
fputc ('\n', ((struct config_save_status *) status)->fp);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
config_save_junk_cb (const char *data, void *fp)
|
||||
config_save_junk_cb (const char *data, void *status)
|
||||
{
|
||||
fputs (data, (FILE *) fp);
|
||||
fputs (data, ((struct config_save_status *) status)->fp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -543,7 +558,8 @@ config_save (void)
|
||||
{
|
||||
char tmppath[BUFSIZ];
|
||||
char *tmpext;
|
||||
FILE *fp_tmp;
|
||||
struct config_save_status status;
|
||||
int i;
|
||||
|
||||
strncpy (tmppath, get_tempdir (), BUFSIZ);
|
||||
strncat (tmppath, "/" CONF_PATH_NAME ".", BUFSIZ);
|
||||
@ -552,11 +568,22 @@ config_save (void)
|
||||
strncat (tmppath, tmpext, BUFSIZ);
|
||||
mem_free (tmpext);
|
||||
|
||||
fp_tmp = fopen (tmppath, "w");
|
||||
if (!fp_tmp)
|
||||
status.fp = fopen (tmppath, "w");
|
||||
if (!status.fp)
|
||||
return 0;
|
||||
config_file_walk (config_save_cb, config_save_junk_cb, (void *) fp_tmp);
|
||||
file_close (fp_tmp, __FILE_POS__);
|
||||
|
||||
memset (status.done, 0, sizeof (status.done));
|
||||
|
||||
config_file_walk (config_save_cb, config_save_junk_cb, (void *) &status);
|
||||
|
||||
/* Set variables that were missing from the configuration file. */
|
||||
for (i = 0; i < sizeof (confmap) / sizeof (confmap[0]); i++)
|
||||
{
|
||||
if (!status.done[i])
|
||||
config_save_cb (confmap[i].key, NULL, &status);
|
||||
}
|
||||
|
||||
file_close (status.fp, __FILE_POS__);
|
||||
|
||||
if (io_file_cp (tmppath, path_conf))
|
||||
unlink (tmppath);
|
||||
|
Loading…
x
Reference in New Issue
Block a user