X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Fmts.c;h=4e02831547347e1d942b2df0bce27f566e1ad595;hp=6418ef5e988d1ebbd6c067f80b49b990d6edc7a6;hb=a485ed478abbd599d8c9aab48934e7a26733ecb1;hpb=f480c03187724e54e5391ee61b810827da319a6c diff --git a/sbr/mts.c b/sbr/mts.c index 6418ef5..4e02831 100644 --- a/sbr/mts.c +++ b/sbr/mts.c @@ -1,4 +1,3 @@ - /* * mts.c -- definitions for the mail transport system * @@ -23,8 +22,8 @@ # include #endif -#define NOTOK (-1) -#define OK 0 +#define NOTOK (-1) +#define OK 0 /* * static prototypes @@ -61,10 +60,10 @@ static char username[BUFSIZ]; static char fullname[BUFSIZ]; /* Variables for username masquerading: */ - boolean draft_from_masquerading = FALSE; +boolean draft_from_masquerading = FALSE; static boolean mmailid_masquerading = FALSE; - boolean username_extension_masquerading = FALSE; /* " from addrsbr.c */ -static char* masquerade = ""; +boolean username_extension_masquerading = FALSE; /* " from addrsbr.c */ +static char* masquerade = ""; /* * Global MailDelivery file @@ -85,22 +84,22 @@ char *NoShell = ""; */ struct bind { - char *keyword; - char **value; + char *keyword; + char **value; }; 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 } + { "mmdfldir", &mmdfldir }, + { "mmdflfil", &mmdflfil }, + { "uucpldir", &uucpldir }, + { "uucplfil", &uucplfil }, + { "mmdelim1", &mmdlm1 }, + { "mmdelim2", &mmdlm2 }, + { "masquerade", &masquerade }, + { "maildelivery", &maildelivery }, + { "everyone", &everyone }, + { "noshell", &NoShell }, + { NULL, NULL } }; @@ -112,36 +111,36 @@ static struct bind binds[] = { void mts_init (char *name) { - const char *cp; - FILE *fp; - static int inited = 0; - - if (inited++ || (fp = fopen (get_mtsconf_pathname(), "r")) == NULL) - return; - mts_read_conf_file(fp); - fclose (fp); - - cp = get_mtsuserconf_pathname(); - if (cp != NULL && - ((fp = fopen (get_mtsuserconf_pathname(), "r")) != NULL)) { - mts_read_conf_file(fp); - fclose (fp); - } + const char *cp; + FILE *fp; + static int inited = 0; + + if (inited++ || (fp = fopen (get_mtsconf_pathname(), "r")) == NULL) + return; + mts_read_conf_file(fp); + fclose (fp); + + cp = get_mtsuserconf_pathname(); + if (cp != NULL && + ((fp = fopen (get_mtsuserconf_pathname(), "r")) != NULL)) { + mts_read_conf_file(fp); + fclose (fp); + } - Everyone = atoi (everyone); + Everyone = atoi (everyone); - if (strstr(masquerade, "draft_from") != NULL) - draft_from_masquerading = TRUE; + if (strstr(masquerade, "draft_from") != NULL) + draft_from_masquerading = TRUE; - if (strstr(masquerade, "mmailid") != NULL) - mmailid_masquerading = TRUE; + if (strstr(masquerade, "mmailid") != NULL) + mmailid_masquerading = TRUE; - if (strstr(masquerade, "username_extension") != NULL) - username_extension_masquerading = TRUE; + if (strstr(masquerade, "username_extension") != NULL) + username_extension_masquerading = TRUE; } -#define QUOTE '\\' +#define QUOTE '\\' /* * Convert escaped values, malloc some new space, @@ -151,47 +150,47 @@ mts_init (char *name) static char * tailor_value (unsigned char *s) { - int i, r; - char *bp; - char buffer[BUFSIZ]; - size_t len; - - for (bp = buffer; *s; bp++, s++) { - if (*s != QUOTE) { - *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; + int i, r; + char *bp; + char buffer[BUFSIZ]; + size_t len; + + for (bp = buffer; *s; bp++, s++) { + if (*s != QUOTE) { *bp = *s; - } - r = *s != '0' ? 10 : 8; - for (i = 0; isdigit (*s); s++) - i = i * r + *s - '0'; - s--; - *bp = toascii (i); - break; - } + } 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; + } + } } - } - *bp = 0; + *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; + return bp; } /* @@ -201,38 +200,38 @@ tailor_value (unsigned char *s) char * LocalName (void) { - static char buffer[BUFSIZ] = ""; - struct addrinfo hints, *res; + static char buffer[BUFSIZ] = ""; + struct addrinfo hints, *res; #ifdef HAVE_UNAME - struct utsname name; + struct utsname name; #endif - /* check if we have cached the local name */ - if (buffer[0]) - return buffer; + /* check if we have cached the local name */ + if (buffer[0]) + return buffer; - mts_init ("mts"); + mts_init ("mts"); - memset(buffer, 0, sizeof(buffer)); + memset(buffer, 0, sizeof(buffer)); #ifdef HAVE_UNAME - /* first get our local name */ - uname (&name); - strncpy (buffer, name.nodename, sizeof(buffer) - 1); + /* first get our local name */ + uname (&name); + strncpy (buffer, name.nodename, sizeof(buffer) - 1); #else - /* first get our local name */ - gethostname (buffer, sizeof(buffer) - 1); + /* first get our local name */ + gethostname (buffer, sizeof(buffer) - 1); #endif - /* 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); - } + /* 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; + return buffer; } @@ -244,26 +243,26 @@ LocalName (void) char * SystemName (void) { - static char buffer[BUFSIZ] = ""; + static char buffer[BUFSIZ] = ""; #ifdef HAVE_UNAME - struct utsname name; + struct utsname name; #endif - /* check if we have cached the system name */ - if (buffer[0]) - return buffer; + /* check if we have cached the system name */ + 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; + return buffer; } @@ -274,10 +273,10 @@ SystemName (void) char * getusername (void) { - if (username[0] == '\0') - getuserinfo(); + if (username[0] == '\0') + getuserinfo(); - return username; + return username; } @@ -289,173 +288,171 @@ getusername (void) char * getfullname (void) { - if (username[0] == '\0') - getuserinfo(); + if (username[0] == '\0') + getuserinfo(); - return fullname; + return fullname; } /* * 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. + * of the passwd file. */ static void getuserinfo (void) { - register unsigned char *cp; - register char *np; - register struct passwd *pw; - - 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 ()); - return; - } + register unsigned char *cp; + register char *np; + register struct passwd *pw; + + 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 ()); + return; + } - np = pw->pw_gecos; + 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 '<'. */ - for (cp = fullname; *np != '\0' && *np != ',' && *np != '<'; - *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. */ - for (cp = fullname; *np != '\0' && *np != ','; - *cp++ = *np++) - continue; + if (mmailid_masquerading) + /* Stop at ',' or '<'. */ + for (cp = fullname; *np != '\0' && *np != ',' && *np != '<'; + *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. */ + 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++; - } - } + /* 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) { - /* 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++) - continue; *cp = '\0'; - } - if (!mmailid_masquerading || *np == '\0') - 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)); + 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. */ + if (*np) + np++; + for (cp = username; *np && *np != '>'; *cp++ = *np++) + continue; + *cp = '\0'; + } + if (!mmailid_masquerading || *np == '\0') + strncpy (username, pw->pw_name, sizeof(username)); - if (strchr(fullname, '.')) { /* quote any .'s */ - char tmp[BUFSIZ]; + /* The $SIGNATURE environment variable overrides the GECOS field's + * idea of your real name. */ + if ((cp = getenv ("SIGNATURE")) && *cp) + strncpy (fullname, cp, sizeof(fullname)); - /* should quote "'s too */ - snprintf (tmp, sizeof(tmp), "\"%s\"", fullname); - strncpy (fullname, tmp, sizeof(fullname)); - } + if (strchr(fullname, '.')) { /* quote any .'s */ + char tmp[BUFSIZ]; - return; + /* should quote "'s too */ + snprintf (tmp, sizeof(tmp), "\"%s\"", fullname); + strncpy (fullname, tmp, sizeof(fullname)); + } + + return; } static const char* get_mtsconf_pathname (void) { - const char *cp = getenv ( "MHMTSCONF "); - if (cp != NULL && *cp != '\0') { - return cp; - } - return mtsconf; + 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; + 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; - } + 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; + } }