Return to BSD News archive
Xref: sserve comp.protocols.tcp-ip.domains:3014 comp.unix.bsd:12072
Newsgroups: comp.protocols.tcp-ip.domains,comp.unix.bsd
Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!elroy.jpl.nasa.gov!swrinde!cs.utexas.edu!utnut!torn!nott!bnrgate!bnr.co.uk!uknet!mcsun!news.inesc.pt!dec4pt.puug.pt!matuc2.mat.uc.pt!rps
From: rps@matuc2.mat.uc.pt (Rui Pedro Mendes Salgueiro)
Subject: An implementation of getnetby* using DNS (RFC1101)
Message-ID: <1993Jun3.202843.13496@matuc2.mat.uc.pt>
Organization: Dep. Matematica Universidade de Coimbra
X-Newsreader: Tin 1.1 PL3
Date: Thu, 3 Jun 1993 20:28:43 GMT
Lines: 946
This is a implementation of getnetby{addr,name}() and {set,end}hostent()
that uses the DNS (RFC1101).
If you want to make your network visible by the DNS (using these functions)
you should add this lines to your DNS files:
in the reverse mapping:
0.x.y.z.IN-ADDR.ARPA. IN PTR your-net.your.domain.
and in the direct:
your-net.your.domain. IN PTR 0.x.y.z.IN-ADDR.ARPA.
This example is for a class C network (the minimum info necessary).
See RFC1101 for more details.
This has been tested in BSD/386 (0.9.4), in SunOS (4.0.3 and 4.1.3)
and Ultrix 4.2.
NOTE: These versions never use yellow pages (NIS).
Authors:
Carlos Leandro and Rui Salgueiro
Dep. Matematica Universidade de Coimbra, Portugal, Europe
3 June 1993
See the README file for more details.
# This is a shell archive. Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file". Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
# README
# Makefile
# main.c
# getnetent.c
# getnetbyname.c
# getnetnamadr.c
# getnetbyaddr.c
#
echo x - README
sed 's/^X//' >README << 'END-of-README'
XThis is a implementation of getnetby{addr,name}() and {set,end}hostent()
Xthat uses the DNS (RFC1101).
X
XWe have moved the old versions of getnetby{addr,name}() and
X{set,end}hostent() to _getnetby{addr,name}() and _{set,end}hostent().
X
XOur implementation querys the DNS and falls back to the old functions in
Xthe case of a negative reply. This is done since, at this moment, few people
Xhave entered this information in the DNS.
X
XBecause of this we have modified the {set,end}netent() functions so now
Xthey turn on or off the resolver options "RES_STAYOPEN | RES_USEVC"
X(by calling {set,end}hostent() ) AND open the /etc/networks .
X
XWe have made a test program (called nettest) that looks for information
Xon a network passed in the command line (either by name or by number).
X
X gnu% ./nettest 192.138.204
X Official name: net.mat.uc.pt
X Net addr. type: 2
X Network : 12618444 ----> 192.138.204
X Aliases :
X gnu% ./nettest 192.138.204.0
X Official name: net.mat.uc.pt
X Net addr. type: 2
X Network : 3230321664 ----> 192.138.204.0
X Aliases :
X gnu% ./nettest net.mat.uc.pt.
X Official name: net.mat.uc.pt
X Net addr. type: 2
X Network : 12618444 ----> 192.138.204
X Aliases :
X gnu% ./nettest mat.uc.pt
X Official name: mat.uc.pt
X Net addr. type: 2
X Network : 12618444 ----> 192.138.204
X Aliases :
X
XThe program nettest.local uses the functions in libresolv, that usually
Xread /etc/networks.
X
XThe Makefile included can also recompile netstat (if you have the
Xsource to netstat) using these functions.
X
XAt this moment this netstat (option -r) is very slow.
XIt will be better when named caches negative replys and/or
Xmore people enter this information in the DNS.
X
XThis has been tested in BSD/386 (0.9.4), in SunOS (4.0.3 and 4.1.3)
Xand Ultrix 4.2.
XNOTE: These versions never use yellow pages (NIS).
X
XAuthors:
X Carlos Leandro leandro@mat.uc.pt
X Rui Salgueiro rps@mat.uc.pt
X
XSend bugs reports, bug fixes, suggestions, etc... to rfc1101@mat.uc.pt.
END-of-README
echo x - Makefile
sed 's/^X//' >Makefile << 'END-of-Makefile'
X# @(#)Makefile 1.6 (Coimbra) 93/06/03
X
XPROG= nettest
XSRCS= main.c getnetent.c getnetbyname.c getnetnamadr.c getnetbyaddr.c
XOBJS= getnetent.o getnetbyname.o getnetnamadr.o getnetbyaddr.o
XCFLAGS=-O -DLIBC_SCCS
XLDFLAGS=
XLIBS=-lresolv # SunOS needs this
X
X
Xnettest: main.o $(OBJS)
X cc $(LDFLAGS) main.o $(OBJS) $(LIBS) -o $@
X
Xall: nettest netstat rfc1101.shar
X
Xnettest.local: main.o
X cc $(LDFLAGS) main.o $(LIBS) -o $@
X
Xrfc1101.shar: README Makefile $(SRCS)
X shar README Makefile $(SRCS) > $@
X
Xclean_all: clean
X rm -f nettest nettest.local netstat rfc1101.shar
X
Xclean:
X rm -f main.o netstat.o $(OBJS)
X
XNETSTAT_SOURCES= /usr/src/usr.bin/netstat/host.c \
X /usr/src/usr.bin/netstat/inet.c /usr/src/usr.bin/netstat/if.c \
X /usr/src/usr.bin/netstat/main.c /usr/src/usr.bin/netstat/mbuf.c \
X /usr/src/usr.bin/netstat/route.c /usr/src/usr.bin/netstat/unix.c \
X /usr/src/usr.bin/netstat/ns.c /usr/src/usr.bin/netstat/iso.c \
X /usr/src/sys/netiso/tp_astring.c
X
Xnetstat: netstat.o $(OBJS)
X cc $(LDFLAGS) netstat.o $(OBJS) $(LIBS) -lkvm -o $@
X
Xnetstat.o: $(NETSTAT_SOURCES)
X -mkdir /tmp/netstat
X cp $(NETSTAT_SOURCES) /usr/src/usr.bin/netstat/netstat.h /tmp/netstat
X cd /tmp/netstat; cc -c $(CFLAGS) *.c; ld -r -o $@ *.o
X mv /tmp/netstat/$@ . ; rm -r /tmp/netstat
END-of-Makefile
echo x - main.c
sed 's/^X//' >main.c << 'END-of-main.c'
X/* Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
X * Dep. Matematica Universidade de Coimbra, Portugal, Europe
X */
X/*
X * Copyright (c) 1983 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X * notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X * notice, this list of conditions and the following disclaimer in the
X * documentation and/or other materials provided with the distribution.
X * 3. All advertising materials mentioning features or use of this software
X * must display the following acknowledgement:
X * This product includes software developed by the University of
X * California, Berkeley and its contributors.
X * 4. Neither the name of the University nor the names of its contributors
X * may be used to endorse or promote products derived from this software
X * without specific prior written permission.
X *
X * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X */
X
X#if defined(LIBC_SCCS) && !defined(lint)
Xstatic char sccsid[] = "@(#)main.c 1.4 (Coimbra) 93/06/03";
X#endif /* LIBC_SCCS and not lint */
X
X#include <sys/types.h>
X#include <netdb.h>
X#include <stdio.h>
X#include <string.h>
X#include <sys/socket.h>
X#include <netinet/in.h>
X#include <arpa/inet.h>
X#include <ctype.h>
X
X#include <arpa/nameser.h>
X#include <resolv.h>
X
X#define ADDR 1
X#define NAME 2
X#define UNDEF -1
X
Xint h_errno;
Xvoid herror();
X
Xchar *progname;
Xchar *use = "%s [-d] [-a addr | -n name | string] \n";
Xint name_or_addr = UNDEF;
X
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X char **ch, c, *net_name_or_addr, *s;
X struct netent *net_entry;
X register unsigned long net2, nn;
X unsigned netbr[4];
X
X progname = argv[0];
X net_name_or_addr = NULL;
X
X while (--argc > 0 && (*++argv)[0] == '-') {
X for (s = argv[0] + 1; *s != '\0'; s++) {
X switch (*s) {
X case 'd':
X _res.options |= RES_DEBUG;
X break;
X case 'a':
X if (--argc > 0) {
X name_or_addr = ADDR;
X net_name_or_addr = *++argv;
X } else
X terminate();
X break;
X case 'n':
X if (--argc > 0) {
X name_or_addr = NAME;
X net_name_or_addr = *++argv;
X } else
X terminate();
X break;
X default:
X terminate();
X break;
X }
X }
X }
X
X if (name_or_addr == UNDEF) {
X if (argc > 0) {
X c = **argv;
X if (isalpha(c)) {
X name_or_addr = NAME;
X } else if (isdigit(c)) {
X name_or_addr = ADDR;
X } else {
X terminate();
X }
X net_name_or_addr = *argv++;
X --argc;
X } else
X terminate();
X }
X
X if (argc > 0) {
X fprintf(stderr, "extra arguments ignored:");
X while (argc-- > 0 )
X fprintf(stderr, " %s", *argv++);
X fprintf(stderr, "\n");
X }
X
X/* fprintf(stderr, "name_or_addr = %d, net_name_or_addr = %s\n",
X name_or_addr , net_name_or_addr);
X*/
X switch (name_or_addr) {
X case ADDR:
X net_entry = getnetbyaddr(inet_network(net_name_or_addr ),
X AF_INET);
X break;
X case NAME:
X net_entry = getnetbyname(net_name_or_addr );
X break;
X default: /* can't happen */
X terminate();
X }
X
X if (net_entry) {
X printf(" Official name: %s \n", net_entry->n_name);
X printf(" Net addr. type: %d \n", net_entry->n_addrtype);
X printf(" Network : %u ----> ", net2 = (unsigned long)net_entry->n_net);
X for (nn = 4; net2; netbr[--nn] = net2 & 0xff, net2 >>= 8)
X ;
X printf(" ");
X switch (nn) {
X case 0:
X printf("%u.%u.%u.%u", netbr[0], netbr[1], netbr[2], netbr[3]);
X break;
X case 1:
X printf("%u.%u.%u", netbr[1], netbr[2], netbr[3]);
X break;
X case 2:
X printf("%u.%u", netbr[2], netbr[3]);
X break;
X case 3:
X printf("%u", netbr[3]);
X break;
X }
X printf(" \n");
X printf(" Aliases : \n");
X for (ch = net_entry->n_aliases; *ch != NULL; ch++)
X printf(" %s \n", *ch);
X return 0;
X } else {
X herror(progname);
X return 2;
X }
X}
X
X
Xterminate()
X{
X fprintf(stderr, use, progname);
X exit (1);
X}
X
X
X#ifdef sun
Xchar *h_errlist[] = {
X "Error 0",
X "Unknown host", /* 1 HOST_NOT_FOUND */
X "Host name lookup failure", /* 2 TRY_AGAIN */
X "Unknown server error", /* 3 NO_RECOVERY */
X "No address associated with name", /* 4 NO_ADDRESS */
X};
X
Xint h_nerr = {
X sizeof(h_errlist) / sizeof(h_errlist[0]) };
X
Xextern int h_errno;
X
X/*
X * herror --
X * print the error indicated by the h_errno value.
X */
Xvoid
Xherror(s)
Xchar *s;
X{
X fprintf(stderr, "%s: %s\n", s,
X (u_int) h_errno < h_nerr ? h_errlist[h_errno] : "Unknown error");
X}
X
X#endif
END-of-main.c
echo x - getnetent.c
sed 's/^X//' >getnetent.c << 'END-of-getnetent.c'
X/* Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
X * Dep. Matematica Universidade de Coimbra, Portugal, Europe
X */
X/*
X * Copyright (c) 1983 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X * notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X * notice, this list of conditions and the following disclaimer in the
X * documentation and/or other materials provided with the distribution.
X * 3. All advertising materials mentioning features or use of this software
X * must display the following acknowledgement:
X * This product includes software developed by the University of
X * California, Berkeley and its contributors.
X * 4. Neither the name of the University nor the names of its contributors
X * may be used to endorse or promote products derived from this software
X * without specific prior written permission.
X *
X * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X */
X
X#if defined(LIBC_SCCS) && !defined(lint)
Xstatic char sccsid[] = "@(#)getnetent.c 1.1 (Coimbra) 93/06/02";
X#endif /* LIBC_SCCS and not lint */
X
X#include <sys/types.h>
X#include <sys/socket.h>
X#include <sys/param.h>
X#include <netinet/in.h>
X#include <arpa/inet.h>
X#include <arpa/nameser.h>
X#include <resolv.h>
X#include <netdb.h>
X#include <stdio.h>
X#include <string.h>
X
X#ifndef _PATH_NETWORKS
X#define _PATH_NETWORKS "/etc/networks"
X#endif
X
X#define MAXALIASES 35
X
Xstatic FILE *netf;
Xstatic char line[BUFSIZ+1];
Xstatic struct netent net;
Xstatic char *net_aliases[MAXALIASES];
Xint _net_stayopen;
X
Xvoid _setnetent(), _endnetent();
X
Xvoid
Xsetnetent(stayopen)
Xint stayopen;
X{
X sethostent(stayopen);
X _setnetent(stayopen);
X}
X
Xvoid
Xendnetent()
X{
X endhostent();
X _endnetent();
X}
X
Xvoid
X_setnetent(f)
Xint f;
X{
X if (netf == NULL)
X netf = fopen(_PATH_NETWORKS, "r" );
X else
X rewind(netf);
X _net_stayopen |= f;
X}
X
Xvoid
X_endnetent()
X{
X if (netf) {
X fclose(netf);
X netf = NULL;
X }
X _net_stayopen = 0;
X}
X
Xstruct netent *
Xgetnetent()
X{
X char *p;
X register char *cp, **q;
X
X if (netf == NULL && (netf = fopen(_PATH_NETWORKS, "r" )) == NULL)
X return (NULL);
Xagain:
X p = fgets(line, BUFSIZ, netf);
X if (p == NULL)
X return (NULL);
X if (*p == '#')
X goto again;
X cp = strpbrk(p, "#\n");
X if (cp == NULL)
X goto again;
X *cp = '\0';
X net.n_name = p;
X cp = strpbrk(p, " \t");
X if (cp == NULL)
X goto again;
X *cp++ = '\0';
X while (*cp == ' ' || *cp == '\t')
X cp++;
X p = strpbrk(cp, " \t");
X if (p != NULL)
X *p++ = '\0';
X net.n_net = inet_network(cp);
X net.n_addrtype = AF_INET;
X q = net.n_aliases = net_aliases;
X if (p != NULL)
X cp = p;
X while (cp && *cp) {
X if (*cp == ' ' || *cp == '\t') {
X cp++;
X continue;
X }
X if (q < &net_aliases[MAXALIASES - 1])
X *q++ = cp;
X cp = strpbrk(cp, " \t");
X if (cp != NULL)
X *cp++ = '\0';
X }
X *q = NULL;
X return (&net);
X}
END-of-getnetent.c
echo x - getnetbyname.c
sed 's/^X//' >getnetbyname.c << 'END-of-getnetbyname.c'
X/* Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
X * Dep. Matematica Universidade de Coimbra, Portugal, Europe
X */
X/*
X * Copyright (c) 1983 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X * notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X * notice, this list of conditions and the following disclaimer in the
X * documentation and/or other materials provided with the distribution.
X * 3. All advertising materials mentioning features or use of this software
X * must display the following acknowledgement:
X * This product includes software developed by the University of
X * California, Berkeley and its contributors.
X * 4. Neither the name of the University nor the names of its contributors
X * may be used to endorse or promote products derived from this software
X * without specific prior written permission.
X *
X * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X */
X
X#if defined(LIBC_SCCS) && !defined(lint)
Xstatic char sccsid[] = "@(#)getnetbyname.c 1.1 (Coimbra) 93/06/02";
X#endif /* LIBC_SCCS and not lint */
X
X#include <netdb.h>
X#include <string.h>
X
Xextern int _net_stayopen;
X
Xstruct netent *
X_getnetbyname(name)
X#ifdef sun
X register char *name;
X#else
X register const char *name;
X#endif
X{
X register struct netent *p;
X register char **cp;
X
X setnetent(_net_stayopen);
X while (p = getnetent()) {
X if (strcmp(p->n_name, name) == 0)
X break;
X for (cp = p->n_aliases; *cp != 0; cp++){
X if (strcmp(*cp, name) == 0)
X goto found;
X }
X }
Xfound:
X if (!_net_stayopen)
X endnetent();
X return (p);
X}
END-of-getnetbyname.c
echo x - getnetnamadr.c
sed 's/^X//' >getnetnamadr.c << 'END-of-getnetnamadr.c'
X/* Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
X * Dep. Matematica Universidade de Coimbra, Portugal, Europe
X */
X/*
X * Copyright (c) 1983 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X * notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X * notice, this list of conditions and the following disclaimer in the
X * documentation and/or other materials provided with the distribution.
X * 3. All advertising materials mentioning features or use of this software
X * must display the following acknowledgement:
X * This product includes software developed by the University of
X * California, Berkeley and its contributors.
X * 4. Neither the name of the University nor the names of its contributors
X * may be used to endorse or promote products derived from this software
X * without specific prior written permission.
X *
X * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X */
X
X#if defined(LIBC_SCCS) && !defined(lint)
Xstatic char sccsid[] = "@(#)getnetnamadr.c 1.4 (Coimbra) 93/06/03";
X#endif /* LIBC_SCCS and not lint */
X
X#include <sys/param.h>
X#include <sys/socket.h>
X#include <netinet/in.h>
X#include <arpa/inet.h>
X#include <arpa/nameser.h>
X#include <netdb.h>
X#include <resolv.h>
X#include <stdio.h>
X#include <ctype.h>
X#include <errno.h>
X#include <string.h>
X
X#define BYADDR 0
X#define BYNAME 1
X#define MAXALIASES 35
X#define GetShort(cp) _getshort(cp); cp += sizeof(unsigned short);
X
Xstatic struct netent net_entry;
Xstatic char *net_aliases[MAXALIASES];
Xstatic char netbuf[BUFSIZ+1];
Xstatic char *net_addrs[2];
X
X#if PACKETSZ > 1024
X#define MAXPACKET PACKETSZ
X#else
X#define MAXPACKET 1024
X#endif
X
Xtypedef union {
X HEADER hdr;
X u_char buf[MAXPACKET];
X} querybuf;
X
Xtypedef union {
X long al;
X char ac;
X} align;
X
Xint h_errno;
X
Xstatic struct netent *
Xgetnetanswer(answer, anslen, net_i)
X querybuf *answer;
X int anslen;
X int net_i;
X{
X
X register HEADER *hp;
X register u_char *cp;
X register int n;
X u_char *eom;
X char *bp, **ap;
X int type, class, buflen, ancount, qdcount;
X int haveanswer, getclass = C_ANY;
X int net_length = 0;
X int i, nchar;
X
X char aux1[30],aux2[30],ans[30];
X char *in,*st,*pauxt,*paux1= &aux1[0],*paux2= &aux2[0],flag=0;
X /*
X * find first satisfactory answer
X
X * answer --> +------------+ ( MESSAGE )
X | Header |
X +------------+
X | Question | the question for the name server
X +------------+
X | Answer | RRs answering the question
X +------------+
X | Authority | RRs pointing toward an authority
X | Additional | RRs holding additional information
X +------------+
X */
X eom=answer->buf+anslen;
X hp = &answer->hdr;
X ancount= ntohs(hp->ancount); /*num. of records in the answer section*/
X qdcount= ntohs(hp->qdcount); /*num. of entries in the question section*/
X bp = netbuf;
X buflen = sizeof(netbuf);
X cp = answer->buf + sizeof(HEADER);
X if (!qdcount) {
X if (hp->aa)
X h_errno = HOST_NOT_FOUND;
X else
X h_errno = TRY_AGAIN;
X
X return ((struct netent *) NULL);
X }
X while (qdcount-- > 0){
X#ifndef bsdi
X cp += dn_skipname(cp, eom) + QFIXEDSZ;
X#else
X cp += __dn_skipname(cp, eom) + QFIXEDSZ;
X#endif
X }
X ap = net_aliases;
X *ap= NULL;
X net_entry.n_aliases = net_aliases;
X haveanswer = 0;
X while (--ancount >= 0 && cp < eom) {
X if ((n = dn_expand((u_char *)answer->buf, (u_char *)eom,
X (u_char *)cp, (u_char *)bp, buflen)) < 0)
X break;
X cp += n;
X ans[0]='\0';
X (void)strcpy(&ans[0],bp);
X type = GetShort(cp);
X class = GetShort(cp);
X cp += sizeof(u_long);
X n = GetShort(cp);
X if (class==C_IN && type == T_PTR) {
X if ((n = dn_expand((u_char *)answer->buf,
X (u_char *)eom, (u_char *)cp, (u_char *)bp,
X buflen)) < 0) {
X cp += n;
X return ((struct netent *) NULL);
X }
X cp += n;
X *ap++ = bp;
X bp += strlen(bp)+1;
X net_entry.n_addrtype = (class == C_IN) ? AF_INET : AF_UNSPEC;
X haveanswer++;
X }
X }
X if (haveanswer) {
X *ap = NULL;
X switch(net_i){
X case BYADDR :
X net_entry.n_name = *net_entry.n_aliases;
X net_entry.n_net=NULL;
X break;
X case BYNAME :
X in= *net_entry.n_aliases;
X net_entry.n_name= &ans[0];
X aux2[0]='\0';
X for (i=0;i<4;i++){
X for(st=in,nchar=0;*st!='.';st++,nchar++);
X if (nchar!=1 || *in!='0' || flag){
X flag=1;
X (void)strncpy(paux1,(i==0) ? in:in-1,
X (i==0) ? nchar:nchar+1);
X pauxt=paux2;
X paux2=strcat(paux1,paux2);
X paux1=pauxt;
X }
X in= ++st;
X }
X net_entry.n_net=inet_network(paux2);
X }
X net_entry.n_aliases++;
X return (&net_entry);
X } else {
X h_errno = TRY_AGAIN;
X return ((struct netent *) NULL);
X }
X}
X
Xstruct netent *
Xgetnetbyaddr(net, net_type)
X register long net;
X register int net_type;
X{
X extern struct netent * _getnetbyaddr();
X unsigned netbr[4];
X int nn,anslen;
X querybuf buf;
X char qbuf[MAXDNAME];
X register unsigned long net2 = net;
X
X
X static struct netent *net_entry;
X
X if (net_type != AF_INET)
X return _getnetbyaddr(net, net_type);
X
X/* net2 has to be unsigned or the loop may never stop */
X for (nn = 4; net2;){
X netbr[--nn] = net2 & 0xff;
X net2 >>= 8;
X }
X switch (nn) {
X case 3: /* Class A */
X (void)sprintf(qbuf, "0.0.0.%u.in-addr.arpa",
X netbr[3]);
X break;
X case 2: /* Class B */
X (void)sprintf(qbuf, "0.0.%u.%u.in-addr.arpa",
X netbr[3], netbr[2]);
X break;
X case 1: /* Class C */
X (void)sprintf(qbuf, "0.%u.%u.%u.in-addr.arpa",
X netbr[3], netbr[2], netbr[1]);
X break;
X case 0: /* Class D - E */
X (void)sprintf(qbuf, "%u.%u.%u.%u.in-addr.arpa",
X netbr[3], netbr[2], netbr[1], netbr[0]);
X break;
X }
X anslen = res_query(qbuf, C_IN, T_PTR, (char *)&buf, sizeof(buf));
X if (anslen < 0) {
X#ifdef DEBUG
X if (_res.options & RES_DEBUG)
X printf("res_query failed\n");
X#endif
X if (errno == ECONNREFUSED)
X return _getnetbyaddr(net, net_type);
X return _getnetbyaddr(net, net_type);
X }
X net_entry= getnetanswer(&buf,anslen,BYADDR);
X if (net_entry){
X unsigned u_net = net; /* maybe net should be unsigned ? */
X /* Strip trailing zeros */
X while ((u_net & 0xff) == 0 && u_net != 0) {
X u_net >>= 8;
X }
X net_entry->n_net=u_net;
X return net_entry;
X } else
X return _getnetbyaddr(net, net_type);
X}
X
Xstruct netent *
Xgetnetbyname(net)
X#ifdef sun
X register char *net;
X#else
X register const char *net;
X#endif
X{
X extern struct netent * _getnetbyname();
X unsigned netbr[4];
X int anslen;
X querybuf buf;
X char qbuf[MAXDNAME];
X
X
X struct netent *net_entry;
X
X (void)strcpy(&qbuf[0],net);
X anslen = res_search(qbuf, C_IN, T_PTR, (char *)&buf, sizeof(buf));
X if (anslen < 0) {
X#ifdef DEBUG
X if (_res.options & RES_DEBUG)
X printf("res_query failed\n");
X#endif
X if (errno == ECONNREFUSED)
X return _getnetbyname(net);
X return _getnetbyname(net);
X }
X net_entry= getnetanswer(&buf,anslen,BYNAME);
X if (net_entry)
X return net_entry;
X else
X return _getnetbyname(net);
X
X}
END-of-getnetnamadr.c
echo x - getnetbyaddr.c
sed 's/^X//' >getnetbyaddr.c << 'END-of-getnetbyaddr.c'
X/* Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
X * Dep. Matematica Universidade de Coimbra, Portugal, Europe
X */
X/*
X * Copyright (c) 1983 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X * notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X * notice, this list of conditions and the following disclaimer in the
X * documentation and/or other materials provided with the distribution.
X * 3. All advertising materials mentioning features or use of this software
X * must display the following acknowledgement:
X * This product includes software developed by the University of
X * California, Berkeley and its contributors.
X * 4. Neither the name of the University nor the names of its contributors
X * may be used to endorse or promote products derived from this software
X * without specific prior written permission.
X *
X * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X */
X
X#if defined(LIBC_SCCS) && !defined(lint)
Xstatic char sccsid[] = "@(#)getnetbyaddr.c 1.1 (Coimbra) 93/06/02";
X#endif /* LIBC_SCCS and not lint */
X
X#include <netdb.h>
X
Xextern int _net_stayopen;
X
Xstruct netent *
X_getnetbyaddr(net, type)
X register long net;
X register int type;
X{
X register struct netent *p;
X
X setnetent(_net_stayopen);
X while (p = getnetent())
X if (p->n_addrtype == type && p->n_net == net)
X break;
X if (!_net_stayopen)
X endnetent();
X return (p);
X}
END-of-getnetbyaddr.c
exit
--
Rui Salgueiro | Dpt. de Matematica |"Why do I smile at people
rps@matuc2.mat.uc.pt | Universidade de Coimbra | I much rather kick in the eye"
rps@inescc.pt | Portugal - Europe | Morrissey