X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Fmts.c;h=3588fecdcd7b902434761cfbd3f94495c9676492;hp=7941e090dc4c0eb2b39bf93f091f918e5fff2570;hb=f6aa95b724fd8c791164abe7ee5468bf5c34f226;hpb=81a21a9a97d8633f6d6231e31fdb6e328d0d3ff2 diff --git a/sbr/mts.c b/sbr/mts.c index 7941e09..3588fec 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. @@ -31,8 +29,11 @@ /* * static prototypes */ -static char *tailor_value (char *); +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 @@ -47,10 +48,6 @@ static void getuserinfo (void); */ static char *mtsconf = nmhetcdir(/mts.conf); -static char *localname = ""; -static char *localdomain = ""; -static char *systemname = ""; - char *mmdfldir = MAILSPOOL; char *mmdflfil = ""; char *uucpldir = "/usr/spool/mail"; @@ -64,7 +61,7 @@ static char username[BUFSIZ]; static char fullname[BUFSIZ]; /* Variables for username masquerading: */ - boolean draft_from_masquerading = FALSE; /* also used from post.c */ + boolean draft_from_masquerading = FALSE; static boolean mmailid_masquerading = FALSE; boolean username_extension_masquerading = FALSE; /* " from addrsbr.c */ static char* masquerade = ""; @@ -72,34 +69,7 @@ static char* masquerade = ""; /* * MTS specific variables */ -#if defined(SMTPMTS) -static char *sm_method = "smtp"; -int sm_mts = MTS_SMTP; -char *hostable = nmhetcdir(/hosts); char *sendmail = SENDMAILPATH; -#endif - -/* - * SMTP/POP stuff - */ -char *clientname = NULL; -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 @@ -125,9 +95,6 @@ struct bind { }; static struct bind binds[] = { - { "localname", &localname }, - { "localdomain", &localdomain }, - { "systemname", &systemname }, { "mmdfldir", &mmdfldir }, { "mmdflfil", &mmdflfil }, { "uucpldir", &uucpldir }, @@ -135,28 +102,7 @@ static struct bind binds[] = { { "mmdelim1", &mmdlm1 }, { "mmdelim2", &mmdlm2 }, { "masquerade", &masquerade }, - -#if defined(SMTPMTS) - { "mts", &sm_method }, - { "hostable", &hostable }, - { "sendmail", &sendmail }, -#endif - - { "clientname", &clientname }, - { "servers", &servers }, - { "pophost", &pophost }, - { "bbdomain", &bb_domain }, - -#ifdef BPOP - { "popbbhost", &popbbhost }, - { "popbbuser", &popbbuser }, - { "popbblist", &popbblist }, -#endif - -#ifdef NNTP - { "nntphost", &popbbhost }, -#endif - + { "sendmail", &sendmail }, { "maildelivery", &maildelivery }, { "everyone", &everyone }, { "noshell", &NoShell }, @@ -172,35 +118,22 @@ static struct bind binds[] = { void mts_init (char *name) { - char *bp, *cp, buffer[BUFSIZ]; - struct bind *b; + 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) @@ -211,17 +144,6 @@ mts_init (char *name) if (strstr(masquerade, "username_extension") != NULL) username_extension_masquerading = TRUE; - -#ifdef SMTPMTS - if (strcmp(sm_method, "smtp") == 0) - sm_mts = MTS_SMTP; - else if (strcmp(sm_method, "sendmail") == 0) - sm_mts = MTS_SENDMAIL; - else { - advise(NULL, "unsupported \"mts\" value in mts.conf: %s", sm_method); - sm_mts = MTS_SMTP; - } -#endif } @@ -233,7 +155,7 @@ mts_init (char *name) */ static char * -tailor_value (char *s) +tailor_value (unsigned char *s) { int i, r; char *bp; @@ -286,8 +208,7 @@ char * LocalName (void) { static char buffer[BUFSIZ] = ""; - struct hostent *hp; - + struct addrinfo hints, *res; #ifdef HAVE_UNAME struct utsname name; #endif @@ -298,33 +219,23 @@ LocalName (void) mts_init ("mts"); - /* check if the mts.conf file specifies a "localname" */ - if (*localname) { - strncpy (buffer, localname, sizeof(buffer)); - } else { + memset(buffer, 0, sizeof(buffer)); #ifdef HAVE_UNAME - /* first get our local name */ - uname (&name); - strncpy (buffer, name.nodename, sizeof(buffer)); + /* first get our local name */ + uname (&name); + strncpy (buffer, name.nodename, sizeof(buffer) - 1); #else - /* first get our local name */ - gethostname (buffer, sizeof(buffer)); + /* first get our local name */ + gethostname (buffer, sizeof(buffer) - 1); #endif -#ifdef HAVE_SETHOSTENT - sethostent (1); -#endif - /* now fully qualify our name */ - if ((hp = gethostbyname (buffer))) - strncpy (buffer, hp->h_name, sizeof(buffer)); - } - - /* - * If the mts.conf file specifies a "localdomain", - * we append that now. This should rarely be needed. - */ - if (*localdomain) { - strcat (buffer, "."); - strcat (buffer, localdomain); + /* now fully qualify our name */ + + 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); } return buffer; @@ -351,12 +262,6 @@ SystemName (void) mts_init ("mts"); - /* check if mts.conf file specifies a "systemname" */ - if (*systemname) { - strncpy (buffer, systemname, sizeof(buffer)); - return buffer; - } - #ifdef HAVE_UNAME uname (&name); strncpy (buffer, name.nodename, sizeof(buffer)); @@ -406,24 +311,13 @@ getfullname (void) static void getuserinfo (void) { - register char *cp, *np; + register unsigned char *cp; + 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 ()); @@ -524,3 +418,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; + } +}