Annotation of 43BSDReno/contrib/mh/mts/sendmail/hosts.c, revision 1.1.1.1

1.1       root        1: /* hosts.c - find out the official name of a host */
                      2: 
                      3: /* LINTLIBRARY */
                      4: 
                      5: /* In the SendMail world, we really don't know what the valid hosts are.
                      6:    We could poke around in the sendmail.cf file, but that still isn't a
                      7:    guarantee.  As a result, we'll say that everything is a valid host, and
                      8:    let SendMail worry about it. */
                      9: 
                     10: 
                     11: #include "../h/strings.h"
                     12: #include <stdio.h>
                     13: #include "../zotnet/mts.h"
                     14: #include <ctype.h>
                     15: #ifdef BSD42
                     16: #include <netdb.h>
                     17: #endif BSD42
                     18: 
                     19: 
                     20: #define        NOTOK   (-1)
                     21: 
                     22: 
                     23: static struct host {
                     24:     char   *h_name;
                     25:     char  **h_aliases;
                     26:     struct host   *h_next;
                     27: }                   hosts;
                     28: 
                     29: char *getcpy ();
                     30: static int init_hs();
                     31: 
                     32: /*  */
                     33: 
                     34: char *
                     35: OfficialName(name)
                     36:        register char *name;
                     37: {
                     38:     register char  *p;
                     39:     char   *q,
                     40:             site[BUFSIZ];
                     41: #ifdef BSD42
                     42:     register struct hostent *hp;
                     43: #endif BSD42
                     44:     static char buffer[BUFSIZ];
                     45:     register char **r;
                     46:     register struct host   *h;
                     47: 
                     48:     for (p = name, q = site; *p; p++, q++)
                     49:        *q = isupper (*p) ? tolower (*p) : *p;
                     50:     *q = NULL;
                     51:     q = site;
                     52: 
                     53:     if (uleq (LocalName (), site))
                     54:        return LocalName ();
                     55: 
                     56: #ifdef BSD41A
                     57:     if (rhost (&q) != NOTOK) {
                     58:        (void) strcpy (buffer, q);
                     59:        free (q);
                     60:        return buffer;
                     61:     }
                     62: #endif BSD41A
                     63: #ifdef BSD42
                     64:     sethostent (1);
                     65:     if (hp = gethostbyname (q)) {
                     66:        (void) strcpy (buffer, hp -> h_name);
                     67:        return buffer;
                     68:     }
                     69: #endif BSD42
                     70: 
                     71:     if (hosts.h_name || init_hs ())
                     72:        for (h = hosts.h_next; h; h = h -> h_next)
                     73:            if (uleq (h -> h_name, q))
                     74:                return h -> h_name;
                     75:            else
                     76:                for (r = h -> h_aliases; *r; r++)
                     77:                    if (uleq (*r, q))
                     78:                        return h -> h_name;
                     79: 
                     80:     (void) strcpy (buffer, site);
                     81:     return buffer;
                     82: }
                     83: 
                     84: /*  */
                     85: 
                     86: /* Use hostable as an exception file for those hosts that aren't on the
                     87:    Internet (listed in /etc/hosts).  These are usually PhoneNet and UUCP
                     88:    sites. */
                     89: 
                     90: 
                     91: #define        NALIASES        50
                     92: 
                     93: static int
                     94: init_hs()
                     95: {
                     96:     register char  *cp,
                     97:                    *dp,
                     98:                   **q,
                     99:                   **r;
                    100:     char    buffer[BUFSIZ],
                    101:            *aliases[NALIASES];
                    102:     register struct host   *h;
                    103:     register FILE  *fp;
                    104: 
                    105:     if ((fp = fopen (hostable, "r")) == NULL)
                    106:        return 0;
                    107: 
                    108:     h = &hosts;
                    109:     while (fgets (buffer, sizeof buffer, fp) != NULL) {
                    110:        if (cp = index (buffer, '#'))
                    111:            *cp = NULL;
                    112:        if (cp = index (buffer, '\n'))
                    113:            *cp = NULL;
                    114:        for (cp = buffer; *cp; cp++)
                    115:            if (isspace (*cp))
                    116:                *cp = ' ';
                    117:        for (cp = buffer; isspace (*cp); cp++)
                    118:            continue;
                    119:        if (*cp == NULL)
                    120:            continue;
                    121: 
                    122:        q = aliases;
                    123:        if (cp = index (dp = cp, ' ')) {
                    124:            *cp = NULL;
                    125:            for (cp++; *cp; cp++) {
                    126:                while (isspace (*cp))
                    127:                    cp++;
                    128:                if (*cp == NULL)
                    129:                    break;
                    130:                if (cp = index (*q++ = cp, ' '))
                    131:                    *cp = NULL;
                    132:                else
                    133:                    break;
                    134:                if (q >= aliases + NALIASES)
                    135:                    break;
                    136:            }
                    137:        }
                    138: 
                    139:        *q = NULL;
                    140: 
                    141:        h -> h_next = (struct host *) calloc (1, sizeof *h);
                    142:        h = h -> h_next;
                    143:        h -> h_name = getcpy (dp);
                    144:        r = h -> h_aliases =
                    145:                (char **) calloc ((unsigned) (q - aliases + 1), sizeof *q);
                    146:        for (q = aliases; *q; q++)
                    147:            *r++ = getcpy (*q);
                    148:        *r = NULL;
                    149:     }
                    150: 
                    151:     (void) fclose (fp);
                    152:     return 1;
                    153: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.