From 55c8ee9a862f8f25be84adb591564b3777d88135 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Tue, 20 Oct 2009 09:56:25 -0700 Subject: [PATCH] notmuch_database_create/open: Fix to handle NULL as documented. When documenting these functions I described support for a NOTMUCH_BASE environment variable to be consulted in the case of a NULL path. Only, I had forgotten to actually write the code. This code exists now, with a new, exported function: notmuch_database_default_path --- database.cc | 53 ++++++++++++++++++++++++++++++++++++++++------------- notmuch.c | 20 +++++++------------- notmuch.h | 17 +++++++++++++++++ 3 files changed, 64 insertions(+), 26 deletions(-) diff --git a/database.cc b/database.cc index 70f80f9f..528ae115 100644 --- a/database.cc +++ b/database.cc @@ -379,24 +379,38 @@ parse_references (GPtrArray *array, } } +char * +notmuch_database_default_path (void) +{ + if (getenv ("NOTMUCH_BASE")) + return strdup (getenv ("NOTMUCH_BASE")); + + return g_strdup_printf ("%s/mail", getenv ("HOME")); +} + notmuch_database_t * notmuch_database_create (const char *path) { - char *notmuch_path; + notmuch_database_t *notmuch = NULL; + char *notmuch_path = NULL; struct stat st; int err; + char *local_path = NULL; + + if (path == NULL) + path = local_path = notmuch_database_default_path (); err = stat (path, &st); if (err) { fprintf (stderr, "Error: Cannot create database at %s: %s.\n", path, strerror (errno)); - return NULL; + goto DONE; } if (! S_ISDIR (st.st_mode)) { fprintf (stderr, "Error: Cannot create database at %s: Not a directory.\n", path); - return NULL; + goto DONE; } notmuch_path = g_strdup_printf ("%s/%s", path, ".notmuch"); @@ -406,22 +420,31 @@ notmuch_database_create (const char *path) if (err) { fprintf (stderr, "Error: Cannot create directory %s: %s.\n", notmuch_path, strerror (errno)); - free (notmuch_path); - return NULL; + goto DONE; } - free (notmuch_path); + notmuch = notmuch_database_open (path); - return notmuch_database_open (path); + DONE: + if (notmuch_path) + free (notmuch_path); + if (local_path) + free (local_path); + + return notmuch; } notmuch_database_t * notmuch_database_open (const char *path) { - notmuch_database_t *notmuch; - char *notmuch_path, *xapian_path; + notmuch_database_t *notmuch = NULL; + char *notmuch_path = NULL, *xapian_path = NULL; struct stat st; int err; + char *local_path = NULL; + + if (path == NULL) + path = local_path = notmuch_database_default_path (); notmuch_path = g_strdup_printf ("%s/%s", path, ".notmuch"); @@ -429,12 +452,10 @@ notmuch_database_open (const char *path) if (err) { fprintf (stderr, "Error: Cannot stat %s: %s\n", notmuch_path, strerror (err)); - free (notmuch_path); - return NULL; + goto DONE; } xapian_path = g_strdup_printf ("%s/%s", notmuch_path, "xapian"); - free (notmuch_path); /* C++ is so nasty in requiring these casts. I'm almost tempted to * write a C wrapper for Xapian... */ @@ -449,7 +470,13 @@ notmuch_database_open (const char *path) error.get_msg().c_str()); } - free (xapian_path); + DONE: + if (local_path) + free (local_path); + if (notmuch_path) + free (notmuch_path); + if (xapian_path) + free (xapian_path); return notmuch; } diff --git a/notmuch.c b/notmuch.c index 05aa52dc..dac19d89 100644 --- a/notmuch.c +++ b/notmuch.c @@ -310,25 +310,19 @@ setup_command (int argc, char *argv[]) "such as mb2md. In that case, press Control-C now and run notmuch again\n" "once the conversion is complete.\n\n"); - printf ("Top-level mail directory [~/mail]: "); - fflush (stdout); + { + char *default_path = notmuch_database_default_path (); + printf ("Top-level mail directory [%s]: ", default_path); + free (default_path); + fflush (stdout); + } mail_directory = read_line (); if (mail_directory == NULL || strlen (mail_directory) == 0) { - char *home; - if (mail_directory) free (mail_directory); - - home = getenv ("HOME"); - if (!home) { - fprintf (stderr, "Error: No mail directory provided HOME environment variable is not set.\n"); - fprintf (stderr, "Cowardly refusing to just guess where your mail might be.\n"); - exit (1); - } - - mail_directory = g_strdup_printf ("%s/mail", home); + mail_directory = notmuch_database_default_path (); } notmuch = notmuch_database_create (mail_directory); diff --git a/notmuch.h b/notmuch.h index e0b57db2..b63a7d77 100644 --- a/notmuch.h +++ b/notmuch.h @@ -110,6 +110,23 @@ notmuch_database_open (const char *path); void notmuch_database_close (notmuch_database_t *database); +/* Lookup the default database path. + * + * This is the path that will be used by notmuch_database_create and + * notmuch_database_open if given a NULL path. Specifically it will be + * the value of the NOTMUCH_BASE environment variable if set, + * otherwise ${HOME}/mail + * + * Returns a newly allocated string which the caller should free() + * when finished with it. + */ +char * +notmuch_database_default_path (void); + +/* Return the database path of the given database. + * + * The return value is a string owned by notmuch so should not be + * modified nor freed by the caller. */ const char * notmuch_database_get_path (notmuch_database_t *database);