|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.