X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Fmts.c;h=834579d166fc70286381aff4db10ffd326a9d77f;hb=3a84d814004fd4557bf4f44952648e9e69bd22a8;hp=cc5ff8e3bbfdee77ffc65d35c59831323233d224;hpb=13f84dd50ca5754391dbd3296a5c7425f9363600;p=mmh diff --git a/sbr/mts.c b/sbr/mts.c index cc5ff8e..834579d 100644 --- a/sbr/mts.c +++ b/sbr/mts.c @@ -2,8 +2,6 @@ /* * mts.c -- definitions for the mail transport system * - * $Id$ - * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for * complete copyright information. @@ -19,20 +17,17 @@ #include #include #include +#include #include -#ifdef HAVE_SYS_UTSNAME_H -# include -#endif - -#define NOTOK (-1) -#define OK 0 - /* * static prototypes */ static char *tailor_value (unsigned char *); static void getuserinfo (void); +static const char *get_mtsconf_pathname(void); +static const char *get_mtsuserconf_pathname(void); +static void mts_read_conf_file (FILE *fp); /* * *mmdfldir and *uucpldir are the maildrop directories. If maildrops @@ -87,21 +82,6 @@ char *servers = "localhost \01localnet"; char *pophost = ""; /* - * BBoards-specific variables - */ -char *bb_domain = ""; - - -/* - * POP BBoards-specific variables - */ -#ifdef BPOP -char *popbbhost = ""; -char *popbbuser = ""; -char *popbblist = nmhetcdir(/hosts.popbb); -#endif /* BPOP */ - -/* * Global MailDelivery file */ char *maildelivery = nmhetcdir(/maildelivery); @@ -145,17 +125,6 @@ static struct bind binds[] = { { "clientname", &clientname }, { "servers", &servers }, { "pophost", &pophost }, - { "bbdomain", &bb_domain }, - -#ifdef BPOP - { "popbbhost", &popbbhost }, - { "popbbuser", &popbbuser }, - { "popbblist", &popbblist }, -#endif - -#ifdef NNTP - { "nntphost", &popbbhost }, -#endif { "maildelivery", &maildelivery }, { "everyone", &everyone }, @@ -172,36 +141,24 @@ static struct bind binds[] = { void mts_init (char *name) { - unsigned char *bp; - char *cp, buffer[BUFSIZ]; - struct bind *b; + NMH_UNUSED (name); + + const char *cp; FILE *fp; static int inited = 0; - if (inited++ || (fp = fopen (mtsconf, "r")) == NULL) + if (inited++ || (fp = fopen (get_mtsconf_pathname(), "r")) == NULL) return; + mts_read_conf_file(fp); + fclose (fp); - while (fgets (buffer, sizeof(buffer), fp)) { - if (!(cp = strchr(buffer, '\n'))) - break; - *cp = 0; - if (*buffer == '#' || *buffer == '\0') - continue; - if (!(bp = strchr(buffer, ':'))) - break; - *bp++ = 0; - while (isspace (*bp)) - *bp++ = 0; - - for (b = binds; b->keyword; b++) - if (!strcmp (buffer, b->keyword)) - break; - if (b->keyword && (cp = tailor_value (bp))) - *b->value = cp; + cp = get_mtsuserconf_pathname(); + if (cp != NULL && + ((fp = fopen (get_mtsuserconf_pathname(), "r")) != NULL)) { + mts_read_conf_file(fp); + fclose (fp); } - fclose (fp); - Everyone = atoi (everyone); if (strstr(masquerade, "draft_from") != NULL) @@ -287,11 +244,7 @@ char * LocalName (void) { static char buffer[BUFSIZ] = ""; - struct hostent *hp; - -#ifdef HAVE_UNAME - struct utsname name; -#endif + struct addrinfo hints, *res; /* check if we have cached the local name */ if (buffer[0]) @@ -303,20 +256,18 @@ LocalName (void) if (*localname) { strncpy (buffer, localname, sizeof(buffer)); } else { -#ifdef HAVE_UNAME - /* first get our local name */ - uname (&name); - strncpy (buffer, name.nodename, sizeof(buffer)); -#else + memset(buffer, 0, sizeof(buffer)); /* first get our local name */ - gethostname (buffer, sizeof(buffer)); -#endif -#ifdef HAVE_SETHOSTENT - sethostent (1); -#endif + gethostname (buffer, sizeof(buffer) - 1); /* now fully qualify our name */ - if ((hp = gethostbyname (buffer))) - strncpy (buffer, hp->h_name, sizeof(buffer)); + + memset(&hints, 0, sizeof(hints)); + hints.ai_flags = AI_CANONNAME; + hints.ai_family = PF_UNSPEC; + if (getaddrinfo(buffer, NULL, &hints, &res) == 0) { + strncpy(buffer, res->ai_canonname, sizeof(buffer) - 1); + freeaddrinfo(res); + } } /* @@ -342,10 +293,6 @@ SystemName (void) { static char buffer[BUFSIZ] = ""; -#ifdef HAVE_UNAME - struct utsname name; -#endif - /* check if we have cached the system name */ if (buffer[0]) return buffer; @@ -358,12 +305,7 @@ SystemName (void) return buffer; } -#ifdef HAVE_UNAME - uname (&name); - strncpy (buffer, name.nodename, sizeof(buffer)); -#else gethostname (buffer, sizeof(buffer)); -#endif return buffer; } @@ -411,21 +353,9 @@ getuserinfo (void) register char *np; register struct passwd *pw; -#ifdef KPOP - uid_t uid; - - uid = getuid (); - if (uid == geteuid () && (cp = getenv ("USER")) != NULL - && (pw = getpwnam (cp)) != NULL) - strncpy (username, cp, sizeof(username)); - else if ((pw = getpwuid (uid)) == NULL - || pw->pw_name == NULL - || *pw->pw_name == '\0') { -#else /* KPOP */ if ((pw = getpwuid (getuid ())) == NULL || pw->pw_name == NULL || *pw->pw_name == '\0') { -#endif /* KPOP */ strncpy (username, "unknown", sizeof(username)); snprintf (fullname, sizeof(fullname), "The Unknown User-ID (%d)", (int) getuid ()); @@ -439,7 +369,6 @@ getuserinfo (void) field, like phone number. Also, if mmailid masquerading is turned on due to "mmailid" appearing on the "masquerade:" line of mts.conf, stop if we hit a '<' (which should precede any ','s). */ -#ifndef BSD42 if (mmailid_masquerading) /* Stop at ',' or '<'. */ for (cp = fullname; *np != '\0' && *np != ',' && *np != '<'; @@ -454,46 +383,6 @@ getuserinfo (void) for (cp = fullname; *np != '\0' && *np != ','; *cp++ = *np++) continue; -#else /* BSD42 */ - /* On BSD(-derived) systems, the system utilities that deal with the GECOS - field (finger, mail, sendmail, etc.) translate any '&' character in it to - the login name, with the first letter capitalized. So, for instance, - fingering a user "bob" with the GECOS field "& Jones" would reveal him to - be "In real life: Bob Jones". Surprisingly, though, the OS doesn't do - the translation for you, so we have to do it manually here. */ - if (mmailid_masquerading) - /* Stop at ',' or '<'. */ - for (cp = fullname; - *np != '\0' && *np != ',' && *np != '<';) { - if (*np == '&') { /* blech! */ - strcpy (cp, pw->pw_name); - *cp = toupper(*cp); - while (*cp) - cp++; - np++; - } else { - *cp++ = *np++; - } - } - else - /* Allow '<' as a legal character of the user's name. This code is - basically a duplicate of the code above the "else" -- we don't - collapse it down to one copy and put the mmailid_masquerading check - inside the loop with "(x ? y : z)" because that's inefficient and the - value'll never change while it's in there. */ - for (cp = fullname; - *np != '\0' && *np != ',';) { - if (*np == '&') { /* blech! */ - strcpy (cp, pw->pw_name); - *cp = toupper(*cp); - while (*cp) - cp++; - np++; - } else { - *cp++ = *np++; - } - } -#endif /* BSD42 */ *cp = '\0'; if (mmailid_masquerading) { @@ -526,3 +415,50 @@ getuserinfo (void) return; } + +static const char* +get_mtsconf_pathname (void) +{ + const char *cp = getenv ( "MHMTSCONF "); + if (cp != NULL && *cp != '\0') { + return cp; + } + return mtsconf; +} + +static const char* +get_mtsuserconf_pathname (void) +{ + const char *cp = getenv ( "MHMTSUSERCONF" ); + if (cp != NULL && *cp != '\0') { + return cp; + } + return NULL; +} + +static void +mts_read_conf_file (FILE *fp) +{ + unsigned char *bp; + char *cp, buffer[BUFSIZ]; + struct bind *b; + + while (fgets (buffer, sizeof(buffer), fp)) { + if (!(cp = strchr(buffer, '\n'))) + break; + *cp = 0; + if (*buffer == '#' || *buffer == '\0') + continue; + if (!(bp = strchr(buffer, ':'))) + break; + *bp++ = 0; + while (isspace (*bp)) + *bp++ = 0; + + for (b = binds; b->keyword; b++) + if (!strcmp (buffer, b->keyword)) + break; + if (b->keyword && (cp = tailor_value (bp))) + *b->value = cp; + } +}