On Sat, Mar 02 2013, Jani Nikula <jani@nikula.org> wrote: > Use realpath on the config path before writing. If that fails, > fallback to the previous behaviour. > > Previously 'notmuch setup' and 'notmuch config set' overwrote the > config file even if it was a symbolic link. > --- > notmuch-config.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/notmuch-config.c b/notmuch-config.c > index b5c2066..1e7389f 100644 > --- a/notmuch-config.c > +++ b/notmuch-config.c > @@ -461,7 +461,7 @@ int > notmuch_config_save (notmuch_config_t *config) > { > size_t length; > - char *data; > + char *data, *filename; > GError *error = NULL; > > data = g_key_file_to_data (config->key_file, &length, NULL); > @@ -470,14 +470,20 @@ notmuch_config_save (notmuch_config_t *config) > return 1; > } > > - if (! g_file_set_contents (config->filename, data, length, &error)) { > + /* Try not to overwrite symlinks. */ > + filename = realpath (config->filename, NULL); The code looks good to me. But should we handle realpath returning NULL differently. It should return NULL only on error. I suggest that when realpath returns NULL, descriptive enough error message is returned to the user so that the problem can be resolved and then tried again. Tomi > + > + if (! g_file_set_contents (filename ? filename : config->filename, > + data, length, &error)) { > fprintf (stderr, "Error saving configuration to %s: %s\n", > config->filename, error->message); > g_error_free (error); > + free (filename); > g_free (data); > return 1; > } > > + free (filename); > g_free (data); > return 0; > } > -- > 1.7.10.4 > > _______________________________________________ > notmuch mailing list > notmuch@notmuchmail.org > http://notmuchmail.org/mailman/listinfo/notmuch