diff -crN uC-libc.orig/include/arpa/nameser.h uC-libc/include/arpa/nameser.h *** uC-libc.orig/include/arpa/nameser.h Wed Dec 31 19:00:00 1969 --- uC-libc/include/arpa/nameser.h Thu Oct 5 13:03:50 2000 *************** *** 0 **** --- 1,366 ---- + /* + * ++Copyright++ 1983, 1989, 1993 + * - + * Copyright (c) 1983, 1989, 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. 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. + * - + * Portions Copyright (c) 1993 by Digital Equipment Corporation. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies, and that + * the name of Digital Equipment Corporation not be used in advertising or + * publicity pertaining to distribution of the document or software without + * specific, written prior permission. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT + * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * - + * Portions Copyright (c) 1995 by International Business Machines, Inc. + * + * International Business Machines, Inc. (hereinafter called IBM) grants + * permission under its copyrights to use, copy, modify, and distribute this + * Software with or without fee, provided that the above copyright notice and + * all paragraphs of this notice appear in all copies, and that the name of IBM + * not be used in connection with the marketing of any product incorporating + * the Software or modifications thereof, without specific, written prior + * permission. + * + * To the extent it has a right to do so, IBM grants an immunity from suit + * under its patents, if any, for the use, sale or manufacture of products to + * the extent that such products are used for performing Domain Name System + * dynamic updates in TCP/IP networks by means of the Software. No immunity is + * granted for any product per se or for any other function of any product. + * + * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, + * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN + * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. + * --Copyright-- + */ + + /* + * @(#)nameser.h 8.1 (Berkeley) 6/2/93 + * $Id: nameser.h,v 1.2 1999/12/27 16:22:16 gafton Exp $ + */ + /* + * 5-Oct-2000 W. Greathosue wgreathouse@smva.com + * Define BYTE_ORDER for arm-uclinux + */ + + #ifndef _ARPA_NAMESER_H + #define _ARPA_NAMESER_H 1 + + #include + #include + #include + + /* + * revision information. this is the release date in YYYYMMDD format. + * it can change every day so the right thing to do with it is use it + * in preprocessor commands such as "#if (__BIND > 19931104)". do not + * compare for equality; rather, use it to determine whether your resolver + * is new enough to contain a certain feature. + */ + + #define __BIND 19960801 /* interface version stamp */ + + /* + * Define constants based on rfc883 + */ + #define PACKETSZ 512 /* maximum packet size */ + #define MAXDNAME 1025 /* maximum domain name */ + #define MAXCDNAME 255 /* maximum compressed domain name */ + #define MAXLABEL 63 /* maximum length of domain label */ + #define HFIXEDSZ 12 /* #/bytes of fixed data in header */ + #define QFIXEDSZ 4 /* #/bytes of fixed data in query */ + #define RRFIXEDSZ 10 /* #/bytes of fixed data in r record */ + #define INT32SZ 4 /* for systems without 32-bit ints */ + #define INT16SZ 2 /* for systems without 16-bit ints */ + #define INADDRSZ 4 /* IPv4 T_A */ + #define IN6ADDRSZ 16 /* IPv6 T_AAAA */ + + /* + * Internet nameserver port number + */ + #define NAMESERVER_PORT 53 + + /* + * Currently defined opcodes + */ + #define QUERY 0x0 /* standard query */ + #define IQUERY 0x1 /* inverse query */ + #define STATUS 0x2 /* nameserver status query */ + /*#define xxx 0x3*/ /* 0x3 reserved */ + #define NS_NOTIFY_OP 0x4 /* notify secondary of SOA change */ + /* + * Currently defined response codes + */ + #define NOERROR 0 /* no error */ + #define FORMERR 1 /* format error */ + #define SERVFAIL 2 /* server failure */ + #define NXDOMAIN 3 /* non existent domain */ + #define NOTIMP 4 /* not implemented */ + #define REFUSED 5 /* query refused */ + + /* + * Type values for resources and queries + */ + #define T_A 1 /* host address */ + #define T_NS 2 /* authoritative server */ + #define T_MD 3 /* mail destination */ + #define T_MF 4 /* mail forwarder */ + #define T_CNAME 5 /* canonical name */ + #define T_SOA 6 /* start of authority zone */ + #define T_MB 7 /* mailbox domain name */ + #define T_MG 8 /* mail group member */ + #define T_MR 9 /* mail rename name */ + #define T_NULL 10 /* null resource record */ + #define T_WKS 11 /* well known service */ + #define T_PTR 12 /* domain name pointer */ + #define T_HINFO 13 /* host information */ + #define T_MINFO 14 /* mailbox information */ + #define T_MX 15 /* mail routing information */ + #define T_TXT 16 /* text strings */ + #define T_RP 17 /* responsible person */ + #define T_AFSDB 18 /* AFS cell database */ + #define T_X25 19 /* X_25 calling address */ + #define T_ISDN 20 /* ISDN calling address */ + #define T_RT 21 /* router */ + #define T_NSAP 22 /* NSAP address */ + #define T_NSAP_PTR 23 /* reverse NSAP lookup (deprecated) */ + #define T_SIG 24 /* security signature */ + #define T_KEY 25 /* security key */ + #define T_PX 26 /* X.400 mail mapping */ + #define T_GPOS 27 /* geographical position (withdrawn) */ + #define T_AAAA 28 /* IP6 Address */ + #define T_LOC 29 /* Location Information */ + #define T_NXT 30 /* Next Valid Name in Zone */ + #define T_EID 31 /* Endpoint identifier */ + #define T_NIMLOC 32 /* Nimrod locator */ + #define T_SRV 33 /* Server selection */ + #define T_ATMA 34 /* ATM Address */ + #define T_NAPTR 35 /* Naming Authority PoinTeR */ + /* non standard */ + #define T_UINFO 100 /* user (finger) information */ + #define T_UID 101 /* user ID */ + #define T_GID 102 /* group ID */ + #define T_UNSPEC 103 /* Unspecified format (binary data) */ + /* Query type values which do not appear in resource records */ + #define T_IXFR 251 /* incremental zone transfer */ + #define T_AXFR 252 /* transfer zone of authority */ + #define T_MAILB 253 /* transfer mailbox records */ + #define T_MAILA 254 /* transfer mail agent records */ + #define T_ANY 255 /* wildcard match */ + + /* + * Values for class field + */ + + #define C_IN 1 /* the arpa internet */ + #define C_CHAOS 3 /* for chaos net (MIT) */ + #define C_HS 4 /* for Hesiod name server (MIT) (XXX) */ + /* Query class values which do not appear in resource records */ + #define C_ANY 255 /* wildcard match */ + + /* + * Flags field of the KEY RR rdata + */ + #define KEYFLAG_TYPEMASK 0xC000 /* Mask for "type" bits */ + #define KEYFLAG_TYPE_AUTH_CONF 0x0000 /* Key usable for both */ + #define KEYFLAG_TYPE_CONF_ONLY 0x8000 /* Key usable for confidentiality */ + #define KEYFLAG_TYPE_AUTH_ONLY 0x4000 /* Key usable for authentication */ + #define KEYFLAG_TYPE_NO_KEY 0xC000 /* No key usable for either; no key */ + /* The type bits can also be interpreted independently, as single bits: */ + #define KEYFLAG_NO_AUTH 0x8000 /* Key not usable for authentication */ + #define KEYFLAG_NO_CONF 0x4000 /* Key not usable for confidentiality */ + + #define KEYFLAG_EXPERIMENTAL 0x2000 /* Security is *mandatory* if bit=0 */ + #define KEYFLAG_RESERVED3 0x1000 /* reserved - must be zero */ + #define KEYFLAG_RESERVED4 0x0800 /* reserved - must be zero */ + #define KEYFLAG_USERACCOUNT 0x0400 /* key is assoc. with a user acct */ + #define KEYFLAG_ENTITY 0x0200 /* key is assoc. with entity eg host */ + #define KEYFLAG_ZONEKEY 0x0100 /* key is zone key for the zone named */ + #define KEYFLAG_IPSEC 0x0080 /* key is for IPSEC use (host or user)*/ + #define KEYFLAG_EMAIL 0x0040 /* key is for email (MIME security) */ + #define KEYFLAG_RESERVED10 0x0020 /* reserved - must be zero */ + #define KEYFLAG_RESERVED11 0x0010 /* reserved - must be zero */ + #define KEYFLAG_SIGNATORYMASK 0x000F /* key can sign DNS RR's of same name */ + + #define KEYFLAG_RESERVED_BITMASK ( KEYFLAG_RESERVED3 | \ + KEYFLAG_RESERVED4 | \ + KEYFLAG_RESERVED10| KEYFLAG_RESERVED11) + + /* The Algorithm field of the KEY and SIG RR's is an integer, {1..254} */ + #define ALGORITHM_MD5RSA 1 /* MD5 with RSA */ + #define ALGORITHM_EXPIRE_ONLY 253 /* No alg, no security */ + #define ALGORITHM_PRIVATE_OID 254 /* Key begins with OID indicating alg */ + + /* Signatures */ + /* Size of a mod or exp in bits */ + #define MIN_MD5RSA_KEY_PART_BITS 512 + #define MAX_MD5RSA_KEY_PART_BITS 2552 + /* Total of binary mod and exp, bytes */ + #define MAX_MD5RSA_KEY_BYTES ((MAX_MD5RSA_KEY_PART_BITS+7/8)*2+3) + /* Max length of text sig block */ + #define MAX_KEY_BASE64 (((MAX_MD5RSA_KEY_BYTES+2)/3)*4) + + /* + * Status return codes for T_UNSPEC conversion routines + */ + #define CONV_SUCCESS 0 + #define CONV_OVERFLOW (-1) + #define CONV_BADFMT (-2) + #define CONV_BADCKSUM (-3) + #define CONV_BADBUFLEN (-4) + + /* glibc always has byte order info in */ + #define __USE_BSD + #include + #undef __USE_BSD + + __BEGIN_DECLS + + /* + * Structure for query header. The order of the fields is machine- and + * compiler-dependent, depending on the byte/bit order and the layout + * of bit fields. We use bit fields only in int variables, as this + * is all ANSI requires. This requires a somewhat confusing rearrangement. + */ + + typedef struct { + unsigned id :16; /* query identification number */ + #if BYTE_ORDER == BIG_ENDIAN + /* fields in third byte */ + unsigned qr: 1; /* response flag */ + unsigned opcode: 4; /* purpose of message */ + unsigned aa: 1; /* authoritative answer */ + unsigned tc: 1; /* truncated message */ + unsigned rd: 1; /* recursion desired */ + /* fields in fourth byte */ + unsigned ra: 1; /* recursion available */ + unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */ + unsigned ad: 1; /* authentic data from named */ + unsigned cd: 1; /* checking disabled by resolver */ + unsigned rcode :4; /* response code */ + #endif + #if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN + /* fields in third byte */ + unsigned rd :1; /* recursion desired */ + unsigned tc :1; /* truncated message */ + unsigned aa :1; /* authoritative answer */ + unsigned opcode :4; /* purpose of message */ + unsigned qr :1; /* response flag */ + /* fields in fourth byte */ + unsigned rcode :4; /* response code */ + unsigned cd: 1; /* checking disabled by resolver */ + unsigned ad: 1; /* authentic data from named */ + unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */ + unsigned ra :1; /* recursion available */ + #endif + /* remaining bytes */ + unsigned qdcount :16; /* number of question entries */ + unsigned ancount :16; /* number of answer entries */ + unsigned nscount :16; /* number of authority entries */ + unsigned arcount :16; /* number of resource entries */ + } HEADER; + + #ifdef __cplusplus + extern "C" { + #endif + + + /* + * Defines for handling compressed domain names + */ + #define INDIR_MASK 0xc0 + + extern u_int16_t _getshort __P((const u_char *)); + extern u_int32_t _getlong __P((const u_char *)); + + /* + * Inline versions of get/put short/long. Pointer is advanced. + * + * These macros demonstrate the property of C whereby it can be + * portable or it can be elegant but rarely both. + */ + #define GETSHORT(s, cp) { \ + register u_char *t_cp = (u_char *)(cp); \ + (s) = ((u_int16_t)t_cp[0] << 8) \ + | ((u_int16_t)t_cp[1]) \ + ; \ + (cp) += INT16SZ; \ + } + + #define GETLONG(l, cp) { \ + register u_char *t_cp = (u_char *)(cp); \ + (l) = ((u_int32_t)t_cp[0] << 24) \ + | ((u_int32_t)t_cp[1] << 16) \ + | ((u_int32_t)t_cp[2] << 8) \ + | ((u_int32_t)t_cp[3]) \ + ; \ + (cp) += INT32SZ; \ + } + + #define PUTSHORT(s, cp) { \ + register u_int16_t t_s = (u_int16_t)(s); \ + register u_char *t_cp = (u_char *)(cp); \ + *t_cp++ = t_s >> 8; \ + *t_cp = t_s; \ + (cp) += INT16SZ; \ + } + + #define PUTLONG(l, cp) { \ + register u_int32_t t_l = (u_int32_t)(l); \ + register u_char *t_cp = (u_char *)(cp); \ + *t_cp++ = t_l >> 24; \ + *t_cp++ = t_l >> 16; \ + *t_cp++ = t_l >> 8; \ + *t_cp = t_l; \ + (cp) += INT32SZ; \ + } + + #ifdef __cplusplus + } + #endif + + + __END_DECLS + + #endif /* arpa/nameser.h */ diff -crN uC-libc.orig/include/bits/endian.h uC-libc/include/bits/endian.h *** uC-libc.orig/include/bits/endian.h Wed Dec 31 19:00:00 1969 --- uC-libc/include/bits/endian.h Thu Oct 5 11:53:37 2000 *************** *** 0 **** --- 1,15 ---- + #ifndef _ENDIAN_H + # error "Never use directly; include instead." + #endif + + #ifdef __arm__ + # ifdef __ARMEL__ + # define __BYTE_ORDER __LITTLE_ENDIAN + # endif + # ifdef __ARMEB__ + # define __BYTE_ORDER __BIG_ENDIAN + # endif + #else /* 68K */ + # define __BYTE_ORDER __BIG_ENDIAN + #endif + diff -crN uC-libc.orig/include/endian.h uC-libc/include/endian.h *** uC-libc.orig/include/endian.h Wed Dec 31 19:00:00 1969 --- uC-libc/include/endian.h Thu Oct 5 11:42:09 2000 *************** *** 0 **** --- 1,50 ---- + /* Copyright (C) 1992, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + #ifndef _ENDIAN_H + #define _ENDIAN_H 1 + + #include + + /* Definitions for byte order, according to significance of bytes, from low + addresses to high addresses. The value is what you get by putting '4' + in the most significant byte, '3' in the second most significant byte, + '2' in the second least significant byte, and '1' in the least + significant byte. */ + + #define __LITTLE_ENDIAN 1234 + #define __BIG_ENDIAN 4321 + #define __PDP_ENDIAN 3412 + + /* This file defines `__BYTE_ORDER' for the particular machine. */ + #include + + /* Some machines may need to use a different endianness for floating point + values. */ + #ifndef __FLOAT_WORD_ORDER + # define __FLOAT_WORD_ORDER __BYTE_ORDER + #endif + + #ifdef __USE_BSD + # define LITTLE_ENDIAN __LITTLE_ENDIAN + # define BIG_ENDIAN __BIG_ENDIAN + # define PDP_ENDIAN __PDP_ENDIAN + # define BYTE_ORDER __BYTE_ORDER + #endif + + #endif /* endian.h */ diff -crN uC-libc.orig/include/resolv.h uC-libc/include/resolv.h *** uC-libc.orig/include/resolv.h Wed May 3 16:38:27 2000 --- uC-libc/include/resolv.h Thu Oct 5 11:33:56 2000 *************** *** 8,13 **** --- 8,17 ---- * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. */ + /* + * 5-Oct-2000 W. Greathouse wgreathouse@smva.com + * Fix argument types in encode_packet() + */ #ifndef _RESOLV_H_ #define _RESOLV_H_ *************** *** 59,67 **** int encode_packet(struct resolv_header * h, struct resolv_question ** q, ! struct resolv_question ** an, ! struct resolv_question ** ns, ! struct resolv_question ** ar, unsigned char * dest, int maxlen); int decode_packet(unsigned char * data, struct resolv_header * h); --- 63,71 ---- int encode_packet(struct resolv_header * h, struct resolv_question ** q, ! struct resolv_answer ** an, ! struct resolv_answer ** ns, ! struct resolv_answer ** ar, unsigned char * dest, int maxlen); int decode_packet(unsigned char * data, struct resolv_header * h); diff -crN uC-libc.orig/make.rules uC-libc/make.rules *** uC-libc.orig/make.rules Tue Jun 20 18:40:46 2000 --- uC-libc/make.rules Fri Sep 29 21:39:36 2000 *************** *** 4,10 **** RANLIB=arm-uclinux-ranlib #AS=arm-uclinux-as ! CFLAGS= -O2 -g -mapcs-32 -mcpu=arm7tdmi -fpic -msingle-pic-base -mno-got -fomit-frame-pointer -msoft-float -D__linux__ -D_uclinux_ -I../include -I. .S.s: $(CC) $(CFLAGS) -D__ASSEMBLY__ -traditional -E -o $*.s $< --- 4,10 ---- RANLIB=arm-uclinux-ranlib #AS=arm-uclinux-as ! CFLAGS= -O2 -g -mapcs-32 -mcpu=arm7tdmi -fpic -msingle-pic-base -mno-got -fomit-frame-pointer -D__linux__ -D_uclinux_ -I../include -I. .S.s: $(CC) $(CFLAGS) -D__ASSEMBLY__ -traditional -E -o $*.s $< diff -crN uC-libc.orig/net/resolv.c uC-libc/net/resolv.c *** uC-libc.orig/net/resolv.c Tue Jun 20 18:40:47 2000 --- uC-libc/net/resolv.c Thu Oct 5 14:09:30 2000 *************** *** 8,13 **** --- 8,40 ---- * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. */ + /* + * 5-Oct-2000 W. Greathouse wgreathouse@smva.com + * Fix memory leak and memory corruption. + * -- Every name resolution resulted in + * a new parse of resolv.conf and new + * copy of nameservers allocated by + * strdup. + * -- Every name resolution resulted in + * a new read of resolv.conf without + * resetting index from prior read... + * resulting in exceeding array bounds. + * + * Limit nameservers read from resolv.conf + * + * Add "search" domains from resolv.conf + * + * Some systems will return a security + * signature along with query answer for + * dynamic DNS entries. + * -- skip/ignore this answer + * + * Fix argument types in encode_packet() + * + * Include arpa/nameser.h for defines. + * + * General cleanup + */ #include #include *************** *** 20,32 **** #include #include #include - #define DNS_SERVICE 53 #define MAX_RECURSE 5 #define REPLY_TIMEOUT 10 #define MAX_RETRIES 15 ! /*#define DEBUG*/ #ifdef DEBUG #define DPRINTF printf #else --- 47,62 ---- #include #include #include + #include #define MAX_RECURSE 5 #define REPLY_TIMEOUT 10 #define MAX_RETRIES 15 ! #define MAX_SERVERS 3 ! #define MAX_SEARCH 4 ! ! /* #define DEBUG */ #ifdef DEBUG #define DPRINTF printf #else *************** *** 219,225 **** char temp[256]; int i; ! i = decode_dotted(message, offset, temp, 256); if (i < 0) return i; --- 249,255 ---- char temp[256]; int i; ! i = decode_dotted(message, offset, temp, sizeof(temp)); if (i < 0) return i; *************** *** 259,265 **** dest += i; maxlen -= i; ! if (maxlen < (10+a->rdlength)) return -1; *dest++ = (a->atype & 0xff00) >> 8; --- 289,295 ---- dest += i; maxlen -= i; ! if (maxlen < (RRFIXEDSZ+a->rdlength)) return -1; *dest++ = (a->atype & 0xff00) >> 8; *************** *** 274,280 **** *dest++ = (a->rdlength & 0x00ff) >> 0; memcpy(dest, a->rdata, a->rdlength); ! return i+10+a->rdlength; } #endif --- 304,310 ---- *dest++ = (a->rdlength & 0x00ff) >> 0; memcpy(dest, a->rdata, a->rdlength); ! return i+RRFIXEDSZ+a->rdlength; } #endif *************** *** 285,291 **** char temp[256]; int i; ! i = decode_dotted(message, offset, temp, 256); if (i < 0) return i; --- 315,321 ---- char temp[256]; int i; ! i = decode_dotted(message, offset, temp, sizeof(temp)); if (i < 0) return i; *************** *** 301,320 **** message += 4; a->rdlength = (message[0] << 8) | message[1]; message += 2; a->rdata = message; ! a->rdoffset = offset+i+10; DPRINTF("i=%d,rdlength=%d\n", i, a->rdlength); ! return i+10+a->rdlength; } #endif #ifdef L_encodep int encode_packet(struct resolv_header * h, struct resolv_question ** q, ! struct resolv_question ** an, ! struct resolv_question ** ns, ! struct resolv_question ** ar, unsigned char * dest, int maxlen) { int i, total=0; --- 331,350 ---- message += 4; a->rdlength = (message[0] << 8) | message[1]; message += 2; a->rdata = message; ! a->rdoffset = offset+i+RRFIXEDSZ; DPRINTF("i=%d,rdlength=%d\n", i, a->rdlength); ! return i+RRFIXEDSZ+a->rdlength; } #endif #ifdef L_encodep int encode_packet(struct resolv_header * h, struct resolv_question ** q, ! struct resolv_answer ** an, ! struct resolv_answer ** ns, ! struct resolv_answer ** ar, unsigned char * dest, int maxlen) { int i, total=0; *************** *** 386,392 **** q.dotted = (char*)name; q.qtype = type; ! q.qclass = 1 /*CLASS_IN*/; i = encode_header(&h, packet, maxlen); if (i < 0) --- 416,422 ---- q.dotted = (char*)name; q.qtype = type; ! q.qclass = C_IN; i = encode_header(&h, packet, maxlen); if (i < 0) *************** *** 412,418 **** { static int id=1; int i,j,len; ! int fd; int pos; static int ns = 0; struct sockaddr_in sa; --- 442,448 ---- { static int id=1; int i,j,len; ! int fd = -1; int pos; static int ns = 0; struct sockaddr_in sa; *************** *** 421,437 **** struct resolv_header h; struct resolv_question q; int retries = 0; ! unsigned char * packet = malloc(512); ! if (!packet) ! goto fail1; ! DPRINTF("Looking up type %d answer for '%s'\n", type, name); - - if (!nscount) - goto fail1; - ns %= nscount; fd = -1; --- 451,468 ---- struct resolv_header h; struct resolv_question q; int retries = 0; ! unsigned char * packet = malloc(PACKETSZ); ! unsigned char * lookup = malloc(MAXDNAME); ! int variant = 0; ! extern int searchdomains; ! extern const char * searchdomain[MAX_SEARCH]; ! ! if (!packet || !lookup || !nscount) ! goto fail; ! DPRINTF("Looking up type %d answer for '%s'\n", type, name); ns %= nscount; fd = -1; *************** *** 444,453 **** fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (fd==-1) ! goto fail2; ! ! memset(packet, 0, 512); memset(&h, 0, sizeof(h)); h.id = ++id; --- 475,483 ---- fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (fd==-1) ! goto fail; ! memset(packet, 0, PACKETSZ); memset(&h, 0, sizeof(h)); h.id = ++id; *************** *** 456,480 **** DPRINTF("encoding header\n"); ! i = encode_header(&h, packet, 512); if (i < 0) ! goto fail3; ! q.dotted = (char*)name; q.qtype = type; ! q.qclass = 1 /*CLASS_IN*/; ! j = encode_question(&q, packet+i, 512-i); if (j < 0) ! goto fail3; len = i+j; DPRINTF("On try %d, sending query to port %d of machine %s\n", ! retries, DNS_SERVICE, nsip[ns]); sa.sin_family = AF_INET; ! sa.sin_port = htons(DNS_SERVICE); sa.sin_addr.s_addr = inet_addr(nsip[ns]); if (connect(fd, (struct sockaddr*)&sa, sizeof(sa))==-1) { --- 486,517 ---- DPRINTF("encoding header\n"); ! i = encode_header(&h, packet, PACKETSZ); if (i < 0) ! goto fail; ! strncpy(lookup,name,MAXDNAME); ! if (variant < searchdomains) ! { ! strncat(lookup,".", MAXDNAME); ! strncat(lookup,searchdomain[variant], MAXDNAME); ! } ! DPRINTF("lookup name: %s\n", lookup); ! q.dotted = (char *)lookup; q.qtype = type; ! q.qclass = C_IN; ! j = encode_question(&q, packet+i, PACKETSZ-i); if (j < 0) ! goto fail; len = i+j; DPRINTF("On try %d, sending query to port %d of machine %s\n", ! retries, NAMESERVER_PORT, nsip[ns]); sa.sin_family = AF_INET; ! sa.sin_port = htons(NAMESERVER_PORT); sa.sin_addr.s_addr = inet_addr(nsip[ns]); if (connect(fd, (struct sockaddr*)&sa, sizeof(sa))==-1) { *************** *** 483,489 **** goto tryall; } else /* retry */ ! break; } DPRINTF("Transmitting packet of length %d, id=%d, qr=%d\n", --- 520,526 ---- goto tryall; } else /* retry */ ! continue; } DPRINTF("Transmitting packet of length %d, id=%d, qr=%d\n", *************** *** 495,501 **** oldalarm = alarm(REPLY_TIMEOUT); oldhandler = signal(SIGALRM, dns_catch_signal); ! i = recv(fd, packet, 512, 0); alarm(0); signal(SIGALRM, oldhandler); --- 532,538 ---- oldalarm = alarm(REPLY_TIMEOUT); oldhandler = signal(SIGALRM, dns_catch_signal); ! i = recv(fd, packet, PACKETSZ, 0); alarm(0); signal(SIGALRM, oldhandler); *************** *** 509,515 **** to next nameserver on queue */ goto again; ! if (i < 12) /* too short ! */ goto again; --- 546,552 ---- to next nameserver on queue */ goto again; ! if (i < HFIXEDSZ) /* too short ! */ goto again; *************** *** 530,539 **** if ((h.rcode) || (h.ancount < 1)) { /* negative result, not present */ ! goto tryall; } ! pos = 12; for(j=0;jdotted); --- 582,602 ---- } DPRINTF("Decoding answer at pos %d\n", pos); ! for (j=0;jatype != T_SIG) ! break; ! ! DPRINTF("skipping T_SIG %d\n", i); ! free(a->dotted); ! pos += i; } DPRINTF("Answer name = |%s|\n", a->dotted); *************** *** 561,585 **** *outpacket = packet; else free(packet); return (0); /* success! */ tryall: /* if there are other nameservers, give them a go, otherwise return with error */ ! if (retries >= nscount) ! break; again: ! ns = (ns + 1) % nscount; ! continue; } ! ! ! fail3: ! close(fd); ! fail2: ! free(packet); ! fail1: return -1; } #endif --- 608,644 ---- *outpacket = packet; else free(packet); + free (lookup); return (0); /* success! */ tryall: /* if there are other nameservers, give them a go, otherwise return with error */ ! variant = 0; ! if (retries >= nscount*(searchdomains+1)) ! goto fail; again: ! /* if there are searchdomains, try them or fallback to as passed */ ! if (variant < searchdomains) ! { ! /* next search */ ! variant++; ! } ! else ! { ! /* next server, first search */ ! ns = (ns + 1) % nscount; ! variant = 0; ! } } ! fail: ! if (fd != -1) ! close(fd); ! if (lookup) ! free(lookup); ! if (packet) ! free(packet); return -1; } #endif *************** *** 599,617 **** if (!address || !in) return -1; ! strcpy(temp, address); for(;;) { ! i = dns_lookup(temp, 1, nscount, nsip, &packet, &a); if (i<0) return -1; free(a.dotted); ! if (a.atype == 5) { /* CNAME*/ ! i = decode_dotted(packet, a.rdoffset, temp, 256); free(packet); if (i <0) --- 658,676 ---- if (!address || !in) return -1; ! strncpy(temp, address, sizeof(temp)); for(;;) { ! i = dns_lookup(temp, T_A, nscount, nsip, &packet, &a); if (i<0) return -1; free(a.dotted); ! if (a.atype == T_CNAME) { ! i = decode_dotted(packet, a.rdoffset, temp, sizeof(temp)); free(packet); if (i <0) *************** *** 619,625 **** if (++nest > MAX_RECURSE) return -1; continue; ! } else if (a.atype == 1) { /* ADDRESS */ free(packet); break; } else { --- 678,684 ---- if (++nest > MAX_RECURSE) return -1; continue; ! } else if (a.atype == T_A) { free(packet); break; } else { *************** *** 629,635 **** } if (in) ! memcpy(in, a.rdata, 4); return 0; } --- 688,694 ---- } if (in) ! memcpy(in, a.rdata, INADDRSZ); /* IPv4 T_A */ return 0; } *************** *** 651,683 **** return -1; /* look up mail exchange */ ! i = dns_lookup(address, 15, nscount, nsip, &packet, &a); ! strcpy(temp, address); if (i>=0) { ! i = decode_dotted(packet, a.rdoffset+2, temp, 256); free(packet); } for(;;) { ! i = dns_lookup(temp, 1, nscount, nsip, &packet, &a); if (i<0) return -1; free(a.dotted); ! if (a.atype == 5) { /* CNAME*/ ! i = decode_dotted(packet, a.rdoffset, temp, 256); free(packet); if (i<0) return i; if (++nest > MAX_RECURSE) return -1; continue; ! } else if (a.atype == 1) { /* ADDRESS */ free(packet); break; } else { --- 710,742 ---- return -1; /* look up mail exchange */ ! i = dns_lookup(address, T_MX, nscount, nsip, &packet, &a); ! strncpy(temp, address, sizeof(temp)); if (i>=0) { ! i = decode_dotted(packet, a.rdoffset+2, temp, sizeof(temp)); free(packet); } for(;;) { ! i = dns_lookup(temp, T_A, nscount, nsip, &packet, &a); if (i<0) return -1; free(a.dotted); ! if (a.atype == T_CNAME) { ! i = decode_dotted(packet, a.rdoffset, temp, sizeof(temp)); free(packet); if (i<0) return i; if (++nest > MAX_RECURSE) return -1; continue; ! } else if (a.atype == T_A) { /* ADDRESS */ free(packet); break; } else { *************** *** 687,705 **** } if (in) ! memcpy(in, a.rdata, 4); return 0; } #endif extern int nameservers; ! extern const char * nameserver[3]; #ifdef L_opennameservers int nameservers; ! const char * nameserver[3]; int open_nameservers() { --- 746,770 ---- } if (in) ! memcpy(in, a.rdata, INADDRSZ); /* IPv4 */ return 0; } #endif extern int nameservers; ! extern const char * nameserver[MAX_SERVERS]; ! ! extern int searchdomains; ! extern const char * searchdomain[MAX_SEARCH]; #ifdef L_opennameservers int nameservers; ! const char * nameserver[MAX_SERVERS]; ! ! int searchdomains; ! const char * searchdomain[MAX_SEARCH]; int open_nameservers() { *************** *** 707,712 **** --- 772,780 ---- char **arg; int i; + if (nameservers > 0) + return 0; + DPRINTF("in open_nameservers\n"); if (fp = fopen("/etc/resolv.conf", "r")) { *************** *** 714,720 **** for (i=0; arg[i]; i++) { DPRINTF("cfgfind %s\n",arg[i]); } ! for (i=1; arg[i]; i++) { nameserver[nameservers++] = strdup(arg[i]); DPRINTF("adding nameserver %s\n",arg[i]); } --- 782,788 ---- for (i=0; arg[i]; i++) { DPRINTF("cfgfind %s\n",arg[i]); } ! for (i=1; arg[i] && nameservers <= MAX_SERVERS; i++) { nameserver[nameservers++] = strdup(arg[i]); DPRINTF("adding nameserver %s\n",arg[i]); } *************** *** 723,734 **** --- 791,816 ---- { DPRINTF("failed to find nameserver entry in resolv.conf\n"); } + if (0 != (arg = cfgfind(fp, "search"))) { + for (i=0; arg[i]; i++) { + DPRINTF("cfgfind %s\n",arg[i]); + } + for (i=1; arg[i] && searchdomains <= MAX_SEARCH; i++) { + searchdomain[searchdomains++] = strdup(arg[i]); + DPRINTF("adding search %s\n",arg[i]); + } + } + else + { + DPRINTF("failed to find nameserver entry in resolv.conf\n"); + } fclose(fp); } else { DPRINTF("failed to open resolv.conf\n"); } + DPRINTF("nameservers = %d\n", nameservers); return 0; } #endif *************** *** 797,803 **** addr_list[0] = ∈ addr_list[1] = 0; ! strcpy(namebuf, name); for(;;) { --- 879,885 ---- addr_list[0] = ∈ addr_list[1] = 0; ! strncpy(namebuf, name, sizeof(namebuf)); for(;;) { *************** *** 806,817 **** if (i<0) return 0; ! strcpy(namebuf, a.dotted); free(a.dotted); ! if (a.atype == 5) { /* CNAME*/ ! i = decode_dotted(packet, a.rdoffset, namebuf, 256); free(packet); if (i <0) --- 888,899 ---- if (i<0) return 0; ! strncpy(namebuf, a.dotted, sizeof(namebuf)); free(a.dotted); ! if (a.atype == T_CNAME) { ! i = decode_dotted(packet, a.rdoffset, namebuf, sizeof(namebuf)); free(packet); if (i <0) *************** *** 819,825 **** if (++nest > MAX_RECURSE) return 0; continue; ! } else if (a.atype == 1) { /* ADDRESS */ memcpy(&in, a.rdata, sizeof(in)); h.h_name = namebuf; h.h_addrtype = AF_INET; --- 901,907 ---- if (++nest > MAX_RECURSE) return 0; continue; ! } else if (a.atype == T_A) { /* ADDRESS */ memcpy(&in, a.rdata, sizeof(in)); h.h_name = namebuf; h.h_addrtype = AF_INET; *************** *** 871,886 **** for(;;) { ! i = dns_lookup(namebuf, 12, nameservers, nameserver, &packet, &a); if (i<0) return 0; ! strcpy(namebuf, a.dotted); free(a.dotted); ! if (a.atype == 5) { /* CNAME*/ ! i = decode_dotted(packet, a.rdoffset, namebuf, 256); free(packet); if (i <0) --- 953,968 ---- for(;;) { ! i = dns_lookup(namebuf, T_PTR, nameservers, nameserver, &packet, &a); if (i<0) return 0; ! strncpy(namebuf, a.dotted, sizeof(namebuf)); free(a.dotted); ! if (a.atype == T_CNAME) { ! i = decode_dotted(packet, a.rdoffset, namebuf, sizeof(namebuf)); free(packet); if (i <0) *************** *** 888,895 **** if (++nest > MAX_RECURSE) return 0; continue; ! } else if (a.atype == 12) { /* ADDRESS */ ! i = decode_dotted(packet, a.rdoffset, namebuf, 256); free(packet); h.h_name = namebuf; --- 970,977 ---- if (++nest > MAX_RECURSE) return 0; continue; ! } else if (a.atype == T_PTR) { ! i = decode_dotted(packet, a.rdoffset, namebuf, sizeof(namebuf)); free(packet); h.h_name = namebuf; diff -crN uC-libc.orig/stdio2/stdio.c uC-libc/stdio2/stdio.c *** uC-libc.orig/stdio2/stdio.c Mon Jun 26 16:16:49 2000 --- uC-libc/stdio2/stdio.c Mon Oct 2 19:44:46 2000 *************** *** 6,11 **** --- 6,24 ---- /* This is an implementation of the C standard IO package. */ + /* + * Updates: + * 29-Sep-2000 W. Greathouse 1. stderr should be unbuffered + * 2. fgetc copying beyond end of buffer + * 3. stdout needs flushed when input requested on + * stdin. + * 4. bufend was set incorrectly to 4 bytes beyond + * bufin (sizeof a pointer) instead of BUFSIZ. + * This resulted in 4 byte buffers for full + * buffered stdin and stdout and an 8 byte + * buffer for the unbuffered stderr! + */ + #include #include *************** *** 51,57 **** FILE stdin[1] = { #if 0 ! {bufin, bufin, bufin, bufin, bufin + sizeof(bufin), #else {0, 0, 0, 0, 0, #endif --- 64,70 ---- FILE stdin[1] = { #if 0 ! {bufin, bufin, bufin, bufin, bufin + BUFSIZ, #else {0, 0, 0, 0, 0, #endif *************** *** 61,67 **** FILE stdout[1] = { #if 0 ! {bufout, bufout, bufout, bufout, bufout + sizeof(bufout), #else {0, 0, 0, 0, 0, #endif --- 74,80 ---- FILE stdout[1] = { #if 0 ! {bufout, bufout, bufout, bufout, bufout + BUFSIZ, #else {0, 0, 0, 0, 0, #endif *************** *** 113,119 **** stdin->bufread = bufin; stdin->bufwrite = bufin; stdin->bufstart = bufin; ! stdin->bufend = bufin + sizeof(bufin); stdin->fd = 0; stdin->mode = _IOFBF | __MODE_READ | __MODE_IOTRAN | __MODE_FREEBUF; --- 126,132 ---- stdin->bufread = bufin; stdin->bufwrite = bufin; stdin->bufstart = bufin; ! stdin->bufend = bufin + sizeof(_fixed_buffers[0].data); stdin->fd = 0; stdin->mode = _IOFBF | __MODE_READ | __MODE_IOTRAN | __MODE_FREEBUF; *************** *** 123,129 **** stdout->bufread = bufout; stdout->bufwrite = bufout; stdout->bufstart = bufout; ! stdout->bufend = bufout + sizeof(bufout); stdout->fd = 1; stdout->mode = _IOFBF | __MODE_WRITE | __MODE_IOTRAN | __MODE_FREEBUF; --- 136,142 ---- stdout->bufread = bufout; stdout->bufwrite = bufout; stdout->bufstart = bufout; ! stdout->bufend = bufout + sizeof(_fixed_buffers[1].data); stdout->fd = 1; stdout->mode = _IOFBF | __MODE_WRITE | __MODE_IOTRAN | __MODE_FREEBUF; *************** *** 139,145 **** stderr->bufstart = buferr; stderr->bufend = buferr + sizeof(buferr); stderr->fd = 2; ! stderr->mode = _IOFBF | __MODE_WRITE | __MODE_IOTRAN; if (isatty(1)) stdout->mode |= _IOLBF; --- 152,158 ---- stderr->bufstart = buferr; stderr->bufend = buferr + sizeof(buferr); stderr->fd = 2; ! stderr->mode = _IONBF | __MODE_WRITE | __MODE_IOTRAN; if (isatty(1)) stdout->mode |= _IOLBF; *************** *** 206,211 **** --- 219,227 ---- if (fp->mode & __MODE_WRITING) fflush(fp); + if ( (fp == stdin) && (stdout->fd != -1) && (stdout->mode & __MODE_WRITING) ) + fflush(stdout); + try_again: /* Can't read or there's been an EOF or error then return EOF */ if ((fp->mode & (__MODE_READ | __MODE_EOF | __MODE_ERR)) != __MODE_READ) *************** *** 329,335 **** Inline_init; ret = s; ! for (i = count; i > 0; i--) { ch = getc(f); if (ch == EOF) --- 345,352 ---- Inline_init; ret = s; ! ! for (i = count-1; i > 0; i--) { ch = getc(f); if (ch == EOF)