update from main archive 961119
authordrepper <drepper>
Wed, 20 Nov 1996 03:42:44 +0000 (03:42 +0000)
committerdrepper <drepper>
Wed, 20 Nov 1996 03:42:44 +0000 (03:42 +0000)
32 files changed:
elf/Makefile
elf/dl-deps.c
elf/dl-lookup.c
elf/dlfcn.h
elf/dlsym.c
elf/ldd.bash.in
elf/ldd.sh.in
elf/link.h
grp/grp.h
inet/ether_hton.c
inet/ether_ntoh.c
inet/rexec.c
login/utmp.h
manual/nss.texi
misc/Makefile
misc/regexp.c [new file with mode: 0644]
misc/regexp.h [new file with mode: 0644]
misc/search.h
misc/sys/cdefs.h
misc/sys/uio.h
nss/nss_dns/dns-host.c
nss/nss_dns/dns-network.c
pwd/pwd.h
resolv/gethnamaddr.c
resolv/getnetnamadr.c
resolv/herror.c
signal/signal.h
stdio-common/vfprintf.c
stdlib/drand48-iter.c
stdlib/tst-strtod.c
stdlib/tst-strtol.c
sunrpc/Makefile

index 58b3a90..4cb8d7e 100644 (file)
@@ -99,11 +99,21 @@ $(objpfx)libdl.so: $(objpfx)libdl_pic.a $(common-objpfx)libc.so $(objpfx)ld.so
 
 $(slibdir)/$(rtld-installed-name): $(objpfx)ld.so; $(do-install-program)
 
+ifneq ($(have-bash2),yes)
 $(objpfx)ldd: ldd.sh.in Makefile
        sed -e 's%@RTLD@%$(slibdir)/$(rtld-installed-name)%g' \
            -e 's%@VERSION@%$(version)%g' < $< > $@.new
        chmod 555 $@.new
        mv -f $@.new $@
+else
+$(objpfx)ldd: ldd.bash.in Makefile
+       sed -e 's%@BASH@%$(BASH)%g' \
+           -e 's%@RTLD@%$(slibdir)/$(rtld-installed-name)%g' \
+           -e 's%@VERSION@%$(version)%g' \
+           -e 's%@TEXTDOMAINDIR@%$(localedir)%g' < $< > $@.new
+       chmod 555 $@.new
+       mv -f $@.new $@
+endif
 \f
 # muwahaha
 
index 977b323..115982f 100644 (file)
@@ -33,16 +33,24 @@ _dl_map_object_deps (struct link_map *map,
       struct list *next;
     };
   struct list head[1 + npreloads], *tailp, *scanp;
+  struct list duphead, *duptailp;
   unsigned int nlist;
+  unsigned int nduplist;
 
   /* Start the search list with one element: MAP itself.  */
   head[0].map = map;
 
+  /* We use `l_reserved' as a mark bit to detect objects we have already
+     put in the search list and avoid adding duplicate elements later in
+     the list.  */
+  map->l_reserved = 1;
+
   /* Add the preloaded items after MAP but before any of its dependencies.  */
   for (nlist = 0; nlist < npreloads; ++nlist)
     {
       head[nlist].next = &head[nlist + 1];
       head[nlist + 1].map = preloads[nlist];
+      preloads[nlist]->l_reserved = 1;
     }
 
   /* Terminate the list.  */
@@ -51,10 +59,10 @@ _dl_map_object_deps (struct link_map *map,
   /* Start here for adding dependencies to the list.  */
   tailp = &head[nlist++];
 
-  /* We use `l_reserved' as a mark bit to detect objects we have already
-     put in the search list and avoid adding duplicate elements later in
-     the list.  */
-  map->l_reserved = 1;
+  /* Until now we have the same number of libraries in the normal and
+     the list with duplicates.  */
+  nduplist = nlist;
+  duptailp = &duphead;
 
   /* Process each element of the search list, loading each of its immediate
      dependencies and appending them to the list as we step through it.
@@ -94,6 +102,13 @@ _dl_map_object_deps (struct link_map *map,
                    /* Set the mark bit that says it's already in the list.  */
                    dep->l_reserved = 1;
                  }
+
+               /* In any case Append DEP to the duplicates search list.  */
+               duptailp->next = alloca (sizeof *duptailp);
+               duptailp = duptailp->next;
+               duptailp->map = dep;
+               duptailp->next = NULL;
+               ++nduplist;
              }
        }
     }
@@ -112,4 +127,12 @@ _dl_map_object_deps (struct link_map *map,
         to avoid duplicates, so the next call starts fresh.  */
       scanp->map->l_reserved = 0;
     }
+
+  map->l_dupsearchlist = malloc (nduplist * sizeof (struct link_map *));
+  map->l_ndupsearchlist = nduplist;
+
+  for (nlist = 0; nlist < npreloads + 1; ++nlist)
+    map->l_dupsearchlist[nlist] = head[nlist].map;
+  for (scanp = duphead.next; scanp; scanp = scanp->next)
+    map->l_dupsearchlist[nlist++] = scanp->map;
 }
index f35bbbe..717ac83 100644 (file)
 #include <string.h>
 
 
+struct sym_val
+  {
+    ElfW(Addr) a;
+    const ElfW(Sym) *s;
+  };
+
+
 /* This is the hashing function specified by the ELF ABI.  */
 static inline unsigned
 _dl_elf_hash (const char *name)
@@ -44,6 +51,90 @@ _dl_elf_hash (const char *name)
   return hash;
 }
 
+
+/* Inner part of the lookup functions.  */
+static inline ElfW(Addr)
+do_lookup (const char *undef_name, unsigned long int hash,
+          const ElfW(Sym) **ref, struct sym_val *result,
+          struct link_map *list[], size_t i, size_t n,
+          const char *reference_name, struct link_map *skip, int flags)
+{
+  struct link_map *map;
+
+  for (; i < n; ++i)
+    {
+      const ElfW(Sym) *symtab;
+      const char *strtab;
+      ElfW(Symndx) symidx;
+
+      map = list[i];
+
+      /* Here come the extra test needed for `_dl_lookup_symbol_skip'.  */
+      if (skip != NULL && map == skip)
+       continue;
+
+      /* Don't search the executable when resolving a copy reloc.  */
+      if (flags & DL_LOOKUP_NOEXEC && map->l_type == lt_executable)
+       continue;
+
+      symtab = ((void *) map->l_addr + map->l_info[DT_SYMTAB]->d_un.d_ptr);
+      strtab = ((void *) map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr);
+
+      /* Search the appropriate hash bucket in this object's symbol table
+        for a definition for the same symbol name.  */
+      for (symidx = map->l_buckets[hash % map->l_nbuckets];
+          symidx != STN_UNDEF;
+          symidx = map->l_chain[symidx])
+       {
+         const ElfW(Sym) *sym = &symtab[symidx];
+
+         if (sym->st_value == 0 || /* No value.  */
+             ((flags & DL_LOOKUP_NOPLT) != 0 /* Reject PLT entry.  */
+              && sym->st_shndx == SHN_UNDEF))
+           continue;
+
+         switch (ELFW(ST_TYPE) (sym->st_info))
+           {
+           case STT_NOTYPE:
+           case STT_FUNC:
+           case STT_OBJECT:
+             break;
+           default:
+             /* Not a code/data definition.  */
+             continue;
+           }
+
+         if (sym != *ref && strcmp (strtab + sym->st_name, undef_name))
+           /* Not the symbol we are looking for.  */
+           continue;
+
+         switch (ELFW(ST_BIND) (sym->st_info))
+           {
+           case STB_GLOBAL:
+             /* Global definition.  Just what we need.  */
+             result->s = sym;
+             result->a = map->l_addr;
+             return 1;
+           case STB_WEAK:
+             /* Weak definition.  Use this value if we don't find
+                another.  */
+             if (! result->s)
+               {
+                 result->s = sym;
+                 result->a = map->l_addr;
+               }
+             break;
+           default:
+             /* Local symbols are ignored.  */
+             break;
+           }
+       }
+    }
+
+  /* We have not found anything until now.  */
+  return 0;
+}
+
 /* Search loaded objects' symbol tables for a definition of the symbol
    UNDEF_NAME.  FLAGS is a set of flags.  If DL_LOOKUP_NOEXEC is set,
    then don't search the executable for a definition; this used for
@@ -57,82 +148,17 @@ _dl_lookup_symbol (const char *undef_name, const ElfW(Sym) **ref,
                   int flags)
 {
   const unsigned long int hash = _dl_elf_hash (undef_name);
-  struct
-    {
-      ElfW(Addr) a;
-      const ElfW(Sym) *s;
-    } weak_value = { 0, NULL };
-  size_t i;
-  struct link_map **scope, *map;
+  struct sym_val current_value = { 0, NULL };
+  struct link_map **scope;
 
   /* Search the relevant loaded objects for a definition.  */
   for (scope = symbol_scope; *scope; ++scope)
-    for (i = 0; i < (*scope)->l_nsearchlist; ++i)
-      {
-       const ElfW(Sym) *symtab;
-       const char *strtab;
-       ElfW(Symndx) symidx;
-
-       map = (*scope)->l_searchlist[i];
-
-       /* Don't search the executable when resolving a copy reloc.  */
-       if (flags & DL_LOOKUP_NOEXEC && map->l_type == lt_executable)
-         continue;
-
-       symtab = ((void *) map->l_addr + map->l_info[DT_SYMTAB]->d_un.d_ptr);
-       strtab = ((void *) map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr);
-
-       /* Search the appropriate hash bucket in this object's symbol table
-          for a definition for the same symbol name.  */
-       for (symidx = map->l_buckets[hash % map->l_nbuckets];
-            symidx != STN_UNDEF;
-            symidx = map->l_chain[symidx])
-         {
-           const ElfW(Sym) *sym = &symtab[symidx];
-
-           if (sym->st_value == 0 || /* No value.  */
-               ((flags & DL_LOOKUP_NOPLT) != 0 /* Reject PLT entry.  */
-                && sym->st_shndx == SHN_UNDEF))
-             continue;
-
-           switch (ELFW(ST_TYPE) (sym->st_info))
-             {
-             case STT_NOTYPE:
-             case STT_FUNC:
-             case STT_OBJECT:
-               break;
-             default:
-               /* Not a code/data definition.  */
-               continue;
-             }
-
-           if (sym != *ref && strcmp (strtab + sym->st_name, undef_name))
-             /* Not the symbol we are looking for.  */
-             continue;
+    if (do_lookup (undef_name, hash, ref, &current_value,
+                  (*scope)->l_searchlist, 0, (*scope)->l_nsearchlist,
+                  reference_name, NULL, flags))
+      break;
 
-           switch (ELFW(ST_BIND) (sym->st_info))
-             {
-             case STB_GLOBAL:
-               /* Global definition.  Just what we need.  */
-               *ref = sym;
-               return map->l_addr;
-             case STB_WEAK:
-               /* Weak definition.  Use this value if we don't find
-                  another.  */
-               if (! weak_value.s)
-                 {
-                   weak_value.s = sym;
-                   weak_value.a = map->l_addr;
-                 }
-               break;
-             default:
-               /* Local symbols are ignored.  */
-               break;
-             }
-         }
-      }
-
-  if (weak_value.s == NULL &&
+  if (current_value.s == NULL &&
       (*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK))
     {
       /* We could find no value for a strong reference.  */
@@ -144,8 +170,45 @@ _dl_lookup_symbol (const char *undef_name, const ElfW(Sym) **ref,
       _dl_signal_error (0, reference_name, buf);
     }
 
-  *ref = weak_value.s;
-  return weak_value.a;
+  *ref = current_value.s;
+  return current_value.a;
+}
+
+
+/* This function is nearly the same as `_dl_lookup_symbol' but it
+   skips in the first list all objects until SKIP_MAP is found.  I.e.,
+   it only considers objects which were loaded after the described
+   object.  If there are more search lists the object described by
+   SKIP_MAP is only skipped.  */
+ElfW(Addr)
+_dl_lookup_symbol_skip (const char *undef_name, const ElfW(Sym) **ref,
+                       struct link_map *symbol_scope[],
+                       const char *reference_name,
+                       struct link_map *skip_map,
+                       int flags)
+{
+  int found_entry = 0;
+  const unsigned long int hash = _dl_elf_hash (undef_name);
+  struct sym_val current_value = { 0, NULL };
+  struct link_map **scope;
+  size_t i;
+
+  /* Search the relevant loaded objects for a definition.  */
+  scope = symbol_scope;
+  for (i = 0; (*scope)->l_dupsearchlist[i] != skip_map; ++i)
+    assert (i < (*scope)->l_ndupsearchlist);
+
+  if (! do_lookup (undef_name, hash, ref, &current_value,
+                  (*scope)->l_dupsearchlist, i, (*scope)->l_ndupsearchlist,
+                  reference_name, skip_map, flags))
+    while (*++scope)
+      if (do_lookup (undef_name, hash, ref, &current_value,
+                    (*scope)->l_dupsearchlist, 0, (*scope)->l_ndupsearchlist,
+                    reference_name, skip_map, flags))
+       break;
+
+  *ref = current_value.s;
+  return current_value.a;
 }
 
 
index b59bebd..c2b66a7 100644 (file)
    visible as if the object were linked directly into the program.  */
 #define RTLD_GLOBAL    0x100
 
+/* If the first argument of `dlsym' is set to RTLD_NEXT the run-time
+   address of the symbol called NAME in the next shared object is
+   returned.  The "next" relation is defined by the order the shared
+   objects were loaded.  */
+#define RTLD_NEXT      ((void *) -1l)
+
 /* Open the shared object FILE and map it in; return a handle that can be
    passed to `dlsym' to get symbol values from it.  */
 extern void *dlopen __P ((__const char *__file, int __mode));
index edfe1c6..12a29e4 100644 (file)
 void *
 dlsym (void *handle, const char *name)
 {
+  ElfW(Addr) caller = (ElfW(Addr)) __builtin_return_address (0);
   ElfW(Addr) loadbase;
   const ElfW(Sym) *ref = NULL;
   void doit (void)
     {
-      struct link_map *map = handle, **scope, *mapscope[2] = { map, NULL };
-      const char *owner;
-
-      if (map)
+      if (handle == NULL)
+       /* Search the global scope.  */
+       loadbase = _dl_lookup_symbol
+         (name, &ref, &(_dl_global_scope ?: _dl_default_scope)[2], NULL, 0);
+      else if (handle == RTLD_NEXT)
        {
-         /* Search the scope of the given object.  */
-         scope = mapscope;
-         owner = map->l_name;
+         struct link_map *l, *match;
+
+         /* Find the highest-addressed object that CALLER is not below.  */
+         match = NULL;
+         for (l = _dl_loaded; l; l = l->l_next)
+           if (caller >= l->l_addr && (!match || match->l_addr < l->l_addr))
+             match = l;
+
+         if (! match)
+           _dl_signal_error (0, NULL, _("\
+RTLD_NEXT used in code not dynamically loaded"));
+
+         l = match;
+         while (l->l_loader)
+           l = l->l_loader;
+
+         loadbase = _dl_lookup_symbol_skip
+           (name, &ref, &_dl_loaded, NULL, l, 0);
        }
       else
        {
-         scope = &(_dl_global_scope ?: _dl_default_scope)[2];
-         owner = NULL;
+         /* Search the scope of the given object.  */
+         struct link_map *map = handle;
+         struct link_map *mapscope[2] = { map, NULL };
+         loadbase = _dl_lookup_symbol (name, &ref, mapscope, map->l_name, 0);
        }
-      loadbase = _dl_lookup_symbol (name, &ref, scope, owner, 0);
     }
 
   return _dlerror_run (doit) ? NULL : (void *) (loadbase + ref->st_value);
index e7ad21f..5269708 100644 (file)
@@ -1,24 +1,50 @@
 #! @BASH@
 
+# 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.
+
+
 # This is the `ldd' command, which lists what shared libraries are
 # used by given dynamically-linked executables.  It works by invoking the
 # run-time dynamic linker as a command and setting the environment
 # variable LD_TRACE_LOADED_OBJECTS to a non-empty value.
 
+# We should be able to find the translation right at the beginning.
+TEXTDOMAIN=libc
+TEXTDOMAINDIR=@TEXTDOMAINDIR@
+
 RTLD=@RTLD@
-usage=$"\
-ldd [OPTION]... FILE...
-  --help           print this help and exit
-  --version        print version information and exit
-Report bugs to <bug-glibc@prep.ai.mit.edu>."
 
 while test $# -gt 0; do
   case "$1" in
   --v*)
-    echo 'ldd (GNU libc) @VERSION@'; exit 0 ;;
+    echo $"ldd (GNU libc) @VERSION@
+Copyright (C) 1996 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+    exit 0 ;;
   --h*)
-    echo "$usage"; exit 0 ;;
-  --)          # Stop option prcessing
+    echo $"ldd [OPTION]... FILE...
+  --help           print this help and exit
+  --version        print version information and exit
+Report bugs to <bug-glibc@prep.ai.mit.edu>."
+    exit 0 ;;
+  --)          # Stop option prcessing.
     shift; break ;;
   *)
     break ;;
@@ -64,3 +90,6 @@ Try \`ldd --help' for more information."
 esac
 
 exit 0
+# Local Variables:
+#  mode:ksh
+# End:
index 16d3fd8..f8df62d 100644 (file)
@@ -1,24 +1,46 @@
 #! /bin/sh
 
+# 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.
+
+
 # This is the `ldd' command, which lists what shared libraries are
 # used by given dynamically-linked executables.  It works by invoking the
 # run-time dynamic linker as a command and setting the environment
 # variable LD_TRACE_LOADED_OBJECTS to a non-empty value.
 
 RTLD=@RTLD@
-usage="\
-ldd [OPTION]... FILE...
-  --help           print this help and exit
-  --version        print version information and exit
-Report bugs to <bug-glibc@prep.ai.mit.edu>."
 
 while test $# -gt 0; do
   case "$1" in
   --v*)
-    echo 'ldd (GNU libc) @VERSION@'; exit 0 ;;
+    echo 'ldd (GNU libc) @VERSION@
+Copyright (C) 1996 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.'
+    exit 0 ;;
   --h*)
-    echo "$usage"; exit 0 ;;
-  --)          # Stop option prcessing
+    echo 'ldd [OPTION]... FILE...
+  --help           print this help and exit
+  --version        print version information and exit
+Report bugs to <bug-glibc@prep.ai.mit.edu>.'
+    exit 0 ;;
+  --)          # Stop option prcessing.
     shift; break ;;
   *)
     break ;;
index 17fea30..b277bf7 100644 (file)
@@ -109,6 +109,11 @@ struct link_map
     struct link_map **l_searchlist;
     unsigned int l_nsearchlist;
 
+    /* We keep another list in which we keep duplicates.  This is
+       needed in _dl_lookup_symbol_skip to implemented RTLD_NEXT.  */
+    struct link_map **l_dupsearchlist;
+    unsigned int l_ndupsearchlist;
+
     /* Dependent object that first caused this object to be loaded.  */
     struct link_map *l_loader;
 
@@ -239,6 +244,14 @@ extern ElfW(Addr) _dl_lookup_symbol (const char *undef,
                                     const char *reference_name,
                                     int flags);
 
+/* For handling RTLD_NEXT we must be able to skip shared objects.  */
+extern ElfW(Addr) _dl_lookup_symbol_skip (const char *undef,
+                                         const ElfW(Sym) **sym,
+                                         struct link_map *symbol_scope[],
+                                         const char *reference_name,
+                                         struct link_map *skip_this,
+                                         int flags);
+
 /* Look up symbol NAME in MAP's scope and return its run-time address.  */
 extern ElfW(Addr) _dl_symbol_value (struct link_map *map, const char *name);
 
index 5243afe..3e2bd05 100644 (file)
--- a/grp/grp.h
+++ b/grp/grp.h
@@ -98,8 +98,11 @@ extern struct group *getgrnam __P ((__const char *__name));
 
 /* Reentrant versions of some of the functions above.
 
-   PLEASE NOTE: these functions are not yet standardized.  The interface
-   may change in later versions of this library.  */
+   PLEASE NOTE: the `getgrent_r' function is not (yet) standardized.
+   The interface may change in later versions of this library.  But
+   the interface is designed following the principals used for the
+   other reentrant functions so the chances are good this is what the
+   POSIX people would choose.  */
 
 #if defined(__USE_SVID) || defined (__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
 extern int getgrent_r __P ((struct group *__resultbuf, char *buffer,
@@ -117,7 +120,8 @@ extern int getgrnam_r __P ((__const char *__name, struct group *__resultbuf,
                            struct group **__result));
 
 #ifdef __USE_SVID
-/* Read a group entry from STREAM.  */
+/* Read a group entry from STREAM.  This function is not standardized
+   an probably never will.  */
 extern int __fgetgrent_r __P ((FILE * __stream, struct group *__resultbuf,
                               char *buffer, size_t __buflen,
                               struct group **__result));
index c4149a0..4e24fbb 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <netinet/ether.h>
 #include <netinet/if_ether.h>
+#include <string.h>
 
 #include "../nss/nsswitch.h"
 
index 61bc0f1..93c2cf8 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <netinet/ether.h>
 #include <netinet/if_ether.h>
+#include <string.h>
 
 #include "../nss/nsswitch.h"
 
index 7533410..f477247 100644 (file)
@@ -43,12 +43,12 @@ static char sccsid[] = "@(#)rexec.c 8.1 (Berkeley) 6/4/93";
 #include <stdio.h>
 #include <netdb.h>
 #include <errno.h>
+#include <string.h>
+#include <unistd.h>
 
-extern errno;
-char   *index();
 int    rexecoptions;
-char   *getpass(), *getlogin();
 
+int
 rexec(ahost, rport, name, pass, cmd, fd2p)
        char **ahost;
        int rport;
index 76870f6..6786190 100644 (file)
@@ -1,20 +1,20 @@
 /* Copyright (C) 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., 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.  */
 
 
 #ifndef        _UTMP_H_
@@ -38,18 +38,18 @@ Boston, MA 02111-1307, USA.  */
 
 /* Make FD be the controlling terminal, stdin, stdout, and stderr;
    then close FD.  Returns 0 on success, nonzero on error.  */
-extern int login_tty __P ((int fd));
+extern int login_tty __P ((int __fd));
 
 
 /* Write the given entry into utmp and wtmp.  */
-extern void login __P ((__const struct utmp *));
+extern void login __P ((__const struct utmp *__entry));
 
 /* Write the utmp entry to say the user on UT_LINE has logged out.  */
-extern int logout __P ((__const char *ut_line));
+extern int logout __P ((__const char *__ut_line));
 
 /* Append to wtmp an entry for the current time and the given info.  */
-extern void logwtmp __P ((__const char *ut_line, __const char *ut_name,
-                         __const char *ut_host));
+extern void logwtmp __P ((__const char *__ut_line, __const char *__ut_name,
+                         __const char *__ut_host));
 
 /* Change name of the utmp file to be examined.  */
 extern int utmpname __P ((__const char *__file));
index 6773fc4..074b857 100644 (file)
@@ -11,7 +11,7 @@ correctly in the local environment.  Traditionally, this was done by
 using files (e.g., @file{/etc/passwd}), but other nameservices (line the
 Network Information Service (NIS) and the Domain Name Service (DNS))
 became popular, and were hacked into the C library, usually with a fixed
-search order @pxref{frobnicate, frobnicate, ,jargon}.
+search order (@pxref{frobnicate, , ,jargon, The Jargon File}).
 
 The GNU C Library contains a cleaner solution of this problem.  It is
 designed after a method used by Sun Microsystems in the C library of
index 46b078c..74e0a73 100644 (file)
@@ -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., 675 Mass Ave,
-# Cambridge, MA 02139, 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.
 
 #
 #      Sub-makefile for misc portion of the library.
@@ -28,7 +28,8 @@ headers       := sys/uio.h iovec.h sys/ioctl.h ioctls.h ioctl-types.h \
           ttyent.h syslog.h sys/syslog.h paths.h sys/reboot.h \
           sys/mman.h sys/param.h fstab.h mntent.h search.h err.h error.h\
           sys/queue.h sysexits.h syscall.h sys/syscall.h sys/swap.h \
-          sys/select.h ustat.h sys/ustat.h ustatbits.h sys/sysinfo.h
+          sys/select.h ustat.h sys/ustat.h ustatbits.h sys/sysinfo.h \
+          regexp.h
 
 routines := brk sbrk sstk ioctl \
            readv writev \
@@ -55,7 +56,7 @@ routines := brk sbrk sstk ioctl \
            efgcvt efgcvt_r qefgcvt qefgcvt_r \
            hsearch hsearch_r tsearch lsearch \
            err error ustat \
-           getsysstats dirname
+           getsysstats dirname regexp
 aux := init-misc
 distribute := bsd-compat.c
 extra-objs := bsd-compat.o
diff --git a/misc/regexp.c b/misc/regexp.c
new file mode 100644 (file)
index 0000000..34019ae
--- /dev/null
@@ -0,0 +1,76 @@
+/* Define function and variables for the obsolete <regexp.h> interface.
+   Copyright (C) 1996 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 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.  */
+
+#define __DO_NOT_DEFINE_COMPILE
+#include <regexp.h>
+
+/* Define the variables used for the interface.  */
+char *loc1;
+char *loc2;
+
+/* Although we do not support the use we define this variable as well.  */
+char *locs;
+
+
+/* Find the next match in STRING.  The compiled regular expression is
+   found in the buffer starting at EXPBUF.  `loc1' will return the
+   first character matched and `loc2' points to the next unmatched
+   character.  */
+int
+__step (const char *string, const char *expbuf)
+{
+  regmatch_t match;    /* We only need info about the full match.  */
+
+  expbuf += __alignof (regex_t *);
+  expbuf -= (expbuf - ((const char *) 0)) % __alignof__ (regex_t *);
+
+  if (regexec ((regex_t *) expbuf, string, 1, &match, REG_NOTEOL)
+      == REG_NOMATCH)
+    return 0;
+
+  loc1 = (char *) string + match.rm_so;
+  loc2 = (char *) string + match.rm_eo;
+  return 1;
+}
+weak_alias (__step, step)
+
+
+/* Match the beginning of STRING with the compiled regular expression
+   in EXPBUF.  If the match is successful `loc2' will contain the
+   position of the first unmatched character.  */
+int
+__advance (const char *string, const char *expbuf)
+{
+  regmatch_t match;    /* We only need info about the full match.  */
+
+  expbuf += __alignof__ (regex_t *);
+  expbuf -= (expbuf - ((const char *) 0)) % __alignof__ (regex_t *);
+
+  if (regexec ((regex_t *) expbuf, string, 1, &match, REG_NOTEOL)
+      == REG_NOMATCH
+      /* We have to check whether the check is at the beginning of the
+        buffer.  */
+      || match.rm_so != 0)
+    return 0;
+
+  loc2 = (char *) string + match.rm_eo;
+  return 1;
+}
+weak_alias (__advance, advance)
diff --git a/misc/regexp.h b/misc/regexp.h
new file mode 100644 (file)
index 0000000..e31407e
--- /dev/null
@@ -0,0 +1,213 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 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.  */
+
+#ifndef _REGEXP_H
+#define _REGEXP_H      1
+
+/* The contents of this header file was first standardized in X/Open
+   System Interface and Headers Issue 2, originally coming from SysV.
+   In issue 4, version 2, it is marked as TO BE WITDRAWN.
+
+   This code shouldn't be used in any newly written code.  It is
+   included only for compatibility reasons.  Use the POSIX definition
+   in <regex.h> for portable applications and a reasonable interface.  */
+
+#include <alloca.h>
+#include <regex.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* The implementation provided here emulates the needed functionality
+   by mapping to the POSIX regular expression matcher.  The interface
+   for the here included function is weird (this really is a harmless
+   word).
+
+   The user has to provide five macros before this header file can be
+   included:
+
+   GETC()      Return the value of the next character in the regular
+               expression pattern.  Successive calls should return
+               successive characters.
+
+   PEEKC()     Return the value of the next character in the regular
+               expression pattern.  Immediately successive calls to
+               PEEKC() should return the same character which should
+               also be the next character returned by GETC().
+
+   UNGETC(c)   Cause `c' to be returned by the next call to GETC() and
+               PEEKC().
+
+   RETURN(ptr) Used for normal exit of the `compile' function.  `ptr'
+               is a pointer to the character after the last character of
+               the compiled regular expression.
+
+   ERROR(val)  Used for abnormal return from `compile'.  `val' is the
+               error number.  The error codes are:
+               11      Range endpoint too large.
+               16      Bad number.
+               25      \digit out of range.
+               36      Illegal or missing delimiter.
+               41      No remembered search string.
+               42      \( \) imbalance.
+               43      Too many \(.
+               44      More tan two numbers given in \{ \}.
+               45      } expected after \.
+               46      First number exceeds second in \{ \}.
+               49      [ ] imbalance.
+               50      Regular expression overflow.
+
+  */
+
+__BEGIN_DECLS
+
+/* Interface variables.  They contain the results of the successful
+   calls to `setp' and `advance'.  */
+extern char *loc1;
+extern char *loc2;
+
+/* The use of this variable in the `advance' function is not
+   supported.  */
+extern char *locs;
+
+
+#ifndef __DO_NOT_DEFINE_COMPILE
+/* Get and compile the user supplied pattern up to end of line or
+   string or until EOF is seen, whatever happens first.  The result is
+   placed in the buffer starting at EXPBUG and delimited by ENDBUF.
+
+   This function cannot be defined in the libc itself since it depends
+   on the macros.  */
+char *
+compile (char *__instring, char *__expbuf, __const char *__endbuf, int __eof)
+{
+  char *__input_buffer = NULL;
+  size_t __input_size = 0;
+  size_t __current_size;
+  int __ch;
+  int __result;
+
+  /* Align the expression buffer according to the needs for an object
+     of type `regex_t'.  Then check for minimum size of the buffer for
+     the compiled regular expression.  */
+  regex_t *__expr_ptr;
+#if defined __GNUC__ && __GNUC__ >= 2
+  const size_t __req = __alignof__ (regex_t *);
+#else
+  /* How shall we find out?  We simply guess it and can change it is
+     this really proofs to be wrong.  */
+  const size_t __req = 8;
+#endif
+  __expbuf += __req;
+  __expbuf -= (__expbuf - ((char *) 0)) % __req;
+  if (__endbuf < __expbuf + sizeof (regex_t))
+    {
+      ERROR (50);
+    }
+  __expr_ptr = (regex_t *) __expbuf;
+  /* The remaining space in the buffer can be used for the compiled
+     pattern.  */
+  __expr_ptr->buffer = __expbuf + sizeof (regex_t);
+  __expr_ptr->allocated = __endbuf -  (char *) __expr_ptr->buffer;
+
+  while ((__ch = (GETC ())) != __eof)
+    {
+      if (__ch == '\0' || __ch == 'n')
+       {
+         UNGETC (__ch);
+         break;
+       }
+
+      if (__current_size + 1 >= __input_size)
+       {
+         size_t __new_size = __input_size ? 2 * __input_size : 128;
+         char *__new_room = __alloca (__new_size);
+         /* See whether we can use the old buffer.  */
+         if (__new_room + __new_size == __input_buffer)
+           {
+             __input_size += __new_size;
+             __input_buffer = memcpy (__new_room, __input_buffer,
+                                      __current_size);
+           }
+         else if (__input_buffer + __input_size == __new_room)
+           __input_size += __new_size;
+         else
+           {
+             __input_size = __new_size;
+             __input_buffer = memcpy (__new_room, __input_buffer,
+                                      __current_size);
+           }
+       }
+      __input_buffer[__current_size++] = __ch;
+    }
+  __input_buffer[__current_size++] = '\0';
+
+  /* Now compile the pattern.  */
+  __error = regcomp (__expr_ptr, __input_buffer, REG_NEWLINE);
+  if (__error != 0)
+    /* Oh well, we have to translate POSIX error codes.  */
+    switch (__error)
+      {
+      case REG_BADPAT:
+      case REG_ECOLLATE:
+      case REG_ECTYPE:
+      case REG_EESCAPE:
+      case REG_BADRPT:
+      case REG_EEND:
+      case REG_RPAREN:
+      default:
+       /* There is no matching error code.  */
+       RETURN (36);
+      case REG_ESUBREG:
+       RETURN (25);
+      case REG_EBRACK:
+       RETURN (49);
+      case REG_EPAREN:
+       RETURN (42);
+      case REG_EBRACE:
+       RETURN (44);
+      case REG_BADBR:
+       RETURN (46);
+      case REG_ERANGE:
+       RETURN (11);
+      case REG_ESPACE:
+      case REG_ESIZE:
+       ERROR (50);
+      }
+
+  /* Everything is ok.  */
+  RETURN ((char *) (__expr_ptr->buffer + __expr->used));
+}
+#endif
+
+
+/* Find the next match in STRING.  The compiled regular expression is
+   found in the buffer starting at EXPBUF.  `loc1' will return the
+   first character matched and `loc2' points to the next unmatched
+   character.  */
+extern int step __P ((__const char *__string, __const char *__expbuf));
+
+/* Match the beginning of STRING with the compiled regular expression
+   in EXPBUF.  If the match is successful `loc2' will contain the
+   position of the first unmatched character.  */
+extern int advance __P ((__const char *__string, __const char *__expbuf));
+
+
+__END_DECLS
+
+#endif /* regexp.h */
index 2103d66..221546d 100644 (file)
@@ -88,7 +88,7 @@ extern void hdestroy __P ((void));
 
 extern int hsearch_r __P ((ENTRY __item, ACTION __action, ENTRY **__retval,
                           struct hsearch_data *__htab));
-extern int hcreate_r __P ((unsigned int __nel, struct hsearch_data *htab));
+extern int hcreate_r __P ((size_t __nel, struct hsearch_data *htab));
 extern void hdestroy_r __P ((struct hsearch_data *htab));
 
 
index b4a2fd2..e90dd0f 100644 (file)
@@ -63,7 +63,7 @@
 
 /* This is not a typedef so `const __ptr_t' does the right thing.  */
 #define __ptr_t void *
-typedef long double __long_double_t;
+#define __long_double_t  long double
 
 #else
 
@@ -71,7 +71,7 @@ typedef long double __long_double_t;
 #define        __STRING(x)     "x"
 
 #define __ptr_t char *
-typedef double __long_double_t;
+#define __long_double_t  long double
 
 /* The BSD header files use the ANSI keywords unmodified (this means that
    old programs may lose if they use the new keywords as identifiers), but
index 0127efb..bc49324 100644 (file)
 #define _SYS_UIO_H     1
 #include <features.h>
 
-__BEGIN_DECLS
-
 #include <sys/types.h>
 
+__BEGIN_DECLS
+
 /* This file defines `struct iovec'.  */
 #include <iovec.h>
 
@@ -34,7 +34,7 @@ __BEGIN_DECLS
    The buffers are filled in the order specified.
    Operates just like `read' (see <unistd.h>) except that data are
    put in VECTOR instead of a contiguous buffer.  */
-extern ssize_t readv __P ((int __fd, __const struct iovec * __vector,
+extern ssize_t readv __P ((int __fd, __const struct iovec *__vector,
                           int __count));
 
 /* Write data pointed by the buffers described by VECTOR, which
@@ -42,7 +42,7 @@ extern ssize_t readv __P ((int __fd, __const struct iovec * __vector,
    The data is written in the order specified.
    Operates just like `write' (see <unistd.h>) except that the data
    are taken from VECTOR instead of a contiguous buffer.  */
-extern ssize_t writev __P ((int __fd, __const struct iovec * __vector,
+extern ssize_t writev __P ((int __fd, __const struct iovec *__vector,
                            int __count));
 
 
index 1209230..e396309 100644 (file)
@@ -1,21 +1,21 @@
 /* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Extended from original form by Ulrich Drepper <drepper@cygnus.com>, 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.  */
+   This file is part of the GNU C Library.
+   Extended from original form by Ulrich Drepper <drepper@cygnus.com>, 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.  */
 
 /* Parts of this file are plain copies of the file `gethtnamadr.c' from
    the bind package and it has the following copyright.  */
index a2d9d28..d91c1bd 100644 (file)
@@ -1,21 +1,21 @@
 /* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Extended from original form by Ulrich Drepper <drepper@cygnus.com>, 1996.
+   This file is part of the GNU C Library.
+   Extended from original form by Ulrich Drepper <drepper@cygnus.com>, 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.  */
 
 /* Parts of this file are plain copies of the file `getnetnamadr.c' from
    the bind package and it has the following copyright.  */
@@ -97,12 +97,12 @@ typedef union querybuf
 
 
 /* Protortypes for local functions.  */
-static int getanswer_r (const querybuf *answer, int anslen,
-                       struct netent *result, char *buffer, int buflen,
-                       lookup_method net_i);
+static enum nss_status getanswer_r (const querybuf *answer, int anslen,
+                                   struct netent *result, char *buffer,
+                                   int buflen, lookup_method net_i);
 
 
-int
+enum nss_status
 _nss_dns_getnetbyname_r (const char *name, struct netent *result,
                         char *buffer, int buflen)
 {
@@ -125,12 +125,12 @@ _nss_dns_getnetbyname_r (const char *name, struct netent *result,
 }
 
 
-int
+enum nss_status
 _nss_dns_getnetbyaddr_r (long net, int type, struct netent *result,
                         char *buffer, int buflen)
 {
   /* Return entry for network with NAME.  */
-  int status;
+  enum nss_status status;
   querybuf net_buffer;
   unsigned int net_bytes[4];
   char qbuf[MAXDNAME];
@@ -194,7 +194,7 @@ _nss_dns_getnetbyaddr_r (long net, int type, struct netent *result,
 #undef offsetof
 #define offsetof(Type, Member) ((size_t) &((Type *) NULL)->Member)
 
-static int
+static enum nss_status
 getanswer_r (const querybuf *answer, int anslen, struct netent *result,
             char *buffer, int buflen, lookup_method net_i)
 {
index 3d6d2a1..89cd03f 100644 (file)
--- a/pwd/pwd.h
+++ b/pwd/pwd.h
@@ -101,8 +101,11 @@ extern struct passwd *getpwnam __P ((__const char *__name));
 
 /* Reentrant versions of some of the functions above.
 
-   PLEASE NOTE: these functions are not yet standardized.  The interface
-   may change in later versions of this library.  */
+   PLEASE NOTE: the `getpwent_r' function is not (yet) standardized.
+   The interface may change in later versions of this library.  But
+   the interface is designed following the principals used for the
+   other reentrant functions so the chances are good this is what the
+   POSIX people would choose.  */
 
 #if defined(__USE_SVID) || defined(__USE_MISC) || defined(__USE_XOPEN_EXTENDED)
 extern int __getpwent_r __P ((struct passwd *__resultbuf, char *__buffer,
@@ -127,7 +130,8 @@ extern int getpwnam_r __P ((__const char *__name, struct passwd *__resultbuf,
 
 
 #ifdef __USE_SVID
-/* Read an entry from STREAM.  */
+/* Read an entry from STREAM.  This function is not standardized and
+   probably never will.  */
 extern int __fgetpwent_r __P ((FILE * __stream, struct passwd *__resultbuf,
                               char *__buffer, size_t __buflen,
                               struct passwd **__result));
index 6962f59..07da429 100644 (file)
@@ -133,7 +133,9 @@ typedef union {
     char ac;
 } align;
 
+#ifndef h_errno
 extern int h_errno;
+#endif
 
 #ifdef DEBUG
 static void
index 6f5bf00..abbc3a3 100644 (file)
@@ -58,9 +58,11 @@ static char rcsid[] = "$Id$";
 #include <errno.h>
 #include <string.h>
 
+#ifndef h_errno
 extern int h_errno;
+#endif
 
-#if defined(mips) && defined(SYSTYPE_BSD43)
+#if defined(mips) && defined(SYSTYPE_BSD43) && !defined(errno)
 extern int errno;
 #endif
 
index 70f13c3..571d1a0 100644 (file)
@@ -78,7 +78,9 @@ const char *h_errlist[] = {
 };
 int    h_nerr = { sizeof h_errlist / sizeof h_errlist[0] };
 
+#ifndef h_errno
 extern int     h_errno;
+#endif
 
 /*
  * herror --
index db7fcb6..26212cb 100644 (file)
@@ -149,15 +149,6 @@ extern int sigdelset __P ((sigset_t *__set, int __signo));
 /* Return 1 if SIGNO is in SET, 0 if not.  */
 extern int sigismember __P ((__const sigset_t *__set, int signo));
 
-#ifdef __OPTIMIZE__
-/* <sigset.h> defines the __ versions as macros that do the work.  */
-#define        sigemptyset(set)        __sigemptyset(set)
-#define        sigfillset(set)         __sigfillset(set)
-#define        sigaddset(set, signo)   __sigaddset(set, signo)
-#define        sigdelset(set, signo)   __sigdelset(set, signo)
-#define        sigismember(set, signo) __sigismember(set, signo)
-#endif
-
 /* Get the system-specific definitions of `struct sigaction'
    and the `SA_*' and `SIG_*'. constants.  */
 #include <sigaction.h>
@@ -170,6 +161,7 @@ extern int sigprocmask __P ((int __how,
 
 /* Change the set of blocked signals to SET,
    wait until a signal arrives, and restore the set of blocked signals.  */
+extern int __sigsuspend __P ((__const sigset_t *__set));
 extern int sigsuspend __P ((__const sigset_t *__set));
 
 /* Get and/or set the action for signal SIG.  */
index c2324d0..2da8988 100644 (file)
 # define ISDIGIT(Ch)   isdigit (Ch)
 
 # ifdef USE_IN_LIBIO
-#  define PUT(F, S, N) _IO_sputn (F, S, N)
+#  define PUT(F, S, N) _IO_sputn ((F), (S), (N))
 #  define PAD(Padchar)                                                       \
   if (width > 0)                                                             \
-    done += _IO_padn (s, Padchar, width)
+    done += _IO_padn (s, (Padchar), width)
 # else
 #  define PUTC(C, F)   putc (C, F)
 ssize_t __printf_pad __P ((FILE *, char pad, size_t n));
 # define PAD(Padchar)                                                        \
   if (width > 0)                                                             \
-    { if (__printf_pad (s, Padchar, width) == -1)                            \
-       return -1; else done += width; }
+    { ssize_t __res = __printf_pad (s, (Padchar), width);                    \
+      if (__res == -1) return -1;                                            \
+      done += __res; }
 # endif
 #else
 # define vfprintf      vfwprintf
@@ -63,17 +64,18 @@ ssize_t __printf_pad __P ((FILE *, char pad, size_t n));
 # define ISDIGIT(Ch)   iswdigit (Ch)
 
 # ifdef USE_IN_LIBIO
-#  define PUT(F, S, N) _IO_sputn (F, S, N)
+#  define PUT(F, S, N) _IO_sputn ((F), (S), (N))
 #  define PAD(Padchar)                                                       \
   if (width > 0)                                                             \
-    done += _IO_wpadn (s, Padchar, width)
+    done += _IO_wpadn (s, (Padchar), width)
 # else
 #  define PUTC(C, F)   wputc (C, F)
 ssize_t __wprintf_pad __P ((FILE *, wchar_t pad, size_t n));
 #  define PAD(Padchar)                                                       \
   if (width > 0)                                                             \
-    { if (__wprintf_pad (s, Padchar, width) == -1)                           \
-       return -1; else done += width; }
+    { ssize_t __res = __wprintf_pad (s, (Padchar), width);                   \
+      if (__res == -1) return -1;                                            \
+      done += __res; }
 # endif
 #endif
 
@@ -1515,6 +1517,7 @@ buffered_vfprintf (register _IO_FILE *s, const CHAR_T *format,
   hp->_IO_file_flags = _IO_MAGIC|_IO_NO_READS;
 #ifdef _IO_MTSAFE_IO
   hp->_lock = &helper.lock;
+  __libc_lock_init (*hp->_lock);
 #endif
   _IO_JUMPS (hp) = (struct _IO_jump_t *) &_IO_helper_jumps;
 
index 6c15b15..707be8e 100644 (file)
@@ -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>, August 1995.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 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.  */
 
 #include <errno.h>
 #include <stdlib.h>
@@ -55,21 +55,20 @@ __drand48_iterate (xsubi, buffer)
 
   if (sizeof (unsigned short int) == 2)
     {
-      X = (xsubi[2] << 16 | xsubi[1]) << 16 | xsubi[0];
-      a = (buffer->a[2] << 16 | buffer->a[1]) << 16 | buffer->a[0];
+      X = (u_int64_t)xsubi[2] << 32 | (u_int64_t)xsubi[1] << 16 | xsubi[0];
+      a = ((u_int64_t)buffer->a[2] << 32 | (u_int64_t)buffer->a[1] << 16
+          | buffer->a[0]);
 
       result = X * a + buffer->c;
 
       xsubi[0] = result & 0xffff;
-      result >>= 16;
-      xsubi[1] = result & 0xffff;
-      result >>= 16;
-      xsubi[2] = result & 0xffff;
+      xsubi[1] = (result >> 16) & 0xffff;
+      xsubi[2] = (result >> 32) & 0xffff;
     }
   else
     {
-      X = xsubi[2] << 16 | xsubi[1] >> 16;
-      a = buffer->a[2] << 16 | buffer->a[1] >> 16;
+      X = (u_int64_t)xsubi[2] << 16 | xsubi[1] >> 16;
+      a = (u_int64_t)buffer->a[2] << 16 | buffer->a[1] >> 16;
 
       result = X * a + buffer->c;
 
index 792ed2e..681bace 100644 (file)
@@ -43,7 +43,7 @@ static const struct ltest tests[] =
 static void expand __P ((char *dst, int c));
 
 int
-main ()
+main (int argc, char ** argv)
 {
   register const struct ltest *lt;
   char *ep;
index af7d41a..620181b 100644 (file)
@@ -74,7 +74,7 @@ static const struct ltest tests[] =
 static void expand __P ((char *dst, int c));
 
 int
-main ()
+main (int argc, char ** argv)
 {
   register const struct ltest *lt;
   char *ep;
index 82d4ea7..dda826a 100644 (file)
@@ -52,7 +52,7 @@ headers = $(addprefix rpc/,auth.h auth_unix.h clnt.h netdb.h pmap_clnt.h \
          $(rpcsvc:%=rpcsvc/%) $(rpcsvc:%.x=rpcsvc/%.h)
 rpcsvc = bootparam.x nlm_prot.x rstat.x \
         yppasswd.x klm_prot.x rex.x sm_inter.x mount.x \
-        rnusers.x spray.x nfs_prot.x rquota.x
+        rusers.x spray.x nfs_prot.x rquota.x
 install-others = $(includedir)/rpcsvc/bootparam_prot.h \
                 $(sysconfdir)/rpc
 generated = $(rpcsvc:%.x=rpcsvc/%.h) $(rpcsvc:%.x=x%.c)