X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-sys%2Funix.c;h=3e2c23dcdc3f7f125f820f683a86143695fa8147;hp=f2141c0c18849a0655a459ac80afdee7ec986d20;hb=9b87576a7ebf2e52a7ca6a0e2dba12fa24bd34dd;hpb=97677c08933e16e25ecb3c12473ef1efdab7962b diff --git a/lib-sys/unix.c b/lib-sys/unix.c index f2141c0..3e2c23d 100644 --- a/lib-sys/unix.c +++ b/lib-sys/unix.c @@ -8,21 +8,13 @@ * please see the file GPL in the top level source directory. */ -#include -#include -#include -#include - -#include -#include -#include +#include #include "unix.h" #include "mutt_signal.h" #include /* for imap_wait_keepalive EEEEK */ - /* Extract the real name from /etc/passwd's GECOS field. * When set, honor the regular expression in rx, * otherwise assume that the GECOS field is a comma-separated list. @@ -39,7 +31,7 @@ ssize_t mutt_gecos_name(char *dst, ssize_t n, struct passwd *pw, rx_t *rx) if (!pw->pw_gecos) return 0; - if (rx) { + if (rx->rx) { regmatch_t pat_match[1]; if (regexec(rx->rx, pw->pw_gecos, 1, pat_match, 0)) { @@ -47,16 +39,16 @@ ssize_t mutt_gecos_name(char *dst, ssize_t n, struct passwd *pw, rx_t *rx) } p = pw->pw_gecos + pat_match[0].rm_so; - end = pw->pw_gecos + pat_match[0].rm_so; + end = pw->pw_gecos + pat_match[0].rm_eo; } else { p = pw->pw_gecos; end = m_strchrnul(pw->pw_gecos, ','); } for (;;) { - const char *q = MIN(end, m_strchrnul(p, '&')); + const char *q = m_strchrnul(p, '&'); - len += m_strncpy(dst + len, n - len, p, q - p); + len += m_strncpy(dst + len, n - len, p, MIN(end, q) - p); p = q + 1; if (!p[-1] || p >= end) @@ -156,3 +148,41 @@ int _mutt_system(const char *cmd, int flags) return (pid > 0 && WIFEXITED(rc)) ? WEXITSTATUS(rc) : -1; } + +int getdnsdomainname(char *s, ssize_t n) +{ + char tmp[1024]; + FILE *f; + + if ((f = fopen("/etc/resolv.conf", "r")) == NULL) + return -1; + + while (fgets(tmp, sizeof(tmp), f)) { + const char *p = skipspaces(tmp); + + if (m_strncmp("domain", p, 6) && m_strncmp("search", p, 6)) + continue; + + p += 6; + + while (*p) { + int trailing_dot; + const char *q; + + p = skipspaces(p); + q = m_strnextsp(p); + + trailing_dot = q[-1] == '.'; + if (!trailing_dot || q > p + 1) { + m_strncpy(s, n, p, q - trailing_dot - p); + m_fclose(&f); + return 0; + } + + p = q; + } + } + + m_fclose(&f); + return -1; +}