aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Carl Worth <cworth@cworth.org>2009-10-20 09:56:25 -0700
committerGravatar Carl Worth <cworth@cworth.org>2009-10-20 09:58:40 -0700
commit55c8ee9a862f8f25be84adb591564b3777d88135 (patch)
treea59eb08ca8615a241c621404007f6d7a9f6c2cf2
parented6ee7330d28c65cb3990cbe4a5ac6182bf23402 (diff)
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
-rw-r--r--database.cc53
-rw-r--r--notmuch.c20
-rw-r--r--notmuch.h17
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);
+
+ DONE:
+ if (notmuch_path)
+ free (notmuch_path);
+ if (local_path)
+ free (local_path);
- return notmuch_database_open (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);