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) }
|
{ "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_cb_t) (const char *, const char *, void *);
|
||||||
typedef int (*config_fn_walk_junk_cb_t) (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. */
|
/* Serialize the value of a configuration variable. */
|
||||||
static int
|
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;
|
int i;
|
||||||
|
|
||||||
@ -425,7 +431,16 @@ config_serialize_conf (char *buf, const char *key)
|
|||||||
for (i = 0; i < sizeof (confmap) / sizeof (confmap[0]); i++)
|
for (i = 0; i < sizeof (confmap) / sizeof (confmap[0]); i++)
|
||||||
{
|
{
|
||||||
if (!strcmp (confmap[i].key, key))
|
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;
|
return -1;
|
||||||
@ -510,10 +525,10 @@ config_load (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
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];
|
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)
|
if (result < 0)
|
||||||
EXIT (_("configuration variable unknown: \"%s\""), key);
|
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);
|
EXIT (_("wrong configuration variable format for \"%s\""), key);
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
|
|
||||||
fputs (key, (FILE *) fp);
|
fputs (key, ((struct config_save_status *) status)->fp);
|
||||||
fputc ('=', (FILE *) fp);
|
fputc ('=', ((struct config_save_status *) status)->fp);
|
||||||
fputs (buf, (FILE *) fp);
|
fputs (buf, ((struct config_save_status *) status)->fp);
|
||||||
fputc ('\n', (FILE *) fp);
|
fputc ('\n', ((struct config_save_status *) status)->fp);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -543,7 +558,8 @@ config_save (void)
|
|||||||
{
|
{
|
||||||
char tmppath[BUFSIZ];
|
char tmppath[BUFSIZ];
|
||||||
char *tmpext;
|
char *tmpext;
|
||||||
FILE *fp_tmp;
|
struct config_save_status status;
|
||||||
|
int i;
|
||||||
|
|
||||||
strncpy (tmppath, get_tempdir (), BUFSIZ);
|
strncpy (tmppath, get_tempdir (), BUFSIZ);
|
||||||
strncat (tmppath, "/" CONF_PATH_NAME ".", BUFSIZ);
|
strncat (tmppath, "/" CONF_PATH_NAME ".", BUFSIZ);
|
||||||
@ -552,11 +568,22 @@ config_save (void)
|
|||||||
strncat (tmppath, tmpext, BUFSIZ);
|
strncat (tmppath, tmpext, BUFSIZ);
|
||||||
mem_free (tmpext);
|
mem_free (tmpext);
|
||||||
|
|
||||||
fp_tmp = fopen (tmppath, "w");
|
status.fp = fopen (tmppath, "w");
|
||||||
if (!fp_tmp)
|
if (!status.fp)
|
||||||
return 0;
|
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))
|
if (io_file_cp (tmppath, path_conf))
|
||||||
unlink (tmppath);
|
unlink (tmppath);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user