From e4cf5070694529a8779d5e1581567bcfb9307da0 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 2 Dec 1996 04:00:15 +0000 Subject: update from main archive 961201 Mon Dec 2 03:59:38 1996 Ulrich Drepper * grp/initgroups.c: Update and reformat copyright. Use __getgrent_r instead of getgrent. * inet/rcmd.c: Update and reformat copyright. Use __gethostbyname_r instead of gethostbyname. * inet/rexec.c: Likewise. * intl/finddomain.c: Correct comment about CEN sponsor and revision. * locale/findlocale.c: Likewise. * intl/l10nflist.c: Correct handling of CEN sponsor and revision. * locale/Makefile (CPPFLAGS): Add definition of LOCALEDIR. * locale/setlocale.c (setlocale): Correctly split value of LOCALE_PATH. * locale/programs/localedef.c: Use LOCALEDIR not LOCALE_PATH to find output directory. * nss/getXXbyYY.c [NEED_H_ERRNO]: Before enlarging buffer test h_errno_tmp variable. Save error value from being changed during `free' call. * nss/getXXent.c: Likewise. * nss/nss_files/files-XXX.c: Set h_errno variable to NETDB_INTERNAL before returning ERANGE error. * posix/glob.c: Use getlogin_r and getpwnam_r function when available or in GNU libc. * pwd/getpw.c: Use getpwuid_r instead of getpwuid. * sunrpc/clnt_gen.c: Use gethostbyname_r and getprotobyname_r. * sunrpc/clnt_simp.c: Likewise. * sunrpc/getrpcport.c: Likewise. * sysdeps/unix/sysv/linux/gethostid.c: Likewise. * posix/getconf.c: Treat _SC_UNIT_MAX and _SC_ULONG_MAX separately since the value might be outsode the range of the `long int'. Print string `undefined' when a value is undefined. * stdlib/l64a.c: Return correct pointer. Patch by NIIBE Yutaka . * string/Makefile (routines): Add argz-addsep. * string/argz-addsep.c: New file. * string/argz.h: Add prototypes for argz_add_sep. * string/argz-ctsep.c: Prevent memory leak. * string/strcoll.c: Correct typo in comment. Sat Nov 30 02:53:59 1996 Ulrich Drepper * sysdeps/unix/sysv/linux/sys/serial.h: Removed again. The file is not general enough to be part of the libc. * sysdeps/unix/sysv/linux/Dist: Remove sys/serial.h. * sysdeps/unix/sysv/linux/Makefile: Don't install sys/serial.h. Thu Nov 28 20:04:41 1996 Andreas Schwab * login/Makefile: Fix typo. * nss/Makefile (generated): Filter out db-alias.c. Thu Nov 28 14:44:01 1996 Andreas Schwab * time/Makefile (echo-zonenames): Don't depend on non-existing target `zonenames'. Thu Nov 28 12:34:05 1996 Andreas Schwab * link.h: New file. * nss/nsswitch.c: Use it. * printf.h: Fix file name. * stdlib/strfmon.c: Use it. --- sunrpc/clnt_gen.c | 70 ++++++++++++++++++++++++++++++++++++++--------------- sunrpc/clnt_simp.c | 24 +++++++++++++++--- sunrpc/getrpcport.c | 33 +++++++++++++++++++------ 3 files changed, 96 insertions(+), 31 deletions(-) (limited to 'sunrpc') diff --git a/sunrpc/clnt_gen.c b/sunrpc/clnt_gen.c index e54e77828b..d7b949caa6 100644 --- a/sunrpc/clnt_gen.c +++ b/sunrpc/clnt_gen.c @@ -6,11 +6,11 @@ * may copy or modify Sun RPC without charge, but are not authorized * to license or distribute it to anyone else except as part of a product or * program developed by the user. - * + * * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * + * * Sun RPC is provided with no support and without any obligation on the * part of Sun Microsystems, Inc. to assist in its use, correction, * modification or enhancement. @@ -18,11 +18,11 @@ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC * OR ANY PART THEREOF. - * + * * In no event will Sun Microsystems, Inc. be liable for any lost revenue * or profits or other special, indirect and consequential damages, even if * Sun has been advised of the possibility of such damages. - * + * * Sun Microsystems, Inc. * 2550 Garcia Avenue * Mountain View, California 94043 @@ -33,6 +33,8 @@ static char sccsid[] = "@(#)clnt_generic.c 1.4 87/08/11 (C) 1987 SMI"; /* * Copyright (C) 1987, Sun Microsystems, Inc. */ +#include +#include #include #include #include @@ -40,7 +42,7 @@ static char sccsid[] = "@(#)clnt_generic.c 1.4 87/08/11 (C) 1987 SMI"; /* * Generic client creation: takes (hostname, program-number, protocol) and - * returns client handle. Default options are set, which the user can + * returns client handle. Default options are set, which the user can * change using the rpc equivalent of ioctl()'s. */ CLIENT * @@ -50,36 +52,64 @@ clnt_create(hostname, prog, vers, proto) unsigned vers; char *proto; { - struct hostent *h; - struct protoent *p; + struct hostent hostbuf, *h; + size_t hstbuflen; + char *hsttmpbuf; + struct protoent protobuf, *p; + size_t prtbuflen; + char *prttmpbuf; struct sockaddr_in sin; int sock; struct timeval tv; CLIENT *client; + int herr; + + hstbuflen = 1024; + hsttmpbuf = __alloca (hstbuflen); + while (__gethostbyname_r (hostname, &hostbuf, hsttmpbuf, hstbuflen, + &h, &herr) < 0) + if (herr != NETDB_INTERNAL || errno != ERANGE) + { + rpc_createerr.cf_stat = RPC_UNKNOWNHOST; + return NULL; + } + else + { + /* Enlarge the buffer. */ + hstbuflen *= 2; + hsttmpbuf = __alloca (hstbuflen); + } - h = gethostbyname(hostname); - if (h == NULL) { - rpc_createerr.cf_stat = RPC_UNKNOWNHOST; - return (NULL); - } if (h->h_addrtype != AF_INET) { /* * Only support INET for now */ rpc_createerr.cf_stat = RPC_SYSTEMERROR; - rpc_createerr.cf_error.re_errno = EAFNOSUPPORT; + rpc_createerr.cf_error.re_errno = EAFNOSUPPORT; return (NULL); } sin.sin_family = h->h_addrtype; sin.sin_port = 0; bzero(sin.sin_zero, sizeof(sin.sin_zero)); bcopy(h->h_addr, (char*)&sin.sin_addr, h->h_length); - p = getprotobyname(proto); - if (p == NULL) { - rpc_createerr.cf_stat = RPC_UNKNOWNPROTO; - rpc_createerr.cf_error.re_errno = EPFNOSUPPORT; - return (NULL); - } + + prtbuflen = 1024; + prttmpbuf = __alloca (prtbuflen); + while (__getprotobyname_r (proto, &protobuf, prttmpbuf, prtbuflen, &p) + < 0) + if (errno != ERANGE) + { + rpc_createerr.cf_stat = RPC_UNKNOWNPROTO; + rpc_createerr.cf_error.re_errno = EPFNOSUPPORT; + return NULL; + } + else + { + /* Enlarge the buffer. */ + prtbuflen *= 2; + prttmpbuf = __alloca (prtbuflen); + } + sock = RPC_ANYSOCK; switch (p->p_proto) { case IPPROTO_UDP: @@ -103,7 +133,7 @@ clnt_create(hostname, prog, vers, proto) break; default: rpc_createerr.cf_stat = RPC_SYSTEMERROR; - rpc_createerr.cf_error.re_errno = EPFNOSUPPORT; + rpc_createerr.cf_error.re_errno = EPFNOSUPPORT; return (NULL); } return (client); diff --git a/sunrpc/clnt_simp.c b/sunrpc/clnt_simp.c index e289b3400d..dd2ae75f1e 100644 --- a/sunrpc/clnt_simp.c +++ b/sunrpc/clnt_simp.c @@ -38,6 +38,8 @@ static char sccsid[] = "@(#)clnt_simple.c 1.35 87/08/11 Copyr 1984 Sun Micro"; * Copyright (C) 1984, Sun Microsystems, Inc. */ +#include +#include #include #include #include @@ -59,7 +61,7 @@ callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out) register struct callrpc_private *crp = callrpc_private; struct sockaddr_in server_addr; enum clnt_stat clnt_stat; - struct hostent *hp; + struct hostent hostbuf, *hp; struct timeval timeout, tottimeout; if (crp == 0) { @@ -77,6 +79,10 @@ callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out) && strcmp(crp->oldhost, host) == 0) { /* reuse old client */ } else { + size_t buflen; + char *buffer; + int herr; + crp->valid = 0; if (crp->socket != RPC_ANYSOCK) { @@ -87,8 +93,20 @@ callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out) clnt_destroy(crp->client); crp->client = NULL; } - if ((hp = gethostbyname(host)) == NULL) - return ((int) RPC_UNKNOWNHOST); + + buflen = 1024; + buffer = __alloca (buflen); + while (__gethostbyname_r (host, &hostbuf, buffer, buflen, + &hp, &herr) < 0) + if (herr != NETDB_INTERNAL || errno != ERANGE) + return (int) RPC_UNKNOWNHOST; + else + { + /* Enlarge the buffer. */ + buflen *= 2; + buffer = __alloca (buflen); + } + timeout.tv_usec = 0; timeout.tv_sec = 5; bcopy(hp->h_addr, (char *)&server_addr.sin_addr, hp->h_length); diff --git a/sunrpc/getrpcport.c b/sunrpc/getrpcport.c index 9b13bac6b0..3e94dbbf7b 100644 --- a/sunrpc/getrpcport.c +++ b/sunrpc/getrpcport.c @@ -9,23 +9,23 @@ static char sccsid[] = "@(#)getrpcport.c 1.3 87/08/11 SMI"; * may copy or modify Sun RPC without charge, but are not authorized * to license or distribute it to anyone else except as part of a product or * program developed by the user. - * + * * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * + * * Sun RPC is provided with no support and without any obligation on the * part of Sun Microsystems, Inc. to assist in its use, correction, * modification or enhancement. - * + * * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC * OR ANY PART THEREOF. - * + * * In no event will Sun Microsystems, Inc. be liable for any lost revenue * or profits or other special, indirect and consequential damages, even if * Sun has been advised of the possibility of such damages. - * + * * Sun Microsystems, Inc. * 2550 Garcia Avenue * Mountain View, California 94043 @@ -35,19 +35,36 @@ static char sccsid[] = "@(#)getrpcport.c 1.3 87/08/11 SMI"; * Copyright (c) 1985 by Sun Microsystems, Inc. */ +#include +#include #include #include #include #include +int getrpcport(host, prognum, versnum, proto) char *host; { struct sockaddr_in addr; - struct hostent *hp; + struct hostent hostbuf, *hp; + size_t buflen; + char *buffer; + int herr; + + buflen = 1024; + buffer = __alloca (buflen); + while (__gethostbyname_r (host, &hostbuf, buffer, buflen, &hp, &herr) + < 0) + if (herr != NETDB_INTERNAL || errno != ERANGE) + return 0; + else + { + /* Enlarge the buffer. */ + buflen *= 2; + buffer = __alloca (buflen); + } - if ((hp = gethostbyname(host)) == NULL) - return (0); bcopy(hp->h_addr, (char *) &addr.sin_addr, hp->h_length); addr.sin_family = AF_INET; addr.sin_port = 0; -- cgit v1.2.3