#include "database-private.h"
#include <pwd.h>
+#include <netdb.h>
static const std::string CONFIG_PREFIX = "C";
};
static const char *_notmuch_config_key_to_string (notmuch_config_key_t key);
+static char *_expand_path (void *ctx, const char *key, const char *val);
static int
_notmuch_config_list_destroy (notmuch_config_list_t *list)
return status;
for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) {
- _notmuch_string_map_append (notmuch->config,
- notmuch_config_list_key (list),
- notmuch_config_list_value (list));
+ const char *key = notmuch_config_list_key (list);
+ char *normalized_val = _expand_path (list, key, notmuch_config_list_value (list));
+ _notmuch_string_map_append (notmuch->config, key, normalized_val);
+ talloc_free (normalized_val);
}
return status;
const char *
notmuch_config_values_get (notmuch_config_values_t *values)
{
- return talloc_strndup (values, values->iterator, values->tok_len);
+ return talloc_strndup (values->children, values->iterator, values->tok_len);
}
void
talloc_free (pairs);
}
+static char *
+_expand_path (void *ctx, const char *key, const char *val)
+{
+ char *expanded_val;
+
+ if ((strcmp (key, "database.path") == 0 ||
+ strcmp (key, "database.mail_root") == 0 ||
+ strcmp (key, "database.hook_dir") == 0 ||
+ strcmp (key, "database.backup_path") == 0 ) &&
+ val[0] != '/')
+ expanded_val = talloc_asprintf (ctx, "%s/%s", getenv ("HOME"), val);
+ else
+ expanded_val = talloc_strdup (ctx, val);
+
+ return expanded_val;
+}
+
notmuch_status_t
_notmuch_config_load_from_file (notmuch_database_t *notmuch,
GKeyFile *file)
keys = g_key_file_get_keys (file, *grp, NULL, NULL);
for (gchar **keys_p = keys; *keys_p; keys_p++) {
char *absolute_key = talloc_asprintf (notmuch, "%s.%s", *grp, *keys_p);
+ char *normalized_val;
val = g_key_file_get_value (file, *grp, *keys_p, NULL);
if (! val) {
status = NOTMUCH_STATUS_FILE_ERROR;
goto DONE;
}
- _notmuch_string_map_set (notmuch->config, absolute_key, val);
+ normalized_val = _expand_path (notmuch, absolute_key, val);
+ _notmuch_string_map_set (notmuch->config, absolute_key, normalized_val);
g_free (val);
talloc_free (absolute_key);
+ talloc_free (normalized_val);
if (status)
goto DONE;
}
return name;
}
+static char *
+_get_username_from_passwd_file (void *ctx)
+{
+ long pw_buf_size;
+ char *pw_buf;
+ struct passwd passwd, *ignored;
+ char *name;
+ int e;
+
+ pw_buf_size = sysconf (_SC_GETPW_R_SIZE_MAX);
+ if (pw_buf_size == -1) pw_buf_size = 64;
+ pw_buf = (char *) talloc_zero_size (ctx, pw_buf_size);
+
+ while ((e = getpwuid_r (getuid (), &passwd, pw_buf,
+ pw_buf_size, &ignored)) == ERANGE) {
+ pw_buf_size = pw_buf_size * 2;
+ pw_buf = (char *) talloc_zero_size (ctx, pw_buf_size);
+ }
+
+ if (e == 0)
+ name = talloc_strdup (ctx, passwd.pw_name);
+ else
+ name = talloc_strdup (ctx, "");
+
+ talloc_free (pw_buf);
+
+ return name;
+}
+
+static const char *
+_get_email_from_passwd_file (void *ctx)
+{
+
+ char hostname[256];
+ struct hostent *hostent;
+ const char *domainname;
+ char *email;
+
+ char *username = _get_username_from_passwd_file (ctx);
+
+ gethostname (hostname, 256);
+ hostname[255] = '\0';
+
+ hostent = gethostbyname (hostname);
+ if (hostent && (domainname = strchr (hostent->h_name, '.')))
+ domainname += 1;
+ else
+ domainname = "(none)";
+
+ email = talloc_asprintf (ctx, "%s@%s.%s",
+ username, hostname, domainname);
+
+ talloc_free (username);
+ return email;
+}
+
static const char *
_notmuch_config_key_to_string (notmuch_config_key_t key)
{
_notmuch_config_default (notmuch_database_t *notmuch, notmuch_config_key_t key)
{
char *path;
- const char *name;
+ const char *name, *email;
switch (key) {
case NOTMUCH_CONFIG_DATABASE_PATH:
case NOTMUCH_CONFIG_EXCLUDE_TAGS:
return "";
case NOTMUCH_CONFIG_NEW_TAGS:
- return "inbox;unread";
+ return "unread;inbox";
case NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS:
return "true";
case NOTMUCH_CONFIG_USER_NAME:
name = talloc_strdup (notmuch, name);
else
name = _get_name_from_passwd_file (notmuch);
-
return name;
- break;
+ case NOTMUCH_CONFIG_PRIMARY_EMAIL:
+ email = getenv ("EMAIL");
+ if (email)
+ email = talloc_strdup (notmuch, email);
+ else
+ email = _get_email_from_passwd_file (notmuch);
+ return email;
+ case NOTMUCH_CONFIG_NEW_IGNORE:
+ return "";
case NOTMUCH_CONFIG_HOOK_DIR:
case NOTMUCH_CONFIG_BACKUP_DIR:
- case NOTMUCH_CONFIG_NEW_IGNORE:
- case NOTMUCH_CONFIG_PRIMARY_EMAIL:
case NOTMUCH_CONFIG_OTHER_EMAIL:
return NULL;
default:
return _notmuch_string_map_get (notmuch->config, _notmuch_config_key_to_string (key));
}
+const char *
+notmuch_config_path (notmuch_database_t *notmuch)
+{
+ return notmuch->config_path;
+}
+
notmuch_status_t
notmuch_config_set (notmuch_database_t *notmuch, notmuch_config_key_t key, const char *val)
{