diff options
36 files changed, 588 insertions, 334 deletions
@@ -1,3 +1,80 @@ +Mon Dec 2 03:59:38 1996 Ulrich Drepper <drepper@cygnus.com> + + * 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 <gniibe@mri.co.jp>. + + * 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 <drepper@cygnus.com> + + * 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 <schwab@issan.informatik.uni-dortmund.de> + + * login/Makefile: Fix typo. + + * nss/Makefile (generated): Filter out db-alias.c. + +Thu Nov 28 14:44:01 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * time/Makefile (echo-zonenames): Don't depend on non-existing + target `zonenames'. + +Thu Nov 28 12:34:05 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * link.h: New file. + * nss/nsswitch.c: Use it. + + * printf.h: Fix file name. + * stdlib/strfmon.c: Use it. + Thu Nov 28 23:03:32 1996 Ulrich Drepper <drepper@cygnus.com> * sysdeps/unix/sysv/linux/netinet/in_systm.h: New file. diff --git a/grp/initgroups.c b/grp/initgroups.c index 35af575..a659f0d 100644 --- a/grp/initgroups.c +++ b/grp/initgroups.c @@ -1,20 +1,20 @@ /* Copyright (C) 1989, 1991, 1993, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. + 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 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. + 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. */ + 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. */ #include <alloca.h> #include <unistd.h> @@ -39,7 +39,9 @@ initgroups (user, group) #else - struct group *g; + struct group grpbuf, *g; + size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX); + char *tmpbuf; register size_t n; size_t ngroups; gid_t *groups; @@ -58,13 +60,14 @@ initgroups (user, group) #endif groups = __alloca (ngroups * sizeof *groups); + tmpbuf = __alloca (buflen); setgrent (); n = 0; groups[n++] = group; - while ((g = getgrent ()) != NULL) + while (__getgrent_r (&grpbuf, tmpbuf, buflen, &g) >= 0) if (g->gr_gid != group) { register char **m; diff --git a/inet/rcmd.c b/inet/rcmd.c index 3fc8adc..2631523 100644 --- a/inet/rcmd.c +++ b/inet/rcmd.c @@ -42,6 +42,7 @@ static char sccsid[] = "@(#)rcmd.c 8.3 (Berkeley) 3/26/94"; #include <netinet/in.h> #include <arpa/inet.h> +#include <alloca.h> #include <signal.h> #include <fcntl.h> #include <netdb.h> @@ -63,20 +64,35 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p) const char *locuser, *remuser, *cmd; int *fd2p; { - struct hostent *hp; + struct hostent hostbuf, *hp; + size_t hstbuflen; + char *tmphstbuf; struct sockaddr_in sin, from; fd_set reads; int32_t oldmask; pid_t pid; int s, lport, timo; char c; + int herr; pid = getpid(); - hp = gethostbyname(*ahost); - if (hp == NULL) { - herror(*ahost); - return (-1); - } + + hstbuflen = 1024; + tmphstbuf = __alloca (hstbuflen); + while (__gethostbyname_r (*ahost, &hostbuf, tmphstbuf, hstbuflen, + &hp, &herr) < 0) + if (herr != NETDB_INTERNAL || errno != ERANGE) + { + herror(*ahost); + return -1; + } + else + { + /* Enlarge the buffer. */ + hstbuflen *= 2; + tmphstbuf = __alloca (hstbuflen); + } + *ahost = hp->h_name; oldmask = sigblock(sigmask(SIGURG)); for (timo = 1, lport = IPPORT_RESERVED - 1;;) { @@ -244,12 +260,27 @@ ruserok(rhost, superuser, ruser, luser) const char *rhost, *ruser, *luser; int superuser; { - struct hostent *hp; + struct hostent hostbuf, *hp; + size_t buflen; + char *buffer; u_int32_t addr; char **ap; + int herr; + + buflen = 1024; + buffer = __alloca (buflen); + + while (__gethostbyname_r (rhost, &hostbuf, buffer, buflen, &hp, &herr) + < 0) + if (herr != NETDB_INTERNAL || errno != ERANGE) + return -1; + else + { + /* Enlarge the buffer. */ + buflen *= 2; + buffer = __alloca (buflen); + } - if ((hp = gethostbyname(rhost)) == NULL) - return (-1); for (ap = hp->h_addr_list; *ap; ++ap) { bcopy(*ap, &addr, sizeof(addr)); if (iruserok(addr, superuser, ruser, luser) == 0) @@ -275,7 +306,7 @@ iruserok(raddr, superuser, ruser, luser) { register char *cp; struct stat sbuf; - struct passwd *pwd; + struct passwd pwdbuf, *pwd; FILE *hostf; uid_t uid; int first; @@ -293,10 +324,12 @@ again: if (first == 1 && (__check_rhosts_file || superuser)) { char *pbuf; size_t dirlen; + size_t buflen = __sysconf (_SC_GETPW_R_SIZE_MAX); + char buffer = __alloca (buflen); first = 0; - if ((pwd = getpwnam(luser)) == NULL) - return (-1); + if (getpwnam_r (luser, &pwdbuf, buffer, buflen, &pwd) < 0) + return -1; dirlen = strlen (pwd->pw_dir); pbuf = alloca (dirlen + sizeof "/.rhosts"); @@ -395,17 +428,30 @@ __icheckhost(raddr, lhost) u_int32_t raddr; register char *lhost; { - register struct hostent *hp; + register struct hostent hostbuf, *hp; + size_t buflen; + char *buffer; register u_int32_t laddr; register char **pp; + int herr; /* Try for raw ip address first. */ if (isdigit(*lhost) && (int32_t)(laddr = inet_addr(lhost)) != -1) return (raddr == laddr); /* Better be a hostname. */ - if ((hp = gethostbyname(lhost)) == NULL) - return (0); + buflen = 1024; + buffer = __alloca (buflen); + while (__gethostbyname_r (lhost, &hostbuf, buffer, buflen, &hp, &herr) + < 0) + if (herr != NETDB_INTERNAL || errno != ERANGE) + return 0; + else + { + /* Enlarge the buffer. */ + buflen *= 2; + buflen = __alloca (buflen); + } /* Spin through ip addresses. */ for (pp = hp->h_addr_list; *pp; ++pp) diff --git a/inet/rexec.c b/inet/rexec.c index f477247..d91949d 100644 --- a/inet/rexec.c +++ b/inet/rexec.c @@ -40,6 +40,7 @@ static char sccsid[] = "@(#)rexec.c 8.1 (Berkeley) 6/4/93"; #include <netinet/in.h> +#include <alloca.h> #include <stdio.h> #include <netdb.h> #include <errno.h> @@ -56,16 +57,30 @@ rexec(ahost, rport, name, pass, cmd, fd2p) int *fd2p; { struct sockaddr_in sin, sin2, from; - struct hostent *hp; + struct hostent hostbuf, *hp; + size_t hstbuflen; + char *hsttmpbuf; u_short port; int s, timo = 1, s3; char c; + int herr; + + hstbuflen = 1024; + hsttmpbuf = __alloca (hstbuflen); + while (__gethostbyname_r (*ahost, &hostbuf, hsttmpbuf, hstbuflen, + &hp, &herr) < 0) + if (herr != NETDB_INTERNAL || errno != ERANGE) + { + herror(*ahost); + return -1; + } + else + { + /* Enlarge the buffer. */ + hstbuflen *= 2; + hsttmpbuf = __alloca (hstbuflen); + } - hp = gethostbyname(*ahost); - if (hp == 0) { - herror(*ahost); - return (-1); - } *ahost = hp->h_name; ruserpass(hp->h_name, &name, &pass); retry: diff --git a/intl/finddomain.c b/intl/finddomain.c index 47bd0ab..a2977d1 100644 --- a/intl/finddomain.c +++ b/intl/finddomain.c @@ -2,23 +2,23 @@ Copyright (C) 1995, 1996 Free Software Foundation, Inc. Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. -This file is part of the GNU C Library. Its master source is NOT part of -the C library, however. The master source lives in /gd/gnu/lib. + This file is part of the GNU C Library. Its master source is NOT part of + the C library, however. The master source lives in /gd/gnu/lib. -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 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. + 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. */ + 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. */ #ifdef HAVE_CONFIG_H # include <config.h> @@ -106,7 +106,7 @@ _nl_find_domain (dirname, locale, domainname) and six parts for the CEN syntax: - language[_territory][+audience][+special][,sponsor][_revision] + language[_territory][+audience][+special][,[sponsor][_revision]] Beside the first all of them are allowed to be missing. If the full specified locale is not found, the less specific one are diff --git a/intl/l10nflist.c b/intl/l10nflist.c index 4608fe8..9a586ec 100644 --- a/intl/l10nflist.c +++ b/intl/l10nflist.c @@ -1,23 +1,23 @@ /* Copyright (C) 1995, 1996 Free Software Foundation, Inc. -Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. -This file is part of the GNU C Library. Its master source is NOT part of -the C library, however. The master source lives in /gd/gnu/lib. + This file is part of the GNU C Library. Its master source is NOT part of + the C library, however. The master source lives in /gd/gnu/lib. -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 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. + 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. */ + 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. */ #ifdef HAVE_CONFIG_H # include <config.h> @@ -205,10 +205,11 @@ _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language, strlen (modifier) + 1 : 0) + ((mask & CEN_SPECIAL) != 0 ? strlen (special) + 1 : 0) - + ((mask & CEN_SPONSOR) != 0 - ? strlen (sponsor) + 1 : 0) - + ((mask & CEN_REVISION) != 0 - ? strlen (revision) + 1 : 0) + + ((mask & (CEN_SPONSOR | CEN_REVISION) != 0) + ? (1 + ((mask & CEN_SPONSOR) != 0 + ? strlen (sponsor) + 1 : 0) + + ((mask & CEN_REVISION) != 0 + ? strlen (revision) + 1 : 0)) : 0) + 1 + strlen (filename) + 1); if (abs_filename == NULL) @@ -251,15 +252,16 @@ _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language, *cp++ = '+'; cp = stpcpy (cp, special); } - if ((mask & CEN_SPONSOR) != 0) + if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0) { *cp++ = ','; - cp = stpcpy (cp, sponsor); - } - if ((mask & CEN_REVISION) != 0) - { - *cp++ = '_'; - cp = stpcpy (cp, revision); + if ((mask & CEN_SPONSOR) != 0) + cp = stpcpy (cp, sponsor); + if ((mask & CEN_REVISION) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, revision); + } } *cp++ = '/'; @@ -0,0 +1 @@ +#include <elf/link.h> diff --git a/locale/Makefile b/locale/Makefile index cedcd70..dd29c35 100644 --- a/locale/Makefile +++ b/locale/Makefile @@ -12,9 +12,9 @@ # 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. +# 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. # # Makefile for locales. @@ -64,7 +64,10 @@ $(objpfx)localedef: $(localedef-modules:%=$(objpfx)%.o) $(objpfx)locale: $(locale-modules:%=$(objpfx)%.o) $(objpfx)localedef $(objpfx)locale: $(lib-modules:%=$(objpfx)%.o) -CPPFLAGS := -DLOCALE_PATH='"$(localedir)"' \ +localepath = "$(localeddir)" + +CPPFLAGS := -DLOCALE_PATH='$(localepath)' \ + -DLOCALEDIR='"$(localedir)"' \ -DCHARMAP_PATH='"$(i18ndir)/charmaps"' \ -DLOCSRCDIR='"$(i18ndir)/locales"' -DHAVE_CONFIG_H \ -Iprograms $(CPPFLAGS) diff --git a/locale/findlocale.c b/locale/findlocale.c index 2bcc111..d73ba4a 100644 --- a/locale/findlocale.c +++ b/locale/findlocale.c @@ -1,21 +1,21 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. -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 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. + 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. */ + 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. */ #include <locale.h> #include <stdlib.h> @@ -99,7 +99,7 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, and six parts for the CEN syntax: - language[_territory][+audience][+special][,sponsor][_revision] + language[_territory][+audience][+special][,[sponsor][_revision]] Beside the first all of them are allowed to be missing. If the full specified locale is not found, the less specific one are diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c index 1db26e5..997126b 100644 --- a/locale/programs/localedef.c +++ b/locale/programs/localedef.c @@ -1,21 +1,21 @@ /* Copyright (C) 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. -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 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. + 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. */ + 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. */ #ifdef HAVE_CONFIG_H # include <config.h> @@ -463,9 +463,9 @@ construct_output_path (char *path) the end of the function we need another byte for the trailing '/'. */ if (normal == NULL) - asprintf (&result, "%s/%s%c", LOCALE_PATH, path, '\0'); + asprintf (&result, "%s/%s%c", LOCALEDIR, path, '\0'); else - asprintf (&result, "%s/%.*s%s%s%c", LOCALE_PATH, startp - path, path, + asprintf (&result, "%s/%.*s%s%s%c", LOCALEDIR, startp - path, path, normal, endp, '\0'); } else diff --git a/locale/setlocale.c b/locale/setlocale.c index ceec1a6..0946642 100644 --- a/locale/setlocale.c +++ b/locale/setlocale.c @@ -255,8 +255,7 @@ setlocale (int category, const char *locale) &locale_path, &locale_path_len) != 0) return NULL; - if (__argz_append (&locale_path, &locale_path_len, - LOCALE_PATH, sizeof (LOCALE_PATH)) != 0) + if (__argz_add_sep (&locale_path, &locale_path_len, LOCALE_PATH, ':') != 0) return NULL; if (category == LC_ALL) diff --git a/login/Makefile b/login/Makefile index da47089..6598266 100644 --- a/login/Makefile +++ b/login/Makefile @@ -27,7 +27,7 @@ headers := utmp.h utmpbits.h lastlog.h pty.h routines := getutent getutent_r getutid getutline getutid_r getutline_r \ utmp_file utmp_db -distribtue := utmp-private.h +distribute := utmp-private.h # Build the -lutil library with these extra functions. extra-libs := libutil diff --git a/nss/Makefile b/nss/Makefile index 9193cf2..ff3e039 100644 --- a/nss/Makefile +++ b/nss/Makefile @@ -55,7 +55,7 @@ libnss_dns-routines := dns-host dns-network libnss_db-routines := $(addprefix db-,$(filter-out hosts network key,\ $(databases))) -generated += $(filter-out db-netgrp.c, \ +generated += $(filter-out db-alias.c db-netgrp.c, \ $(addsuffix .c,$(libnss_db-routines))) distribute += db-XXX.c diff --git a/nss/getXXbyYY.c b/nss/getXXbyYY.c index 8449a38..529864a 100644 --- a/nss/getXXbyYY.c +++ b/nss/getXXbyYY.c @@ -96,15 +96,22 @@ FUNCTION_NAME (ADD_PARAMS) while (buffer != NULL && INTERNAL (REENTRANT_NAME) (ADD_VARIABLES, &resbuf, buffer, buffer_size, &result H_ERRNO_VAR) != 0 +#ifdef NEED_H_ERRNO + && h_errno_tmp == NETDB_INTERNAL +#endif && errno == ERANGE) { char *new_buf; buffer_size += BUFLEN; new_buf = realloc (buffer, buffer_size); if (new_buf == NULL) - /* We are out of memory. Free the current buffer so that the - process gets a chance for a normal termination. */ - free (buffer); + { + /* We are out of memory. Free the current buffer so that the + process gets a chance for a normal termination. */ + save = errno; + free (buffer); + __set_errno (save); + } buffer = new_buf; } diff --git a/nss/getXXent.c b/nss/getXXent.c index 2d6d1c3..f180171 100644 --- a/nss/getXXent.c +++ b/nss/getXXent.c @@ -84,15 +84,22 @@ GETFUNC_NAME (void) while (buffer != NULL && INTERNAL (REENTRANT_GETNAME) (&resbuf, buffer, buffer_size, &result H_ERRNO_VAR) != 0 +#ifdef NEED_H_ERRNO + && h_errno == NETDB_INTERNAL +#endif && errno == ERANGE) { char *new_buf; buffer_size += BUFLEN; new_buf = realloc (buffer, buffer_size); if (new_buf == NULL) - /* We are out of memory. Free the current buffer so that the - process gets a chance for a normal termination. */ - free (buffer); + { + /* We are out of memory. Free the current buffer so that the + process gets a chance for a normal termination. */ + save = errno; + free (buffer); + __set_errno (save); + } buffer = new_buf; } diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c index 014e272..2f99420 100644 --- a/nss/nss_files/files-XXX.c +++ b/nss/nss_files/files-XXX.c @@ -149,6 +149,7 @@ internal_getent (struct STRUCTURE *result, if (buflen < (int) sizeof *data + 1) { __set_errno (ERANGE); + HERRNO_SET (NETDB_INTERNAL); return NSS_STATUS_TRYAGAIN; } diff --git a/nss/nsswitch.c b/nss/nsswitch.c index af74493..ac743c7 100644 --- a/nss/nsswitch.c +++ b/nss/nsswitch.c @@ -22,13 +22,13 @@ #include <errno.h> #include <netdb.h> #include <libc-lock.h> +#include <link.h> /* We need some help from ld.so. */ #include <search.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "nsswitch.h" -#include "../elf/link.h" /* We need some help from ld.so. */ /* Prototypes for the local functions. */ static void *nss_lookup_function (service_user *ni, const char *fct_name); diff --git a/posix/getconf.c b/posix/getconf.c index f4f4765..5b67a28 100644 --- a/posix/getconf.c +++ b/posix/getconf.c @@ -231,7 +231,14 @@ main (int argc, char *argv[]) if (argc > 2) usage (); value = sysconf (c->call_name); - printf ("%ld\n", value); + if (value == -1l) + if (c->call_name == _SC_UINT_MAX + || c->call_name == _SC_ULONG_MAX) + printf ("%lu\n", value); + else + puts (_("undefined")); + else + printf ("%ld\n", value); exit (0); case CONFSTR: diff --git a/posix/glob.c b/posix/glob.c index b8820ce..0fa1561 100644 --- a/posix/glob.c +++ b/posix/glob.c @@ -56,7 +56,7 @@ Cambridge, MA 02139, USA. */ #include <stddef.h> #endif -#ifdef HAVE_UNISTD_H +#if defined HAVE_UNISTD_H || defined _LIBC #include <unistd.h> #ifndef POSIX #ifdef _POSIX_VERSION @@ -467,11 +467,40 @@ glob (pattern, flags, errfunc, pglob) if (dirname == NULL || dirname[0] == '\0') { extern char *getlogin __P ((void)); - char *name = getlogin (); - if (name != NULL) + extern int getlogin_r __P ((char *, size_t)); + int success; + +#if defined HAVE_GETLOGIN_R || defined _LIBC + size_t buflen = sysconf (_SC_LOGIN_NAME_MAX) + 1; + char *name; + + if (buflen == 0) + /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try + a moderate value. */ + buflen = 16; + name = __alloca (buflen); + + success = getlogin_r (name, buflen) >= 0; +#else + char *name; + success = (name = getlogin ()) != NULL; +#endif + if (success) { +#if defined HAVE_GETPWNAM_R || defined _LIBC + size_t pwbuflen = sysconf (_SC_GETPW_R_SIZE_MAX); + char *pwtmpbuf; + struct passwd pwbuf, *p; + + pwtmpbuf = __alloca (pwbuflen); + + success = (__getpwnam_r (name, &pwbuf, pwtmpbuf, + pwbuflen, &p) >= 0); +#else struct passwd *p = getpwnam (name); - if (p != NULL) + success = p != NULL; +#endif + if (success) dirname = p->pw_dir; } } @@ -491,9 +520,17 @@ glob (pattern, flags, errfunc, pglob) dirname = "c:/users/default"; /* poor default */ #else /* Look up specific user's home directory. */ +#if defined HAVE_GETPWNAM_R || defined _LIBC + size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX); + char *pwtmpbuf = __alloca (buflen); + struct passwd pwbuf, *p; + if (__getpwnam_r (dirname + 1, &pwbuf, pwtmpbuf, buflen, &p) >= 0) + dirname = p->pw_dir; +#else struct passwd *p = getpwnam (dirname + 1); if (p != NULL) dirname = p->pw_dir; +#endif #endif /* WIN32 */ #endif } @@ -1 +1 @@ -#include <stdio/printf.h> +#include <stdio-common/printf.h> diff --git a/pwd/getpw.c b/pwd/getpw.c index 402fafd..9c2e4af 100644 --- a/pwd/getpw.c +++ b/pwd/getpw.c @@ -1,23 +1,25 @@ /* Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. + 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 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. + 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. */ + 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. */ +#include <alloca.h> #include <errno.h> #include <stdio.h> +#include <unistd.h> #include <pwd.h> @@ -30,9 +32,11 @@ int __getpw __P ((__uid_t uid, char *buf)); int __getpw (uid, buf) __uid_t uid; - register char *buf; + char *buf; { - register struct passwd *p; + size_t buflen; + char *tmpbuf; + struct passwd resbuf, *p; if (buf == NULL) { @@ -40,8 +44,10 @@ __getpw (uid, buf) return -1; } - p = getpwuid (uid); - if (p == NULL) + buflen = __sysconf (_SC_GETPW_R_SIZE_MAX); + tmpbuf = alloca (buflen); + + if (getpwuid_r (uid, &resbuf, tmpbuf, buflen, &p) < 0) return -1; if (sprintf (buf, "%s:%s:%u:%u:%s:%s:%s", p->pw_name, p->pw_passwd, diff --git a/stdlib/l64a.c b/stdlib/l64a.c index 1559b5b..ba7a910 100644 --- a/stdlib/l64a.c +++ b/stdlib/l64a.c @@ -53,5 +53,5 @@ l64a (n) n >>= 6; } - return &result[n + 1]; + return &result[cnt + 1]; } diff --git a/stdlib/strfmon.c b/stdlib/strfmon.c index 99408c7..85f8898 100644 --- a/stdlib/strfmon.c +++ b/stdlib/strfmon.c @@ -27,10 +27,10 @@ Boston, MA 02111-1307, USA. */ # include "../libio/libioP.h" # include "../libio/strfile.h" #endif +#include <printf.h> #include <stdarg.h> #include <stdio.h> #include <string.h> -#include "../stdio-common/printf.h" #include "../locale/localeinfo.h" diff --git a/string/Makefile b/string/Makefile index d817d15..e91bd4d 100644 --- a/string/Makefile +++ b/string/Makefile @@ -35,7 +35,8 @@ routines := strcat strchr strcmp strcoll strcpy strcspn \ memccpy memcpy wordcopy strsep \ swab strfry memfrob memmem \ $(addprefix argz-,append count create ctsep next \ - delete extract insert stringify) \ + delete extract insert stringify \ + addsep) \ envz basename tests := tester testcopy test-ffs tst-strlen stratcliff diff --git a/string/argz-addsep.c b/string/argz-addsep.c new file mode 100644 index 0000000..7405e9a --- /dev/null +++ b/string/argz-addsep.c @@ -0,0 +1,59 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. + + 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. */ + +#include <argz.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> + + +error_t +__argz_add_sep (char **argz, size_t *argz_len, const char *string, int delim) +{ + size_t nlen = strlen (string) + 1; + + if (nlen > 1) + { + const char *rp; + char *wp; + + *argz = (char *) realloc (*argz, *argz_len + nlen); + if (*argz == NULL) + return ENOMEM; + + wp = *argz + *argz_len; + rp = string; + do + if (*rp == delim) + { + if (wp > *argz && wp[-1] != '\0') + *wp++ = '\0'; + else + --nlen; + } + else + *wp++ = *rp; + while (*rp++ != '\0'); + + *argz_len += nlen; + } + + return 0; +} +weak_alias (__argz_create_sep, argz_create_sep) diff --git a/string/argz-ctsep.c b/string/argz-ctsep.c index 9560591..461b9be 100644 --- a/string/argz-ctsep.c +++ b/string/argz-ctsep.c @@ -1,21 +1,21 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. -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 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. + 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. */ + 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. */ #include <argz.h> #include <errno.h> @@ -28,11 +28,11 @@ __argz_create_sep (const char *string, int delim, char **argz, size_t *len) { size_t nlen = strlen (string) + 1; - if (nlen != 0) + if (nlen > 1) { const char *rp; char *wp; - + *argz = (char *) malloc (nlen); if (*argz == NULL) return ENOMEM; @@ -50,10 +50,19 @@ __argz_create_sep (const char *string, int delim, char **argz, size_t *len) else *wp++ = *rp; while (*rp++ != '\0'); + + if (nlen == 0) + { + free (*argz); + *argz = NULL; + *len = 0; + } + } + else + { + *argz = NULL; + *len = 0; } - if (nlen == 0) - *argz = NULL; - *len = nlen; return 0; } diff --git a/string/argz.h b/string/argz.h index 2cfb5b7..255e1d3 100644 --- a/string/argz.h +++ b/string/argz.h @@ -71,6 +71,13 @@ extern error_t __argz_add __P ((char **__argz, size_t *__argz_len, extern error_t argz_add __P ((char **__argz, size_t *__argz_len, __const char *__str)); +/* Append SEP separated list in STRING to the argz vector in ARGZ & + ARGZ_LEN. */ +extern error_t __argz_add_sep __P ((char **__argz, size_t *__argz_len, + __const char *__string, int __delim)); +extern error_t argz_add_sep __P ((char **__argz, size_t *__argz_len, + __const char *__string, int __delim)); + /* Delete ENTRY from ARGZ & ARGZ_LEN, if it appears there. */ extern void __argz_delete __P ((char **__argz, size_t *__argz_len, char *__entry)); diff --git a/string/strcoll.c b/string/strcoll.c index 7061a38..fa1025e 100644 --- a/string/strcoll.c +++ b/string/strcoll.c @@ -74,7 +74,7 @@ STRCOLL (s1, s2) u_int32_t w1, w2; /* Here we have to check for IGNORE entries. If these are - found we count them and go on witht he next value. */ + found we count them and go on with the next value. */ while ((w1 = s1run->data[pass].value[s1idx]) == (u_int32_t) IGNORE_CHAR) { diff --git a/sunrpc/clnt_gen.c b/sunrpc/clnt_gen.c index e54e778..d7b949c 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 <alloca.h> +#include <errno.h> #include <rpc/rpc.h> #include <sys/socket.h> #include <sys/errno.h> @@ -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 e289b34..dd2ae75 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 <alloca.h> +#include <errno.h> #include <stdio.h> #include <rpc/rpc.h> #include <sys/socket.h> @@ -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 9b13bac..3e94dbb 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 <alloca.h> +#include <errno.h> #include <stdio.h> #include <rpc/rpc.h> #include <netdb.h> #include <sys/socket.h> +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; diff --git a/sysdeps/unix/sysv/linux/Dist b/sysdeps/unix/sysv/linux/Dist index 3f7d123..0adc370 100644 --- a/sysdeps/unix/sysv/linux/Dist +++ b/sysdeps/unix/sysv/linux/Dist @@ -21,7 +21,6 @@ sys/mount.h sys/mtio.h sys/procfs.h sys/quota.h -sys/serial.h sys/socketcall.h sys/soundcard.h sys/sysctl.h diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 9e6bd65..c7cf1f9 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -10,8 +10,7 @@ sysdep_routines += sysctl clone llseek sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h sys/mtio.h \ sys/module.h sys/io.h sys/klog.h sys/kdaemon.h \ sys/user.h syscall-list.h sys/sysmacros.h sys/procfs.h \ - sys/debugreg.h sys/kd.h sys/soundcard.h sys/vt.h \ - sys/serial.h + sys/debugreg.h sys/kd.h sys/soundcard.h sys/vt.h # Generate the list of SYS_* macros for the system calls (__NR_* macros). $(objpfx)syscall-%.h $(objpfx)syscall-%.d: ../sysdeps/unix/sysv/linux/syscall.h diff --git a/sysdeps/unix/sysv/linux/gethostid.c b/sysdeps/unix/sysv/linux/gethostid.c index ca2669d..b313ab3 100644 --- a/sysdeps/unix/sysv/linux/gethostid.c +++ b/sysdeps/unix/sysv/linux/gethostid.c @@ -1,20 +1,21 @@ /* Copyright (C) 1995, 1996 Free Software Foundation, Inc. -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. */ - + 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. */ + +#include <alloca.h> #include <errno.h> #include <fcntl.h> #include <unistd.h> @@ -58,9 +59,12 @@ long int gethostid () { char hostname[MAXHOSTNAMELEN + 1]; - struct hostent *hp; - unsigned long id; + size_t buflen; + char *buffer; + struct hostent hostbuf, *hp; + unsigned long int id; struct in_addr in; + int herr; int fd; /* First try to get the ID from a former invocation of sethostid. */ @@ -81,10 +85,20 @@ gethostid () /* This also fails. Return and arbitrary value. */ return 0; + buflen = 1024; + buffer = __alloca (buflen); + /* To get the IP address we need to know the host name. */ - hp = gethostbyname (hostname); - if (hp == NULL) - return 0; + while (__gethostbyname_r (hostname, &hostbuf, buffer, buflen, &hp, &herr) + < 0) + if (herr != NETDB_INTERNAL || errno != ERANGE) + return 0; + else + { + /* Enlarge buffer. */ + buflen *= 2; + buffer = __alloca (buflen); + } in.s_addr = 0; memcpy (&in, hp->h_addr, diff --git a/sysdeps/unix/sysv/linux/sys/serial.h b/sysdeps/unix/sysv/linux/sys/serial.h deleted file mode 100644 index 1844ef6..0000000 --- a/sysdeps/unix/sysv/linux/sys/serial.h +++ /dev/null @@ -1,110 +0,0 @@ -/* Copyright (C) 1996 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 _SYS_SERIAL_H -#define _SYS_SERIAL_H 1 -/* Defines for PC AT serial port. */ - -/* Serial port addresses and IRQs. */ -#define PORT_0 0x03F8 -#define PORT_1 0x02F8 -#define IRQ_0 0x04 -#define IRQ_1 0x03 - -/* Definitions for INS8250 / 16550 chips. */ - -/* Defined as offsets from the port address (data port). */ -#define DAT 0 /* Receive/transmit data. */ -#define ICR 1 /* Interrupt control register. */ -#define ISR 2 /* Interrupt status register. */ -#define LCR 3 /* Line control register. */ -#define MCR 4 /* Modem control register. */ -#define LSR 5 /* Line status register. */ -#define MSR 6 /* Modem status register. */ -#define DLL 0 /* Divisor latch (lsb). */ -#define DLH 1 /* Divisor latch (msb). */ - - -/* ICR. */ -#define RIEN 0x01 /* Enable receiver interrupt. */ -#define TIEN 0x02 /* Enable transmitter interrupt. */ -#define SIEN 0x04 /* Enable receiver line status interrupt. */ -#define MIEN 0x08 /* Enable modem status interrupt. */ - - -/* ISR */ -#define FFTMOUT 0x0c /* Fifo rcvr timeout. */ -#define RSTATUS 0x06 /* Change in receiver line status. */ -#define RxRDY 0x04 /* Receiver data available. */ -#define TxRDY 0x02 /* Transmitter holding register empty. */ -#define MSTATUS 0x00 /* Change in modem status. */ - - -/* LCR 3 - Number of data bits per received/transmitted character. */ -#define RXLEN 0x03 -#define STOP1 0x00 -#define STOP2 0x04 -#define PAREN 0x08 -#define PAREVN 0x10 -#define PARMARK 0x20 -#define SNDBRK 0x40 -#define DLAB 0x80 - -/* Baud rate definitions. */ -#define ASY9600 12 - -/* Definitions for character length (data bits) in RXLEN field. */ -#define BITS5 0x00 -#define BITS6 0x01 -#define BITS7 0x02 -#define BITS8 0x03 - -/* MCR. */ -#define DTR 0x01 /* Bring up DTR. */ -#define RTS 0x02 /* Bring up RTS. */ -#define OUT1 0x04 -#define OUT2 0x08 -#define LOOP 0x10 /* Put chip into loopback state. */ - - -/* LSR */ -#define RCA 0x01 /* Receive char available. */ -#define OVRRUN 0x02 /* Receive overrun. */ -#define PARERR 0x04 /* Parity error. */ -#define FRMERR 0x08 /* Framing/CRC error. */ -#define BRKDET 0x10 /* Break detected (null char + frame error). */ -#define XHRE 0x20 /* Transmit holding register empty. */ -#define XSRE 0x40 /* Transmit shift register empty. */ - - -/* MSR */ -#define DCTS 0x01 /* CTS has changed state. */ -#define DDSR 0x02 /* DSR has changed state. */ -#define DRI 0x04 /* RI has changed state. */ -#define DDCD 0x08 /* DCD has changed state. */ -#define CTS 0x10 /* State of CTS. */ -#define DSR 0x20 /* State of DSR. */ -#define RI 0x40 /* State of RI. */ -#define DCD 0x80 /* State of DCD. */ - - -#define DELTAS(x) ((x) & (DCTS | DDSR | DRI | DDCD)) -#define STATES(x) ((x) (CTS | DSR | RI | DCD)) - -#endif /* sys/serial.h */ diff --git a/time/Makefile b/time/Makefile index 252b335..966d9f2 100644 --- a/time/Makefile +++ b/time/Makefile @@ -99,7 +99,7 @@ $(tzfiles:%=$(objpfx)z.%): $(objpfx)z.%: % Makefile mv $@.new $@ .PHONY: echo-zonenames -echo-zonenames: zonenames +echo-zonenames: @echo 'Known zones: $(zonenames)' |