X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Fmts.c;h=ced0cf73e4d4a4ade5d5838077fcfb1f735a6a69;hb=bf5e3d96f882fe51157059787cd658d4a7ddd840;hp=4e02831547347e1d942b2df0bce27f566e1ad595;hpb=a485ed478abbd599d8c9aab48934e7a26733ecb1;p=mmh diff --git a/sbr/mts.c b/sbr/mts.c index 4e02831..ced0cf7 100644 --- a/sbr/mts.c +++ b/sbr/mts.c @@ -1,17 +1,14 @@ /* - * mts.c -- definitions for the mail transport system - * - * 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. - */ +** mts.c -- definitions for the mail transport system +** +** 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. +*/ #include /* for snprintf() */ #include #include - -#define nmhetcdir(file) NMHETCDIR#file - #include #include #include @@ -26,34 +23,19 @@ #define OK 0 /* - * static prototypes - */ -static char *tailor_value (unsigned char *); -static void getuserinfo (void); +** 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 - * are kept in the user's home directory, then these should be empty - * strings. In this case, the appropriate ...lfil array should contain - * the name of the file in the user's home directory. Usually, this is - * something like ".mail". - */ +static void mts_read_conf_file(FILE *fp); /* - * nmh mail transport interface customization file - */ -static char *mtsconf = nmhetcdir(/mts.conf); - -char *mmdfldir = MAILSPOOL; -char *mmdflfil = ""; -char *uucpldir = "/usr/spool/mail"; -char *uucplfil = ""; +** nmh mail transport interface customization file +*/ +static char *mtsconf = NMHETCDIR"/mts.conf"; -char *mmdlm1 = "\001\001\001\001\n"; -char *mmdlm2 = "\001\001\001\001\n"; /* Cache the username and fullname of the user */ static char username[BUFSIZ]; @@ -66,22 +48,14 @@ boolean username_extension_masquerading = FALSE; /* " from addrsbr.c */ static char* masquerade = ""; /* - * Global MailDelivery file - */ -char *maildelivery = nmhetcdir(/maildelivery); - - -/* - * Aliasing Facility (doesn't belong here) - */ -int Everyone = NOTOK; -static char *everyone = "-1"; -char *NoShell = ""; +** Global MailDelivery file +*/ +char *maildelivery = NMHETCDIR"/maildelivery"; /* - * Customize the MTS settings for nmh by adjusting - * the file mts.conf in the nmh etc directory. - */ +** Customize the MTS settings for nmh by adjusting +** the file mts.conf in the nmh etc directory. +*/ struct bind { char *keyword; @@ -89,46 +63,36 @@ struct bind { }; static struct bind binds[] = { - { "mmdfldir", &mmdfldir }, - { "mmdflfil", &mmdflfil }, - { "uucpldir", &uucpldir }, - { "uucplfil", &uucplfil }, - { "mmdelim1", &mmdlm1 }, - { "mmdelim2", &mmdlm2 }, { "masquerade", &masquerade }, { "maildelivery", &maildelivery }, - { "everyone", &everyone }, - { "noshell", &NoShell }, { NULL, NULL } }; /* - * Read the configuration file for the nmh interface - * to the mail transport system (MTS). - */ +** Read the configuration file for the nmh interface +** to the mail transport system (MTS). +*/ void -mts_init (char *name) +mts_init(char *name) { const char *cp; FILE *fp; static int inited = 0; - if (inited++ || (fp = fopen (get_mtsconf_pathname(), "r")) == NULL) + if (inited++ || (fp = fopen(get_mtsconf_pathname(), "r")) == NULL) return; mts_read_conf_file(fp); - fclose (fp); + fclose(fp); cp = get_mtsuserconf_pathname(); if (cp != NULL && - ((fp = fopen (get_mtsuserconf_pathname(), "r")) != 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) draft_from_masquerading = TRUE; @@ -143,12 +107,12 @@ mts_init (char *name) #define QUOTE '\\' /* - * Convert escaped values, malloc some new space, - * and copy string to malloc'ed memory. - */ +** Convert escaped values, malloc some new space, +** and copy string to malloc'ed memory. +*/ static char * -tailor_value (unsigned char *s) +tailor_value(unsigned char *s) { int i, r; char *bp; @@ -160,45 +124,45 @@ tailor_value (unsigned char *s) *bp = *s; } else { switch (*++s) { - case 'b': *bp = '\b'; break; - case 'f': *bp = '\f'; break; - case 'n': *bp = '\n'; break; - case 't': *bp = '\t'; break; - - case 0: s--; - case QUOTE: - *bp = QUOTE; - break; - - default: - if (!isdigit (*s)) { - *bp++ = QUOTE; - *bp = *s; - } - r = *s != '0' ? 10 : 8; - for (i = 0; isdigit (*s); s++) - i = i * r + *s - '0'; - s--; - *bp = toascii (i); - break; + case 'b': *bp = '\b'; break; + case 'f': *bp = '\f'; break; + case 'n': *bp = '\n'; break; + case 't': *bp = '\t'; break; + + case 0: s--; + case QUOTE: + *bp = QUOTE; + break; + + default: + if (!isdigit(*s)) { + *bp++ = QUOTE; + *bp = *s; + } + r = *s != '0' ? 10 : 8; + for (i = 0; isdigit(*s); s++) + i = i * r + *s - '0'; + s--; + *bp = toascii(i); + break; } } } *bp = 0; - len = strlen (buffer) + 1; - bp = mh_xmalloc (len); - memcpy (bp, buffer, len); + len = strlen(buffer) + 1; + bp = mh_xmalloc(len); + memcpy(bp, buffer, len); return bp; } /* - * Get the fully qualified name of the local host. - */ +** Get the fully qualified name of the local host. +*/ char * -LocalName (void) +LocalName(void) { static char buffer[BUFSIZ] = ""; struct addrinfo hints, *res; @@ -210,16 +174,16 @@ LocalName (void) if (buffer[0]) return buffer; - mts_init ("mts"); + mts_init("mts"); memset(buffer, 0, sizeof(buffer)); #ifdef HAVE_UNAME /* first get our local name */ - uname (&name); - strncpy (buffer, name.nodename, sizeof(buffer) - 1); + uname(&name); + strncpy(buffer, name.nodename, sizeof(buffer) - 1); #else /* first get our local name */ - gethostname (buffer, sizeof(buffer) - 1); + gethostname(buffer, sizeof(buffer) - 1); #endif /* now fully qualify our name */ @@ -236,12 +200,12 @@ LocalName (void) /* - * This is only for UUCP mail. It gets the hostname - * as part of the UUCP "domain". - */ +** This is only for UUCP mail. It gets the hostname +** as part of the UUCP "domain". +*/ char * -SystemName (void) +SystemName(void) { static char buffer[BUFSIZ] = ""; @@ -253,13 +217,13 @@ SystemName (void) if (buffer[0]) return buffer; - mts_init ("mts"); + mts_init("mts"); #ifdef HAVE_UNAME - uname (&name); - strncpy (buffer, name.nodename, sizeof(buffer)); + uname(&name); + strncpy(buffer, name.nodename, sizeof(buffer)); #else - gethostname (buffer, sizeof(buffer)); + gethostname(buffer, sizeof(buffer)); #endif return buffer; @@ -267,11 +231,11 @@ SystemName (void) /* - * Get the username of current user - */ +** Get the username of current user +*/ char * -getusername (void) +getusername(void) { if (username[0] == '\0') getuserinfo(); @@ -281,12 +245,12 @@ getusername (void) /* - * Get full name of current user (typically from GECOS - * field of password file). - */ +** Get full name of current user (typically from GECOS +** field of password file). +*/ char * -getfullname (void) +getfullname(void) { if (username[0] == '\0') getuserinfo(); @@ -296,34 +260,37 @@ getfullname (void) /* - * Find the user's username and full name, and cache them. - * Also, handle "mmailid" username masquerading controlled from the GECOS field - * of the passwd file. - */ +** Find the user's username and full name, and cache them. +** Also, handle "mmailid" username masquerading controlled from the GECOS field +** of the passwd file. +*/ static void -getuserinfo (void) +getuserinfo(void) { register unsigned char *cp; register char *np; register struct passwd *pw; - if ((pw = getpwuid (getuid ())) == NULL + if ((pw = getpwuid(getuid())) == NULL || pw->pw_name == NULL || *pw->pw_name == '\0') { - strncpy (username, "unknown", sizeof(username)); - snprintf (fullname, sizeof(fullname), "The Unknown User-ID (%d)", - (int) getuid ()); + strncpy(username, "unknown", sizeof(username)); + snprintf(fullname, sizeof(fullname), "The Unknown User-ID (%d)", + (int) getuid()); return; } np = pw->pw_gecos; - /* Get the user's real name from the GECOS field. Stop once we hit a ',', - * which some OSes use to separate other 'finger' information in the GECOS - * 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). */ + /* + ** Get the user's real name from the GECOS field. Stop once + ** we hit a ',', which some OSes use to separate other 'finger' + ** information in the GECOS 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 '<'. */ @@ -331,26 +298,32 @@ getuserinfo (void) *cp++ = *np++) continue; 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. */ + /* + ** 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 != ','; *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. */ + /* + ** 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); + strcpy(cp, pw->pw_name); *cp = toupper(*cp); while (*cp) cp++; @@ -360,14 +333,17 @@ getuserinfo (void) } } 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. */ + /* + ** 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); + strcpy(cp, pw->pw_name); *cp = toupper(*cp); while (*cp) cp++; @@ -380,11 +356,13 @@ getuserinfo (void) *cp = '\0'; if (mmailid_masquerading) { - /* Do mmailid processing. The GECOS field should have the form - * "Full Name ". For instance, - * "Dan Harkless ". Naturally, you'll want your MTA to - * have an alias (e.g. in /etc/aliases) from "fakeusername" to your - * account name. */ + /* + ** Do mmailid processing. The GECOS field should have + ** the form "Full Name ". For instance, + ** "Dan Harkless ". Naturally, you'll want + ** your MTA to have an alias (e.g. in /etc/aliases) from + ** "fakeusername" to your account name. + */ if (*np) np++; for (cp = username; *np && *np != '>'; *cp++ = *np++) @@ -392,28 +370,30 @@ getuserinfo (void) *cp = '\0'; } if (!mmailid_masquerading || *np == '\0') - strncpy (username, pw->pw_name, sizeof(username)); + strncpy(username, pw->pw_name, sizeof(username)); - /* The $SIGNATURE environment variable overrides the GECOS field's - * idea of your real name. */ - if ((cp = getenv ("SIGNATURE")) && *cp) - strncpy (fullname, cp, sizeof(fullname)); + /* + ** The $SIGNATURE environment variable overrides the GECOS field's + ** idea of your real name. + */ + if ((cp = getenv("SIGNATURE")) && *cp) + strncpy(fullname, cp, sizeof(fullname)); if (strchr(fullname, '.')) { /* quote any .'s */ char tmp[BUFSIZ]; /* should quote "'s too */ - snprintf (tmp, sizeof(tmp), "\"%s\"", fullname); - strncpy (fullname, tmp, sizeof(fullname)); + snprintf(tmp, sizeof(tmp), "\"%s\"", fullname); + strncpy(fullname, tmp, sizeof(fullname)); } return; } static const char* -get_mtsconf_pathname (void) +get_mtsconf_pathname(void) { - const char *cp = getenv ( "MHMTSCONF "); + const char *cp = getenv( "MHMTSCONF "); if (cp != NULL && *cp != '\0') { return cp; } @@ -421,9 +401,9 @@ get_mtsconf_pathname (void) } static const char* -get_mtsuserconf_pathname (void) +get_mtsuserconf_pathname(void) { - const char *cp = getenv ( "MHMTSUSERCONF" ); + const char *cp = getenv( "MHMTSUSERCONF" ); if (cp != NULL && *cp != '\0') { return cp; } @@ -431,13 +411,13 @@ get_mtsuserconf_pathname (void) } static void -mts_read_conf_file (FILE *fp) +mts_read_conf_file(FILE *fp) { unsigned char *bp; char *cp, buffer[BUFSIZ]; struct bind *b; - while (fgets (buffer, sizeof(buffer), fp)) { + while (fgets(buffer, sizeof(buffer), fp)) { if (!(cp = strchr(buffer, '\n'))) break; *cp = 0; @@ -446,13 +426,13 @@ mts_read_conf_file (FILE *fp) if (!(bp = strchr(buffer, ':'))) break; *bp++ = 0; - while (isspace (*bp)) + while (isspace(*bp)) *bp++ = 0; for (b = binds; b->keyword; b++) - if (!strcmp (buffer, b->keyword)) + if (strcmp(buffer, b->keyword)==0) break; - if (b->keyword && (cp = tailor_value (bp))) + if (b->keyword && (cp = tailor_value(bp))) *b->value = cp; } }