Annotation of 43BSDTahoe/lib/libc/net/hosttable/gethostnamadr.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1983 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms are permitted
                      6:  * provided that the above copyright notice and this paragraph are
                      7:  * duplicated in all such forms and that any documentation,
                      8:  * advertising materials, and other materials related to such
                      9:  * distribution and use acknowledge that the software was developed
                     10:  * by the University of California, Berkeley.  The name of the
                     11:  * University may not be used to endorse or promote products derived
                     12:  * from this software without specific prior written permission.
                     13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     16:  */
                     17: 
                     18: #if defined(LIBC_SCCS) && !defined(lint)
                     19: static char sccsid[] = "@(#)gethostnamadr.c    5.7 (Berkeley) 6/27/88";
                     20: #endif /* LIBC_SCCS and not lint */
                     21: 
                     22: #include <stdio.h>
                     23: #include <netdb.h>
                     24: #include <sys/file.h>
                     25: #include <ndbm.h>
                     26: #include <ctype.h>
                     27: 
                     28: #define        MAXALIASES      35
                     29: 
                     30: static struct hostent host;
                     31: static char *host_aliases[MAXALIASES];
                     32: static char hostbuf[BUFSIZ+1];
                     33: static char *host_addrs[2];
                     34: 
                     35: int h_errno;
                     36: 
                     37: /*
                     38:  * The following is shared with gethostent.c
                     39:  */
                     40: extern char *_host_file;
                     41: DBM    *_host_db = (DBM *)NULL;
                     42: int    _host_stayopen; /* set by sethostent(), cleared by endhostent() */
                     43: 
                     44: static struct hostent *
                     45: fetchhost(key)
                     46:        datum key;
                     47: {
                     48:         register char *cp, *tp, **ap;
                     49:        int naliases;
                     50: 
                     51:         if (key.dptr == 0)
                     52:                 return ((struct hostent *)NULL);
                     53:        key = dbm_fetch(_host_db, key);
                     54:        if (key.dptr == 0)
                     55:                 return ((struct hostent *)NULL);
                     56:         cp = key.dptr;
                     57:        tp = hostbuf;
                     58:        host.h_name = tp;
                     59:        while (*tp++ = *cp++)
                     60:                ;
                     61:        bcopy(cp, (char *)&naliases, sizeof(int)); cp += sizeof (int);
                     62:        for (ap = host_aliases; naliases > 0; naliases--) {
                     63:                *ap++ = tp;
                     64:                while (*tp++ = *cp++)
                     65:                        ;
                     66:        }
                     67:        *ap = (char *)NULL;
                     68:        host.h_aliases = host_aliases;
                     69:        bcopy(cp, (char *)&host.h_addrtype, sizeof (int));
                     70:        cp += sizeof (int);
                     71:        bcopy(cp, (char *)&host.h_length, sizeof (int));
                     72:        cp += sizeof (int);
                     73:        host.h_addr_list = host_addrs;
                     74:        host.h_addr = tp;
                     75:        bcopy(cp, tp, host.h_length);
                     76:         return (&host);
                     77: }
                     78: 
                     79: struct hostent *
                     80: gethostbyname(nam)
                     81:        register char *nam;
                     82: {
                     83:        register struct hostent *hp;
                     84:        register char **cp;
                     85:         datum key;
                     86:        char lowname[128];
                     87:        register char *lp = lowname;
                     88:        
                     89:        while (*nam)
                     90:                if (isupper(*nam))
                     91:                        *lp++ = tolower(*nam++);
                     92:                else
                     93:                        *lp++ = *nam++;
                     94:        *lp = '\0';
                     95: 
                     96:        if ((_host_db == (DBM *)NULL)
                     97:          && ((_host_db = dbm_open(_host_file, O_RDONLY)) == (DBM *)NULL)) {
                     98:                sethostent(_host_stayopen);
                     99:                while (hp = gethostent()) {
                    100:                        if (strcmp(hp->h_name, lowname) == 0)
                    101:                                break;
                    102:                        for (cp = hp->h_aliases; cp != 0 && *cp != 0; cp++)
                    103:                                if (strcmp(*cp, lowname) == 0)
                    104:                                        goto found;
                    105:                }
                    106:        found:
                    107:                if (!_host_stayopen)
                    108:                        endhostent();
                    109:                return (hp);
                    110:        }
                    111:         key.dptr = lowname;
                    112:         key.dsize = strlen(lowname);
                    113:        hp = fetchhost(key);
                    114:        if (!_host_stayopen) {
                    115:                dbm_close(_host_db);
                    116:                _host_db = (DBM *)NULL;
                    117:        }
                    118:        if ( hp == NULL)
                    119:                h_errno = HOST_NOT_FOUND;
                    120:         return (hp);
                    121: }
                    122: 
                    123: struct hostent *
                    124: gethostbyaddr(addr, length, type)
                    125:        char *addr;
                    126:        register int length;
                    127:        register int type;
                    128: {
                    129:        register struct hostent *hp;
                    130:         datum key;
                    131: 
                    132:        if ((_host_db == (DBM *)NULL)
                    133:          && ((_host_db = dbm_open(_host_file, O_RDONLY)) == (DBM *)NULL)) {
                    134:                sethostent(_host_stayopen);
                    135:                while (hp = gethostent()) {
                    136:                        if (hp->h_addrtype == type && hp->h_length == length
                    137:                            && bcmp(hp->h_addr, addr, length) == 0)
                    138:                                break;
                    139:                }
                    140:                if (!_host_stayopen)
                    141:                        endhostent();
                    142:                if ( hp == NULL)
                    143:                        h_errno = HOST_NOT_FOUND;
                    144:                return (hp);
                    145:        }
                    146:         key.dptr = addr;
                    147:         key.dsize = length;
                    148:        hp = fetchhost(key);
                    149:        if (!_host_stayopen) {
                    150:                dbm_close(_host_db);
                    151:                _host_db = (DBM *)NULL;
                    152:        }
                    153:        if ( hp == NULL)
                    154:                h_errno = HOST_NOT_FOUND;
                    155:         return (hp);
                    156: }

unix.superglobalmegacorp.com

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