diff options
-rw-r--r-- | ChangeLog | 21 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | hurd/thread-cancel.c | 6 | ||||
-rw-r--r-- | inet/Makefile | 2 | ||||
-rw-r--r-- | netdb.h | 2 | ||||
-rw-r--r-- | resolv/Makefile | 2 | ||||
-rw-r--r-- | resolv/gethnamaddr.c | 82 | ||||
-rw-r--r-- | resolv/inet_addr.c | 20 | ||||
-rw-r--r-- | resolv/netdb.h (renamed from inet/netdb.h) | 1 | ||||
-rw-r--r-- | resolv/res_send.c | 11 | ||||
-rw-r--r-- | sysdeps/mach/hurd/i386/intr-msg.h | 47 |
11 files changed, 150 insertions, 46 deletions
@@ -1,8 +1,29 @@ +Tue Aug 22 16:49:12 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu> + + * inet/netdb.h: Moved to resolv. + * inet/Makefile (headers): Remove netdb.h. + * resolv/Makefile (headers): Add netdb.h. + * resolv/gethnamaddr.c, resolv/inet_addr.c, resolv/netdb.h, + resolv/res_send.c: Updated from BIND-4.9.3-BETA26. + + * hurd/thread-cancel.c: If SS->cancel_hook is not null, call it before + resuming the thread. + * hurd/hurd/signal.h (struct hurd_sigstate): New member `cancel_hook'. + + * hurd/Makefile: Removed dep on hurd/signal.h for RPC stub objects. + +Mon Aug 21 16:37:09 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu> + + * sysdeps/i386/dl-machine.h (elf_machine_rel): Grok R_386_NONE + relocs, and do nothing. Why the linker generates them we may + never know. + Thu Aug 17 16:18:38 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu> * sysdeps/mach/hurd/Makefile: Don't elide sunrpc and manual from `subdirs' variable. + * sysdeps/mach/hurd/i386/intr-msg.h: New file. * hurd/intr-msg.c: Use INTR_MSG_TRAP macro from machine-dependent "intr-msg.h" for special syscall code, instead of i386-specific asm. * hurd/hurdsig.c: Use INTR_MSG_BACK_OUT macro from @@ -75,7 +75,7 @@ Version 1.10 * The new header file <fts.h> and suite of functions simplify programs that operate on directory trees. This code comes from 4.4 BSD. -* The resolver code has been updated from the BIND-4.9.3-BETA24 release. +* The resolver code has been updated from the BIND-4.9.3-BETA26 release. * The new function `malloc_find_object_address' finds the starting address of a malloc'd block, given any address within the block. This can be diff --git a/hurd/thread-cancel.c b/hurd/thread-cancel.c index db527c3935..7fb8cd23b4 100644 --- a/hurd/thread-cancel.c +++ b/hurd/thread-cancel.c @@ -62,6 +62,12 @@ hurd_thread_cancel (thread_t thread) (natural_t *) &state.basic, MACHINE_THREAD_STATE_COUNT); + if (ss->cancel_hook) + /* The code being cancelled has a special wakeup function. + Calling this should make the thread wake up and check the + cancellation flag. */ + (*ss->cancel_hook) (); + __thread_resume (thread); } diff --git a/inet/Makefile b/inet/Makefile index 069485b903..9389a22338 100644 --- a/inet/Makefile +++ b/inet/Makefile @@ -21,7 +21,7 @@ # subdir := inet -headers := netinet/in.h $(wildcard arpa/*.h protocols/*.h) netdb.h +headers := netinet/in.h $(wildcard arpa/*.h protocols/*.h) routines := ntohl ntohs htonl htons \ inet_lnaof inet_mkadr \ @@ -1 +1 @@ -#include <inet/netdb.h> +#include <resolv/netdb.h> diff --git a/resolv/Makefile b/resolv/Makefile index e07cfb0b15..f1a8701017 100644 --- a/resolv/Makefile +++ b/resolv/Makefile @@ -21,7 +21,7 @@ # subdir := resolv -headers := resolv.h arpa/nameser.h sys/bitypes.h +headers := resolv.h netdb.h arpa/nameser.h sys/bitypes.h distribute := ../conf/portability.h routines := gethnamaddr getnetbyaddr getnetbyname getnetent getnetnamadr \ diff --git a/resolv/gethnamaddr.c b/resolv/gethnamaddr.c index d3b68f7d95..87b4db1a6f 100644 --- a/resolv/gethnamaddr.c +++ b/resolv/gethnamaddr.c @@ -93,6 +93,7 @@ static const char AskedForGot[] = "gethostby*.getanswer: asked for \"%s\", got \"%s\""; static char *h_addr_ptrs[MAXADDRS + 1]; +static struct hostent *gethostbyname_ipv4 __P((const char *)); static struct hostent host; static char *host_aliases[MAXALIASES]; @@ -156,7 +157,9 @@ getanswer(answer, anslen, qname, qclass, qtype) int haveanswer, had_error; int toobig = 0; char tbuf[MAXDNAME+1]; + const char *tname; + tname = qname; host.h_name = NULL; eom = answer->buf + anslen; /* @@ -249,19 +252,36 @@ getanswer(answer, anslen, qname, qclass, qtype) buflen -= n; continue; } + if (qtype == T_PTR && type == T_CNAME) { + n = dn_expand(answer->buf, eom, cp, tbuf, sizeof tbuf); + if (n < 0) { + had_error++; + continue; + } + cp += n; + /* Get canonical name. */ + n = strlen(tbuf) + 1; /* for the \0 */ + if (n > buflen) { + had_error++; + continue; + } + strcpy(bp, tbuf); + tname = bp; + bp += n; + buflen -= n; + continue; + } if (type != qtype) { - /* CNAME->PTR should not cause a log message. */ - if (!(qtype == T_PTR && type == T_CNAME)) - syslog(LOG_NOTICE|LOG_AUTH, + syslog(LOG_NOTICE|LOG_AUTH, "gethostby*.getanswer: asked for \"%s %s %s\", got type \"%s\"", - qname, p_class(qclass), p_type(qtype), - p_type(type)); + qname, p_class(qclass), p_type(qtype), + p_type(type)); cp += n; continue; /* XXX - had_error++ ? */ } switch (type) { case T_PTR: - if (strcasecmp(qname, bp) != 0) { + if (strcasecmp(tname, bp) != 0) { syslog(LOG_NOTICE|LOG_AUTH, AskedForGot, qname, bp); cp += n; @@ -377,6 +397,36 @@ struct hostent * gethostbyname(name) const char *name; { + struct hostent *hp; + +#if defined(AF_INET6) && defined(RES_TRY_INET6) + if (_res.options & RES_TRY_INET6) { + hp = gethostbyname2(name, AF_INET6); + if (hp) + return (hp); + } +#endif + return (gethostbyname2(name, AF_INET)); +} + +struct hostent * +gethostbyname2(name, af) + const char *name; + int af; +{ + switch (af) { + case AF_INET: + return (gethostbyname_ipv4(name)); + } + errno = EAFNOSUPPORT; + h_errno = NETDB_INTERNAL; + return (NULL); +} + +static struct hostent * +gethostbyname_ipv4(name) + const char *name; +{ querybuf buf; register const char *cp; int n; @@ -727,23 +777,3 @@ dn_skipname(comp_dn, eom) return (__dn_skipname(comp_dn, eom)); } #endif /*old-style libc with yp junk in it*/ - -#ifdef ultrix -/* more icky libc packaging in ultrix */ -int -local_hostname_length(hostname) - const char *hostname; -{ - int len_host, len_domain; - - if (!*_res.defdname) - res_init(); - len_host = strlen(hostname); - len_domain = strlen(_res.defdname); - if (len_host > len_domain && - !strcasecmp(hostname + len_host - len_domain, _res.defdname) && - hostname[len_host - len_domain - 1] == '.') - return (len_host - len_domain - 1); - return (0); -} -#endif diff --git a/resolv/inet_addr.c b/resolv/inet_addr.c index 2a15067b07..01a38e6a00 100644 --- a/resolv/inet_addr.c +++ b/resolv/inet_addr.c @@ -66,10 +66,6 @@ static char rcsid[] = "$Id$"; /* these are compatibility routines, not needed on recent BSD releases */ -#ifndef NEED_INETADDR -int __inet_addr_unneeded__; -#else - /* * Ascii internet address interpretation routine. * The value returned is in network order. @@ -84,11 +80,6 @@ inet_addr(cp) return (val.s_addr); return (INADDR_NONE); } -#endif /*NEED_INETADDR*/ - -#ifndef NEED_INETATON -int __inet_aton_unneeded__; -#else /* * Check whether "cp" is a valid ascii representation @@ -113,8 +104,10 @@ inet_aton(cp, addr) /* * Collect number up to ``.''. * Values are specified as for C: - * 0x=hex, 0=octal, other=decimal. + * 0x=hex, 0=octal, isdigit=decimal. */ + if (!isdigit(c)) + return (0); val = 0; base = 10; if (c == '0') { c = *++cp; @@ -123,7 +116,7 @@ inet_aton(cp, addr) else base = 8; } - while (c != '\0') { + for (;;) { if (isascii(c) && isdigit(c)) { val = (val * base) + (c - '0'); c = *++cp; @@ -141,7 +134,7 @@ inet_aton(cp, addr) * a.b.c (with c treated as 16 bits) * a.b (with b treated as 24 bits) */ - if (pp >= parts + 3 || val > 0xff) + if (pp >= parts + 3) return (0); *pp++ = val; c = *++cp; @@ -151,7 +144,7 @@ inet_aton(cp, addr) /* * Check for trailing characters. */ - if (c && (!isascii(c) || (!isspace(c) && !ispunct(c)))) + if (c != '\0' && (!isascii(c) || !isspace(c))) return (0); /* * Concoct the address according to @@ -188,4 +181,3 @@ inet_aton(cp, addr) addr->s_addr = htonl(val); return (1); } -#endif /*NEED_INETATON*/ diff --git a/inet/netdb.h b/resolv/netdb.h index a568e2d6a5..822b621363 100644 --- a/inet/netdb.h +++ b/resolv/netdb.h @@ -133,6 +133,7 @@ void endprotoent __P((void)); void endservent __P((void)); struct hostent *gethostbyaddr __P((const char *, int, int)); struct hostent *gethostbyname __P((const char *)); +struct hostent *gethostbyname2 __P((const char *, int)); struct hostent *gethostent __P((void)); struct netent *getnetbyaddr __P((long, int)); /* u_long? */ struct netent *getnetbyname __P((const char *)); diff --git a/resolv/res_send.c b/resolv/res_send.c index 4ee52b438b..f8e58f3e11 100644 --- a/resolv/res_send.c +++ b/resolv/res_send.c @@ -109,6 +109,13 @@ static int vc = 0; /* is the socket a virtual ciruit? */ #define FD_ZERO(p) bzero((char *)(p), sizeof(*(p))) #endif +/* XXX - this should be done in portability.h */ +#if (defined(BSD) && (BSD >= 199103)) || defined(linux) +# define CAN_RECONNECT 1 +#else +# define CAN_RECONNECT 0 +#endif + #ifndef DEBUG # define Dprint(cond, args) /*empty*/ # define DprintQ(cond, args, query, size) /*empty*/ @@ -484,7 +491,7 @@ res_send(buf, buflen, ans, anssiz) _res_close(); s = socket(PF_INET, SOCK_DGRAM, 0); if (s < 0) { -#if !defined(BSD) || (BSD < 199103) +#if !CAN_RECONNECT bad_dg_sock: #endif terrno = errno; @@ -538,7 +545,7 @@ res_send(buf, buflen, ans, anssiz) * for responses from more than one server. */ if (connected) { -#if defined(BSD) && (BSD >= 199103) +#if CAN_RECONNECT struct sockaddr_in no_addr; no_addr.sin_family = AF_INET; diff --git a/sysdeps/mach/hurd/i386/intr-msg.h b/sysdeps/mach/hurd/i386/intr-msg.h new file mode 100644 index 0000000000..353a6d2acd --- /dev/null +++ b/sysdeps/mach/hurd/i386/intr-msg.h @@ -0,0 +1,47 @@ +/* Machine-dependent details of interruptible RPC messaging. i386 version. +Copyright (C) 1995 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., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + + +#define INTR_MSG_TRAP(msg, option, send_size, rcv_size, rcv_name, timeout, notify) \ +({ \ + error_t err; \ + asm (".globl _hurd_intr_rpc_msg_do_trap\n" \ + ".globl _hurd_intr_rpc_msg_in_trap\n" \ + ".globl _hurd_intr_rpc_msg_cx_sp\n" \ + ".globl _hurd_intr_rpc_msg_sp_restored\n" \ + " movl %%esp, %%ecx\n" \ + " leal %1, %%esp\n" \ + "_hurd_intr_rpc_msg_cx_sp: movl $-25, %%eax\n" \ + "_hurd_intr_rpc_msg_do_trap: lcall $7, $0 # status in %0\n" \ + "_hurd_intr_rpc_msg_in_trap: movl %%ecx, %%esp\n" \ + "_hurd_intr_rpc_msg_sp_restored:" \ + : "=a" (err) : "m" ((&msg)[-1]) : "%ecx"); \ + err; \ +}) + + +static void inline +INTR_MSG_BACK_OUT (struct i386_thread_state *state) +{ + extern const void _hurd_intr_rpc_msg_cx_sp; + if (state->eip >= (natural_t) &_hurd_intr_rpc_msg_cx_sp) + state->uesp = state->ecx; + else + state->ecx = state->uesp; +} |