diff options
Diffstat (limited to 'ident.c')
-rw-r--r-- | ident.c | 68 |
1 files changed, 54 insertions, 14 deletions
@@ -50,6 +50,54 @@ static void copy_gecos(const struct passwd *w, char *name, size_t sz) } +static int add_mailname_host(char *buf, size_t len) +{ + FILE *mailname; + + mailname = fopen("/etc/mailname", "r"); + if (!mailname) { + if (errno != ENOENT) + warning("cannot open /etc/mailname: %s", + strerror(errno)); + return -1; + } + if (!fgets(buf, len, mailname)) { + if (ferror(mailname)) + warning("cannot read /etc/mailname: %s", + strerror(errno)); + fclose(mailname); + return -1; + } + /* success! */ + fclose(mailname); + return 0; +} + +static void add_domainname(char *buf, size_t len) +{ + struct hostent *he; + size_t namelen; + const char *domainname; + + if (gethostname(buf, len)) { + warning("cannot get host name: %s", strerror(errno)); + strlcpy(buf, "(none)", len); + return; + } + namelen = strlen(buf); + if (memchr(buf, '.', namelen)) + return; + + he = gethostbyname(buf); + buf[namelen++] = '.'; + buf += namelen; + len -= namelen; + if (he && (domainname = strchr(he->h_name, '.'))) + strlcpy(buf, domainname + 1, len); + else + strlcpy(buf, "(none)", len); +} + static void copy_email(const struct passwd *pw) { /* @@ -61,20 +109,12 @@ static void copy_email(const struct passwd *pw) die("Your sysadmin must hate you!"); memcpy(git_default_email, pw->pw_name, len); git_default_email[len++] = '@'; - gethostname(git_default_email + len, sizeof(git_default_email) - len); - if (!strchr(git_default_email+len, '.')) { - struct hostent *he = gethostbyname(git_default_email + len); - char *domainname; - - len = strlen(git_default_email); - git_default_email[len++] = '.'; - if (he && (domainname = strchr(he->h_name, '.'))) - strlcpy(git_default_email + len, domainname + 1, - sizeof(git_default_email) - len); - else - strlcpy(git_default_email + len, "(none)", - sizeof(git_default_email) - len); - } + + if (!add_mailname_host(git_default_email + len, + sizeof(git_default_email) - len)) + return; /* read from "/etc/mailname" (Debian) */ + add_domainname(git_default_email + len, + sizeof(git_default_email) - len); } static void setup_ident(void) |