This is mainly copying code from the CLI into the lib. The CLI copy
will be deleted in a later commit.
---
lib/config.cc | 70 +++++++++++++++++++++++++++++++++++++++---
test/T590-libconfig.sh | 7 ++---
test/test-lib.sh | 6 +++-
3 files changed, 73 insertions(+), 10 deletions(-)
diff --git a/lib/config.cc b/lib/config.cc
index 38416632..36f242f2 100644
--- a/lib/config.cc
+++ b/lib/config.cc
@@ -23,6 +23,7 @@
#include "database-private.h"
#include <pwd.h>
+#include <netdb.h>
static const std::string CONFIG_PREFIX = "C";
@@ -488,6 +489,63 @@ _get_name_from_passwd_file (void *ctx)
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);
+ talloc_free (email);
+ return email;
+}
+
static const char *
_notmuch_config_key_to_string (notmuch_config_key_t key)
{
@@ -523,7 +581,7 @@ static const char *
_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:
@@ -549,13 +607,17 @@ _notmuch_config_default (notmuch_database_t *notmuch, notmuch_config_key_t key)
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_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:
diff --git a/test/T590-libconfig.sh b/test/T590-libconfig.sh
index 2c6e726c..292778d5 100755
--- a/test/T590-libconfig.sh
+++ b/test/T590-libconfig.sh
@@ -397,7 +397,7 @@ MAIL_DIR/.notmuch/backups
inbox;unread
NULL
true
-NULL
+USERNAME@FQDN
NULL
USER_FULL_NAME
== stderr ==
@@ -626,9 +626,6 @@ EOF
test_begin_subtest "notmuch_database_get_config (ndlc)"
-echo NOTMUCH_CONFIG=$NOTMUCH_CONFIG
-echo NOTMUCH_PROFILE=$NOTMUCH_PROFILE
-echo HOME=$HOME
cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL%
{
EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
@@ -742,7 +739,7 @@ MAIL_DIR/.notmuch/backups
inbox;unread
NULL
true
-NULL
+USERNAME@FQDN
NULL
USER_FULL_NAME
== stderr ==
diff --git a/test/test-lib.sh b/test/test-lib.sh
index fa2e401e..1f438042 100644
--- a/test/test-lib.sh
+++ b/test/test-lib.sh
@@ -107,6 +107,9 @@ unset GREP_OPTIONS
# For emacsclient
unset ALTERNATE_EDITOR
+# for reproducibility
+unset EMAIL
+
add_gnupg_home ()
{
[ -e "${GNUPGHOME}/gpg.conf" ] && return
@@ -697,8 +700,9 @@ notmuch_built_with_sanitize ()
notmuch_passwd_sanitize ()
{
local user=$(id -un)
+ local fqdn=$(hostname -f)
local full_name=$(getent passwd $user | cut -d: -f 5 | cut -d, -f1)
- sed "s/$full_name/USER_FULL_NAME/"
+ sed -e "s/$user/USERNAME/" -e "s/$fqdn/FQDN/" -e "s/$full_name/USER_FULL_NAME/"
}
notmuch_config_sanitize ()
--
2.30.2
_______________________________________________
notmuch mailing list -- notmuch@notmuchmail.org
To unsubscribe send an email to notmuch-leave@notmuchmail.org