diff options
| author | matt <matt@NetBSD.org> | 2006-08-26 16:07:01 +0000 |
|---|---|---|
| committer | matt <matt@NetBSD.org> | 2006-08-26 16:07:01 +0000 |
| commit | 95ff9c00a4ed1523fc02c779fe58eb77862efc31 (patch) | |
| tree | ea3eaf0af61eed0784d7fbff691a3908764e291d /lib/libc/compat | |
| parent | a5db20545841c9efa57cd3855ce628049a52590b (diff) | |
Move ns_addr and ns_ntoa to compat libc. Add a stripped version of
<netns/ns.h> which only include struct ns_addr and the ns_addr and ns_ntoa
function prototypes.
Diffstat (limited to 'lib/libc/compat')
| -rw-r--r-- | lib/libc/compat/Makefile | 3 | ||||
| -rw-r--r-- | lib/libc/compat/Makefile.inc | 3 | ||||
| -rw-r--r-- | lib/libc/compat/include/ns.h | 66 | ||||
| -rw-r--r-- | lib/libc/compat/net/Makefile.inc | 4 | ||||
| -rw-r--r-- | lib/libc/compat/net/compat_ns_addr.c | 250 | ||||
| -rw-r--r-- | lib/libc/compat/net/compat_ns_ntoa.c | 111 |
6 files changed, 435 insertions, 2 deletions
diff --git a/lib/libc/compat/Makefile b/lib/libc/compat/Makefile index 72c9e9dbb31..ab683de6698 100644 --- a/lib/libc/compat/Makefile +++ b/lib/libc/compat/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.2 2006/03/11 23:04:03 christos Exp $ +# $NetBSD: Makefile,v 1.3 2006/08/26 16:07:01 matt Exp $ # @(#)Makefile 8.2 (Berkeley) 2/3/94 # @@ -14,6 +14,7 @@ COMPATDIR=${.CURDIR} .include "${.CURDIR}/db/Makefile.inc" .include "${.CURDIR}/gen/Makefile.inc" +.include "${.CURDIR}/net/Makefile.inc" .include "${.CURDIR}/stdlib/Makefile.inc" .include "${.CURDIR}/sys/Makefile.inc" diff --git a/lib/libc/compat/Makefile.inc b/lib/libc/compat/Makefile.inc index a996647eb72..f0f414b4296 100644 --- a/lib/libc/compat/Makefile.inc +++ b/lib/libc/compat/Makefile.inc @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.inc,v 1.3 2006/03/11 23:04:03 christos Exp $ +# $NetBSD: Makefile.inc,v 1.4 2006/08/26 16:07:01 matt Exp $ CPPFLAGS+= -I${NETBSDSRCDIR}/sys @@ -7,6 +7,7 @@ COMPATARCHDIR=${COMPATDIR}/arch/${ARCHSUBDIR} .include "${COMPATDIR}/db/Makefile.inc" .include "${COMPATDIR}/gen/Makefile.inc" +.include "${COMPATDIR}/net/Makefile.inc" .include "${COMPATDIR}/stdlib/Makefile.inc" .include "${COMPATDIR}/sys/Makefile.inc" .include "${COMPATARCHDIR}/Makefile.inc" diff --git a/lib/libc/compat/include/ns.h b/lib/libc/compat/include/ns.h new file mode 100644 index 00000000000..97d9cd473b0 --- /dev/null +++ b/lib/libc/compat/include/ns.h @@ -0,0 +1,66 @@ +/* $NetBSD: ns.h,v 1.1 2006/08/26 16:07:01 matt Exp $ */ + +/* + * Copyright (c) 1984, 1985, 1986, 1987, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ns.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETNS_NS_H_ +#define _NETNS_NS_H_ + +/* + * NS addressing + */ +union ns_host { + u_int8_t c_host[6]; + u_int16_t s_host[3]; +}; + +union ns_net { + u_int8_t c_net[4]; + u_int16_t s_net[2]; +}; + +union ns_net_u { + union ns_net net_e; + u_int32_t long_e; +}; + +struct ns_addr { + union ns_net x_net; + union ns_host x_host; + u_int16_t x_port; +}; + +__BEGIN_DECLS +extern struct ns_addr ns_addr __P((const char *)); +extern char *ns_ntoa __P((struct ns_addr)); +__END_DECLS + +#endif /* !_NETNS_NS_H_ */ diff --git a/lib/libc/compat/net/Makefile.inc b/lib/libc/compat/net/Makefile.inc new file mode 100644 index 00000000000..1a59b93808c --- /dev/null +++ b/lib/libc/compat/net/Makefile.inc @@ -0,0 +1,4 @@ +# $NetBSD: Makefile.inc,v 1.1 2006/08/26 16:07:01 matt Exp $ + +.PATH: ${COMPATDIR}/net +SRCS+=compat_ns_addr.c compat_ns_ntoa.c diff --git a/lib/libc/compat/net/compat_ns_addr.c b/lib/libc/compat/net/compat_ns_addr.c new file mode 100644 index 00000000000..be55f3bbf8c --- /dev/null +++ b/lib/libc/compat/net/compat_ns_addr.c @@ -0,0 +1,250 @@ +/* $NetBSD: compat_ns_addr.c,v 1.1 2006/08/26 16:07:01 matt Exp $ */ + +/* + * Copyright (c) 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * J.Q. Johnson. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)ns_addr.c 8.1 (Berkeley) 6/7/93"; +#else +__RCSID("$NetBSD: compat_ns_addr.c,v 1.1 2006/08/26 16:07:01 matt Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" +#include <sys/param.h> +#include <compat/include/ns.h> + +#include <assert.h> +#include <stdio.h> +#include <string.h> + +static void Field __P((char *, u_int8_t *, int)); +static void cvtbase __P((long, int, int[], int, u_int8_t[], int)); + +struct ns_addr +ns_addr(name) + const char *name; +{ + char separator; + char *hostname, *socketname, *cp; + char buf[50]; + static struct ns_addr addr; + + _DIAGASSERT(name != NULL); + + (void)strlcpy(buf, name, sizeof(buf)); + + /* + * First, figure out what he intends as a field separtor. + * Despite the way this routine is written, the prefered + * form 2-272.AA001234H.01777, i.e. XDE standard. + * Great efforts are made to insure backward compatibility. + */ + if ((hostname = strchr(buf, '#')) != NULL) + separator = '#'; + else { + hostname = strchr(buf, '.'); + if ((cp = strchr(buf, ':')) && + ((hostname && cp < hostname) || (hostname == 0))) { + hostname = cp; + separator = ':'; + } else + separator = '.'; + } + if (hostname) + *hostname++ = 0; + + memset(&addr, '\0', sizeof(addr)); + Field(buf, addr.x_net.c_net, 4); + if (hostname == 0) + return (addr); /* No separator means net only */ + + socketname = strchr(hostname, separator); + if (socketname) { + *socketname++ = 0; + Field(socketname, (u_int8_t *)(void *)&addr.x_port, 2); + } + + Field(hostname, addr.x_host.c_host, 6); + + return (addr); +} + +static void +Field(buf, out, len) + char *buf; + u_int8_t *out; + int len; +{ + register char *bp = buf; + int i, ibase, base16 = 0, base10 = 0, clen = 0; + int hb[6], *hp; + + _DIAGASSERT(buf != NULL); + _DIAGASSERT(out != NULL); + + /* + * first try 2-273#2-852-151-014#socket + */ + if ((*buf != '-') && + (1 < (i = sscanf(buf, "%d-%d-%d-%d-%d", + &hb[0], &hb[1], &hb[2], &hb[3], &hb[4])))) { + cvtbase(1000L, 256, hb, i, out, len); + return; + } + /* + * try form 8E1#0.0.AA.0.5E.E6#socket + */ + if (1 < (i = sscanf(buf,"%x.%x.%x.%x.%x.%x", + &hb[0], &hb[1], &hb[2], &hb[3], &hb[4], &hb[5]))) { + cvtbase(256L, 256, hb, i, out, len); + return; + } + /* + * try form 8E1#0:0:AA:0:5E:E6#socket + */ + if (1 < (i = sscanf(buf,"%x:%x:%x:%x:%x:%x", + &hb[0], &hb[1], &hb[2], &hb[3], &hb[4], &hb[5]))) { + cvtbase(256L, 256, hb, i, out, len); + return; + } + /* + * This is REALLY stretching it but there was a + * comma notation separting shorts -- definitely non standard + */ + if (1 < (i = sscanf(buf,"%x,%x,%x", + &hb[0], &hb[1], &hb[2]))) { + hb[0] = htons(hb[0]); hb[1] = htons(hb[1]); + hb[2] = htons(hb[2]); + cvtbase(65536L, 256, hb, i, out, len); + return; + } + + /* Need to decide if base 10, 16 or 8 */ + while (*bp) switch (*bp++) { + + case '0': case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '-': + break; + + case '8': case '9': + base10 = 1; + break; + + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': + base16 = 1; + break; + + case 'x': case 'X': + *--bp = '0'; + base16 = 1; + break; + + case 'h': case 'H': + base16 = 1; + /* FALLTHROUGH */ + + default: + *--bp = 0; /* Ends Loop */ + } + if (base16) { + ibase = 4096; + } else if (base10 == 0 && *buf == '0') { + ibase = 512; + } else { + base10 = 1; + ibase = 1000; + } + + for (bp = buf; *bp++; ) clen++; + if (clen == 0) clen++; + if (clen > 18) clen = 18; + i = ((clen - 1) / 3) + 1; + bp = clen + buf - 3; + hp = hb + i - 1; + + while (hp > hb) { + if (base16) + (void)sscanf(bp, "%3x", hp); + else if (base10) + (void)sscanf(bp, "%3d", hp); + else + (void)sscanf(bp, "%3o", hp); + + bp[0] = 0; + hp--; + bp -= 3; + } + if (base16) + (void)sscanf(buf, "%3x", hp); + else if (base10) + (void)sscanf(buf, "%3d", hp); + else + (void)sscanf(buf, "%3o", hp); + + cvtbase((long)ibase, 256, hb, i, out, len); +} + +static void +cvtbase(oldbase,newbase,input,inlen,result,reslen) + long oldbase; + int newbase; + int input[]; + int inlen; + unsigned char result[]; + int reslen; +{ + int d, e; + long sum; + + _DIAGASSERT(input != NULL); + _DIAGASSERT(result != NULL); + + e = 1; + while (e > 0 && reslen > 0) { + d = 0; e = 0; sum = 0; + /* long division: input=input/newbase */ + while (d < inlen) { + sum = sum*oldbase + (long) input[d]; + e += (sum > 0); + input[d++] = (int) (sum / newbase); + sum %= newbase; + } + /* accumulate remainder */ + result[--reslen] = (unsigned char)sum; + } + for (d=0; d < reslen; d++) + result[d] = 0; +} diff --git a/lib/libc/compat/net/compat_ns_ntoa.c b/lib/libc/compat/net/compat_ns_ntoa.c new file mode 100644 index 00000000000..469b2e7311b --- /dev/null +++ b/lib/libc/compat/net/compat_ns_ntoa.c @@ -0,0 +1,111 @@ +/* $NetBSD: compat_ns_ntoa.c,v 1.1 2006/08/26 16:07:01 matt Exp $ */ + +/* + * Copyright (c) 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)ns_ntoa.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: compat_ns_ntoa.c,v 1.1 2006/08/26 16:07:01 matt Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include <sys/param.h> +#include <compat/include/ns.h> + +#include <assert.h> +#include <stdio.h> + +static char *spectHex __P((char *)); + +char * +ns_ntoa(addr) + struct ns_addr addr; +{ + static char obuf[40]; + union { union ns_net net_e; u_int32_t long_e; } net; + u_int16_t port = htons(addr.x_port); + char *cp; + char *cp2; + u_int8_t *up = addr.x_host.c_host; + u_int8_t *uplim = up + 6; + + net.net_e = addr.x_net; + sprintf(obuf, "%x", ntohl(net.long_e)); + cp = spectHex(obuf); + cp2 = cp + 1; + while (up < uplim && *up==0) + up++; + if (up == uplim) { + if (port) { + sprintf(cp, ".0"); + cp += 2; + } + } else { + sprintf(cp, ".%x", *up++); + while (up < uplim) { + while (*cp) cp++; + sprintf(cp, "%02x", *up++); + } + cp = spectHex(cp2); + } + if (port) { + sprintf(cp, ".%x", port); + spectHex(cp + 1); + } + return (obuf); +} + +static char * +spectHex(p0) + char *p0; +{ + int ok = 0; + int nonzero = 0; + char *p = p0; + + _DIAGASSERT(p0 != NULL); + + for (; *p; p++) + switch (*p) { + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + *p += ('A' - 'a'); + /* FALLTHROUGH */ + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': + ok = 1; + /* FALLTHROUGH */ + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': + nonzero = 1; + } + if (nonzero && !ok) { *p++ = 'H'; *p = 0; } + return (p); +} |
