about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1997-05-07 15:31:21 +0000
committerUlrich Drepper <drepper@redhat.com>1997-05-07 15:31:21 +0000
commit51702635af8445431054291c86aaace7c30b0970 (patch)
treee9cc4d28c401bd6046f71f62d186865d37c0141f
parent1f07e6177553845817af5f7c90f148edd2e59d32 (diff)
downloadglibc-51702635af8445431054291c86aaace7c30b0970.tar.gz
glibc-51702635af8445431054291c86aaace7c30b0970.tar.xz
glibc-51702635af8445431054291c86aaace7c30b0970.zip
	* locale/categories.def: Change type of _NL_CTYPE_CLASS_NAMES and
	_NL_CTYPE_MAP_NAMES field to stringlist.
	Change name of _NL_CTYPE_CODESET_NAME to "charmap".
	* locale/localeinfo.h (enum value_type): Add stringlist.
	* locale/programs/locale.c (show_info): Handle stringlist.

	* locale/programs/charmap.c (charmap_read): If charmap file is not
	using the given name try to find it by looking through all available
	charmap files and compare the code set name.
	* locale/programs/locale.c (write_charmaps): Also print names of
	charset in <code_set_name> fields in the files.

	* elf/ldd.bash.in: Correct translatable strings.

	* posix/TESTS: Add some more tests for character class matching.
	* posix/regex.c: Merge with GNU awk version.
	(regex_compile): Use ISO C/amend 1 functions for character class
	handling.
	* posix/regex.h: Merge with GNU awk version.

	* posix/getopt.c: Declare as master copies.
	* posix/getopt1.c: Likewise.
	* posix/getopt.h: Likewise.

	* sysdeps/unix/sysv/linux/sys/mount.h: Add definitions for option
	value to mount functions.
	Patch by a sun <asun@zoology.washington.edu>.

	* stdio-common/bug4.c (main): Use /tmp/bug4.test for concurrency
	with other tests.
	* sunrpc/svc_run.c (svc_exit): New, defined.
	(svc_run): Test for svc_stop variable.
	* sysdeps/m68k/s_cexp.c: Rewritten.
	* sysdeps/m68k/s_cexpf.c: Likewise.
	* sysdeps/m68k/s_cexpl.c: Likewise.
-rw-r--r--ChangeLog39
-rw-r--r--Makerules16
-rwxr-xr-xconfig.guess3
-rw-r--r--csu/Makefile4
-rw-r--r--csu/abi-note.S6
-rw-r--r--elf/ldd.bash.in22
-rw-r--r--locale/categories.def6
-rw-r--r--locale/localeinfo.h3
-rw-r--r--locale/programs/charmap.c68
-rw-r--r--locale/programs/locale.c63
-rw-r--r--manual/Makefile4
-rw-r--r--manual/texinfo.tex225
-rw-r--r--math/libm-test.c318
-rw-r--r--nis/Banner2
-rw-r--r--nis/Makefile9
-rw-r--r--nis/TODO25
-rw-r--r--nis/nis_add.c71
-rw-r--r--nis/nis_addmember.c69
-rw-r--r--nis/nis_call.c9
-rw-r--r--nis/nis_checkpoint.c71
-rw-r--r--nis/nis_creategroup.c66
-rw-r--r--nis/nis_defaults.c466
-rw-r--r--nis/nis_destroygroup.c52
-rw-r--r--nis/nis_domain_of.c29
-rw-r--r--nis/nis_domain_of_r.c58
-rw-r--r--nis/nis_getservlist.c115
-rw-r--r--nis/nis_intern.c24
-rw-r--r--nis/nis_ismember.c142
-rw-r--r--nis/nis_lookup.c157
-rw-r--r--nis/nis_mkdir.c46
-rw-r--r--nis/nis_modify.c47
-rw-r--r--nis/nis_ping.c63
-rw-r--r--nis/nis_print_group_entry.c59
-rw-r--r--nis/nis_remove.c55
-rw-r--r--nis/nis_removemember.c80
-rw-r--r--nis/nis_rmdir.c46
-rw-r--r--nis/nis_server.c154
-rw-r--r--nis/nis_subr.c44
-rw-r--r--nis/nis_verifygroup.c51
-rw-r--r--nis/rpcsvc/nislib.h89
-rw-r--r--posix/TESTS8
-rw-r--r--posix/getopt.c3
-rw-r--r--posix/getopt.h4
-rw-r--r--posix/getopt1.c4
-rw-r--r--posix/regex.c96
-rw-r--r--posix/regex.h21
-rw-r--r--sysdeps/libm-ieee754/e_acoshl.c2
-rw-r--r--sysdeps/libm-ieee754/e_atan2l.c6
-rw-r--r--sysdeps/libm-ieee754/e_atanhl.c2
-rw-r--r--sysdeps/libm-ieee754/e_sinhl.c2
-rw-r--r--sysdeps/m68k/fpu/__math.h21
-rw-r--r--sysdeps/m68k/fpu/e_pow.c32
-rw-r--r--sysdeps/m68k/fpu/s_ccos.c73
-rw-r--r--sysdeps/m68k/fpu/s_ccosf.c3
-rw-r--r--sysdeps/m68k/fpu/s_ccosh.c85
-rw-r--r--sysdeps/m68k/fpu/s_ccoshf.c1
-rw-r--r--sysdeps/m68k/fpu/s_ccoshl.c1
-rw-r--r--sysdeps/m68k/fpu/s_ccosl.c3
-rw-r--r--sysdeps/m68k/fpu/s_cexp.c119
-rw-r--r--sysdeps/m68k/fpu/s_cexpf.c1
-rw-r--r--sysdeps/m68k/fpu/s_cexpl.c1
-rw-r--r--sysdeps/m68k/fpu/s_csin.c69
-rw-r--r--sysdeps/m68k/fpu/s_csinf.c3
-rw-r--r--sysdeps/m68k/fpu/s_csinh.c91
-rw-r--r--sysdeps/m68k/fpu/s_csinhf.c1
-rw-r--r--sysdeps/m68k/fpu/s_csinhl.c1
-rw-r--r--sysdeps/m68k/fpu/s_csinl.c3
-rw-r--r--sysdeps/unix/sysv/linux/abi-tag.h8
-rw-r--r--sysdeps/unix/sysv/linux/alpha/brk.S12
-rw-r--r--sysdeps/unix/sysv/linux/alpha/clone.S13
-rw-r--r--sysdeps/unix/sysv/linux/sys/mount.h70
71 files changed, 2854 insertions, 781 deletions
diff --git a/ChangeLog b/ChangeLog
index b6269a38c6..a0106c9fd7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,33 @@
 1997-05-07 16:31  Ulrich Drepper  <drepper@cygnus.com>
 
+	* locale/categories.def: Change type of _NL_CTYPE_CLASS_NAMES and
+	_NL_CTYPE_MAP_NAMES field to stringlist.
+	Change name of _NL_CTYPE_CODESET_NAME to "charmap".
+	* locale/localeinfo.h (enum value_type): Add stringlist.
+	* locale/programs/locale.c (show_info): Handle stringlist.
+
+	* locale/programs/charmap.c (charmap_read): If charmap file is not
+	using the given name try to find it by looking through all available
+	charmap files and compare the code set name.
+	* locale/programs/locale.c (write_charmaps): Also print names of
+	charset in <code_set_name> fields in the files.
+
+	* elf/ldd.bash.in: Correct translatable strings.
+
+	* posix/TESTS: Add some more tests for character class matching.
+	* posix/regex.c: Merge with GNU awk version.
+	(regex_compile): Use ISO C/amend 1 functions for character class
+	handling.
+	* posix/regex.h: Merge with GNU awk version.
+
+	* posix/getopt.c: Declare as master copies.
+	* posix/getopt1.c: Likewise.
+	* posix/getopt.h: Likewise.
+
+	* sysdeps/unix/sysv/linux/sys/mount.h: Add definitions for option
+	value to mount functions.
+	Patch by a sun <asun@zoology.washington.edu>.
+
 	* sysdeps/i386/dl-machine.h (elf_machine_rel): Check for mismatch
 	in size for copy relocation.
 	* sysdeps/m68k/dl-machine.h (elf_machine_rela): Likewise.
@@ -9,13 +37,13 @@
 
 1997-05-06 13:25  H.J. Lu  <hjl@gnu.ai.mit.edu>
 
-	* stdio-common/bug4.c (main): Use /tmp/bug4.test for concurrency
-	with other tests.
 	* stdio-common/bug3.c (main): Use /tmp/bug3.test for concurrency
 	with other tests.
+	* stdio-common/bug4.c (main): Use /tmp/bug4.test for concurrency
+	with other tests.
 
-	* sunrpc/svc_run.c: svc_exit): New, defined.  (svc_run): Test for
-	svc_stop variable.
+	* sunrpc/svc_run.c (svc_exit): New, defined.
+	(svc_run): Test for svc_stop variable.
 	* sunrpc/rpc/svc.h (svc_exit): New, declared.
 
 1997-05-03 08:47  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
@@ -40,10 +68,13 @@
 
 	* sysdeps/m68k/s_ccosh.c: Rewritten.
 	* sysdeps/m68k/s_csinh.c: Rewritten.
+	* sysdeps/m68k/s_cexp.c: Rewritten.
 	* sysdeps/m68k/s_ccoshf.c: Don't define huge_val.
 	* sysdeps/m68k/s_ccoshl.c: Likewise.
 	* sysdeps/m68k/s_csinhf.c: Likewise.
 	* sysdeps/m68k/s_csinhl.c: Likewise.
+	* sysdeps/m68k/s_cexpf.c: Likewise.
+	* sysdeps/m68k/s_cexpl.c: Likewise.
 
 	* sysdeps/m68k/s_ccos.c: New file.
 	* sysdeps/m68k/s_ccosf.c: New file.
diff --git a/Makerules b/Makerules
index 10cbd972e4..31b965f3d7 100644
--- a/Makerules
+++ b/Makerules
@@ -477,8 +477,8 @@ others: $(addprefix $(objpfx),$(install-lib))
 ifndef objects
 
 # Create the stamp$o files to keep the parent makefile happy.
-subdir_lib: $(foreach o,$(object-suffixes),$(objpfx)stamp$o-$(subdir))
-$(foreach o,$(object-suffixes),$(objpfx)stamp$o-$(subdir)):
+subdir_lib: $(foreach o,$(object-suffixes),$(objpfx)stamp$o)
+$(foreach o,$(object-suffixes),$(objpfx)stamp$o):
 	$(make-target-directory)
 	rm -f $@; > $@
 else
@@ -490,19 +490,19 @@ else
 define o-iterator-doit
 $(common-objpfx)$(patsubst %,$(libtype$o),c)(\
 $(addsuffix .%,$(filter-out $(elide-routines$o),$(notdir $(objects:.o=))))): \
-  $(objpfx)stamp.%-$(subdir) ;
+  $(objpfx)stamp.% ;
 endef
 object-suffixes-left := $(object-suffixes)
 include $(o-iterator)
 
-# The pattern rule tells Make to remake $(objpfx)stamp.%-$(subdir) as
+# The pattern rule tells Make to remake $(objpfx)stamp.% as
 # the way to update all the foo.% object files in $(objects).  Now we
-# define explicit rules to update each $(objpfx)stamp.SUFFIX-$(subdir)
+# define explicit rules to update each $(objpfx)stamp.SUFFIX
 # timestamp file; these rules (one explicit rule is generated for each
 # object suffix) will update the parent archive with ar.  Use a static
 # pattern rule so $* is set to the object type during the commands.
 define o-iterator-doit
-$(objpfx)stamp$o-$(subdir): $(objpfx)stamp%-$(subdir): $(o-objects); $$(do-ar)
+$(objpfx)stamp$o: $(objpfx)stamp%: $(o-objects); $$(do-ar)
 endef
 object-suffixes-left := $(object-suffixes)
 include $(o-iterator)
@@ -529,7 +529,7 @@ $(common-objpfx)$(patsubst %,$(libtype$o),c)($(ar-symtab-name)): \
 	  $$(RANLIB) $$(common-objpfx)$$(patsubst %,$$(libtype$o),c)
 endef
 ifndef subdir
-subdirs-stamps := $(foreach d,$(subdirs),$(common-objpfx)$d/stamp%-$d)
+subdirs-stamps := $(foreach d,$(subdirs),$(common-objpfx)$d/stamp%)
 subdirs-stamp-o = $(subst %,$o,$(subdirs-stamps))
 $(subdirs-stamps): subdir_lib;
 endif
@@ -866,7 +866,7 @@ common-mostlyclean:
 	$(rmobjs)
 define rmobjs
 $(foreach o,$(object-suffixes),
--rm -f $(addprefix $(objpfx),stamp$o-$(subdir)) $(o-objects))
+-rm -f $(objpfx)stamp$o $(o-objects))
 endef
 
 # Also remove the dependencies and generated source files.
diff --git a/config.guess b/config.guess
index b6f37c9919..bfd352355e 100755
--- a/config.guess
+++ b/config.guess
@@ -168,6 +168,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     VAX*:ULTRIX*:*:*)
 	echo vax-dec-ultrix${UNAME_RELEASE}
 	exit 0 ;;
+    2020:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit 0 ;;
     mips:*:*:UMIPS | mips:*:*:RISCos)
 	sed 's/^	//' << EOF >dummy.c
 	int main (argc, argv) int argc; char **argv; {
diff --git a/csu/Makefile b/csu/Makefile
index 9664821ec4..5888d1098e 100644
--- a/csu/Makefile
+++ b/csu/Makefile
@@ -81,6 +81,10 @@ $(objpfx)defs.h: $(objpfx)initfini.s
 
 endif
 
+ifeq (yes,$(elf))
+extra-objs += abi-note.o
+endif
+
 include ../Rules
 
 define link-relocatable
diff --git a/csu/abi-note.S b/csu/abi-note.S
index baa409de4d..d2051e5b3b 100644
--- a/csu/abi-note.S
+++ b/csu/abi-note.S
@@ -32,18 +32,18 @@
 
 #define ELF_NOTE_BEGIN(sectname, sectflags, type, name)			      \
 	.section sectname, sectflags;					      \
-	.align ALIGNARG(2);	/* Notes are 4-byte aligned.  */	      \
+	.align 4;		/* Notes are 4-byte aligned.  */	      \
 	.long 1f - 0f;		/* 32-bit word: length of name field */	      \
 	.long 3f - 2f;		/* 32-bit word: length of desc field */	      \
 	.long (type);		/* 32-bit word: vendor-defined type field */  \
 0:	.asciz name;		/* null-terminated string, any length: name */\
-1:	.align ALIGNARG(2);	/* Name data padded to 4-byte alignment.  */  \
+1:	.align 4;		/* Name data padded to 4-byte alignment.  */  \
 2:	/* Here follows the "note descriptor" data, whose format	      \
 	   is not specified by ELF.  The vendor name and type field	      \
 	   indicate what sort of data is found here.  */
 
 #define ELF_NOTE_END							      \
-3:	.align ALIGNARG(2)	/* Pad to 4-byte align the next note.  */
+3:	.align 4		/* Pad to 4-byte align the next note.  */
 
 
 /* The linker (GNU ld 2.8 and later) recognize an allocated section whose
diff --git a/elf/ldd.bash.in b/elf/ldd.bash.in
index 48d5c90fd5..492d3ba452 100644
--- a/elf/ldd.bash.in
+++ b/elf/ldd.bash.in
@@ -35,8 +35,8 @@ bind_now=
 while test $# -gt 0; do
   case "$1" in
   --v | --ve | --ver | --vers | --versi | --versio | --version)
-    echo $"ldd (GNU libc) @VERSION@
-Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+    echo '"ldd (GNU libc) @VERSION@'
+    echo $"Copyright (C) 1996, 1997 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 ;;
@@ -61,7 +61,7 @@ Report bugs using the \`glibcbug' script to <bugs@gnu.ai.mit.edu>."
   --)		# Stop option processing.
     shift; break ;;
   -*)
-    echo >&2 $"ldd: unrecognized option" "\`$1'"
+    echo >&2 'ldd:' $"unrecognized option" "\`$1'"
     echo >&2 $"Try \`ldd --help' for more information."
     exit 1 ;;
   *)
@@ -72,7 +72,7 @@ done
 add_env="LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now"
 case $# in
 0)
-  echo >&2 $"ldd: missing file arguments"
+  echo >&2 'ldd:' $"missing file arguments"
   echo >&2 $"Try \`ldd --help' for more information."
   exit 1 ;;
 1)
@@ -86,7 +86,7 @@ case $# in
     exit 1
   elif test -r "$file"; then
     test -x "$file" ||
-    echo $"ldd: warning: you do not have execution permission for" "\`$file'"
+    echo 'ldd:' $"warning: you do not have execution permission for" "\`$file'"
     ${RTLD} --verify "$file"
     case $? in
     0)
@@ -100,12 +100,12 @@ case $# in
       eval $add_env exec \${RTLD} '"$file"' || exit 1
       ;;
     *)
-      echo $"ldd: ${RTLD} exited with unknown exit code ($?)" >&2
+      echo 'ldd:' ${RTLD} $"exited with unknown exit code" "($?)" >&2
       exit 1
       ;;
     esac
   else
-    echo $"ldd: error: you do not have read permission for" "\`$file'"
+    echo 'ldd:' $"error: you do not have read permission for" "\`$file'"
     exit 1
   fi
   exit ;;
@@ -121,8 +121,8 @@ case $# in
       echo "ldd: ${file}:" $"no such file"
       result=1
     elif test -r "$file"; then
-      test -x "$file" || echo $"\
-ldd: warning: you do not have execution permission for" "\`$file'"
+      test -x "$file" || echo 'ldd:' $"\
+warning: you do not have execution permission for" "\`$file'"
       ${RTLD} --verify "$file"
       case $? in
       0)
@@ -136,12 +136,12 @@ ldd: warning: you do not have execution permission for" "\`$file'"
         eval $add_env ${RTLD} '"$file"' || result=1
 	;;
       *)
-	echo $"ldd: ${RTLD} exited with unknown exit code ($?)" >&2
+	echo 'ldd:' ${RTLD} $"exited with unknown exit code" "($?)" >&2
 	exit 1
 	;;
       esac
     else
-      echo $"ldd: error: you do not have read permission for" "\`$file'"
+      echo 'ldd:' $"error: you do not have read permission for" "\`$file'"
       result=1
     fi
   done
diff --git a/locale/categories.def b/locale/categories.def
index b04ca20cc2..098d712172 100644
--- a/locale/categories.def
+++ b/locale/categories.def
@@ -84,11 +84,11 @@ DEFINE_CATEGORY
   DEFINE_ELEMENT (_NL_CTYPE_NAMES_EL,	  "ctype-names-el",     std, string)
   DEFINE_ELEMENT (_NL_CTYPE_HASH_SIZE,	  "ctype-hash-size",    std, word)
   DEFINE_ELEMENT (_NL_CTYPE_HASH_LAYERS,  "ctype-hash-layers",  std, word)
-  DEFINE_ELEMENT (_NL_CTYPE_CLASS_NAMES,  "ctype-class-names",  std, string)
-  DEFINE_ELEMENT (_NL_CTYPE_MAP_NAMES,	  "ctype-map-names",    std, string)
+  DEFINE_ELEMENT (_NL_CTYPE_CLASS_NAMES,  "ctype-class-names",  std, stringlist)
+  DEFINE_ELEMENT (_NL_CTYPE_MAP_NAMES,	  "ctype-map-names",    std, stringlist)
   DEFINE_ELEMENT (_NL_CTYPE_WIDTH,	  "ctype-width",        std, bytearray)
   DEFINE_ELEMENT (_NL_CTYPE_MB_CUR_MAX,	  "ctype-mb-cur-max",   std, word)
-  DEFINE_ELEMENT (_NL_CTYPE_CODESET_NAME, "ctype-codeset-name", std, string)
+  DEFINE_ELEMENT (_NL_CTYPE_CODESET_NAME, "charmap",		std, string)
   ), _nl_postload_ctype, ctype_input, ctype_check, ctype_output)
 
 
diff --git a/locale/localeinfo.h b/locale/localeinfo.h
index b062200b3b..79db06d2f5 100644
--- a/locale/localeinfo.h
+++ b/locale/localeinfo.h
@@ -81,7 +81,8 @@ enum value_type
   stringarray,
   byte,
   bytearray,
-  word
+  word,
+  stringlist
 };
 
 
diff --git a/locale/programs/charmap.c b/locale/programs/charmap.c
index 37b6cdef96..359b913c1f 100644
--- a/locale/programs/charmap.c
+++ b/locale/programs/charmap.c
@@ -22,6 +22,7 @@
 #endif
 
 #include <ctype.h>
+#include <dirent.h>
 #include <errno.h>
 #include <libintl.h>
 #include <obstack.h>
@@ -78,6 +79,73 @@ charmap_read (const char *filename)
 
   if (result == NULL)
     {
+      /* OK, one more try.  We also accept the names given to the
+	 character sets in the files.  Sometimes they differ from the
+	 file name.  */
+      DIR *dir;
+      struct dirent *dirent;
+
+      dir = opendir (CHARMAP_PATH);
+      if (dir == NULL)
+	{
+	  while ((dirent = readdir (dir)) != NULL)
+	    if (strcmp (dirent->d_name, ".") != 0
+		&& strcmp (dirent->d_name, "..") != 0)
+	      {
+		char buf[sizeof (CHARMAP_PATH)
+			+ strlen (dirent->d_name) + 1];
+		FILE *fp;
+#ifdef _DIRENT_HAVE_D_TYPE
+		if (dirent->d_type != DT_UNKNOWN && dirent->d_type != DT_REG)
+		  continue;
+#endif
+		stpcpy (stpcpy (stpcpy (buf, CHARMAP_PATH), "/"),
+			dirent->d_name);
+
+		fp = fopen (buf, "r");
+		if (fp != NULL)
+		  {
+		    char *name = NULL;
+
+		    while (!feof (fp))
+		      {
+			char junk[BUFSIZ];
+
+			if (fscanf (fp, " <code_set_name> %as", &name) == 1)
+			  break;
+
+			do
+			  fgets (junk, sizeof junk, fp);
+			while (strchr (junk, '\n') == NULL);
+		      }
+
+		    fclose (fp);
+
+		    if (name != NULL)
+		      {
+			if (strcmp (name, filename) == 0)
+			  {
+			    result = parse_charmap (buf);
+
+			    free (buf);
+
+			    if (result)
+			      return result;
+
+			    break;
+			  }
+
+			free (name);
+		      }
+		  }
+	      }
+
+	  closedir (dir);
+	}
+    }
+
+  if (result == NULL)
+    {
       pathnfile = CHARMAP_PATH "/" DEFAULT_CHARMAP;
 
       result = parse_charmap (pathnfile);
diff --git a/locale/programs/locale.c b/locale/programs/locale.c
index 7b0aaaa60f..28ad94403f 100644
--- a/locale/programs/locale.c
+++ b/locale/programs/locale.c
@@ -456,7 +456,9 @@ write_charmaps (void)
     if (strcmp (dirent->d_name, ".") != 0
 	&& strcmp (dirent->d_name, "..") != 0)
       {
+	char *buf = NULL;
 	mode_t mode;
+
 #ifdef _DIRENT_HAVE_D_TYPE
 	if (dirent->d_type != DT_UNKNOWN)
 	  mode = DTTOIF (dirent->d_type);
@@ -464,7 +466,8 @@ write_charmaps (void)
 #endif
 	  {
 	    struct stat st;
-	    char buf[sizeof (CHARMAP_PATH) + strlen (dirent->d_name) + 1];
+
+	    buf = alloca (sizeof (CHARMAP_PATH) + strlen (dirent->d_name) + 1);
 
 	    stpcpy (stpcpy (stpcpy (buf, CHARMAP_PATH), "/"), dirent->d_name);
 
@@ -474,7 +477,44 @@ write_charmaps (void)
 	  }
 
 	if (S_ISREG (mode))
-	  PUT (strdup (dirent->d_name));
+	  {
+	    FILE *fp;
+
+	    PUT (strdup (dirent->d_name));
+
+	    /* Read the file and learn about the code set name.  */
+	    if (buf == NULL)
+	      {
+		buf = alloca (sizeof (CHARMAP_PATH)
+			      + strlen (dirent->d_name) + 1);
+
+		stpcpy (stpcpy (stpcpy (buf, CHARMAP_PATH), "/"),
+			dirent->d_name);
+	      }
+
+	    fp = fopen (buf, "r");
+	    if (fp != NULL)
+	      {
+		char *name = NULL;
+
+		while (!feof (fp))
+		  {
+		    char junk[BUFSIZ];
+
+		    if (fscanf (fp, " <code_set_name> %as", &name) == 1)
+		      break;
+
+		    do
+		      fgets (junk, sizeof junk, fp);
+		    while (strchr (junk, '\n') == NULL);
+		  }
+
+		fclose (fp);
+
+		if (name != NULL)
+		  PUT (name);
+	      }
+	  }
       }
 
   closedir (dir);
@@ -496,8 +536,8 @@ show_locale_vars (void)
     {
       char *val = getenv (name);
 
-      if (lcall != NULL || val == NULL)
-	printf ("%s=\"%s\"\n", name, lcall ? : lang);
+      if ((lcall ?: "")[0] != '\0' || val == NULL)
+	printf ("%s=\"%s\"\n", name, (lcall ?: "")[0] ? lcall : lang);
       else
 	printf ("%s=%s\n", name, val);
     }
@@ -553,6 +593,21 @@ show_info (const char *name)
 	      putchar ('"');
 	  }
 	  break;
+	case stringlist:
+	  {
+	    int first = 1;
+	    const char *val = nl_langinfo (item->item_id) ? : "";
+
+	    while (*val != '\0')
+	      {
+		printf ("%s%s%s%s", first ? "" : ";",
+			show_keyword_name ? "\"" : "", val,
+			show_keyword_name ? "\"" : "");
+		val = strchr (val, '\0') + 1;
+		first = 0;
+	      }
+	  }
+	  break;
 	case byte:
 	  {
 	    const char *val = nl_langinfo (item->item_id);
diff --git a/manual/Makefile b/manual/Makefile
index c99f4974a8..94cc59c891 100644
--- a/manual/Makefile
+++ b/manual/Makefile
@@ -174,9 +174,9 @@ $(glibc-targets):
 # Create stamp files if they don't exist, so the parent makefile's rules for
 # updating the library archives are happy with us, and never think we have
 # changed the library.
-lib: $(foreach o,$(object-suffixes),$(objpfx)stamp$o-$(subdir))
+lib: $(foreach o,$(object-suffixes),$(objpfx)stamp$o)
 stubs: $(common-objpfx)stub-manual
-$(common-objpfx)stub-manual ../po/manual.pot $(objpfx)stamp%-$(subdir):
+$(common-objpfx)stub-manual ../po/manual.pot $(objpfx)stamp%:
 	$(make-target-directory)
 	cp /dev/null $@
 
diff --git a/manual/texinfo.tex b/manual/texinfo.tex
index 4059d0a811..72050b8e22 100644
--- a/manual/texinfo.tex
+++ b/manual/texinfo.tex
@@ -1,5 +1,5 @@
 %% TeX macros to handle Texinfo files.
-%% $Id: texinfo.tex,v 2.197 1997/04/30 15:34:30 drepper Exp $
+%% $Id: texinfo.tex,v 2.198 1997/05/07 15:16:03 drepper Exp $
 
 %  Copyright (C) 1985, 86, 88, 90, 91, 92, 93,
 %                94, 95, 96, 97 Free Software Foundation, Inc.
@@ -36,7 +36,7 @@
 
 % This automatically updates the version number based on RCS.
 \def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
-\deftexinfoversion$Revision: 2.197 $
+\deftexinfoversion$Revision: 2.198 $
 \message{Loading texinfo package [Version \texinfoversion]:}
 
 % If in a .fmt file, print the version number
@@ -147,11 +147,7 @@
 % \onepageout takes a vbox as an argument.  Note that \pagecontents
 % does insertions, but you have to call it yourself.
 \def\onepageout#1{%
-  \ifcropmarks
-    \hoffset = 0pt
-  \else
-    \hoffset = \normaloffset
-  \fi
+  \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
   %
   \ifodd\pageno  \advance\hoffset by \bindingoffset
   \else \advance\hoffset by -\bindingoffset\fi
@@ -171,17 +167,20 @@
     \normalturnoffactive  % \ in index entries must not stay \, e.g., if
                    % the page break happens to be in the middle of an example.
     \shipout\vbox{%
-      \ifcropmarks
-        \vbox to \outervsize\bgroup
-          \hsize = \outerhsize
-          \vbox{\line{\ewtop\hfill\ewtop}}%
-          \nointerlineskip
-          \line{%
-            \vbox{\moveleft\cornerthick\nstop}%
-            \hfill
-            \vbox{\moveright\cornerthick\nstop}%
-          }%
-          \vskip\topandbottommargin
+      \ifcropmarks \vbox to \outervsize\bgroup
+        \hsize = \outerhsize
+        \line{\ewtop\hfil\ewtop}%
+        \nointerlineskip
+        \line{%
+          \vbox{\moveleft\cornerthick\nstop}%
+          \hfill
+          \vbox{\moveright\cornerthick\nstop}%
+        }%
+        \vskip\topandbottommargin
+        \line\bgroup
+          \hfil % center the page within the outer (page) hsize.
+          \ifodd\pageno\hskip\bindingoffset\fi
+          \vbox\bgroup
       \fi
       %
       \unvbox\headlinebox
@@ -189,19 +188,21 @@
       \unvbox\footlinebox
       %
       \ifcropmarks
-          \vskip\topandbottommargin plus1fill minus1fill
-          \boxmaxdepth = \cornerthick
-          \line{%
-            \vbox{\moveleft\cornerthick\nsbot}%
-            \hfill
-            \vbox{\moveright\cornerthick\nsbot}%
-          }%
-          \nointerlineskip
-          \vbox{\line{\ewbot\hfill\ewbot}}%
-        \egroup % \vbox from first cropmarks clause
+          \egroup % end of \vbox\bgroup
+        \hfil\egroup % end of (centering) \line\bgroup
+        \vskip\topandbottommargin plus1fill minus1fill
+        \boxmaxdepth = \cornerthick
+        \line{%
+          \vbox{\moveleft\cornerthick\nsbot}%
+          \hfill
+          \vbox{\moveright\cornerthick\nsbot}%
+        }%
+        \nointerlineskip
+        \line{\ewbot\hfil\ewbot}%
+      \egroup % \vbox from first cropmarks clause
       \fi
-    }%
-    }%
+    }% end of \shipout\vbox
+  }% end of group with \turnoffactive
   \advancepageno
   \ifnum\outputpenalty>-20000 \else\dosupereject\fi
 }
@@ -219,7 +220,6 @@
 \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
 }
 
-%
 % Here are the rules for the cropmarks.  Note that they are
 % offset so that the space between them is truly \outerhsize or \outervsize
 % (P. A. MacKay, 12 November, 1986)
@@ -2408,27 +2408,16 @@ width0pt\relax} \fi
 
 % Define the macros used in formatting output of the sorted index material.
 
-% This is what you call to cause a particular index to get printed.
-% Write
-% @unnumbered Function Index
-% @printindex fn
-
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
 \def\printindex{\parsearg\doprintindex}
-
 \def\doprintindex#1{\begingroup
   \dobreak \chapheadingskip{10000}%
   %
   \indexfonts \rm
   \tolerance = 9500
   \indexbreaks
-  \def\indexbackslash{\rawbackslashxx}%
-  % Index files are almost Texinfo source, but we use \ as the escape
-  % character.  It would be better to use @, but that's too big a change
-  % to make right now.
-  \catcode`\\ = 0
-  \catcode`\@ = 11
-  \escapechar = `\\
-  \begindoublecolumns
   %
   % See if the index file exists and is nonempty.
   \openin 1 \jobname.#1s
@@ -2447,11 +2436,19 @@ width0pt\relax} \fi
     \ifeof 1
       (Index is empty)
     \else
+      % Index files are almost Texinfo source, but we use \ as the escape
+      % character.  It would be better to use @, but that's too big a change
+      % to make right now.
+      \def\indexbackslash{\rawbackslashxx}%
+      \catcode`\\ = 0
+      \catcode`\@ = 11
+      \escapechar = `\\
+      \begindoublecolumns
       \input \jobname.#1s
+      \enddoublecolumns
     \fi
   \fi
   \closein 1
-  \enddoublecolumns
 \endgroup}
 
 % These macros are used by the sorted index file itself.
@@ -2553,24 +2550,39 @@ width0pt\relax} \fi
 
 \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
   % Grab any single-column material above us.
-  \output = {\global\setbox\partialpage
-    =\vbox{\unvbox255\kern -\topskip \kern \baselineskip}}%
+  \output = {\global\setbox\partialpage = \vbox{%
+    % 
+    % Here is a possibility not foreseen in manmac: if we accumulate a
+    % whole lot of material, we might end up calling this \output
+    % routine twice in a row (see the doublecol-lose test, which is
+    % essentially a couple of indexes with @setchapternewpage off).  In
+    % that case, we must prevent the second \partialpage from
+    % simply overwriting the first, causing us to lose the page.
+    % This will preserve it until a real output routine can ship it
+    % out.  Generally, \partialpage will be empty when this runs and
+    % this will be a no-op.
+    \unvbox\partialpage
+    %
+    % Unvbox the main output page.
+    \unvbox255
+    \kern-\topskip \kern\baselineskip
+  }}%
   \eject
   %
-  % Now switch to the double-column output routine.
-  \output={\doublecolumnout}%
+  % Use the double-column output routine for subsequent pages.
+  \output = {\doublecolumnout}%
   %
   % Change the page size parameters.  We could do this once outside this
   % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
   % format, but then we repeat the same computation.  Repeating a couple
   % of assignments once per index is clearly meaningless for the
-  % execution time, so we may as well do it once.
+  % execution time, so we may as well do it in one place.
   %
   % First we halve the line length, less a little for the gutter between
   % the columns.  We compute the gutter based on the line length, so it
   % changes automatically with the paper format.  The magic constant
-  % below is chosen so that the gutter has the same value (well, +- <
-  % 1pt) as it did when we hard-coded it.
+  % below is chosen so that the gutter has the same value (well, +-<1pt)
+  % as it did when we hard-coded it.
   %
   % We put the result in a separate register, \doublecolumhsize, so we
   % can restore it in \pagesofar, after \hsize itself has (potentially)
@@ -2591,100 +2603,103 @@ width0pt\relax} \fi
   % (undoubled) page height minus any material left over from the
   % previous page.
   \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
-  % box0 will be the left-hand column, box1 the right.
+  % box0 will be the left-hand column, box2 the right.
   \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
   \onepageout\pagesofar
-  \unvbox255 \penalty\outputpenalty
+  \unvbox255
+  \penalty\outputpenalty
 }
 \def\pagesofar{%
-  % The contents of the output page -- any previous material,
+  % Re-output the contents of the output page -- any previous material,
   % followed by the two boxes we just split.
   \unvbox\partialpage
   \hsize = \doublecolumnhsize
   \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}%
 }
 \def\enddoublecolumns{%
-  \output={\balancecolumns}\eject % split what we have
-  \endgroup
+  \output = {\balancecolumns}\eject % split what we have
+  \endgroup % started in \begindoublecolumns
+  %
   % Back to normal single-column typesetting, but take account of the
   % fact that we just accumulated some stuff on the output page.
-  \pagegoal=\vsize
+  \pagegoal = \vsize
 }
 \def\balancecolumns{%
-  % Called on the last page of the double column material.
-  \setbox0=\vbox{\unvbox255}%
+  % Called at the end of the double column material.
+  \setbox0 = \vbox{\unvbox255}%
   \dimen@ = \ht0
   \advance\dimen@ by \topskip
   \advance\dimen@ by-\baselineskip
   \divide\dimen@ by 2
   \splittopskip = \topskip
   % Loop until we get a decent breakpoint.
-  {\vbadness=10000 \loop \global\setbox3=\copy0
+  {\vbadness=10000 \loop
+    \global\setbox3=\copy0
     \global\setbox1=\vsplit3 to\dimen@
-    \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat}%
+    \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt
+   \repeat}%
   \setbox0=\vbox to\dimen@{\unvbox1}%
   \setbox2=\vbox to\dimen@{\unvbox3}%
   \pagesofar
 }
-\catcode `\@=\other
+\catcode`\@ = \other
 
 
 \message{sectioning,}
 % Define chapters, sections, etc.
 
-\newcount \chapno
-\newcount \secno        \secno=0
-\newcount \subsecno     \subsecno=0
-\newcount \subsubsecno  \subsubsecno=0
+\newcount\chapno
+\newcount\secno        \secno=0
+\newcount\subsecno     \subsecno=0
+\newcount\subsubsecno  \subsubsecno=0
 
 % This counter is funny since it counts through charcodes of letters A, B, ...
-\newcount \appendixno  \appendixno = `\@
+\newcount\appendixno  \appendixno = `\@
 \def\appendixletter{\char\the\appendixno}
 
-\newwrite \contentsfile
+\newwrite\contentsfile
 % This is called from \setfilename.
-\def\opencontents{\openout \contentsfile = \jobname.toc}
+\def\opencontents{\openout\contentsfile = \jobname.toc }
 
 % Each @chapter defines this as the name of the chapter.
 % page headings and footings can use it.  @section does likewise
 
 \def\thischapter{} \def\thissection{}
-\def\seccheck#1{\if \pageno<0 %
-\errmessage{@#1 not allowed after generating table of contents}\fi
-%
-}
+\def\seccheck#1{\ifnum \pageno<0
+  \errmessage{@#1 not allowed after generating table of contents}%
+\fi}
 
 \def\chapternofonts{%
-\let\rawbackslash=\relax%
-\let\frenchspacing=\relax%
-\def\result{\realbackslash result}
-\def\equiv{\realbackslash equiv}
-\def\expansion{\realbackslash expansion}
-\def\print{\realbackslash print}
-\def\TeX{\realbackslash TeX}
-\def\dots{\realbackslash dots}
-\def\copyright{\realbackslash copyright}
-\def\tt{\realbackslash tt}
-\def\bf{\realbackslash bf }
-\def\w{\realbackslash w}
-\def\less{\realbackslash less}
-\def\gtr{\realbackslash gtr}
-\def\hat{\realbackslash hat}
-\def\char{\realbackslash char}
-\def\tclose##1{\realbackslash tclose {##1}}
-\def\code##1{\realbackslash code {##1}}
-\def\samp##1{\realbackslash samp {##1}}
-\def\r##1{\realbackslash r {##1}}
-\def\b##1{\realbackslash b {##1}}
-\def\key##1{\realbackslash key {##1}}
-\def\file##1{\realbackslash file {##1}}
-\def\kbd##1{\realbackslash kbd {##1}}
-% These are redefined because @smartitalic wouldn't work inside xdef.
-\def\i##1{\realbackslash i {##1}}
-\def\cite##1{\realbackslash cite {##1}}
-\def\var##1{\realbackslash var {##1}}
-\def\emph##1{\realbackslash emph {##1}}
-\def\dfn##1{\realbackslash dfn {##1}}
+  \let\rawbackslash=\relax
+  \let\frenchspacing=\relax
+  \def\result{\realbackslash result}%
+  \def\equiv{\realbackslash equiv}%
+  \def\expansion{\realbackslash expansion}%
+  \def\print{\realbackslash print}%
+  \def\TeX{\realbackslash TeX}%
+  \def\dots{\realbackslash dots}%
+  \def\copyright{\realbackslash copyright}%
+  \def\tt{\realbackslash tt}%
+  \def\bf{\realbackslash bf}%
+  \def\w{\realbackslash w}%
+  \def\less{\realbackslash less}%
+  \def\gtr{\realbackslash gtr}%
+  \def\hat{\realbackslash hat}%
+  \def\char{\realbackslash char}%
+  \def\tclose##1{\realbackslash tclose{##1}}%
+  \def\code##1{\realbackslash code{##1}}%
+  \def\samp##1{\realbackslash samp{##1}}%
+  \def\r##1{\realbackslash r{##1}}%
+  \def\b##1{\realbackslash b{##1}}%
+  \def\key##1{\realbackslash key{##1}}%
+  \def\file##1{\realbackslash file{##1}}%
+  \def\kbd##1{\realbackslash kbd{##1}}%
+  % These are redefined because @smartitalic wouldn't work inside xdef.
+  \def\i##1{\realbackslash i{##1}}%
+  \def\cite##1{\realbackslash cite{##1}}%
+  \def\var##1{\realbackslash var{##1}}%
+  \def\emph##1{\realbackslash emph{##1}}%
+  \def\dfn##1{\realbackslash dfn{##1}}%
 }
 
 \newcount\absseclevel % used to calculate proper heading level
diff --git a/math/libm-test.c b/math/libm-test.c
index ccb8aa80d5..1f64d1ad24 100644
--- a/math/libm-test.c
+++ b/math/libm-test.c
@@ -221,13 +221,13 @@ static void
 test_not_exception (const char *test_name, short int exception)
 {
 #ifdef FE_DIVBYZERO
-  if ((exception & FE_DIVBYZERO) == 0)
+  if ((exception & DIVIDE_BY_ZERO_EXCEPTION) == 0)
     test_single_exception (test_name, exception,
 			   DIVIDE_BY_ZERO_EXCEPTION, FE_DIVBYZERO,
 			   "Divide by zero");
 #endif
 #ifdef FE_INVALID
-  if ((exception & FE_INVALID) == 0)
+  if ((exception & INVALID_EXCEPTION) == 0)
     test_single_exception (test_name, exception, INVALID_EXCEPTION, FE_INVALID,
 			   "Invalid operation");
 #endif
@@ -1743,43 +1743,43 @@ cexp_test (void)
 
   result = FUNC(cexp) (BUILD_COMPLEX (0.0, plus_infty));
   check_isnan_exc ("real(cexp(0 + i inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cexp(0 + i inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(cexp) (BUILD_COMPLEX (minus_zero, plus_infty));
   check_isnan_exc ("real(cexp(-0 + i inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cexp(-0 + i inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(cexp) (BUILD_COMPLEX (0.0, minus_infty));
   check_isnan_exc ("real(cexp(0 - i inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cexp(0 - i inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(cexp) (BUILD_COMPLEX (minus_zero, minus_infty));
   check_isnan_exc ("real(cexp(-0 - i inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cexp(-0 - i inf)) = NaN plus invalid exception",
 	       __imag__ result);
 
   result = FUNC(cexp) (BUILD_COMPLEX (100.0, plus_infty));
   check_isnan_exc ("real(cexp(100.0 + i inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cexp(100.0 + i inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(cexp) (BUILD_COMPLEX (-100.0, plus_infty));
   check_isnan_exc ("real(cexp(-100.0 + i inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cexp(-100.0 + i inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(cexp) (BUILD_COMPLEX (100.0, minus_infty));
   check_isnan_exc ("real(cexp(100.0 - i inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cexp(100.0 - i inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(cexp) (BUILD_COMPLEX (-100.0, minus_infty));
   check_isnan_exc ("real(cexp(-100.0 - i inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cexp(-100.0 - i inf)) = NaN", __imag__ result);
 
   result = FUNC(cexp) (BUILD_COMPLEX (minus_infty, 2.0));
@@ -1798,12 +1798,12 @@ cexp_test (void)
 
   result = FUNC(cexp) (BUILD_COMPLEX (plus_infty, plus_infty));
   check_isinfp_exc ("real(cexp(+inf + i inf)) = +inf plus invalid exception",
-		    __real__ result, FE_INVALID);
+		    __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cexp(+inf + i inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(cexp) (BUILD_COMPLEX (plus_infty, minus_infty));
   check_isinfp_exc ("real(cexp(+inf - i inf)) = +inf plus invalid exception",
-		    __real__ result, FE_INVALID);
+		    __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cexp(+inf - i inf)) = NaN plus invalid exception",
 	       __imag__ result);
 
@@ -1824,28 +1824,28 @@ cexp_test (void)
 
   result = FUNC(cexp) (BUILD_COMPLEX (nan_value, 0.0));
   check_isnan_maybe_exc ("real(cexp(NaN + i0)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cexp(NaN + i0)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(cexp) (BUILD_COMPLEX (nan_value, 1.0));
   check_isnan_maybe_exc ("real(cexp(NaN + 1i)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cexp(NaN + 1i)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(cexp) (BUILD_COMPLEX (nan_value, plus_infty));
   check_isnan_maybe_exc ("real(cexp(NaN + i inf)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cexp(NaN + i inf)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
   result = FUNC(cexp) (BUILD_COMPLEX (0, nan_value));
   check_isnan_maybe_exc ("real(cexp(0 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cexp(0 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(cexp) (BUILD_COMPLEX (1, nan_value));
   check_isnan_maybe_exc ("real(cexp(1 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cexp(1 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
@@ -1888,64 +1888,64 @@ csin_test (void)
 
   result = FUNC(csin) (BUILD_COMPLEX (plus_infty, 0.0));
   check_isnan_exc ("real(csin(+Inf + 0i)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check ("imag(csin(+Inf + 0i)) = +-0 plus invalid exception",
 	 FUNC(fabs) (__imag__ result), 0);
   result = FUNC(csin) (BUILD_COMPLEX (minus_infty, 0.0));
   check_isnan_exc ("real(csin(-Inf + 0i)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check ("imag(csin(-Inf + 0i)) = +-0 plus invalid exception",
 	 FUNC(fabs) (__imag__ result), 0);
   result = FUNC(csin) (BUILD_COMPLEX (plus_infty, minus_zero));
   check_isnan_exc ("real(csin(+Inf - 0i)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check ("imag(csin(+Inf - 0i)) = +-0 plus invalid exception",
 	 FUNC(fabs) (__imag__ result), 0.0);
   result = FUNC(csin) (BUILD_COMPLEX (minus_infty, minus_zero));
   check_isnan_exc ("real(csin(-Inf - 0i)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check ("imag(csin(-Inf - 0i)) = +-0 plus invalid exception",
 	 FUNC(fabs) (__imag__ result), 0.0);
 
   result = FUNC(csin) (BUILD_COMPLEX (plus_infty, plus_infty));
   check_isnan_exc ("real(csin(+Inf + i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isinfp ("imag(csin(+Inf + i Inf)) = +-Inf plus invalid exception",
 		FUNC(fabs) (__imag__ result));
   result = FUNC(csin) (BUILD_COMPLEX (minus_infty, plus_infty));
   check_isnan_exc ("real(csin(-Inf + i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isinfp ("imag(csin(-Inf + i Inf)) = +-Inf plus invalid exception",
 		FUNC(fabs) (__imag__ result));
   result = FUNC(csin) (BUILD_COMPLEX (plus_infty, minus_infty));
   check_isnan_exc ("real(csin(Inf - i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isinfp ("imag(csin(Inf - i Inf)) = +-Inf plus invalid exception",
 		FUNC(fabs) (__imag__ result));
   result = FUNC(csin) (BUILD_COMPLEX (minus_infty, minus_infty));
   check_isnan_exc ("real(csin(-Inf - i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isinfp ("imag(csin(-Inf - i Inf)) = +-Inf plus invalid exception",
 		FUNC(fabs) (__imag__ result));
 
   result = FUNC(csin) (BUILD_COMPLEX (plus_infty, 6.75));
   check_isnan_exc ("real(csin(+Inf + i 6.75)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csin(+Inf + i6.75)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(csin) (BUILD_COMPLEX (plus_infty, -6.75));
   check_isnan_exc ("real(csin(+Inf - i 6.75)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csin(+Inf - i6.75)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(csin) (BUILD_COMPLEX (minus_infty, 6.75));
   check_isnan_exc ("real(csin(-Inf + i6.75)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csin(-Inf + i6.75)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(csin) (BUILD_COMPLEX (minus_infty, -6.75));
   check_isnan_exc ("real(csin(-Inf - i6.75)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csin(-Inf - i6.75)) = NaN plus invalid exception",
 	       __imag__ result);
 
@@ -1979,14 +1979,14 @@ csin_test (void)
 		FUNC(fabs) (__imag__ result));
 
   result = FUNC(csin) (BUILD_COMPLEX (nan_value, 9.0));
-  check_isnan_maybe_exc ("real(csin(NaN + i9.0)) = NaN plus maybeinvalid exception",
-			 __real__ result, FE_INVALID);
-  check_isnan ("imag(csin(NaN + i9.0)) = NaN plus maybeinvalid exception",
+  check_isnan_maybe_exc ("real(csin(NaN + i9.0)) = NaN plus maybe invalid exception",
+			 __real__ result, INVALID_EXCEPTION);
+  check_isnan ("imag(csin(NaN + i9.0)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(csin) (BUILD_COMPLEX (nan_value, -9.0));
-  check_isnan_maybe_exc ("real(csin(NaN - i9.0)) = NaN plus maybeinvalid exception",
-			 __real__ result, FE_INVALID);
-  check_isnan ("imag(csin(NaN - i9.0)) = NaN plus maybeinvalid exception",
+  check_isnan_maybe_exc ("real(csin(NaN - i9.0)) = NaN plus maybe invalid exception",
+			 __real__ result, INVALID_EXCEPTION);
+  check_isnan ("imag(csin(NaN - i9.0)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
   result = FUNC(csin) (BUILD_COMPLEX (0.0, nan_value));
@@ -1997,22 +1997,26 @@ csin_test (void)
   check_isnan ("imag(csin(-0 + NaN)) = NaN", __imag__ result);
 
   result = FUNC(csin) (BUILD_COMPLEX (10.0, nan_value));
-  check_isnan_maybe_exc ("real(csin(10 + i NaN)) = NaN plus maybeinvalid exception",
-			 __real__ result, FE_INVALID);
-  check_isnan ("imag(csin(10 + i NaN)) = NaN plus maybeinvalid exception",
+  check_isnan_maybe_exc ("real(csin(10 + i NaN)) = NaN plus maybe invalid exception",
+			 __real__ result, INVALID_EXCEPTION);
+  check_isnan ("imag(csin(10 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(csin) (BUILD_COMPLEX (nan_value, -10.0));
-  check_isnan_maybe_exc ("real(csin(-10 + i NaN)) = NaN plus maybeinvalid exception",
-			 __real__ result, FE_INVALID);
-  check_isnan ("imag(csin(-10 + i NaN)) = NaN plus maybeinvalid exception",
+  check_isnan_maybe_exc ("real(csin(-10 + i NaN)) = NaN plus maybe invalid exception",
+			 __real__ result, INVALID_EXCEPTION);
+  check_isnan ("imag(csin(-10 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
   result = FUNC(csin) (BUILD_COMPLEX (plus_infty, nan_value));
-  check_isnan ("real(csin(+Inf + i NaN)) = NaN", __real__ result);
-  check_isnan ("imag(csin(+Inf + i NaN)) = NaN", __imag__ result);
+  check_isnan_maybe_exc ("real(csin(+Inf + i NaN)) = NaN plus maybe invalid exception",
+			 __real__ result, INVALID_EXCEPTION);
+  check_isnan ("imag(csin(+Inf + i NaN)) = NaN plus maybe invalid exception",
+	       __imag__ result);
   result = FUNC(csin) (BUILD_COMPLEX (minus_infty, nan_value));
-  check_isnan ("real(csin(-Inf + i NaN)) = NaN", __real__ result);
-  check_isnan ("imag(csin(-Inf + i NaN)) = NaN", __imag__ result);
+  check_isnan_maybe_exc ("real(csin(-Inf + i NaN)) = NaN plus maybe invalid exception",
+			 __real__ result, INVALID_EXCEPTION);
+  check_isnan ("imag(csin(-Inf + i NaN)) = NaN plus maybe invalid exception",
+	       __imag__ result);
 
   result = FUNC(csin) (BUILD_COMPLEX (nan_value, nan_value));
   check_isnan ("real(csin(NaN + i NaN)) = NaN", __real__ result);
@@ -2040,22 +2044,22 @@ csinh_test (void)
 
   result = FUNC(csinh) (BUILD_COMPLEX (0.0, plus_infty));
   check_exc ("real(csinh(0 + i Inf)) = +-0 plus invalid exception",
-	     FUNC(fabs) (__real__ result), 0, FE_INVALID);
+	     FUNC(fabs) (__real__ result), 0, INVALID_EXCEPTION);
   check_isnan ("imag(csinh(0 + i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(csinh) (BUILD_COMPLEX (minus_zero, plus_infty));
   check_exc ("real(csinh(-0 + i Inf)) = +-0 plus invalid exception",
-	     FUNC(fabs) (__real__ result), 0, FE_INVALID);
+	     FUNC(fabs) (__real__ result), 0, INVALID_EXCEPTION);
   check_isnan ("imag(csinh(-0 + i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(csinh) (BUILD_COMPLEX (0.0, minus_infty));
   check_exc ("real(csinh(0 - i Inf)) = +-0 plus invalid exception",
-	     FUNC(fabs) (__real__ result), 0, FE_INVALID);
+	     FUNC(fabs) (__real__ result), 0, INVALID_EXCEPTION);
   check_isnan ("imag(csinh(0 - i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(csinh) (BUILD_COMPLEX (minus_zero, minus_infty));
   check_exc ("real(csinh(-0 - i Inf)) = +-0 plus invalid exception",
-	     FUNC(fabs) (__real__ result), 0, FE_INVALID);
+	     FUNC(fabs) (__real__ result), 0, INVALID_EXCEPTION);
   check_isnan ("imag(csinh(-0 - i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
 
@@ -2074,22 +2078,22 @@ csinh_test (void)
 
   result = FUNC(csinh) (BUILD_COMPLEX (plus_infty, plus_infty));
   check_isinfp_exc ("real(csinh(+Inf + i Inf)) = +-Inf plus invalid exception",
-		    FUNC(fabs) (__real__ result), FE_INVALID);
+		    FUNC(fabs) (__real__ result), INVALID_EXCEPTION);
   check_isnan ("imag(csinh(+Inf + i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(csinh) (BUILD_COMPLEX (minus_infty, plus_infty));
   check_isinfp_exc ("real(csinh(-Inf + i Inf)) = +-Inf plus invalid exception",
-		    FUNC(fabs) (__real__ result), FE_INVALID);
+		    FUNC(fabs) (__real__ result), INVALID_EXCEPTION);
   check_isnan ("imag(csinh(-Inf + i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(csinh) (BUILD_COMPLEX (plus_infty, minus_infty));
   check_isinfp_exc ("real(csinh(Inf - i Inf)) = +-Inf plus invalid exception",
-		    FUNC(fabs) (__real__ result), FE_INVALID);
+		    FUNC(fabs) (__real__ result), INVALID_EXCEPTION);
   check_isnan ("imag(csinh(Inf - i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(csinh) (BUILD_COMPLEX (minus_infty, minus_infty));
   check_isinfp_exc ("real(csinh(-Inf - i Inf)) = +-Inf plus invalid exception",
-		    FUNC(fabs) (__real__ result), FE_INVALID);
+		    FUNC(fabs) (__real__ result), INVALID_EXCEPTION);
   check_isnan ("imag(csinh(-Inf - i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
 
@@ -2108,22 +2112,22 @@ csinh_test (void)
 
   result = FUNC(csinh) (BUILD_COMPLEX (6.75, plus_infty));
   check_isnan_exc ("real(csinh(6.75 + i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csinh(6.75 + i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(csinh) (BUILD_COMPLEX (-6.75, plus_infty));
   check_isnan_exc ("real(csinh(-6.75 + i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csinh(-6.75 + i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(csinh) (BUILD_COMPLEX (6.75, minus_infty));
   check_isnan_exc ("real(csinh(6.75 - i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csinh(6.75 - i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(csinh) (BUILD_COMPLEX (-6.75, minus_infty));
   check_isnan_exc ("real(csinh(-6.75 - i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csinh(-6.75 - i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
 
@@ -2145,12 +2149,12 @@ csinh_test (void)
 
   result = FUNC(csinh) (BUILD_COMPLEX (9.0, nan_value));
   check_isnan_maybe_exc ("real(csinh(9.0 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csinh(9.0 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(csinh) (BUILD_COMPLEX (-9.0, nan_value));
   check_isnan_maybe_exc ("real(csinh(-9.0 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csinh(-9.0 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
@@ -2163,21 +2167,25 @@ csinh_test (void)
 
   result = FUNC(csinh) (BUILD_COMPLEX (nan_value, 10.0));
   check_isnan_maybe_exc ("real(csinh(NaN + i10)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csinh(NaN + i10)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(csinh) (BUILD_COMPLEX (nan_value, -10.0));
   check_isnan_maybe_exc ("real(csinh(NaN - i10)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csinh(NaN - i10)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
   result = FUNC(csinh) (BUILD_COMPLEX (nan_value, plus_infty));
-  check_isnan ("real(csinh(NaN + i Inf)) = NaN", __real__ result);
-  check_isnan ("imag(csinh(NaN + i Inf)) = NaN", __imag__ result);
+  check_isnan_maybe_exc ("real(csinh(NaN + i Inf)) = NaN plus maybe invalid exception",
+			 __real__ result, INVALID_EXCEPTION);
+  check_isnan ("imag(csinh(NaN + i Inf)) = NaN plus maybe invalid exception",
+	       __imag__ result);
   result = FUNC(csinh) (BUILD_COMPLEX (nan_value, minus_infty));
-  check_isnan ("real(csinh(NaN - i Inf)) = NaN", __real__ result);
-  check_isnan ("imag(csinh(NaN - i Inf)) = NaN", __imag__ result);
+  check_isnan_maybe_exc ("real(csinh(NaN - i Inf)) = NaN plus maybe invalid exception",
+			 __real__ result, INVALID_EXCEPTION);
+  check_isnan ("imag(csinh(NaN - i Inf)) = NaN plus maybe invalid exception",
+	       __imag__ result);
 
   result = FUNC(csinh) (BUILD_COMPLEX (nan_value, nan_value));
   check_isnan ("real(csinh(NaN + i NaN)) = NaN", __real__ result);
@@ -2205,22 +2213,22 @@ ccos_test (void)
 
   result = FUNC(ccos) (BUILD_COMPLEX (plus_infty, 0.0));
   check_isnan_exc ("real(ccos(+Inf + i0)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check ("imag(ccos(Inf + i0)) = +-0 plus invalid exception",
 	 FUNC(fabs) (__imag__ result), 0);
   result = FUNC(ccos) (BUILD_COMPLEX (plus_infty, minus_zero));
   check_isnan_exc ("real(ccos(Inf - i0)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check ("imag(ccos(Inf - i0)) = +-0 plus invalid exception",
 	 FUNC(fabs) (__imag__ result), 0);
   result = FUNC(ccos) (BUILD_COMPLEX (minus_infty, 0.0));
   check_isnan_exc ("real(ccos(-Inf + i0)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check ("imag(ccos(-Inf + i0)) = +-0 plus invalid exception",
 	 FUNC(fabs) (__imag__ result), 0);
   result = FUNC(ccos) (BUILD_COMPLEX (minus_infty, minus_zero));
   check_isnan_exc ("real(ccos(-Inf - i0)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check ("imag(ccos(-Inf - i0)) = +-0 plus invalid exception",
 	 FUNC(fabs) (__imag__ result), 0);
 
@@ -2239,22 +2247,22 @@ ccos_test (void)
 
   result = FUNC(ccos) (BUILD_COMPLEX (plus_infty, plus_infty));
   check_isinfp_exc ("real(ccos(+Inf + i Inf)) = +Inf plus invalid exception",
-		    __real__ result, FE_INVALID);
+		    __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccos(+Inf + i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ccos) (BUILD_COMPLEX (minus_infty, plus_infty));
   check_isinfp_exc ("real(ccos(-Inf + i Inf)) = +Inf plus invalid exception",
-		    __real__ result, FE_INVALID);
+		    __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccos(-Inf + i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ccos) (BUILD_COMPLEX (plus_infty, minus_infty));
   check_isinfp_exc ("real(ccos(Inf - i Inf)) = +Inf plus invalid exception",
-		    __real__ result, FE_INVALID);
+		    __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccos(Inf - i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ccos) (BUILD_COMPLEX (minus_infty, minus_infty));
   check_isinfp_exc ("real(ccos(-Inf - i Inf)) = +Inf plus invalid exception",
-		    __real__ result, FE_INVALID);
+		    __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccos(-Inf - i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
 
@@ -2273,22 +2281,22 @@ ccos_test (void)
 
   result = FUNC(ccos) (BUILD_COMPLEX (plus_infty, 6.75));
   check_isnan_exc ("real(ccos(+Inf + i6.75)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccos(+Inf + i6.75)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ccos) (BUILD_COMPLEX (plus_infty, -6.75));
   check_isnan_exc ("real(ccos(+Inf - i6.75)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccos(+Inf - i6.75)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ccos) (BUILD_COMPLEX (minus_infty, 6.75));
   check_isnan_exc ("real(ccos(-Inf + i6.75)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccos(-Inf + i6.75)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ccos) (BUILD_COMPLEX (minus_infty, -6.75));
   check_isnan_exc ("real(ccos(-Inf - i6.75)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccos(-Inf - i6.75)) = NaN plus invalid exception",
 	       __imag__ result);
 
@@ -2308,12 +2316,12 @@ ccos_test (void)
 
   result = FUNC(ccos) (BUILD_COMPLEX (nan_value, 9.0));
   check_isnan_maybe_exc ("real(ccos(NaN + i9.0)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccos(NaN + i9.0)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(ccos) (BUILD_COMPLEX (nan_value, -9.0));
   check_isnan_maybe_exc ("real(ccos(NaN - i9.0)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccos(NaN - i9.0)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
@@ -2326,23 +2334,23 @@ ccos_test (void)
 
   result = FUNC(ccos) (BUILD_COMPLEX (10.0, nan_value));
   check_isnan_maybe_exc ("real(ccos(10 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccos(10 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(ccos) (BUILD_COMPLEX (-10.0, nan_value));
   check_isnan_maybe_exc ("real(ccos(-10 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccos(-10 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
   result = FUNC(ccos) (BUILD_COMPLEX (plus_infty, nan_value));
   check_isnan_maybe_exc ("real(ccos(+Inf + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccos(+Inf + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(ccos) (BUILD_COMPLEX (minus_infty, nan_value));
   check_isnan_maybe_exc ("real(ccos(-Inf + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccos(-Inf + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
@@ -2372,22 +2380,22 @@ ccosh_test (void)
 
   result = FUNC(ccosh) (BUILD_COMPLEX (0.0, plus_infty));
   check_isnan_exc ("real(ccosh(0 + i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check ("imag(ccosh(0 + i Inf)) = +-0 plus invalid exception",
 	 FUNC(fabs) (__imag__ result), 0);
   result = FUNC(ccosh) (BUILD_COMPLEX (minus_zero, plus_infty));
   check_isnan_exc ("real(ccosh(-0 + i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check ("imag(ccosh(-0 + i Inf)) = +-0 plus invalid exception",
 	 FUNC(fabs) (__imag__ result), 0);
   result = FUNC(ccosh) (BUILD_COMPLEX (0.0, minus_infty));
   check_isnan_exc ("real(ccosh(0 - i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check ("imag(ccosh(0 - i Inf)) = +-0 plus invalid exception",
 	 FUNC(fabs) (__imag__ result), 0);
   result = FUNC(ccosh) (BUILD_COMPLEX (minus_zero, minus_infty));
   check_isnan_exc ("real(ccosh(-0 - i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check ("imag(ccosh(-0 - i Inf)) = +-0 plus invalid exception",
 	 FUNC(fabs) (__imag__ result), 0);
 
@@ -2406,22 +2414,22 @@ ccosh_test (void)
 
   result = FUNC(ccosh) (BUILD_COMPLEX (plus_infty, plus_infty));
   check_isinfp_exc ("real(ccosh(+Inf + i Inf)) = +Inf plus invalid exception",
-		    __real__ result, FE_INVALID);
+		    __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccosh(+Inf + i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ccosh) (BUILD_COMPLEX (minus_infty, plus_infty));
   check_isinfp_exc ("real(ccosh(-Inf + i Inf)) = +Inf plus invalid exception",
-		    __real__ result, FE_INVALID);
+		    __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccosh(-Inf + i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ccosh) (BUILD_COMPLEX (plus_infty, minus_infty));
   check_isinfp_exc ("real(ccosh(Inf - i Inf)) = +Inf plus invalid exception",
-		    __real__ result, FE_INVALID);
+		    __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccosh(Inf - i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ccosh) (BUILD_COMPLEX (minus_infty, minus_infty));
   check_isinfp_exc ("real(ccosh(-Inf - i Inf)) = +Inf plus invalid exception",
-		    __real__ result, FE_INVALID);
+		    __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccosh(-Inf - i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
 
@@ -2440,22 +2448,22 @@ ccosh_test (void)
 
   result = FUNC(ccosh) (BUILD_COMPLEX (6.75, plus_infty));
   check_isnan_exc ("real(ccosh(6.75 + i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccosh(6.75 + i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ccosh) (BUILD_COMPLEX (-6.75, plus_infty));
   check_isnan_exc ("real(ccosh(-6.75 + i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccosh(-6.75 + i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ccosh) (BUILD_COMPLEX (6.75, minus_infty));
   check_isnan_exc ("real(ccosh(6.75 - i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccosh(6.75 - i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ccosh) (BUILD_COMPLEX (-6.75, minus_infty));
   check_isnan_exc ("real(ccosh(-6.75 - i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccosh(-6.75 - i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
 
@@ -2475,12 +2483,12 @@ ccosh_test (void)
 
   result = FUNC(ccosh) (BUILD_COMPLEX (9.0, nan_value));
   check_isnan_maybe_exc ("real(ccosh(9.0 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccosh(9.0 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(ccosh) (BUILD_COMPLEX (-9.0, nan_value));
   check_isnan_maybe_exc ("real(ccosh(-9.0 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccosh(-9.0 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
@@ -2493,23 +2501,23 @@ ccosh_test (void)
 
   result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, 10.0));
   check_isnan_maybe_exc ("real(ccosh(NaN + i10)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccosh(NaN + i10)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, -10.0));
   check_isnan_maybe_exc ("real(ccosh(NaN - i10)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccosh(NaN - i10)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
   result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, plus_infty));
   check_isnan_maybe_exc ("real(ccosh(NaN + i Inf)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccosh(NaN + i Inf)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, minus_infty));
   check_isnan_maybe_exc ("real(ccosh(NaN - i Inf)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ccosh(NaN - i Inf)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
@@ -2621,23 +2629,23 @@ cacos_test (void)
 
   result = FUNC(cacos) (BUILD_COMPLEX (10.5, nan_value));
   check_isnan_maybe_exc ("real(cacos(10.5 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cacos(10.5 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(cacos) (BUILD_COMPLEX (-10.5, nan_value));
   check_isnan_maybe_exc ("real(cacos(-10.5 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cacos(-10.5 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
   result = FUNC(cacos) (BUILD_COMPLEX (nan_value, 0.75));
   check_isnan_maybe_exc ("real(cacos(NaN + i0.75)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cacos(NaN + i0.75)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(cacos) (BUILD_COMPLEX (-10.5, nan_value));
   check_isnan_maybe_exc ("real(cacos(NaN - i0.75)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cacos(NaN - i0.75)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
@@ -2749,23 +2757,23 @@ cacosh_test (void)
 
   result = FUNC(cacosh) (BUILD_COMPLEX (10.5, nan_value));
   check_isnan_maybe_exc ("real(cacosh(10.5 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cacosh(10.5 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(cacosh) (BUILD_COMPLEX (-10.5, nan_value));
   check_isnan_maybe_exc ("real(cacosh(-10.5 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cacosh(-10.5 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
   result = FUNC(cacosh) (BUILD_COMPLEX (nan_value, 0.75));
   check_isnan_maybe_exc ("real(cacosh(NaN + i0.75)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cacosh(NaN + i0.75)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(cacosh) (BUILD_COMPLEX (-10.5, nan_value));
   check_isnan_maybe_exc ("real(cacosh(NaN - i0.75)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(cacosh(NaN - i0.75)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
@@ -2882,23 +2890,23 @@ casin_test (void)
 
   result = FUNC(casin) (BUILD_COMPLEX (nan_value, 10.5));
   check_isnan_maybe_exc ("real(casin(NaN + i10.5)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(casin(NaN + i10.5)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(casin) (BUILD_COMPLEX (nan_value, -10.5));
   check_isnan_maybe_exc ("real(casin(NaN - i10.5)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(casin(NaN - i10.5)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
   result = FUNC(casin) (BUILD_COMPLEX (0.75, nan_value));
   check_isnan_maybe_exc ("real(casin(0.75 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(casin(0.75 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(casin) (BUILD_COMPLEX (-0.75, nan_value));
   check_isnan_maybe_exc ("real(casin(-0.75 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(casin(-0.75 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
@@ -3015,23 +3023,23 @@ casinh_test (void)
 
   result = FUNC(casinh) (BUILD_COMPLEX (10.5, nan_value));
   check_isnan_maybe_exc ("real(casinh(10.5 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(casinh(10.5 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(casinh) (BUILD_COMPLEX (-10.5, nan_value));
   check_isnan_maybe_exc ("real(casinh(-10.5 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(casinh(-10.5 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
   result = FUNC(casinh) (BUILD_COMPLEX (nan_value, 0.75));
   check_isnan_maybe_exc ("real(casinh(NaN + i0.75)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(casinh(NaN + i0.75)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(casinh) (BUILD_COMPLEX (-0.75, nan_value));
   check_isnan_maybe_exc ("real(casinh(NaN - i0.75)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(casinh(NaN - i0.75)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
@@ -3153,23 +3161,23 @@ catan_test (void)
 
   result = FUNC(catan) (BUILD_COMPLEX (nan_value, 10.5));
   check_isnan_maybe_exc ("real(catan(NaN + i10.5)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(catan(NaN + i10.5)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(catan) (BUILD_COMPLEX (nan_value, -10.5));
   check_isnan_maybe_exc ("real(catan(NaN - i10.5)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(catan(NaN - i10.5)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
   result = FUNC(catan) (BUILD_COMPLEX (0.75, nan_value));
   check_isnan_maybe_exc ("real(catan(0.75 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(catan(0.75 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(catan) (BUILD_COMPLEX (-0.75, nan_value));
   check_isnan_maybe_exc ("real(catan(-0.75 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(catan(-0.75 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
@@ -3291,23 +3299,23 @@ catanh_test (void)
 
   result = FUNC(catanh) (BUILD_COMPLEX (10.5, nan_value));
   check_isnan_maybe_exc ("real(catanh(10.5 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(catanh(10.5 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(catanh) (BUILD_COMPLEX (-10.5, nan_value));
   check_isnan_maybe_exc ("real(catanh(-10.5 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(catanh(-10.5 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
   result = FUNC(catanh) (BUILD_COMPLEX (nan_value, 0.75));
   check_isnan_maybe_exc ("real(catanh(NaN + i0.75)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(catanh(NaN + i0.75)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(catanh) (BUILD_COMPLEX (nan_value, -0.75));
   check_isnan_maybe_exc ("real(catanh(NaN - i0.75)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(catanh(NaN - i0.75)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
@@ -3362,42 +3370,42 @@ ctanh_test (void)
 
   result = FUNC(ctanh) (BUILD_COMPLEX (0, plus_infty));
   check_isnan_exc ("real(ctanh(0 + i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ctanh(0 + i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ctanh) (BUILD_COMPLEX (2, plus_infty));
   check_isnan_exc ("real(ctanh(2 + i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ctanh(2 + i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ctanh) (BUILD_COMPLEX (0, minus_infty));
   check_isnan_exc ("real(ctanh(0 - i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ctanh(0 - i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ctanh) (BUILD_COMPLEX (2, minus_infty));
   check_isnan_exc ("real(ctanh(2 - i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ctanh(2 - i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ctanh) (BUILD_COMPLEX (minus_zero, plus_infty));
   check_isnan_exc ("real(ctanh(-0 + i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ctanh(-0 + i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ctanh) (BUILD_COMPLEX (-2, plus_infty));
   check_isnan_exc ("real(ctanh(-2 + i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ctanh(-2 + i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ctanh) (BUILD_COMPLEX (minus_zero, minus_infty));
   check_isnan_exc ("real(ctanh(-0 - i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ctanh(-0 - i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
   result = FUNC(ctanh) (BUILD_COMPLEX (-2, minus_infty));
   check_isnan_exc ("real(ctanh(-2 - i Inf)) = NaN plus invalid exception",
-		   __real__ result, FE_INVALID);
+		   __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ctanh(-2 - i Inf)) = NaN plus invalid exception",
 	       __imag__ result);
 
@@ -3417,33 +3425,33 @@ ctanh_test (void)
 
   result = FUNC(ctanh) (BUILD_COMPLEX (nan_value, 0.5));
   check_isnan_maybe_exc ("real(ctanh(NaN + i0.5)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ctanh(NaN + i0.5)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(ctanh) (BUILD_COMPLEX (nan_value, -4.5));
   check_isnan_maybe_exc ("real(ctanh(NaN - i4.5)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ctanh(NaN - i4.5)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
   result = FUNC(ctanh) (BUILD_COMPLEX (0, nan_value));
   check_isnan_maybe_exc ("real(ctanh(0 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ctanh(0 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(ctanh) (BUILD_COMPLEX (5, nan_value));
   check_isnan_maybe_exc ("real(ctanh(5 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ctanh(5 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(ctanh) (BUILD_COMPLEX (minus_zero, nan_value));
   check_isnan_maybe_exc ("real(ctanh(-0 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ctanh(-0 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(ctanh) (BUILD_COMPLEX (-0.25, nan_value));
   check_isnan_maybe_exc ("real(ctanh(-0.25 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(ctanh(-0.25 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
@@ -3561,43 +3569,43 @@ clog_test (void)
 
   result = FUNC(clog) (BUILD_COMPLEX (0, nan_value));
   check_isnan_maybe_exc ("real(clog(0 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(clog(0 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(clog) (BUILD_COMPLEX (3, nan_value));
   check_isnan_maybe_exc ("real(clog(3 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(clog(3 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(clog) (BUILD_COMPLEX (minus_zero, nan_value));
   check_isnan_maybe_exc ("real(clog(-0 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(clog(-0 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(clog) (BUILD_COMPLEX (-3, nan_value));
   check_isnan_maybe_exc ("real(clog(-3 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(clog(-3 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
   result = FUNC(clog) (BUILD_COMPLEX (nan_value, 0));
   check_isnan_maybe_exc ("real(clog(NaN + i0)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(clog(NaN + i0)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(clog) (BUILD_COMPLEX (nan_value, 5));
   check_isnan_maybe_exc ("real(clog(NaN + i5)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(clog(NaN + i5)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(clog) (BUILD_COMPLEX (nan_value, minus_zero));
   check_isnan_maybe_exc ("real(clog(NaN - i0)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(clog(NaN - i0)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(clog) (BUILD_COMPLEX (nan_value, -5));
   check_isnan_maybe_exc ("real(clog(NaN - i5)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(clog(NaN - i5)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
@@ -3699,43 +3707,43 @@ csqrt_test (void)
 
   result = FUNC(csqrt) (BUILD_COMPLEX (0, nan_value));
   check_isnan_maybe_exc ("real(csqrt(0 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csqrt(0 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(csqrt) (BUILD_COMPLEX (1, nan_value));
   check_isnan_maybe_exc ("real(csqrt(1 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csqrt(1 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(csqrt) (BUILD_COMPLEX (minus_zero, nan_value));
   check_isnan_maybe_exc ("real(csqrt(-0 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csqrt(-0 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(csqrt) (BUILD_COMPLEX (-1, nan_value));
   check_isnan_maybe_exc ("real(csqrt(-1 + i NaN)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csqrt(-1 + i NaN)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
   result = FUNC(csqrt) (BUILD_COMPLEX (nan_value, 0));
   check_isnan_maybe_exc ("real(csqrt(NaN + i0)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csqrt(NaN + i0)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(csqrt) (BUILD_COMPLEX (nan_value, 8));
   check_isnan_maybe_exc ("real(csqrt(NaN + i8)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csqrt(NaN + i8)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(csqrt) (BUILD_COMPLEX (nan_value, minus_zero));
   check_isnan_maybe_exc ("real(csqrt(NaN - i0)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csqrt(NaN - i0)) = NaN plus maybe invalid exception",
 	       __imag__ result);
   result = FUNC(csqrt) (BUILD_COMPLEX (nan_value, -8));
   check_isnan_maybe_exc ("real(csqrt(NaN - i8)) = NaN plus maybe invalid exception",
-			 __real__ result, FE_INVALID);
+			 __real__ result, INVALID_EXCEPTION);
   check_isnan ("imag(csqrt(NaN - i8)) = NaN plus maybe invalid exception",
 	       __imag__ result);
 
diff --git a/nis/Banner b/nis/Banner
index f03f4ea3f5..b5aedc2b97 100644
--- a/nis/Banner
+++ b/nis/Banner
@@ -1 +1 @@
-NIS(YP)/NIS+ NSS modules 0.10 by Thorsten Kukuk
+NIS(YP)/NIS+ NSS modules 0.11 by Thorsten Kukuk
diff --git a/nis/Makefile b/nis/Makefile
index 64925bb70d..a5a591e1b7 100644
--- a/nis/Makefile
+++ b/nis/Makefile
@@ -43,8 +43,13 @@ vpath %.c $(subdir-dirs)
 
 libnsl-routines = yp_xdr ypclnt ypupdate_xdr \
                   nis_subr nis_local_names nis_free nis_file \
-                  nis_print nis_error nis_call nis_names nis_clone\
-                  nis_table nis_xdr nis_intern nis_server
+                  nis_print nis_error nis_call nis_lookup nis_clone\
+                  nis_table nis_xdr nis_intern nis_server nis_ping\
+		  nis_checkpoint nis_mkdir nis_rmdir nis_getservlist\
+		  nis_verifygroup nis_ismember nis_addmember \
+		  nis_removemember nis_creategroup nis_destroygroup\
+		  nis_print_group_entry nis_domain_of nis_domain_of_r\
+		  nis_modify nis_remove nis_add nis_defaults
 
 libnss_compat-routines	:= $(addprefix compat-,grp pwd spwd)
 libnss_compat-inhibit-o	= $(filter-out .so,$(object-suffixes))
diff --git a/nis/TODO b/nis/TODO
index 628e646d15..33072fa730 100644
--- a/nis/TODO
+++ b/nis/TODO
@@ -4,15 +4,6 @@
  * nss_nisplus: Search the data in the complete NIS+ namespace
 		specified by NIS_PATH
  
- * nis_server: implement nis_getservlist, nis_stats, nis_servstate
-
- * nis_groups: implement it
-
- * nis_ping: implement it
-
- * __start_clock(), __stop_clock(): Test the interface and
-                                    implement it
- 
  * What does nis_list give back, if rpc.nisd is not running or
    if /var/nis/NIS_START_FILE does not exist ?
 
@@ -20,21 +11,7 @@
 	Missing flags: FOLLOW_PATH, ALL_RESULTS
 	callback: Don't simulate it, use server callback thread
 
- * Possible flags:
-	- FOLLOW_LINKS	(nis_list, nis_lookup)
+ * Missing flags:
 	- FOLLOW_PATH	(nis_list, not supported)
-	- HARD_LOOKUP	(__do_niscall)
 	- ALL_RESULTS	(nis_list, not supported, needs server callback)
 	- NO_CACHE	(__do_niscall, cache not supported yet)
-	- MASTER_ONLY	(__do_niscall)
-	- EXPAND_NAME	(nis_lookup, nis_list)
-	- RETURN_RESULT (nis_table.c)
-	- ADD_OVERWRITE	(nis_table.c)
-	- REM_MULTIPLE	(nis_table.c)
-	- MOD_SAMEOBJ 	(nis_table.c)
-	- ADD_RESERVED	(nis_table.c)
-	- REM_RESERVED	(nis_table.c)
-	- MOD_EXCLUSIVE	(nis_table.c)
-	- USE_DGRAM	(__do_niscall)
-	- NO_AUTHINFO 	(__do_niscall)
-	
diff --git a/nis/nis_add.c b/nis/nis_add.c
new file mode 100644
index 0000000000..0eb838efed
--- /dev/null
+++ b/nis/nis_add.c
@@ -0,0 +1,71 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@uni-paderborn.de>, 1997.
+
+   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 <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+
+#include "nis_intern.h"
+
+nis_result *
+nis_add (const_nis_name name, const nis_object *obj)
+{
+  nis_result *res;
+  nis_error status;
+  struct ns_request req;
+  char *p1, *p2, *p3, *p4;
+  char buf1 [strlen (name) + 20];
+  char buf4 [strlen (name) + 20];
+
+  res = calloc (1, sizeof (nis_result));
+
+  req.ns_name = (char *)name;
+
+  req.ns_object.ns_object_len = 1;
+  req.ns_object.ns_object_val = nis_clone_object (obj, NULL);
+
+  p1 = req.ns_object.ns_object_val[0].zo_name;
+  req.ns_object.ns_object_val[0].zo_name =
+    nis_name_of_r (name, buf1, sizeof (buf1));
+
+  p2 = req.ns_object.ns_object_val[0].zo_owner;
+  if (p2 == NULL || strlen (p2) == 0)
+    req.ns_object.ns_object_val[0].zo_owner = nis_local_principal ();
+
+  p3 = req.ns_object.ns_object_val[0].zo_group;
+  if (p3 == NULL || strlen (p3) == 0)
+    req.ns_object.ns_object_val[0].zo_group = nis_local_group ();
+
+  p4 = req.ns_object.ns_object_val[0].zo_domain;
+  req.ns_object.ns_object_val[0].zo_domain =
+    nis_domain_of_r (name, buf4, sizeof (buf4));
+
+  if ((status = __do_niscall (NULL, 0, NIS_ADD, (xdrproc_t) xdr_ns_request,
+			      (caddr_t) &req, (xdrproc_t) xdr_nis_result,
+			      (caddr_t) res, MASTER_ONLY)) != RPC_SUCCESS)
+    res->status = status;
+
+  req.ns_object.ns_object_val[0].zo_name = p1;
+  req.ns_object.ns_object_val[0].zo_owner = p2;
+  req.ns_object.ns_object_val[0].zo_group = p3;
+  req.ns_object.ns_object_val[0].zo_domain = p4;
+
+  nis_destroy_object (req.ns_object.ns_object_val);
+
+  return res;
+}
diff --git a/nis/nis_addmember.c b/nis/nis_addmember.c
new file mode 100644
index 0000000000..2eee9cc8bf
--- /dev/null
+++ b/nis/nis_addmember.c
@@ -0,0 +1,69 @@
+/* Copyright (c) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+
+   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 <string.h>
+#include <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+
+nis_error
+nis_addmember (const_nis_name member, const_nis_name group)
+{
+  if (group != NULL && strlen (group) > 0)
+    {
+      char buf[strlen (group) + 50];
+      char leafbuf[strlen (group) + 2];
+      char domainbuf[strlen (group) + 2];
+      nis_result *res, *res2;
+      nis_error status;
+      char *cp, *cp2;
+
+      cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1));
+      cp = stpcpy (cp, ".groups_dir");
+      cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
+      if (cp2 != NULL && strlen (cp2) > 0)
+        {
+          cp = stpcpy (cp, ".");
+          strcpy (cp, cp2);
+        }
+      res = nis_lookup (buf, FOLLOW_LINKS|EXPAND_NAME);
+      if (res->status != NIS_SUCCESS)
+	{
+	  status = res->status;
+	  nis_freeresult (res);
+	  return status;
+	}
+      if ((res->objects.objects_len != 1) ||
+          (res->objects.objects_val[0].zo_data.zo_type != GROUP_OBJ))
+        return NIS_INVALIDOBJ;
+
+      res->objects.objects_val[0].GR_data.gr_members.gr_members_val
+	= realloc (res->objects.objects_val[0].GR_data.gr_members.gr_members_val, res->objects.objects_val[0].GR_data.gr_members.gr_members_len + 1);
+      ++res->objects.objects_val[0].GR_data.gr_members.gr_members_len;
+      res->objects.objects_val[0].GR_data.gr_members.gr_members_val[res->objects.objects_val[0].GR_data.gr_members.gr_members_len] = strdup (member);
+
+      res2 = nis_modify (buf, res->objects.objects_val);
+      status = res2->status;
+      nis_freeresult (res);
+      nis_freeresult (res2);
+
+      return status;
+    }
+  else
+    return NIS_FAIL;
+}
diff --git a/nis/nis_call.c b/nis/nis_call.c
index 12b3ab265e..a92f1445f4 100644
--- a/nis/nis_call.c
+++ b/nis/nis_call.c
@@ -134,7 +134,7 @@ __nis_dobind (const nis_server *server, u_long flags)
       if ((flags & NO_AUTHINFO) != NO_AUTHINFO)
 	{
 #if defined(HAVE_SECURE_RPC)
-	  if (server->key_type == NIS_PK_DH)
+	  if (server->key_type == NIS_PK_DH && getenv ("NO_SECURE_RPC") == NULL)
 	    {
 	      char netname[MAXNETNAMELEN+1];
 	      char *p;
@@ -173,11 +173,8 @@ __do_niscall (const nis_server *serv, int serv_len, u_long prog,
   if (serv == NULL || serv_len == 0)
     {
       dir = readColdStartFile ();
-      if (dir == NULL)
-	{
-	  fputs (_("Error: could not find a NIS_COLD_START file\n"), stderr);
-	  return NIS_UNAVAIL;
-	}
+      if (dir == NULL) /* No /var/nis/NIS_COLD_START -> no NIS+ installed */
+	return NIS_UNAVAIL;
       server = dir->do_servers.do_servers_val;
       server_len = dir->do_servers.do_servers_len;
     }
diff --git a/nis/nis_checkpoint.c b/nis/nis_checkpoint.c
new file mode 100644
index 0000000000..56e98b2ac5
--- /dev/null
+++ b/nis/nis_checkpoint.c
@@ -0,0 +1,71 @@
+/* Copyright (c) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+
+   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 <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+#include "nis_intern.h"
+
+nis_result *
+nis_checkpoint(const_nis_name dirname)
+{
+  nis_result *res;
+
+  res = calloc (1, sizeof (nis_result));
+
+  if (dirname != NULL)
+    {
+      cp_result *cpres = NULL;
+      nis_result *res2;
+      u_int i;
+
+      res2 = nis_lookup (dirname, EXPAND_NAME);
+      if (res2->status != NIS_SUCCESS && res2->status != NIS_S_SUCCESS)
+        return res2;
+
+      /* Check if obj is really a diryectory object */
+      if (res2->objects.objects_val[0].zo_data.zo_type != DIRECTORY_OBJ)
+	{
+	  nis_freeresult (res);
+	  res->status = NIS_INVALIDOBJ;
+	  return res;
+	}
+
+      for (i = 0;
+	   i < res2->objects.objects_val[0].DI_data.do_servers.do_servers_len;
+	   ++i)
+	{
+	  if (__do_niscall (&res2->objects.objects_val[0].DI_data.do_servers.do_servers_val[i],
+			    1, NIS_CHECKPOINT, (xdrproc_t) xdr_nis_name,
+			    (caddr_t) &dirname, (xdrproc_t) xdr_cp_result,
+			    (caddr_t) &cpres, 0) != RPC_SUCCESS)
+	    res->status = NIS_RPCERROR;
+	  else
+	    {
+	      res->status += cpres->cp_status;
+	      res->zticks += cpres->cp_zticks;
+	      res->dticks += cpres->cp_dticks;
+	    }
+	}
+      nis_freeresult (res2);
+    }
+  else
+    res->status = NIS_NOSUCHNAME;
+
+  return res;
+}
diff --git a/nis/nis_creategroup.c b/nis/nis_creategroup.c
new file mode 100644
index 0000000000..c62b039b5e
--- /dev/null
+++ b/nis/nis_creategroup.c
@@ -0,0 +1,66 @@
+/* Copyright (c) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+
+   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 <string.h>
+#include <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+
+nis_error
+nis_creategroup (const_nis_name group, u_long flags)
+{
+  if (group != NULL && strlen (group) > 0)
+    {
+      char buf[strlen (group) + 50];
+      char leafbuf[strlen (group) + 2];
+      char domainbuf[strlen (group) + 2];
+      nis_error status;
+      nis_result *res;
+      char *cp, *cp2;
+      nis_object *obj;
+
+      cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1));
+      cp = stpcpy (cp, ".groups_dir");
+      cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
+      if (cp2 != NULL && strlen (cp2) > 0)
+        {
+          cp = stpcpy (cp, ".");
+          strcpy (cp, cp2);
+        }
+      else
+	return NIS_BADNAME;
+
+      obj = calloc (1, sizeof (nis_object));
+      obj->zo_owner = strdup (__nis_default_owner (NULL));
+      obj->zo_group = strdup (__nis_default_group (NULL));
+      obj->zo_access = __nis_default_access (NULL, 0);
+      obj->zo_ttl = __nis_default_ttl (0);
+      obj->zo_data.zo_type = GROUP_OBJ;
+      obj->zo_data.objdata_u.gr_data.gr_flags = flags;
+      obj->zo_data.objdata_u.gr_data.gr_members.gr_members_len = 0;
+      obj->zo_data.objdata_u.gr_data.gr_members.gr_members_val = NULL;
+
+      res = nis_add (buf, obj);
+      status = res->status;
+      nis_freeresult (res);
+      nis_free_object (obj);
+
+      return status;
+    }
+  return NIS_FAIL;
+}
diff --git a/nis/nis_defaults.c b/nis/nis_defaults.c
new file mode 100644
index 0000000000..9d152d1f11
--- /dev/null
+++ b/nis/nis_defaults.c
@@ -0,0 +1,466 @@
+/* Copyright (c) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+
+   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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <rpc/rpc.h>
+#include <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+
+#define DEFAULT_TTL 43200
+
+/*
+** Some functions for parsing the -D param and NIS_DEFAULTS Environ
+*/
+static nis_name
+searchgroup (char *str)
+{
+  static char default_group[NIS_MAXNAMELEN];
+ char *cptr;
+  int i;
+
+  cptr = strstr (str, "group=");
+  if (cptr == NULL)
+    return NULL;
+
+  cptr += 6;			/* points to the begin of the group string */
+  i = 0;
+  while (cptr[i] != '\0' && cptr[i] != ':')
+    i++;
+  if (i == 0)			/* only "group=" ? */
+    return (nis_name)"";
+
+  strncpy (default_group, cptr, i);
+
+  return default_group;
+}
+
+static nis_name
+searchowner (char *str)
+{
+  static char default_owner[NIS_MAXNAMELEN];
+  char *cptr;
+  int i;
+
+  cptr = strstr (str, "owner=");
+  if (cptr == NULL)
+    return NULL;
+
+  cptr += 6;			/* points to the begin of the owner string */
+  i = 0;
+  while (cptr[i] != '\0' && cptr[i] != ':')
+    i++;
+  if (i == 0)			/* only "owner=" ? */
+    return (nis_name)"";
+
+  strncpy (default_owner, cptr, i);
+
+  return default_owner;
+}
+
+static u_long
+searchttl (char *str)
+{
+  char buf[1024];
+  char *cptr, *dptr;
+  u_long time;
+  int i;
+
+  dptr = strstr (str, "ttl=");
+  if (dptr == NULL)		/* should (could) not happen */
+    return DEFAULT_TTL;;
+
+  dptr += 4;			/* points to the begin of the new ttl */
+  i = 0;
+  while (dptr[i] != '\0' && dptr[i] != ':')
+    i++;
+  if (i == 0)			/* only "ttl=" ? */
+    return DEFAULT_TTL;
+
+  strncpy (buf, dptr, i);
+  time = 0;
+
+  dptr = buf;
+  cptr = strchr (dptr, 'd');
+  if (cptr != NULL)
+    {
+      *cptr = '\0';
+      cptr++;
+      time += atoi (dptr) * 60 * 60 * 24;
+      dptr = cptr;
+    }
+
+  cptr = strchr (dptr, 'h');
+  if (cptr != NULL)
+    {
+      *cptr = '\0';
+      cptr++;
+      time += atoi (dptr) * 60 * 60;
+      dptr = cptr;
+    }
+
+  cptr = strchr (dptr, 'm');
+  if (cptr != NULL)
+    {
+      *cptr = '\0';
+      cptr++;
+      time += atoi (dptr) * 60;
+      dptr = cptr;
+    }
+
+  cptr = strchr (dptr, 's');
+  if (cptr != NULL)
+    *cptr = '\0';
+
+  time += atoi (dptr);
+
+  return time;
+}
+
+static u_long
+searchaccess (char *str, u_long access)
+{
+  static char buf[NIS_MAXNAMELEN];
+  char *cptr;
+  u_long result;
+  int i;
+  int n, o, g, w;
+
+  cptr = strstr (str, "access=");
+  if (cptr == NULL)
+    return 0;
+
+  cptr += 7;			/* points to the begin of the access string */
+  i = 0;
+  while (cptr[i] != '\0' && cptr[i] != ':')
+    i++;
+  if (i == 0)			/* only "access=" ? */
+    return 0;
+
+  strncpy (buf, cptr, i);
+
+  result = n = o = g = w = 0;
+  cptr = buf;
+  while (*cptr != '\0')
+    {
+      switch (*cptr)
+	{
+	case 'n':
+	  n = 1;
+	  break;
+	case 'o':
+	  o = 1;
+	  break;
+	case 'g':
+	  g = 1;
+	  break;
+	case 'w':
+	  w = 1;
+	  break;
+	case 'a':
+	  o = g = w = 1;
+	  break;
+	case '-':
+	  cptr++;		/* Remove "=" from beginning */
+	  while (*cptr != '\0' && *cptr != ',')
+	    {
+	      switch (*cptr)
+		{
+		case 'r':
+		  if (n)
+		    result = result & ~(NIS_READ_ACC << 24);
+		  if (o)
+		    result = result & ~(NIS_READ_ACC << 16);
+		  if (g)
+		    result = result & ~(NIS_READ_ACC << 8);
+		  if (w)
+		    result = result & ~(NIS_READ_ACC);
+		  break;
+		case 'm':
+		  if (n)
+		    result = result & ~(NIS_MODIFY_ACC << 24);
+		  if (o)
+		    result = result & ~(NIS_MODIFY_ACC << 16);
+		  if (g)
+		    result = result & ~(NIS_MODIFY_ACC << 8);
+		  if (w)
+		    result = result & ~(NIS_MODIFY_ACC);
+		  break;
+		case 'c':
+		  if (n)
+		    result = result & ~(NIS_CREATE_ACC << 24);
+		  if (o)
+		    result = result & ~(NIS_CREATE_ACC << 16);
+		  if (g)
+		    result = result & ~(NIS_CREATE_ACC << 8);
+		  if (w)
+		    result = result & ~(NIS_CREATE_ACC);
+		  break;
+		case 'd':
+		  if (n)
+		    result = result & ~(NIS_DESTROY_ACC << 24);
+		  if (o)
+		    result = result & ~(NIS_DESTROY_ACC << 16);
+		  if (g)
+		    result = result & ~(NIS_DESTROY_ACC << 8);
+		  if (w)
+		    result = result & ~(NIS_DESTROY_ACC);
+		  break;
+		default:
+		  fprintf (stderr, "Parse error in \"%s\"\n", buf);
+		  return 0;
+		}
+	      cptr++;
+	    }
+	  break;
+	case '+':
+	  cptr++;		/* Remove "=" from beginning */
+	  while (*cptr != '\0' && *cptr != ',')
+	    {
+	      switch (*cptr)
+		{
+		case 'r':
+		  if (n)
+		    result = result | (NIS_READ_ACC << 24);
+		  if (o)
+		    result = result | (NIS_READ_ACC << 16);
+		  if (g)
+		    result = result | (NIS_READ_ACC << 8);
+		  if (w)
+		    result = result | (NIS_READ_ACC);
+		  break;
+		case 'm':
+		  if (n)
+		    result = result | (NIS_MODIFY_ACC << 24);
+		  if (o)
+		    result = result | (NIS_MODIFY_ACC << 16);
+		  if (g)
+		    result = result | (NIS_MODIFY_ACC << 8);
+		  if (w)
+		    result = result | (NIS_MODIFY_ACC);
+		  break;
+		case 'c':
+		  if (n)
+		    result = result | (NIS_CREATE_ACC << 24);
+		  if (o)
+		    result = result | (NIS_CREATE_ACC << 16);
+		  if (g)
+		    result = result | (NIS_CREATE_ACC << 8);
+		  if (w)
+		    result = result | (NIS_CREATE_ACC);
+		  break;
+		case 'd':
+		  if (n)
+		    result = result | (NIS_DESTROY_ACC << 24);
+		  if (o)
+		    result = result | (NIS_DESTROY_ACC << 16);
+		  if (g)
+		    result = result | (NIS_DESTROY_ACC << 8);
+		  if (w)
+		    result = result | (NIS_DESTROY_ACC);
+		  break;
+		default:
+		  fprintf (stderr, "Parse error in \"%s\"\n", buf);
+		  return 0;
+		}
+	      cptr++;
+	    }
+	  break;
+	case '=':
+	  cptr++;		/* Remove "=" from beginning */
+	  /* Clear */
+	  if (n)
+	    result = result & ~((NIS_READ_ACC + NIS_MODIFY_ACC +
+				 NIS_CREATE_ACC + NIS_DESTROY_ACC) << 24);
+
+	  if (o)
+	    result = result & ~((NIS_READ_ACC + NIS_MODIFY_ACC +
+				 NIS_CREATE_ACC + NIS_DESTROY_ACC) << 16);
+	  if (g)
+	    result = result & ~((NIS_READ_ACC + NIS_MODIFY_ACC +
+				 NIS_CREATE_ACC + NIS_DESTROY_ACC) << 8);
+	  if (w)
+	    result = result & ~(NIS_READ_ACC + NIS_MODIFY_ACC +
+				NIS_CREATE_ACC + NIS_DESTROY_ACC);
+	  while (*cptr != '\0' && *cptr != ',')
+	    {
+	      switch (*cptr)
+		{
+		case 'r':
+		  if (n)
+		    result = result | (NIS_READ_ACC << 24);
+		  if (o)
+		    result = result | (NIS_READ_ACC << 16);
+		  if (g)
+		    result = result | (NIS_READ_ACC << 8);
+		  if (w)
+		    result = result | (NIS_READ_ACC);
+		  break;
+		case 'm':
+		  if (n)
+		    result = result | (NIS_MODIFY_ACC << 24);
+		  if (o)
+		    result = result | (NIS_MODIFY_ACC << 16);
+		  if (g)
+		    result = result | (NIS_MODIFY_ACC << 8);
+		  if (w)
+		    result = result | (NIS_MODIFY_ACC);
+		  break;
+		case 'c':
+		  if (n)
+		    result = result | (NIS_CREATE_ACC << 24);
+		  if (o)
+		    result = result | (NIS_CREATE_ACC << 16);
+		  if (g)
+		    result = result | (NIS_CREATE_ACC << 8);
+		  if (w)
+		    result = result | (NIS_CREATE_ACC);
+		  break;
+		case 'd':
+		  if (n)
+		    result = result | (NIS_DESTROY_ACC << 24);
+		  if (o)
+		    result = result | (NIS_DESTROY_ACC << 16);
+		  if (g)
+		    result = result | (NIS_DESTROY_ACC << 8);
+		  if (w)
+		    result = result | (NIS_DESTROY_ACC);
+		  break;
+		default:
+		  fprintf (stderr, "Parse error in \"%s\"\n", buf);
+		  return 0;
+		}
+	      cptr++;
+	    }
+	  break;
+	default:
+	  fprintf (stderr, "Parse error in \"%s\"\n", buf);
+	  return 0;
+	}
+      cptr++;
+    }
+
+  return 0;
+}
+
+nis_name
+__nis_default_owner (char *defaults)
+{
+  static char default_owner[NIS_MAXNAMELEN];
+  char *cptr, *dptr;
+
+  strcpy (default_owner, nis_local_principal ());
+
+  if (defaults != NULL)
+    {
+      dptr = strstr (defaults, "owner=");
+      if (dptr != NULL)
+	strcpy (default_owner, searchowner (defaults));
+    }
+  else
+    {
+      cptr = getenv ("NIS_DEFAULTS");
+      if (cptr != NULL)
+	{
+	  dptr = strstr (cptr, "owner=");
+	  if (dptr != NULL)
+	    strcpy (default_owner, searchowner (cptr));
+	}
+    }
+
+  return default_owner;
+}
+
+nis_name
+__nis_default_group (char *defaults)
+{
+  static char default_group[NIS_MAXNAMELEN];
+  char *cptr, *dptr;
+
+  strcpy (default_group, nis_local_group ());
+
+  if (defaults != NULL)
+    {
+      dptr = strstr (defaults, "group=");
+      if (dptr != NULL)
+	strcpy (default_group, searchgroup (defaults));
+    }
+  else
+    {
+      cptr = getenv ("NIS_DEFAULTS");
+      if (cptr != NULL)
+	{
+	  dptr = strstr (cptr, "group=");
+	  if (dptr != NULL)
+	    strcpy (default_group, searchgroup (cptr));
+	}
+    }
+
+  return default_group;
+}
+
+u_long
+__nis_default_ttl (char *defaults)
+{
+  char *cptr, *dptr;
+
+  if (defaults != NULL)
+    {
+      dptr = strstr (defaults, "ttl=");
+      if (dptr != NULL)
+	return searchttl (defaults);
+    }
+
+  cptr = getenv ("NIS_DEFAULTS");
+  if (cptr == NULL)
+    return DEFAULT_TTL;
+
+  dptr = strstr (cptr, "ttl=");
+  if (dptr == NULL)
+    return DEFAULT_TTL;
+
+  return searchttl (cptr);
+}
+
+/* Default access rights are ----rmcdr---r---, but we could change
+   this with the NIS_DEFAULTS variable. */
+u_long
+__nis_default_access (char *param, u_long defaults)
+{
+  u_long result;
+  char *cptr;
+
+  if (defaults == 0)
+    result = 0 | OWNER_DEFAULT | GROUP_DEFAULT | WORLD_DEFAULT;
+  else
+    result = defaults;
+
+  if (param != NULL && strstr (param, "access=") != NULL)
+    result = searchaccess (param, result);
+  else
+    {
+      cptr = getenv ("NIS_DEFAULTS");
+      if (cptr != NULL && strstr (cptr, "access=") != NULL)
+	result = searchaccess (getenv ("NIS_DEFAULTS"), result);
+    }
+
+  return result;
+}
diff --git a/nis/nis_destroygroup.c b/nis/nis_destroygroup.c
new file mode 100644
index 0000000000..524e0776ac
--- /dev/null
+++ b/nis/nis_destroygroup.c
@@ -0,0 +1,52 @@
+/* Copyright (c) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+
+   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 <string.h>
+#include <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+
+nis_error
+nis_destroygroup (const_nis_name group)
+{
+  if (group != NULL && strlen (group) > 0)
+    {
+      char buf[strlen (group) + 50];
+      char leafbuf[strlen (group) + 3];
+      char domainbuf[strlen (group) + 3];
+      nis_error status;
+      nis_result *res;
+      char *cp, *cp2;
+
+      cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1));
+      cp = stpcpy (cp, ".groups_dir");
+      cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
+      if (cp2 != NULL && strlen (cp2) > 0)
+	{
+	  cp = stpcpy (cp, ".");
+	  strcpy (cp, cp2);
+	}
+      res = nis_remove (buf, NULL);
+      status = res->status;
+      nis_freeresult (res);
+      return status;
+    }
+  else
+    return NIS_FAIL;
+
+}
diff --git a/nis/nis_domain_of.c b/nis/nis_domain_of.c
new file mode 100644
index 0000000000..f0cfe316e6
--- /dev/null
+++ b/nis/nis_domain_of.c
@@ -0,0 +1,29 @@
+/* Copyright (c) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+
+   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 <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+
+nis_name
+nis_domain_of (const_nis_name name)
+{
+  static char result[NIS_MAXNAMELEN + 1];
+
+  return nis_domain_of_r (name, result, NIS_MAXNAMELEN);
+}
diff --git a/nis/nis_domain_of_r.c b/nis/nis_domain_of_r.c
new file mode 100644
index 0000000000..3435233aef
--- /dev/null
+++ b/nis/nis_domain_of_r.c
@@ -0,0 +1,58 @@
+/* Copyright (c) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+
+   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 <errno.h>
+#include <string.h>
+#include <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+
+nis_name
+nis_domain_of_r (const_nis_name name, char *buffer, size_t buflen)
+{
+  char *cptr;
+  size_t cptr_len;
+
+  if (buffer == NULL)
+    {
+      errno = ERANGE;
+      return NULL;
+    }
+
+  buffer[0] = '\0';
+
+  cptr = strchr (name, '.');
+
+  if (cptr == NULL)
+    return buffer;
+
+  ++cptr;
+  cptr_len = strlen (cptr);
+
+  if (cptr_len == 0)
+    strcpy (buffer, ".");
+  else if (cptr_len >= buflen)
+    {
+      errno = ERANGE;
+      return NULL;
+    }
+  else
+    memcpy (buffer, cptr, cptr_len + 1);
+
+  return buffer;
+}
diff --git a/nis/nis_getservlist.c b/nis/nis_getservlist.c
new file mode 100644
index 0000000000..0c9fbfb60d
--- /dev/null
+++ b/nis/nis_getservlist.c
@@ -0,0 +1,115 @@
+/* Copyright (c) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+
+   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 <string.h>
+#include <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+#include "nis_intern.h"
+
+nis_server **
+nis_getservlist (const_nis_name dir)
+{
+  nis_result *res;
+  nis_server **serv;
+
+  res = nis_lookup (dir, FOLLOW_LINKS);
+
+  if (res->status == NIS_SUCCESS || res->status == NIS_S_SUCCESS)
+    {
+      unsigned long i;
+      nis_server *server;
+
+      serv = malloc (sizeof (nis_server *) *
+		     (res->objects.objects_val->DI_data.do_servers.do_servers_len + 1));
+      if (serv == NULL)
+	return NULL;
+      for (i = 0; i < res->objects.objects_val->DI_data.do_servers.do_servers_len; ++i)
+	{
+	  server =
+	    &res->objects.objects_val->DI_data.do_servers.do_servers_val[i];
+	  if (server->name != NULL)
+            serv[i]->name = strdup (server->name);
+          else
+            serv[i]->name = NULL;
+
+          serv[i]->ep.ep_len = server->ep.ep_len;
+          if (serv[i]->ep.ep_len > 0)
+            {
+              unsigned long j;
+
+              serv[i]->ep.ep_val =
+		malloc (server->ep.ep_len * sizeof (endpoint));
+              for (j = 0; j < serv[i]->ep.ep_len; ++j)
+                {
+                  if (server->ep.ep_val[j].uaddr)
+                    serv[i]->ep.ep_val[j].uaddr =
+		      strdup (server->ep.ep_val[j].uaddr);
+                  else
+                    serv[i]->ep.ep_val[j].uaddr = NULL;
+                  if (server->ep.ep_val[j].family)
+		    serv[i]->ep.ep_val[j].family =
+		      strdup (server->ep.ep_val[j].family);
+                  else
+                    serv[i]->ep.ep_val[j].family = NULL;
+                  if (server->ep.ep_val[j].proto)
+		    serv[i]->ep.ep_val[j].proto =
+		      strdup (server->ep.ep_val[j].proto);
+                  else
+		    serv[i]->ep.ep_val[j].proto = NULL;
+                }
+            }
+          else
+	    serv[i]->ep.ep_val = NULL;
+          serv[i]->key_type = server->key_type;
+          serv[i]->pkey.n_len = server->pkey.n_len;
+          if (server->pkey.n_len > 0)
+            {
+              serv[i]->pkey.n_bytes =
+                malloc (server->pkey.n_len);
+              if (serv[i]->pkey.n_bytes == NULL)
+                return NULL;
+              memcpy (serv[i]->pkey.n_bytes, server->pkey.n_bytes,
+                      server->pkey.n_len);
+            }
+          else
+            serv[i]->pkey.n_bytes = NULL;
+        }
+    }
+  else
+    {
+      serv = malloc (sizeof (nis_server *));
+      if (serv != NULL)
+	serv[0] = NULL;
+    }
+  return serv;
+}
+
+void
+nis_freeservlist (nis_server **serv)
+{
+  int i;
+
+  if (serv == NULL)
+    return;
+
+  i = 0;
+  while (serv[i] != NULL)
+    nis_free_servers (serv[i], 1);
+  free (serv);
+}
diff --git a/nis/nis_intern.c b/nis/nis_intern.c
index 91522a6312..7bfa263070 100644
--- a/nis/nis_intern.c
+++ b/nis/nis_intern.c
@@ -143,27 +143,3 @@ __nis_expandname (const char *name)
 
   return getnames;
 }
-
-fd_result *
-__nis_finddirectoy (const_nis_name name)
-{
-  fd_args args;
-  nis_error status;
-  fd_result *res;
-
-  args.dir_name = (char *) name;
-  args.requester = nis_local_principal ();
-
-  res = calloc (1, sizeof (fd_result));
-  if (res == NULL)
-    return NULL;
-
-  if ((status = __do_niscall (NULL, 0, NIS_FINDDIRECTORY,
-			      (xdrproc_t) xdr_fd_args,
-			      (caddr_t) &args,
-			      (xdrproc_t) xdr_fd_result,
-			      (caddr_t) res, 0)) != RPC_SUCCESS)
-    res->status = status;
-
-  return res;
-}
diff --git a/nis/nis_ismember.c b/nis/nis_ismember.c
new file mode 100644
index 0000000000..f0d087ca51
--- /dev/null
+++ b/nis/nis_ismember.c
@@ -0,0 +1,142 @@
+/* Copyright (c) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+
+   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 <string.h>
+#include <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+
+/* internal_nis_ismember ()
+   return codes: -1 principal is in -group
+                  0 principal isn't in any group
+		  1 pirncipal is in group */
+static int
+internal_ismember (const_nis_name principal, const_nis_name group)
+{
+  if (group != NULL && strlen (group) > 0)
+    {
+      char buf[strlen (group) + 50];
+      char leafbuf[strlen (group) + 2];
+      char domainbuf[strlen (group) + 2];
+      nis_result *res;
+      char *cp, *cp2;
+      u_int i;
+
+      cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1));
+      cp = stpcpy (cp, ".groups_dir");
+      cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
+      if (cp2 != NULL && strlen (cp2) > 0)
+        {
+          cp = stpcpy (cp, ".");
+          strcpy (cp, cp2);
+	}
+      res = nis_lookup (buf, EXPAND_NAME|FOLLOW_LINKS);
+      if (res->status != NIS_SUCCESS && res->status != NIS_S_SUCCESS)
+        return 0;
+
+      if ((res->objects.objects_len != 1) ||
+          (res->objects.objects_val[0].zo_data.zo_type != GROUP_OBJ))
+        return 0;
+
+      /* We search twice in the list, at first, if we have the name
+	 with a "-", then if without. "-member" has priority */
+      for (i = 0;
+           i < res->objects.objects_val[0].GR_data.gr_members.gr_members_len;
+           ++i)
+	{
+	  cp =res->objects.objects_val[0].GR_data.gr_members.gr_members_val[i];
+	  if (cp[0] == '-')
+	    {
+	      if (strcmp (&cp[1], principal) == 0)
+		return -1;
+	      if (cp[1] == '@')
+		switch (internal_ismember (principal, &cp[2]))
+		  {
+		  case -1:
+		    return -1;
+		  case 1:
+		    return -1;
+		  default:
+		    break;
+		  }
+	      else
+		if (cp[1] == '*')
+		  {
+		    char buf1[strlen (principal) + 2];
+		    char buf2[strlen (cp) + 2];
+
+		    strcpy (buf1, nis_domain_of (principal));
+		    strcpy (buf2, nis_domain_of (cp));
+		    if (strcmp (buf1, buf2) == 0)
+		      return -1;
+		  }
+	    }
+	}
+      for (i = 0;
+	   i < res->objects.objects_val[0].GR_data.gr_members.gr_members_len;
+           ++i)
+	{
+	  cp =res->objects.objects_val[0].GR_data.gr_members.gr_members_val[i];
+	  if (cp[0] != '-')
+	    {
+	      if (strcmp (cp, principal) == 0)
+		return 1;
+	      if (cp[0] == '@')
+		switch (internal_ismember (principal, &cp[1]))
+		  {
+		  case -1:
+		    return -1;
+		  case 1:
+		    return 1;
+		  default:
+		    break;
+		  }
+	      else
+		if (cp[0] == '*')
+		  {
+		    char buf1[strlen (principal) + 2];
+		    char buf2[strlen (cp) + 2];
+
+		    strcpy (buf1, nis_domain_of (principal));
+		    strcpy (buf2, nis_domain_of (cp));
+		    if (strcmp (buf1, buf2) == 0)
+		      return 1;
+		  }
+	    }
+	}
+    }
+
+  return 0;
+}
+
+bool_t
+nis_ismember (const_nis_name principal, const_nis_name group)
+{
+  if (group != NULL && strlen (group) > 0)
+    {
+      int status;
+
+      status = internal_ismember (principal, group);
+      if (status == 1)
+	return TRUE;
+      else
+	return FALSE;
+    }
+  else
+    return FALSE;
+}
diff --git a/nis/nis_lookup.c b/nis/nis_lookup.c
new file mode 100644
index 0000000000..9173437bfa
--- /dev/null
+++ b/nis/nis_lookup.c
@@ -0,0 +1,157 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@uni-paderborn.de>, 1997.
+
+   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 <string.h>
+#include <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+
+#include "nis_intern.h"
+
+nis_result *
+nis_lookup (const_nis_name name, const u_long flags)
+{
+  nis_result *res;
+  struct ns_request req;
+  nis_name *names;
+  nis_error status;
+  int is_link = 1;	 /* We should go at least once in the while loop */
+  int count_links = 0;	 /* We will follow only 16 links in the deep */
+  int i;
+
+  res = calloc (1, sizeof (nis_result));
+
+  if (flags & EXPAND_NAME)
+    {
+      names = __nis_expandname (name);
+      if (names == NULL)
+	{
+	  res->status = NIS_NAMEUNREACHABLE;
+	  return res;
+	}
+
+      i = 0;
+      while (names[i] != NULL && (i == 0 || res->status > 1))
+	{
+	  req.ns_name = names[i];
+
+	  while (is_link)
+	    {
+	      req.ns_object.ns_object_len = 0;
+	      req.ns_object.ns_object_val = NULL;
+	      memset (res, '\0', sizeof (nis_result));
+
+	      if ((status = __do_niscall (NULL, 0, NIS_LOOKUP,
+					  (xdrproc_t) xdr_ns_request,
+					  (caddr_t) & req,
+					  (xdrproc_t) xdr_nis_result,
+				      (caddr_t) res, flags)) != RPC_SUCCESS)
+		{
+		  res->status = status;
+		  nis_freenames (names);
+		  return res;
+		}
+
+	      if ((res->status == NIS_SUCCESS || res->status == NIS_S_SUCCESS)
+		  && (res->objects.objects_len > 0 &&
+		      res->objects.objects_val->zo_data.zo_type == LINK_OBJ))
+		is_link = 1;
+	      else
+		is_link = 0;
+
+	      if (is_link)
+		{
+		  if ((flags & FOLLOW_LINKS) == FOLLOW_LINKS)
+		    {
+		      if (count_links == 16)
+			{
+			  res->status = NIS_LINKNAMEERROR;
+			  return res;
+			}
+		      else
+			++count_links;
+
+		      req.ns_name = res->objects.objects_val->LI_data.li_name;
+		    }
+		  else
+		    {
+		      res->status = NIS_NOTSEARCHABLE;
+		      return res;
+		    }
+		}
+	    }
+
+	  ++i;
+	  if (res->status == NIS_NOT_ME)
+	    res->status = NIS_NOSUCHNAME;
+	}
+
+      nis_freenames (names);
+    }
+  else
+    {
+      req.ns_name = (char *)name;
+
+      while (is_link)
+	{
+	  req.ns_object.ns_object_len = 0;
+	  req.ns_object.ns_object_val = NULL;
+	  memset (res, '\0', sizeof (nis_result));
+
+	  if ((status = __do_niscall (NULL, 0, NIS_LOOKUP,
+				      (xdrproc_t) xdr_ns_request,
+				      (caddr_t) &req,
+				      (xdrproc_t) xdr_nis_result,
+				      (caddr_t) res, flags)) != RPC_SUCCESS)
+	    {
+	      res->status = status;
+	      return res;
+	    }
+
+	  if ((res->status == NIS_SUCCESS || res->status == NIS_S_SUCCESS) &&
+	      (res->objects.objects_len > 0 &&
+	       res->objects.objects_val->zo_data.zo_type == LINK_OBJ))
+	    is_link = 1;
+	  else
+	    is_link = 0;
+
+	  if (is_link)
+	    {
+	      if ((flags & FOLLOW_LINKS) == FOLLOW_LINKS)
+		{
+		  if (count_links == 16)
+		    {
+		      res->status = NIS_LINKNAMEERROR;
+		      return res;
+		    }
+		  else
+		    ++count_links;
+
+		  req.ns_name = res->objects.objects_val->LI_data.li_name;
+		}
+	      else
+		{
+		  res->status = NIS_NOTSEARCHABLE;
+		  return res;
+		}
+	    }
+	}
+    }
+
+  return res;
+}
diff --git a/nis/nis_mkdir.c b/nis/nis_mkdir.c
new file mode 100644
index 0000000000..a781c041ba
--- /dev/null
+++ b/nis/nis_mkdir.c
@@ -0,0 +1,46 @@
+/* Copyright (c) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+
+   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 <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+#include "nis_intern.h"
+
+nis_error
+nis_mkdir (const_nis_name dir, const nis_server *server)
+{
+  nis_error res;
+
+  if (server == NULL)
+    {
+      if (__do_niscall (NULL, 0, NIS_MKDIR, (xdrproc_t) xdr_nis_name,
+			(caddr_t) &dir, (xdrproc_t) xdr_nis_error,
+			(caddr_t) &res, 0) != RPC_SUCCESS)
+	return NIS_RPCERROR;
+    }
+  else
+    {
+      if (__do_niscall (server, 1, NIS_MKDIR,
+			(xdrproc_t) xdr_nis_name,
+			(caddr_t) &dir, (xdrproc_t) xdr_nis_error,
+			(caddr_t) &res, 0) != RPC_SUCCESS)
+	return NIS_RPCERROR;
+    }
+
+  return res;
+}
diff --git a/nis/nis_modify.c b/nis/nis_modify.c
new file mode 100644
index 0000000000..9c371c03bc
--- /dev/null
+++ b/nis/nis_modify.c
@@ -0,0 +1,47 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@uni-paderborn.de>, 1997.
+
+   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 <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+
+#include "nis_intern.h"
+
+nis_result *
+nis_modify (const_nis_name name, const nis_object *obj)
+{
+  nis_result *res;
+  nis_error status;
+  struct ns_request req;
+
+  res = calloc (1, sizeof (nis_result));
+
+  req.ns_name = (char *)name;
+
+  req.ns_object.ns_object_len = 1;
+  req.ns_object.ns_object_val = nis_clone_object (obj, NULL);
+
+  if ((status = __do_niscall (NULL, 0, NIS_MODIFY, (xdrproc_t) xdr_ns_request,
+			      (caddr_t) & req, (xdrproc_t) xdr_nis_result,
+			      (caddr_t) res, MASTER_ONLY)) != RPC_SUCCESS)
+    res->status = status;
+
+  nis_destroy_object (req.ns_object.ns_object_val);
+
+  return res;
+}
diff --git a/nis/nis_ping.c b/nis/nis_ping.c
new file mode 100644
index 0000000000..0aa56ed37e
--- /dev/null
+++ b/nis/nis_ping.c
@@ -0,0 +1,63 @@
+/* Copyright (c) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+
+   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 <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+#include "nis_intern.h"
+
+void
+nis_ping (const_nis_name dirname, u_long utime, const nis_object *dirobj)
+{
+  nis_result *res = NULL;
+  nis_object *obj;
+  ping_args args;
+  u_int i;
+
+  if (dirname == NULL && dirobj == NULL)
+    abort ();
+
+  if (dirobj == NULL)
+    {
+      res = nis_lookup (dirname, EXPAND_NAME + FOLLOW_LINKS);
+      if (res->status != NIS_SUCCESS && res->status != NIS_S_SUCCESS)
+	return;
+      obj = res->objects.objects_val;
+    }
+  else
+    obj = (nis_object *)dirobj;
+
+  /* Check if obj is really a diryectory object */
+  if (obj->zo_data.zo_type != DIRECTORY_OBJ)
+    abort ();
+
+  if (dirname == NULL)
+    args.dir = obj->DI_data.do_name;
+  else
+    args.dir = (char *)dirname;
+  args.stamp = utime;
+
+  for (i = 0; i < obj->DI_data.do_servers.do_servers_len; ++i)
+    __do_niscall (&obj->DI_data.do_servers.do_servers_val[i], 1,
+		  NIS_PING, (xdrproc_t) xdr_ping_args,
+		  (caddr_t) &args, (xdrproc_t) xdr_void,
+		  (caddr_t) NULL, 0);
+
+  if (res)
+    nis_freeresult (res);
+}
diff --git a/nis/nis_print_group_entry.c b/nis/nis_print_group_entry.c
new file mode 100644
index 0000000000..e7c866cbe2
--- /dev/null
+++ b/nis/nis_print_group_entry.c
@@ -0,0 +1,59 @@
+/* Copyright (c) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+
+   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 <string.h>
+#include <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+
+void
+nis_print_group_entry (const_nis_name group)
+{
+  if (group != NULL && strlen (group) > 0)
+    {
+      char buf[strlen (group) + 50];
+      char leafbuf[strlen (group) + 3];
+      char domainbuf[strlen (group) + 3];
+      nis_result *res;
+      char *cp, *cp2;
+      u_int i;
+
+      cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1));
+      cp = stpcpy (cp, ".groups_dir");
+      cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
+      if (cp2 != NULL && strlen (cp2) > 0)
+	{
+	  cp = stpcpy (cp, ".");
+	  strcpy (cp, cp2);
+	}
+      res = nis_lookup (buf, FOLLOW_LINKS|EXPAND_NAME);
+
+      if (res->status != NIS_SUCCESS && res->status != NIS_S_SUCCESS)
+	return;
+
+      if ((res->objects.objects_len != 1) ||
+          (res->objects.objects_val[0].zo_data.zo_type != GROUP_OBJ))
+	return;
+
+      for (i = 0;
+	   i < res->objects.objects_val[0].GR_data.gr_members.gr_members_len;
+	   ++i)
+	fprintf (stdout, "  %s\n",
+		 res->objects.objects_val[0].GR_data.gr_members.gr_members_val[i]);
+    }
+}
diff --git a/nis/nis_remove.c b/nis/nis_remove.c
new file mode 100644
index 0000000000..0415dca731
--- /dev/null
+++ b/nis/nis_remove.c
@@ -0,0 +1,55 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@uni-paderborn.de>, 1997.
+
+   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 <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+
+#include "nis_intern.h"
+
+nis_result *
+nis_remove (const_nis_name name, const nis_object *obj)
+{
+  nis_result *res;
+  nis_error status;
+  struct ns_request req;
+
+  res = calloc (1, sizeof (nis_result));
+
+  req.ns_name = (char *)name;
+
+  if (obj != NULL)
+    {
+      req.ns_object.ns_object_len = 1;
+      req.ns_object.ns_object_val = nis_clone_object (obj, NULL);
+    }
+  else
+    {
+      req.ns_object.ns_object_len = 0;
+      req.ns_object.ns_object_val = NULL;
+    }
+
+  if ((status = __do_niscall (NULL, 0, NIS_REMOVE, (xdrproc_t) xdr_ns_request,
+			      (caddr_t) & req, (xdrproc_t) xdr_nis_result,
+			      (caddr_t) res, MASTER_ONLY)) != RPC_SUCCESS)
+    res->status = status;
+
+  nis_destroy_object (req.ns_object.ns_object_val);
+
+  return res;
+}
diff --git a/nis/nis_removemember.c b/nis/nis_removemember.c
new file mode 100644
index 0000000000..473438ba5c
--- /dev/null
+++ b/nis/nis_removemember.c
@@ -0,0 +1,80 @@
+/* Copyright (c) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+
+   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 <string.h>
+#include <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+
+nis_error
+nis_removemember (const_nis_name member, const_nis_name group)
+{
+  if (group != NULL && strlen (group) > 0)
+    {
+      char buf[strlen (group) + 50];
+      char leafbuf[strlen (group) + 2];
+      char domainbuf[strlen (group) + 2];
+      nis_name *newmem;
+      nis_result *res, *res2;
+      nis_error status;
+      char *cp, *cp2;
+      u_int i, j;
+
+      cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1));
+      cp = stpcpy (cp, ".groups_dir");
+      cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
+      if (cp2 != NULL && strlen (cp2) > 0)
+        {
+          cp = stpcpy (cp, ".");
+          strcpy (cp, cp2);
+        }
+      res = nis_lookup (buf, FOLLOW_LINKS|EXPAND_NAME);
+      if (res->status != NIS_SUCCESS)
+        {
+          status = res->status;
+          nis_freeresult (res);
+          return status;
+        }
+      if ((res->objects.objects_len != 1) ||
+          (res->objects.objects_val[0].zo_data.zo_type != GROUP_OBJ))
+        return NIS_INVALIDOBJ;
+
+      newmem = malloc (res->objects.objects_val[0].GR_data.gr_members.gr_members_len);
+
+      j = 0;
+      for (i = 0; i < res->objects.objects_val[0].GR_data.gr_members.gr_members_len - 1; ++i)
+	{
+	  if (strcmp (res->objects.objects_val[0].GR_data.gr_members.gr_members_val[j], member) != 0)
+	    {
+	      newmem[j] = res->objects.objects_val[0].GR_data.gr_members.gr_members_val[i];
+	      ++j;
+	    }
+	}
+      --res->objects.objects_val[0].GR_data.gr_members.gr_members_len;
+      free (res->objects.objects_val[0].GR_data.gr_members.gr_members_val);
+      res->objects.objects_val[0].GR_data.gr_members.gr_members_val = newmem;
+      res2 = nis_modify (buf, res->objects.objects_val);
+      status = res2->status;
+      nis_freeresult (res);
+      nis_freeresult (res2);
+
+      return status;
+    }
+  else
+    return NIS_FAIL;
+}
diff --git a/nis/nis_rmdir.c b/nis/nis_rmdir.c
new file mode 100644
index 0000000000..5b6f1d181b
--- /dev/null
+++ b/nis/nis_rmdir.c
@@ -0,0 +1,46 @@
+/* Copyright (c) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+
+   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 <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+#include "nis_intern.h"
+
+nis_error
+nis_rmdir (const_nis_name dir, const nis_server *server)
+{
+  nis_error res;
+
+  if (server == NULL)
+    {
+      if (__do_niscall (NULL, 0, NIS_RMDIR, (xdrproc_t) xdr_nis_name,
+			(caddr_t) &dir, (xdrproc_t) xdr_nis_error,
+			(caddr_t) &res, 0) != RPC_SUCCESS)
+	return NIS_RPCERROR;
+    }
+  else
+    {
+      if (__do_niscall (server, 1, NIS_RMDIR,
+			(xdrproc_t) xdr_nis_name,
+			(caddr_t) &dir, (xdrproc_t) xdr_nis_error,
+			(caddr_t) &res, 0) != RPC_SUCCESS)
+	return NIS_RPCERROR;
+    }
+
+  return res;
+}
diff --git a/nis/nis_server.c b/nis/nis_server.c
index 431fbe7f2a..393f6c6eb4 100644
--- a/nis/nis_server.c
+++ b/nis/nis_server.c
@@ -17,93 +17,104 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA. */
 
+#include <string.h>
 #include <rpcsvc/nis.h>
 #include <rpcsvc/nislib.h>
 #include "nis_intern.h"
 
 nis_error
-nis_mkdir (const_nis_name dir, const nis_server *server)
+nis_servstate (const nis_server *serv, const nis_tag *tags,
+	       const int numtags, nis_tag **result)
 {
-  nis_error res;
+  nis_taglist taglist;
+  nis_taglist tagres;
+
+  tagres.tags.tags_len = 0;
+  tagres.tags.tags_val = NULL;
+  *result = NULL;
+  taglist.tags.tags_len = numtags;
+  taglist.tags.tags_val = (nis_tag *)tags;
 
-  if (server == NULL)
+  if (serv == NULL)
     {
-      int result;
-      if ((result = __do_niscall (NULL, 0, NIS_MKDIR, (xdrproc_t) xdr_nis_name,
-				  (caddr_t) &dir, (xdrproc_t) xdr_nis_error,
-				  (caddr_t) &res, 0)) != RPC_SUCCESS)
-	{
-	  fprintf (stderr, _("__do_niscall: Error #%d\n"), result);
-	  return NIS_RPCERROR;
-	}
+      if (__do_niscall (NULL, 0, NIS_SERVSTATE, (xdrproc_t) xdr_nis_taglist,
+			(caddr_t) &taglist, (xdrproc_t) xdr_nis_taglist,
+			(caddr_t) &tagres, 0) != RPC_SUCCESS)
+	return NIS_RPCERROR;
     }
   else
     {
-      int result;
-      if ((result = __do_niscall (server, 1, NIS_MKDIR,
-				  (xdrproc_t) xdr_nis_name,
-				  (caddr_t) &dir, (xdrproc_t) xdr_nis_error,
-				  (caddr_t) &res, 0)) != RPC_SUCCESS)
+      if (__do_niscall (serv, 1, NIS_SERVSTATE, (xdrproc_t) xdr_nis_taglist,
+			(caddr_t) &taglist, (xdrproc_t) xdr_nis_taglist,
+			(caddr_t) &tagres, 0) != RPC_SUCCESS)
+	return NIS_RPCERROR;
+    }
+  if (tagres.tags.tags_len > 0)
+    {
+      u_long i;
+
+      result = malloc (sizeof (nis_tag *) * tagres.tags.tags_len);
+      if (result == NULL)
+	return NIS_NOMEMORY;
+      for (i = 0; i < tagres.tags.tags_len; ++i)
 	{
-	  fprintf (stderr, _("__do_niscall: Error #%d\n"), result);
-	  return NIS_RPCERROR;
+	  result[i] = malloc (sizeof (nis_tag));
+	  if (result[i] == NULL)
+	    return NIS_NOMEMORY;
+	  result[i]->tag_val = strdup (tagres.tags.tags_val[i].tag_val);
+	  result[i]->tag_type = tagres.tags.tags_val[i].tag_type;
 	}
     }
 
-  return res;
+  return NIS_SUCCESS;
 }
 
 nis_error
-nis_rmdir (const_nis_name dir, const nis_server *server)
+nis_stats (const nis_server *serv, const nis_tag *tags,
+	   const int numtags, nis_tag **result)
 {
-  nis_error res;
+  nis_taglist taglist;
+  nis_taglist tagres;
 
-  if (server == NULL)
+  tagres.tags.tags_len = 0;
+  tagres.tags.tags_val = NULL;
+  *result = NULL;
+  taglist.tags.tags_len = numtags;
+  taglist.tags.tags_val = (nis_tag *)tags;
+
+  if (serv == NULL)
     {
-      int result;
-      if ((result = __do_niscall (NULL, 0, NIS_RMDIR, (xdrproc_t) xdr_nis_name,
-				  (caddr_t) &dir, (xdrproc_t) xdr_nis_error,
-				  (caddr_t) &res, 0)) != RPC_SUCCESS)
-	{
-	  fprintf (stderr, _("__do_niscall: Error #%d\n"), result);
-	  return NIS_RPCERROR;
-	}
+      if (__do_niscall (NULL, 0, NIS_STATUS, (xdrproc_t) xdr_nis_taglist,
+			(caddr_t) &taglist, (xdrproc_t) xdr_nis_taglist,
+			(caddr_t) &tagres, 0) != RPC_SUCCESS)
+	return NIS_RPCERROR;
     }
   else
     {
-      int result;
-      if ((result = __do_niscall (server, 1, NIS_RMDIR,
-				  (xdrproc_t) xdr_nis_name,
-				  (caddr_t) &dir, (xdrproc_t) xdr_nis_error,
-				  (caddr_t) &res, 0)) != RPC_SUCCESS)
+      if (__do_niscall (serv, 1, NIS_STATUS, (xdrproc_t) xdr_nis_taglist,
+			(caddr_t) &taglist, (xdrproc_t) xdr_nis_taglist,
+			(caddr_t) &tagres, 0) != RPC_SUCCESS)
+	return NIS_RPCERROR;
+    }
+  if (tagres.tags.tags_len > 0)
+    {
+      u_long i;
+
+      result = malloc (sizeof (nis_tag *) * tagres.tags.tags_len);
+      if (result == NULL)
+	return NIS_NOMEMORY;
+      for (i = 0; i < tagres.tags.tags_len; ++i)
 	{
-	  fprintf (stderr, _("__do_niscall: Error #%d\n"), result);
-	  return NIS_RPCERROR;
+	  result[i] = malloc (sizeof (nis_tag));
+	  if (result[i] == NULL)
+	    return NIS_NOMEMORY;
+	  result[i]->tag_val = strdup (tagres.tags.tags_val[i].tag_val);
+	  result[i]->tag_type = tagres.tags.tags_val[i].tag_type;
 	}
     }
 
-  return res;
-}
-
-nis_error
-nis_servstate (const nis_server *serv, const nis_tag *tags,
-	       const int numtags, nis_tag **result)
-{
-  *result = NULL;
-  return NIS_FAIL;
-}
-stub_warning (nis_servstate)
-
-nis_error
-nis_stats (const nis_server *serv, const nis_tag *tags,
-	   const int numtags, nis_tag **result)
-{
-  result = malloc (sizeof (nis_tag *));
-  if (result != NULL)
-    result[0] = NULL;
-  return NIS_FAIL;
+  return NIS_SUCCESS;
 }
-stub_warning (nis_stats);
 
 void
 nis_freetags (nis_tag *tags, const int numtags)
@@ -114,30 +125,3 @@ nis_freetags (nis_tag *tags, const int numtags)
     free (tags->tag_val);
   free (tags);
 }
-
-nis_server **
-nis_getservlist (const_nis_name dir)
-{
-  nis_server **serv;
-
-  serv = malloc (sizeof (nis_server *));
-  if (serv != NULL)
-    serv[0] = NULL;
-
-  return serv;
-}
-stub_warning (nis_getservlist);
-
-void
-nis_freeservlist (nis_server **serv)
-{
-  int i;
-
-  if (serv == NULL)
-    return;
-
-  i = 0;
-  while (serv[i] != NULL)
-    nis_free_servers (serv[i], 1);
-  free (serv);
-}
diff --git a/nis/nis_subr.c b/nis/nis_subr.c
index 479e11d175..780c27f7b5 100644
--- a/nis/nis_subr.c
+++ b/nis/nis_subr.c
@@ -46,8 +46,16 @@ nis_leaf_of_r (const_nis_name name, char *buffer, size_t buflen)
       return NULL;
     }
 
-  if (i > 1)
-    strncpy (buffer, name, i - 1);
+  if (i > 0)
+    {
+      if ((size_t)i >= buflen)
+	{
+	  errno = ERANGE;
+	  return NULL;
+	}
+      strncpy (buffer, name, i);
+      buffer[i] = 0;
+    }
 
   return buffer;
 }
@@ -89,38 +97,6 @@ nis_name_of_r (const_nis_name name, char *buffer, size_t buflen)
   return buffer;
 }
 
-nis_name
-nis_domain_of (const_nis_name name)
-{
-  static char result[NIS_MAXNAMELEN + 1];
-
-  return nis_domain_of_r (name, result, NIS_MAXNAMELEN);
-}
-
-nis_name
-nis_domain_of_r (const_nis_name name, char *buffer, size_t buflen)
-{
-  char *cptr;
-  size_t cptr_len;
-
-  cptr = strchr (name, '.');	/* XXX What happens if the NIS name
-				   does not contain a `.'?  */
-  ++cptr;
-  cptr_len = strlen (cptr);
-
-  if (cptr_len == 0)
-    strcpy (buffer, ".");
-  else if (cptr_len >= buflen)
-    {
-      errno = ERANGE;
-      return NULL;
-    }
-  else
-    memcpy (buffer, cptr, cptr_len + 1);
-
-  return buffer;
-}
-
 static int
 count_dots (const_nis_name str)
 {
diff --git a/nis/nis_verifygroup.c b/nis/nis_verifygroup.c
new file mode 100644
index 0000000000..e57f16589a
--- /dev/null
+++ b/nis/nis_verifygroup.c
@@ -0,0 +1,51 @@
+/* Copyright (c) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+
+   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 <string.h>
+#include <rpcsvc/nis.h>
+#include <rpcsvc/nislib.h>
+
+nis_error
+nis_verifygroup (const_nis_name group)
+{
+  if (group != NULL && strlen (group) > 0)
+    {
+      char buf[strlen (group) + 50];
+      char leafbuf[strlen (group) + 2];
+      char domainbuf[strlen (group) + 2];
+      nis_result *res;
+      nis_error status;
+      char *cp, *cp2;
+
+      cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1));
+      cp = stpcpy (cp, ".groups_dir");
+      cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
+      if (cp2 != NULL && strlen (cp2) > 0)
+	{
+	  cp = stpcpy (cp, ".");
+	  strcpy (cp, cp2);
+	}
+      res = nis_lookup (buf, 0);
+      status = res->status;
+      nis_freeresult (res);
+      return status;
+    }
+  else
+    return NIS_FAIL;
+}
diff --git a/nis/rpcsvc/nislib.h b/nis/rpcsvc/nislib.h
index fa3ee4f65d..cbd8fbde51 100644
--- a/nis/rpcsvc/nislib.h
+++ b/nis/rpcsvc/nislib.h
@@ -29,58 +29,58 @@ typedef const char *const_nis_name;
 /* nis_names: These functions are used to locate and manipulate all NIS+
  * objects except the NIS+ entry objects.
  *
- * nis_lookup (name, flags) resolves a NIS+ name and returns a copy of 
+ * nis_lookup (name, flags) resolves a NIS+ name and returns a copy of
  *                          that object  from a NIS+ server.
  *    const nis_name name: name of the object to be resolved
- *    u_long flags: logically ORing zero or more flags (FOLLOW_LINKS, 
- *                  HARD_LOOKUP, [NO_CACHE], MASTER_ONLY, EXPAND_NAME) 
- *   
+ *    u_long flags: logically ORing zero or more flags (FOLLOW_LINKS,
+ *                  HARD_LOOKUP, [NO_CACHE], MASTER_ONLY, EXPAND_NAME)
+ *
  * nis_add (name, obj) adds objects to the NIS+ namespace.
  *    const nis_name name: fully qualified NIS+ name.
- *    const nis_object *obj: object members zo_name and zo_domain will be 
+ *    const nis_object *obj: object members zo_name and zo_domain will be
  *                           constructed from name.
  *
  * nis_remove (name, obj) removes objects from the NIS+ namespace.
  *    const nis_name name: fully qualified NIS+ name.
- *    const nis_object *obj: if not NULL, it is assumed to point to a copy 
- *                           of the object being removed. In this case, if 
+ *    const nis_object *obj: if not NULL, it is assumed to point to a copy
+ *                           of the object being removed. In this case, if
  *                           the object on the server does not have the same
  *                           object identifier as the  object  being  passed,
- *                           the operation will fail with the NIS_NOTSAMEOBJ 
+ *                           the operation will fail with the NIS_NOTSAMEOBJ
  *                           error.
  *
- * nis_modify (name, obj) can change specific attributes of an object 
+ * nis_modify (name, obj) can change specific attributes of an object
  *                        that already exists in the namespace.
  */
 extern nis_result *nis_lookup __P ((const_nis_name name, u_long flags));
 extern nis_result *nis_add __P ((const_nis_name name, const nis_object *obj));
 extern nis_result *nis_remove __P ((const_nis_name name,
 				    const nis_object *obj));
-extern nis_result *nis_modify __P ((const_nis_name name, 
+extern nis_result *nis_modify __P ((const_nis_name name,
 				    const nis_object *obj));
 
 /* nis_tables: These functions are used to search and modify NIS+ tables.
  *
- * nis_list (table_name, flags, callback(table_name, obj, userdata), userdata) 
+ * nis_list (table_name, flags, callback(table_name, obj, userdata), userdata)
  *           search a table in the NIS+ namespace.
  *    const nis_name table_name: indexed name ([xx=yy],table.dir)
  *    u_long flags: logically ORing one or more flags (FOLLOW_LINKS,
  *                  [FOLLOW_PATH], HARD_LOOKUP, [ALL_RESULTS], [NO_CACHE],
  *                  MASTER_ONLY, EXPAND_NAME, RETURN_RESULT)
- *    callback(): callback is an optional pointer to a function that will 
- *                process the ENTRY type objects that are returned from the 
+ *    callback(): callback is an optional pointer to a function that will
+ *                process the ENTRY type objects that are returned from the
  *                search. If this pointer is NULL, then all entries that match
  *                the search criteria are returned in the nis_result structure,
- *                otherwise  this  function  will  be  called once for each 
+ *                otherwise  this  function  will  be  called once for each
  *                entry returned.
- *    void *userdata: passed to callback function along with the returned 
+ *    void *userdata: passed to callback function along with the returned
  *                    entry object.
  *
  * nis_add_entry (table_name, obj, flags) will add the NIS+ object to the
  *                                        NIS+ table_name.
  *    const nis_name table_name
  *    const nis_object *obj
- *    u_long flags: 0, ADD_OVERWRITE, RETURN_RESULT 
+ *    u_long flags: 0, ADD_OVERWRITE, RETURN_RESULT
  *
  * nis_modify_entry (name, obj, flags) modifies an object identified by name.
  *    const nis_name name: object identifier
@@ -95,15 +95,15 @@ extern nis_result *nis_modify __P ((const_nis_name name,
  *    const nis_object *obj: if obj is non-null, it is presumed to point to
  *                           a cached copy of the entry. When the removal is
  *                           attempted, and the object that would be removed
- *                           is not the same as the cached object pointed to 
- *                           by object then the operation will fail with an 
+ *                           is not the same as the cached object pointed to
+ *                           by object then the operation will fail with an
  *                           NIS_NOTSAMEOBJ error
  *    u_long flags: 0, REM_MULTIPLE
  *
  * nis_first_entry (table_name) fetches entries from a table one at a time.
  *    const nis_name table_name
  *
- * nis_next_entry (table_name, cookie) retrieves the "next" entry from a 
+ * nis_next_entry (table_name, cookie) retrieves the "next" entry from a
  *                                     table specified by table_name.
  *    const nis_name table_name:
  *    const netobj *cookie: The value of cookie from the nis_result structure
@@ -117,25 +117,25 @@ extern nis_result *nis_list __P ((const_nis_name name, u_long flags,
 extern nis_result *nis_add_entry __P ((const_nis_name table_name,
 				       const nis_object *obj, u_long flags));
 extern nis_result *nis_modify_entry __P ((const_nis_name name,
-					  const nis_object *obj, 
+					  const nis_object *obj,
 					  u_long flags));
 extern nis_result *nis_remove_entry __P ((const_nis_name table_name,
 					  const nis_object *obj,
 					  u_long flags));
 extern nis_result *nis_first_entry __P ((const_nis_name table_name));
-extern nis_result *nis_next_entry __P ((const_nis_name table_name, 
+extern nis_result *nis_next_entry __P ((const_nis_name table_name,
 					const netobj *cookie));
 /*
 ** nis_server
 */
-extern nis_error nis_mkdir __P ((const_nis_name dirname, 
+extern nis_error nis_mkdir __P ((const_nis_name dirname,
 				 const nis_server *machine));
-extern nis_error nis_rmdir __P ((const_nis_name dirname, 
+extern nis_error nis_rmdir __P ((const_nis_name dirname,
 				 const nis_server *machine));
-extern nis_error nis_servstate __P ((const nis_server *machine, 
-				     const nis_tag *tags, int numtags, 
+extern nis_error nis_servstate __P ((const nis_server *machine,
+				     const nis_tag *tags, int numtags,
 				     nis_tag **result));
-extern nis_error nis_stats __P ((const nis_server *machine, 
+extern nis_error nis_stats __P ((const nis_server *machine,
 				 const nis_tag *tags, int numtags,
 				 nis_tag **result));
 extern void nis_freetags __P ((nis_tag *tags, int numtags));
@@ -146,7 +146,7 @@ extern void nis_freeservlist __P ((nis_server **machines));
 ** nis_subr
 */
 extern nis_name nis_leaf_of __P ((const_nis_name name));
-extern nis_name nis_leaf_of_r __P ((const_nis_name name, char *buffer, 
+extern nis_name nis_leaf_of_r __P ((const_nis_name name, char *buffer,
 				    size_t buflen));
 extern nis_name nis_name_of __P ((const_nis_name name));
 extern nis_name nis_name_of_r __P ((const_nis_name name, char *buffer,
@@ -157,7 +157,7 @@ extern nis_name nis_domain_of_r __P ((const_nis_name name, char *buffer,
 extern nis_name *nis_getnames __P ((const_nis_name name));
 extern void nis_freenames __P ((nis_name *namelist));
 extern name_pos nis_dir_cmp __P ((const_nis_name n1, const_nis_name n2));
-extern nis_object *nis_clone_object __P ((const nis_object *src, 
+extern nis_object *nis_clone_object __P ((const nis_object *src,
 					  nis_object *dest));
 extern void nis_destroy_object __P ((nis_object *obj));
 extern void nis_print_object __P ((const nis_object *obj));
@@ -182,11 +182,11 @@ extern char *nis_sperror_r __P ((const nis_error status, const char *label,
 /*
 ** nis_groups
 */
-extern bool_t nis_ismember __P ((const_nis_name principal, 
+extern bool_t nis_ismember __P ((const_nis_name principal,
 				 const_nis_name group));
-extern nis_error nis_addmember __P ((const_nis_name member, 
+extern nis_error nis_addmember __P ((const_nis_name member,
 				     const_nis_name group));
-extern nis_error nis_removemember __P ((const_nis_name member, 
+extern nis_error nis_removemember __P ((const_nis_name member,
 					const_nis_name group));
 extern nis_error nis_creategroup __P ((const_nis_name group, u_long flags));
 extern nis_error nis_destroygroup __P ((const_nis_name group));
@@ -224,20 +224,18 @@ extern bool_t nis_write_obj __P ((const char *file, const nis_object *obj));
 */
 extern directory_obj *nis_clone_directory __P ((const directory_obj *src,
 						directory_obj *dest));
-extern group_obj *nis_clone_group __P ((const group_obj *src, 
+extern group_obj *nis_clone_group __P ((const group_obj *src,
 					group_obj *dest));
-extern table_obj *nis_clone_table __P ((const table_obj *src, 
+extern table_obj *nis_clone_table __P ((const table_obj *src,
 					table_obj *dest));
-extern entry_obj *nis_clone_entry __P ((const entry_obj *src, 
+extern entry_obj *nis_clone_entry __P ((const entry_obj *src,
 					entry_obj *dest));
 extern link_obj *nis_clone_link __P ((const link_obj *src, link_obj *dest));
 extern objdata *nis_clone_objdata __P ((const objdata *src, objdata *dest));
-extern nis_result *nis_clone_result __P ((const nis_result *src, 
+extern nis_result *nis_clone_result __P ((const nis_result *src,
 					  nis_result *dest));
 
-/*
-** nis_free - nis_freeresult
-*/
+/* nis_free - nis_freeresult */
 extern void nis_freeresult __P ((nis_result *result));
 /* (XXX THE FOLLOWING ARE INTERNAL FUNCTIONS, SHOULD NOT BE USED !!) */
 extern void nis_free_attr __P ((nis_attr *attr));
@@ -251,12 +249,15 @@ extern void nis_free_entry __P ((entry_obj *enobj));
 extern void nis_free_link __P ((link_obj *lnkobj));
 extern void nis_free_object __P ((nis_object *obj));
 
-/* This is the SUN definition, but I don't know for what we need
-   the directory_obj parameter */
-/* extern fd_result *nis_finddirectory __P ((directory_obj *, nis_name)); */
-extern fd_result *__nis_finddirectory __P ((const_nis_name name));
-extern int __start_clock(int);
-extern u_long __stop_clock(int);
+/* (XXX INTERNAL FUNCTIONS, SHOULD NOT BE USED !!) */
+extern nis_name __nis_default_owner __P ((char *));
+extern nis_name __nis_default_group __P ((char *));
+extern u_long __nis_default_ttl __P ((char *));
+extern u_long __nis_default_access __P ((char *, u_long));
+extern fd_result *__nis_finddirectory __P ((directory_obj *, nis_name));
+extern log_result *__nis_dumplog __P ((nis_server *,nis_name, u_long));
+extern log_result *__nis_dump __P ((nis_server *, nis_name,
+				    int (*)(nis_name, nis_object *, void *)));
 
 __END_DECLS
 
diff --git a/posix/TESTS b/posix/TESTS
index 2bb7c93446..4f1c49f30d 100644
--- a/posix/TESTS
+++ b/posix/TESTS
@@ -157,3 +157,11 @@
 0:M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]:Moammar Qudhafi
 0:M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]:Mu'ammar al-Qaddafi
 0:M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]:Mulazim Awwal Mu'ammar Muhammad Abu Minyar al-Qadhafi
+0:[[:digit:]]+:01234
+1:[[:alpha:]]+:01234
+0:^[[:digit:]]*$:01234
+1:^[[:digit:]]*$:01234a
+0:^[[:alnum:]]*$:01234a
+0:^[[:xdigit:]]*$:01234a
+1:^[[:xdigit:]]*$:01234g
+0:^[[:alnum:][:space:]]*$:Hello world
diff --git a/posix/getopt.c b/posix/getopt.c
index 4cbefa1f33..59b51cd679 100644
--- a/posix/getopt.c
+++ b/posix/getopt.c
@@ -6,9 +6,6 @@
    Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97
    	Free Software Foundation, Inc.
 
-   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
diff --git a/posix/getopt.h b/posix/getopt.h
index 7dad11b79f..d6ceb0eee1 100644
--- a/posix/getopt.h
+++ b/posix/getopt.h
@@ -1,8 +1,6 @@
 /* Declarations for getopt.
    Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc.
-
-   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.
 
    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
diff --git a/posix/getopt1.c b/posix/getopt1.c
index 8347bb1331..4aa8de6f67 100644
--- a/posix/getopt1.c
+++ b/posix/getopt1.c
@@ -1,8 +1,6 @@
 /* getopt_long and getopt_long_only entry points for GNU getopt.
    Copyright (C) 1987,88,89,90,91,92,93,94,96,97 Free Software Foundation, Inc.
-
-   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.
 
    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
diff --git a/posix/regex.c b/posix/regex.c
index b7c82f633e..fc4db38a55 100644
--- a/posix/regex.c
+++ b/posix/regex.c
@@ -1,6 +1,6 @@
 /* Extended regular expression matching and search library,
    version 0.12.
-   (Implements POSIX draft P10003.2/D11.2, except for
+   (Implements POSIX draft P1003.2/D11.2, except for some of the
    internationalization features.)
 
    Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
@@ -42,6 +42,13 @@
 #include <sys/types.h>
 #endif
 
+/* For platform which support the ISO C amendement 1 functionality we
+   support user defined character classes.  */
+#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+# include <wctype.h>
+# include <wchar.h>
+#endif
+
 /* This is for other GNU distributions with internationalized messages.  */
 #if HAVE_LIBINTL_H || defined (_LIBC)
 # include <libintl.h>
@@ -946,6 +953,12 @@ re_set_syntax (syntax)
   reg_syntax_t ret = re_syntax_options;
 
   re_syntax_options = syntax;
+#ifdef DEBUG
+  if (syntax & RE_DEBUG)
+    debug = 1;
+  else if (debug) /* was on but now is not */
+    debug = 0;
+#endif /* DEBUG */
   return ret;
 }
 
@@ -1026,22 +1039,24 @@ static const char *re_error_msgid[] =
 #endif
 
 /* Roughly the maximum number of failure points on the stack.  Would be
-   exactly that if always used MAX_FAILURE_SPACE each time we failed.
+   exactly that if always used MAX_FAILURE_ITEMS items each time we failed.
    This is a variable only so users of regex can assign to it; we never
    change it ourselves.  */
 
 #ifdef INT_IS_16BIT
 
 #if defined (MATCH_MAY_ALLOCATE)
-long re_max_failures = 4000;
+/* 4400 was enough to cause a crash on Alpha OSF/1,
+   whose default stack limit is 2mb.  */
+long int re_max_failures = 4000;
 #else
-long re_max_failures = 2000;
+long int re_max_failures = 2000;
 #endif
 
 union fail_stack_elt
 {
   unsigned char *pointer;
-  long integer;
+  long int integer;
 };
 
 typedef union fail_stack_elt fail_stack_elt_t;
@@ -1049,8 +1064,8 @@ typedef union fail_stack_elt fail_stack_elt_t;
 typedef struct
 {
   fail_stack_elt_t *stack;
-  unsigned long size;
-  unsigned long avail;                 /* Offset of next open position.  */
+  unsigned long int size;
+  unsigned long int avail;		/* Offset of next open position.  */
 } fail_stack_type;
 
 #else /* not INT_IS_16BIT */
@@ -1058,7 +1073,7 @@ typedef struct
 #if defined (MATCH_MAY_ALLOCATE)
 /* 4400 was enough to cause a crash on Alpha OSF/1,
    whose default stack limit is 2mb.  */
-int re_max_failures = 4000;
+int re_max_failures = 20000;
 #else
 int re_max_failures = 2000;
 #endif
@@ -1661,15 +1676,29 @@ typedef struct
        } 								\
     }
 
-#define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
+#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+/* The GNU C library provides support for user-defined character classes
+   and the functions from ISO C amendement 1.  */
+# ifdef CHARCLASS_NAME_MAX
+#  define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
+# else
+/* This shouldn't happen but some implementation might still have this
+   problem.  Use a reasonable default value.  */
+#  define CHAR_CLASS_MAX_LENGTH 256
+# endif
+
+# define IS_CHAR_CLASS(string) wctype (string)
+#else
+# define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
 
-#define IS_CHAR_CLASS(string)						\
+# define IS_CHAR_CLASS(string)						\
    (STREQ (string, "alpha") || STREQ (string, "upper")			\
     || STREQ (string, "lower") || STREQ (string, "digit")		\
     || STREQ (string, "alnum") || STREQ (string, "xdigit")		\
     || STREQ (string, "space") || STREQ (string, "print")		\
     || STREQ (string, "punct") || STREQ (string, "graph")		\
     || STREQ (string, "cntrl") || STREQ (string, "blank"))
+#endif
 
 #ifndef MATCH_MAY_ALLOCATE
 
@@ -2147,6 +2176,34 @@ regex_compile (pattern, size, syntax, bufp)
                        the leading `:' and `[' (but set bits for them).  */
                     if (c == ':' && *p == ']')
                       {
+#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+                        boolean is_lower = STREQ (str, "lower");
+                        boolean is_upper = STREQ (str, "upper");
+			wctype_t wt;
+                        int ch;
+
+			wt = wctype (str);
+			if (wt == 0)
+			  FREE_STACK_RETURN (REG_ECTYPE);
+
+                        /* Throw away the ] at the end of the character
+                           class.  */
+                        PATFETCH (c);
+
+                        if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
+
+                        for (ch = 0; ch < 1 << BYTEWIDTH; ++ch)
+			  {
+			    if (iswctype (btowc (ch), wt))
+			      SET_LIST_BIT (ch);
+
+			    if (translate && (is_upper || is_lower)
+				&& (ISUPPER (ch) || ISLOWER (ch)))
+			      SET_LIST_BIT (ch);
+			  }
+
+                        had_char_class = true;
+#else
                         int ch;
                         boolean is_alnum = STREQ (str, "alnum");
                         boolean is_alpha = STREQ (str, "alpha");
@@ -2194,6 +2251,7 @@ regex_compile (pattern, size, syntax, bufp)
 			      SET_LIST_BIT (ch);
                           }
                         had_char_class = true;
+#endif	/* libc || wctype.h */
                       }
                     else
                       {
@@ -3551,12 +3609,14 @@ re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop)
            : (d) == string2 - 1 ? *(end1 - 1) : *(d))			\
    == Sword)
 
+/* Disabled due to a compiler bug -- see comment at case wordbound */
+#if 0
 /* Test if the character before D and the one at D differ with respect
    to being word-constituent.  */
 #define AT_WORD_BOUNDARY(d)						\
   (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)				\
    || WORDCHAR_P (d - 1) != WORDCHAR_P (d))
-
+#endif
 
 /* Free everything we malloc.  */
 #ifdef MATCH_MAY_ALLOCATE
@@ -4725,6 +4785,7 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
                                dummy_low_reg, dummy_high_reg,
                                reg_dummy, reg_dummy, reg_info_dummy);
           }
+	  /* Note fall through.  */
 
 	unconditional_jump:
 #ifdef _LIBC
@@ -5355,7 +5416,13 @@ re_compile_pattern (pattern, length, bufp)
 /* BSD has one and only one pattern buffer.  */
 static struct re_pattern_buffer re_comp_buf;
 
-char * weak_function
+char *
+#ifdef _LIBC
+/* Make these definitions weak in libc, so POSIX programs can redefine
+   these names if they don't use our functions, and still use
+   regcomp/regexec below without link errors.  */
+weak_function
+#endif
 re_comp (s)
     const char *s;
 {
@@ -5396,7 +5463,10 @@ re_comp (s)
 }
 
 
-int weak_function
+int
+#ifdef _LIBC
+weak_function
+#endif
 re_exec (s)
     const char *s;
 {
diff --git a/posix/regex.h b/posix/regex.h
index ae0165e89c..8e2bd8f394 100644
--- a/posix/regex.h
+++ b/posix/regex.h
@@ -152,6 +152,14 @@ typedef unsigned long int reg_syntax_t;
    If not set, then the GNU regex operators are recognized. */
 #define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1)
 
+/* If this bit is set, turn on internal regex debugging.
+   If not set, and debugging was on, turn it off.
+   This only works if regex.c is compiled -DDEBUG.
+   We define this bit always, so that all that's needed to turn on
+   debugging is to recompile regex.c; the calling code can always have
+   this bit set, and it won't affect anything in the normal case. */
+#define RE_DEBUG (RE_NO_GNU_OPS << 1)
+
 /* This global variable defines the particular regexp syntax to use (for
    some interfaces).  When a regexp is compiled, the syntax used is
    stored in the pattern buffer, so changing this does not affect
@@ -168,15 +176,16 @@ extern reg_syntax_t re_syntax_options;
   (RE_BACKSLASH_ESCAPE_IN_LISTS   | RE_DOT_NOT_NULL			\
    | RE_NO_BK_PARENS              | RE_NO_BK_REFS			\
    | RE_NO_BK_VBAR                | RE_NO_EMPTY_RANGES			\
-   | RE_DOT_NEWLINE							\
+   | RE_DOT_NEWLINE		  | RE_CONTEXT_INDEP_ANCHORS		\
    | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
 
 #define RE_SYNTAX_GNU_AWK						\
-  ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS)		\
-   & ~(RE_DOT_NOT_NULL | RE_INTERVALS))
+  ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG)	\
+   & ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS))
 
 #define RE_SYNTAX_POSIX_AWK 						\
-  (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_NO_GNU_OPS)
+  (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS		\
+   | RE_INTERVALS	    | RE_NO_GNU_OPS)
 
 #define RE_SYNTAX_GREP							\
   (RE_BK_PLUS_QM              | RE_CHAR_CLASSES				\
@@ -316,10 +325,10 @@ struct re_pattern_buffer
   unsigned char *buffer;
 
 	/* Number of bytes to which `buffer' points.  */
-  unsigned long allocated;
+  unsigned long int allocated;
 
 	/* Number of bytes actually used in `buffer'.  */
-  unsigned long used;
+  unsigned long int used;
 
         /* Syntax setting with which the pattern was compiled.  */
   reg_syntax_t syntax;
diff --git a/sysdeps/libm-ieee754/e_acoshl.c b/sysdeps/libm-ieee754/e_acoshl.c
index 7b7bea7054..a60704aa29 100644
--- a/sysdeps/libm-ieee754/e_acoshl.c
+++ b/sysdeps/libm-ieee754/e_acoshl.c
@@ -53,7 +53,7 @@ ln2	= 6.931471805599453094287e-01L; /* 0x3FFE, 0xB17217F7, 0xD1CF79AC */
 	long double t;
 	u_int32_t se,i0,i1;
 	GET_LDOUBLE_WORDS(se,i0,i1,x);
-	if(se<0x3fff) {			/* x < 1 */
+	if(se<0x3fff || se & 0x8000) {	/* x < 1 */
 	    return (x-x)/(x-x);
 	} else if(se >=0x401b) {	/* x > 2**28 */
 	    if(se >=0x7fff) {		/* x is inf of NaN */
diff --git a/sysdeps/libm-ieee754/e_atan2l.c b/sysdeps/libm-ieee754/e_atan2l.c
index e60f2d41c1..72d3eac172 100644
--- a/sysdeps/libm-ieee754/e_atan2l.c
+++ b/sysdeps/libm-ieee754/e_atan2l.c
@@ -73,10 +73,10 @@ pi_lo   = -5.01655761266833202345176e-20L;/* 0xBFBE, 0xECE675D1, 0xFC8F8CBB */
 
 	EXTRACT_LDOUBLE_WORDS(sx,hx,lx,x);
 	ix = sx&0x7fff;
-	lx |= hx ^ 0x80000000;
+	lx |= hx & 0x7fffffff;
 	EXTRACT_LDOUBLE_WORDS(sy,hy,ly,y);
 	iy = sy&0x7fff;
-	ly |= hy ^ 0x80000000;
+	ly |= hy & 0x7fffffff;
 	if(((2*ix|((lx|-lx)>>31))>0xfffe)||
 	   ((2*iy|((ly|-ly)>>31))>0xfffe))	/* x or y is NaN */
 	   return x+y;
@@ -114,7 +114,7 @@ pi_lo   = -5.01655761266833202345176e-20L;/* 0xBFBE, 0xECE675D1, 0xFC8F8CBB */
 	    }
 	}
     /* when y is INF */
-	if(iy==0x7fff) return (hy>=0x8000)? -pi_o_2-tiny: pi_o_2+tiny;
+	if(iy==0x7fff) return (sy>=0x8000)? -pi_o_2-tiny: pi_o_2+tiny;
 
     /* compute y/x */
 	k = sy-sx;
diff --git a/sysdeps/libm-ieee754/e_atanhl.c b/sysdeps/libm-ieee754/e_atanhl.c
index 0e6dadd602..fdcd1e9fe8 100644
--- a/sysdeps/libm-ieee754/e_atanhl.c
+++ b/sysdeps/libm-ieee754/e_atanhl.c
@@ -75,5 +75,5 @@ static double long zero = 0.0;
 	    t = 0.5*__log1pl(t+t*x/(one-x));
 	} else
 	    t = 0.5*__log1pl((x+x)/(one-x));
-	if(se>0x7fff) return t; else return -t;
+	if(se<=0x7fff) return t; else return -t;
 }
diff --git a/sysdeps/libm-ieee754/e_sinhl.c b/sysdeps/libm-ieee754/e_sinhl.c
index f9ccc6fa90..4f9cfe2c38 100644
--- a/sysdeps/libm-ieee754/e_sinhl.c
+++ b/sysdeps/libm-ieee754/e_sinhl.c
@@ -63,7 +63,7 @@ static long double one = 1.0, shuge = 1.0e4931L;
 	if(ix==0x7fff) return x+x;
 
 	h = 0.5;
-	if (jx<0) h = -h;
+	if (jx & 0x8000) h = -h;
     /* |x| in [0,25], return sign(x)*0.5*(E+E/(E+1))) */
 	if (ix < 0x4003 || (ix == 0x4003 && i0 <= 0xc8000000)) { /* |x|<25 */
 	    if (ix<0x3fe3) 		/* |x|<2**-28 */
diff --git a/sysdeps/m68k/fpu/__math.h b/sysdeps/m68k/fpu/__math.h
index 92487f9b04..5dc4d2e066 100644
--- a/sysdeps/m68k/fpu/__math.h
+++ b/sysdeps/m68k/fpu/__math.h
@@ -153,6 +153,21 @@ __internal_inline_functions (float,f)
 __internal_inline_functions (long double,l)
 #undef __internal_inline_functions
 
+/* Get the m68881 condition codes, to quickly check multiple conditions.  */
+static __inline__ unsigned long
+__m81_test (long double __val)
+{
+  unsigned long __fpsr;
+  __asm ("ftst%.x %1; fmove%.l %/fpsr,%0" : "=dm" (__fpsr) : "f" (__val));
+  return __fpsr;
+}
+
+/* Bit values returned by __m81_test.  */
+#define __M81_COND_NAN (1 << 24)
+#define __M81_COND_INF (2 << 24)
+#define __M81_COND_ZERO (4 << 24)
+#define __M81_COND_NEG (8 << 24)
+
 #endif /* __LIBC_M81_MATH_INLINES */
 
 /* The rest of the functions are available to the user.  */
@@ -163,8 +178,12 @@ __m81_u(__CONCAT(__frexp,s))(float_type __value, int *__expptr)		  \
 {									  \
   float_type __mantissa, __exponent;					  \
   int __iexponent;							  \
-  if (__value == 0.0)							  \
+  unsigned long __fpsr;							  \
+  __asm("ftst%.x %1\n"							  \
+	"fmove%.l %/fpsr, %0" : "=dm" (__fpsr) : "f" (__value));	  \
+  if (__fpsr & (7 << 24))						  \
     {									  \
+      /* Not finite or zero.  */					  \
       *__expptr = 0;							  \
       return __value;							  \
     }									  \
diff --git a/sysdeps/m68k/fpu/e_pow.c b/sysdeps/m68k/fpu/e_pow.c
index a39b63d342..b3d151fadc 100644
--- a/sysdeps/m68k/fpu/e_pow.c
+++ b/sysdeps/m68k/fpu/e_pow.c
@@ -36,29 +36,33 @@ s(__ieee754_pow) (float_type x, float_type y)
 {
   float_type z;
   float_type ax;
+  unsigned long x_cond, y_cond;
 
-  if (y == 0.0)
+  y_cond = __m81_test (y);
+  if (y_cond & __M81_COND_ZERO)
     return 1.0;
-  if (x != x || y != y)
+
+  x_cond = __m81_test (x);
+  if ((x_cond | y_cond) & __M81_COND_NAN)
     return x + y;
 
-  if (m81(__isinf) (y))
+  if (y_cond & __M81_COND_INF)
     {
       ax = s(fabs) (x);
       if (ax == 1)
-	return 0.0/0.0;
+	return y - y;
       if (ax > 1)
-	return y > 0 ? y : 0;
+	return y_cond & __M81_COND_NEG ? 0 : y;
       else
-	return y < 0 ? -y : 0;
+	return y_cond & __M81_COND_NEG ? -y : 0;
     }
 
   if (s(fabs) (y) == 1)
-    return y > 0 ? x : 1 / x;
+    return y_cond & __M81_COND_NEG ? 1 / x : x;
 
   if (y == 2)
     return x * x;
-  if (y == 0.5 && x >= 0)
+  if (y == 0.5 && !(x_cond & __M81_COND_NEG))
     return m81(__ieee754_sqrt) (x);
 
   if (x == 10.0)
@@ -73,17 +77,17 @@ s(__ieee754_pow) (float_type x, float_type y)
     }
 
   ax = s(fabs) (x);
-  if (m81(__isinf) (x) || x == 0 || ax == 1)
+  if (x_cond & (__M81_COND_INF | __M81_COND_ZERO) || ax == 1)
     {
       z = ax;
-      if (y < 0)
+      if (y_cond & __M81_COND_NEG)
 	z = 1 / z;
-      if (m81(__signbit) (x))
+      if (x_cond & __M81_COND_NEG)
 	{
 	  if (y != m81(__rint) (y))
 	    {
 	      if (x == -1)
-		z = 0.0/0.0;
+		z = (z - z) / (z - z);
 	    }
 	  else
 	    goto maybe_negate;
@@ -91,7 +95,7 @@ s(__ieee754_pow) (float_type x, float_type y)
       return z;
     }
 
-  if (x < 0.0)
+  if (x_cond & __M81_COND_NEG)
     {
       if (y == m81(__rint) (y))
 	{
@@ -112,7 +116,7 @@ s(__ieee754_pow) (float_type x, float_type y)
 	  }
 	}
       else
-	z = 0.0/0.0;
+	z = (y - y) / (y - y);
     }
   else
     z = m81(__ieee754_exp) (y * m81(__ieee754_log) (x));
diff --git a/sysdeps/m68k/fpu/s_ccos.c b/sysdeps/m68k/fpu/s_ccos.c
new file mode 100644
index 0000000000..53f8286b14
--- /dev/null
+++ b/sysdeps/m68k/fpu/s_ccos.c
@@ -0,0 +1,73 @@
+/* Complex cosine function.  m68k fpu version
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>.
+
+   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 __LIBC_M81_MATH_INLINES
+#include <complex.h>
+#include <math.h>
+
+#ifndef SUFF
+#define SUFF
+#endif
+#ifndef float_type
+#define float_type double
+#endif
+
+#define CONCATX(a,b) __CONCAT(a,b)
+#define s(name) CONCATX(name,SUFF)
+#define m81(func) __m81_u(s(func))
+
+__complex__ float_type
+s(__ccos) (__complex__ float_type x)
+{
+  __complex__ float_type retval;
+  unsigned long rx_cond = __m81_test (__real__ x);
+
+  if ((rx_cond & (__M81_COND_INF|__M81_COND_NAN)) == 0)
+    {
+      /* Real part is finite.  */
+      float_type sin_rx, cos_rx;
+
+      __asm ("fsincos%.x %2,%1:%0" : "=f" (sin_rx), "=f" (cos_rx)
+	     : "f" (__real__ x));
+      __real__ retval = cos_rx * m81(__ieee754_cosh) (__imag__ x);
+      if (rx_cond & __M81_COND_ZERO)
+	__imag__ retval = (m81(__signbit) (__imag__ x)
+			   ? __real__ x : -__real__ x);
+      else
+	__imag__ retval = -sin_rx * m81(__ieee754_sinh) (__imag__ x);
+    }
+  else
+    {
+      unsigned long ix_cond = __m81_test (__imag__ x);
+
+      if (ix_cond & __M81_COND_INF)
+	__real__ retval = s(fabs) (__imag__ x);
+      else
+	__real__ retval = __real__ x - __real__ x;
+      if (ix_cond & __M81_COND_ZERO)
+	__imag__ retval = __imag__ x;
+      else
+	__imag__ retval = __real__ x - __real__ x;
+    }
+
+  return retval;
+}
+#define weak_aliasx(a,b) weak_alias(a,b)
+weak_aliasx (s(__ccos), s(ccos))
diff --git a/sysdeps/m68k/fpu/s_ccosf.c b/sysdeps/m68k/fpu/s_ccosf.c
new file mode 100644
index 0000000000..f5e8a41faf
--- /dev/null
+++ b/sysdeps/m68k/fpu/s_ccosf.c
@@ -0,0 +1,3 @@
+#define SUFF f
+#define float_type float
+#include <s_ccos.c>
diff --git a/sysdeps/m68k/fpu/s_ccosh.c b/sysdeps/m68k/fpu/s_ccosh.c
index 439eae131c..85e73b87e3 100644
--- a/sysdeps/m68k/fpu/s_ccosh.c
+++ b/sysdeps/m68k/fpu/s_ccosh.c
@@ -25,9 +25,6 @@
 #ifndef SUFF
 #define SUFF
 #endif
-#ifndef huge_val
-#define huge_val HUGE_VAL
-#endif
 #ifndef float_type
 #define float_type double
 #endif
@@ -40,78 +37,40 @@ __complex__ float_type
 s(__ccosh) (__complex__ float_type x)
 {
   __complex__ float_type retval;
+  unsigned long ix_cond = __m81_test (__imag__ x);
 
-  __real__ x = s(fabs) (__real__ x);
-
-  if (m81(__finite) (__real__ x))
+  if ((ix_cond & (__M81_COND_INF|__M81_COND_NAN)) == 0)
     {
-      if (m81(__finite) (__imag__ x))
-	{
-	  float_type cosh_val;
-	  float_type sin_ix, cos_ix;
+      /* Imaginary part is finite.  */
+      float_type sin_ix, cos_ix;
 
-	  __asm ("fsincos%.x %2,%1:%0" : "=f" (sin_ix), "=f" (cos_ix)
-		 : "f" (__imag__ x));
-	  cosh_val = m81(__ieee754_cosh) (__real__ x);
-	  __real__ retval = cos_ix * cosh_val;
-	  __imag__ retval = sin_ix * cosh_val;
-	}
-      else if (__real__ x == 0)
-	{
-	  __imag__ retval = 0.0;
-	  __real__ retval = huge_val - huge_val;
-	}
+      __asm ("fsincos%.x %2,%1:%0" : "=f" (sin_ix), "=f" (cos_ix)
+	     : "f" (__imag__ x));
+      __real__ retval = cos_ix * m81(__ieee754_cosh) (__real__ x);
+      if (ix_cond & __M81_COND_ZERO)
+	__imag__ retval = (m81(__signbit) (__real__ x)
+			   ? -__imag__ x : __imag__ x);
       else
-	__real__ retval = __imag__ retval = huge_val - huge_val;
+	__imag__ retval = sin_ix * m81(__ieee754_sinh) (__real__ x);
     }
-  else if (m81(__isinf) (__real__ x))
+  else
     {
-      if (__imag__ x == 0)
-	{
-	  __real__ retval = huge_val;
-	  __imag__ retval = __imag__ x;
-	}
-      else if (m81(__finite) (__imag__ x))
-	{
-	  float_type remainder, pi_2;
-	  int quadrant;
-	  __real__ retval = __imag__ retval = huge_val;
+      unsigned long rx_cond = __m81_test (__real__ x);
 
-	  __asm ("fmovecr %#0,%0\n\tfscale%.w %#-1,%0" : "=f" (pi_2));
-	  __asm ("fmod%.x %2,%0\n\tfmove%.l %/fpsr,%1"
-		 : "=f" (remainder), "=dm" (quadrant)
-		 : "f" (pi_2), "0" (__imag__ x));
-	  quadrant = (quadrant >> 16) & 0x83;
-	  if (quadrant & 0x80)
-	    quadrant ^= 0x83;
-	  switch (quadrant)
-	    {
-	    default:
-	      break;
-	    case 1:
-	      __real__ retval = -__real__ retval;
-	      break;
-	    case 2:
-	      __real__ retval = -__real__ retval;
-	    case 3:
-	      __imag__ retval = -__imag__ retval;
-	      break;
-	    }
+      if (rx_cond & __M81_COND_ZERO)
+	{
+	  __real__ retval = __imag__ x - __imag__ x;
+	  __imag__ retval = __real__ x;
 	}
       else
 	{
-	  /* The subtraction raises the invalid exception.  */
-	  __real__ retval = huge_val;
-	  __imag__ retval = huge_val - huge_val;
+	  if (rx_cond & __M81_COND_INF)
+	    __real__ retval = s(fabs) (__real__ x);
+	  else
+	    __real__ retval = 0.0/0.0;
+	  __imag__ retval = __imag__ x - __imag__ x;
 	}
     }
-  else if (__imag__ x == 0)
-    {
-      __real__ retval = 0.0/0.0;
-      __imag__ retval = __imag__ x;
-    }
-  else
-    __real__ retval = __imag__ retval = 0.0/0.0;
 
   return retval;
 }
diff --git a/sysdeps/m68k/fpu/s_ccoshf.c b/sysdeps/m68k/fpu/s_ccoshf.c
index 7d0766851f..3c8e7c7bb7 100644
--- a/sysdeps/m68k/fpu/s_ccoshf.c
+++ b/sysdeps/m68k/fpu/s_ccoshf.c
@@ -1,4 +1,3 @@
 #define SUFF f
 #define float_type float
-#define huge_val HUGE_VALF
 #include <s_ccosh.c>
diff --git a/sysdeps/m68k/fpu/s_ccoshl.c b/sysdeps/m68k/fpu/s_ccoshl.c
index 6f1d1e5f85..772d5786cf 100644
--- a/sysdeps/m68k/fpu/s_ccoshl.c
+++ b/sysdeps/m68k/fpu/s_ccoshl.c
@@ -1,4 +1,3 @@
 #define SUFF l
 #define float_type long double
-#define huge_val HUGE_VALL
 #include <s_ccosh.c>
diff --git a/sysdeps/m68k/fpu/s_ccosl.c b/sysdeps/m68k/fpu/s_ccosl.c
new file mode 100644
index 0000000000..aaff365208
--- /dev/null
+++ b/sysdeps/m68k/fpu/s_ccosl.c
@@ -0,0 +1,3 @@
+#define SUFF l
+#define float_type long double
+#include <s_ccos.c>
diff --git a/sysdeps/m68k/fpu/s_cexp.c b/sysdeps/m68k/fpu/s_cexp.c
index 4846ec10f3..86cc894a7e 100644
--- a/sysdeps/m68k/fpu/s_cexp.c
+++ b/sysdeps/m68k/fpu/s_cexp.c
@@ -25,9 +25,6 @@
 #ifndef SUFF
 #define SUFF
 #endif
-#ifndef huge_val
-#define huge_val HUGE_VAL
-#endif
 #ifndef float_type
 #define float_type double
 #endif
@@ -40,85 +37,79 @@ __complex__ float_type
 s(__cexp) (__complex__ float_type x)
 {
   __complex__ float_type retval;
+  unsigned long ix_cond;
+
+  ix_cond = __m81_test (__imag__ x);
 
-  if (m81(__finite) (__real__ x))
+  if ((ix_cond & (__M81_COND_NAN|__M81_COND_INF)) == 0)
     {
-      if (m81(__finite) (__imag__ x))
+      /* Imaginary part is finite.  */
+      float_type exp_val = m81(__ieee754_exp) (__real__ x);
+
+      __real__ retval = __imag__ retval = exp_val;
+      if (m81(__finite) (exp_val))
 	{
-	  float_type exp_val = m81(__ieee754_exp) (__real__ x);
+	  float_type sin_ix, cos_ix;
+	  __asm ("fsincos%.x %2,%1:%0" : "=f" (sin_ix), "=f" (cos_ix)
+		 : "f" (__imag__ x));
+	  __real__ retval *= cos_ix;
+	  if (ix_cond & __M81_COND_ZERO)
+	    __imag__ retval = __imag__ x;
+	  else
+	    __imag__ retval *= sin_ix;
+	}
+      else
+	{
+	  /* Compute the sign of the result.  */
+	  float_type remainder, pi_2;
+	  int quadrant;
 
-	  __real__ retval = __imag__ retval = exp_val;
-	  if (m81(__finite) (exp_val))
+	  __asm ("fmovecr %#0,%0\n\tfscale%.w %#-1,%0" : "=f" (pi_2));
+	  __asm ("fmod%.x %2,%0\n\tfmove%.l %/fpsr,%1"
+		 : "=f" (remainder), "=dm" (quadrant)
+		 : "f" (pi_2), "0" (__imag__ x));
+	  quadrant = (quadrant >> 16) & 0x83;
+	  if (quadrant & 0x80)
+	    quadrant ^= 0x83;
+	  switch (quadrant)
 	    {
-	      float_type sin_ix, cos_ix;
-	      __asm ("fsincos%.x %2,%1:%0" : "=f" (sin_ix), "=f" (cos_ix)
-		     : "f" (__imag__ x));
-	      __real__ retval *= cos_ix;
-	      __imag__ retval *= sin_ix;
+	    default:
+	      break;
+	    case 1:
+	      __real__ retval = -__real__ retval;
+	      break;
+	    case 2:
+	      __real__ retval = -__real__ retval;
+	    case 3:
+	      __imag__ retval = -__imag__ retval;
+	      break;
 	    }
-	  else
-	    goto fix_sign;
+	  if (ix_cond & __M81_COND_ZERO && !m81(__isnan) (exp_val))
+	    __imag__ retval = __imag__ x;
 	}
-      else
-	/* If the imaginary part is +-inf or NaN and the real part is
-	   not +-inf the result is NaN + iNaN.  */
-	__real__ retval = __imag__ retval = 0.0/0.0;
     }
-  else if (m81(__isinf) (__real__ x))
+  else
     {
-      if (m81(__finite) (__imag__ x))
-	{
-	  float_type value = m81(__signbit) (__real__ x) ? 0.0 : huge_val;
+      unsigned long rx_cond = __m81_test (__real__ x);
 
-	  if (__imag__ x == 0.0)
+      if (rx_cond & __M81_COND_INF)
+	{
+	  /* Real part is infinite.  */
+	  if (rx_cond & __M81_COND_NEG)
 	    {
-	      __real__ retval = value;
-	      __imag__ retval = __imag__ x;
+	      __real__ retval = __imag__ retval = 0.0;
+	      if (ix_cond & __M81_COND_NEG)
+		__imag__ retval = -__imag__ retval;
 	    }
 	  else
 	    {
-	      float_type remainder, pi_2;
-	      int quadrant;
-	      __real__ retval = value;
-	      __imag__ retval = value;
-
-	    fix_sign:
-	      __asm ("fmovecr %#0,%0\n\tfscale%.w %#-1,%0" : "=f" (pi_2));
-	      __asm ("fmod%.x %2,%0\n\tfmove%.l %/fpsr,%1"
-		     : "=f" (remainder), "=dm" (quadrant)
-		     : "f" (pi_2), "0" (__imag__ x));
-	      quadrant = (quadrant >> 16) & 0x83;
-	      if (quadrant & 0x80)
-		quadrant ^= 0x83;
-	      switch (quadrant)
-		{
-		default:
-		  break;
-		case 1:
-		  __real__ retval = -__real__ retval;
-		  break;
-		case 2:
-		  __real__ retval = -__real__ retval;
-		case 3:
-		  __imag__ retval = -__imag__ retval;
-		  break;
-		}
+	      __real__ retval = __real__ x;
+	      __imag__ retval = __imag__ x - __imag__ x;
 	    }
 	}
-      else if (m81(__signbit) (__real__ x) == 0)
-	{
-	  __real__ retval = huge_val;
-	  __imag__ retval = 0.0/0.0;
-	}
       else
-	{
-	  __real__ retval = 0.0;
-	  __imag__ retval = s(__copysign) (0.0, __imag__ x);
-	}
+	__real__ retval = __imag__ retval = __imag__ x - __imag__ x;
     }
-  else
-    /* If the real part is NaN the result is NaN + iNaN.  */
-    __real__ retval = __imag__ retval = 0.0/0.0;
 
   return retval;
 }
diff --git a/sysdeps/m68k/fpu/s_cexpf.c b/sysdeps/m68k/fpu/s_cexpf.c
index db9f174546..177a360f9b 100644
--- a/sysdeps/m68k/fpu/s_cexpf.c
+++ b/sysdeps/m68k/fpu/s_cexpf.c
@@ -1,4 +1,3 @@
 #define SUFF f
-#define huge_val HUGE_VALF
 #define float_type float
 #include <s_cexp.c>
diff --git a/sysdeps/m68k/fpu/s_cexpl.c b/sysdeps/m68k/fpu/s_cexpl.c
index 7367070548..bbda4ba990 100644
--- a/sysdeps/m68k/fpu/s_cexpl.c
+++ b/sysdeps/m68k/fpu/s_cexpl.c
@@ -1,4 +1,3 @@
 #define SUFF l
-#define huge_val HUGE_VALL
 #define float_type long double
 #include <s_cexp.c>
diff --git a/sysdeps/m68k/fpu/s_csin.c b/sysdeps/m68k/fpu/s_csin.c
new file mode 100644
index 0000000000..8eecd961a6
--- /dev/null
+++ b/sysdeps/m68k/fpu/s_csin.c
@@ -0,0 +1,69 @@
+/* Complex sine function.  m68k fpu version
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>.
+
+   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 __LIBC_M81_MATH_INLINES
+#include <complex.h>
+#include <math.h>
+
+#ifndef SUFF
+#define SUFF
+#endif
+#ifndef float_type
+#define float_type double
+#endif
+
+#define CONCATX(a,b) __CONCAT(a,b)
+#define s(name) CONCATX(name,SUFF)
+#define m81(func) __m81_u(s(func))
+
+__complex__ float_type
+s(__csin) (__complex__ float_type x)
+{
+  __complex__ float_type retval;
+  unsigned long rx_cond = __m81_test (__real__ x);
+
+  if ((rx_cond & (__M81_COND_INF|__M81_COND_NAN)) == 0)
+    {
+      /* Real part is finite.  */
+      float_type sin_rx, cos_rx;
+
+      __asm ("fsincos%.x %2,%1:%0" : "=f" (sin_rx), "=f" (cos_rx)
+	     : "f" (__real__ x));
+      if (rx_cond & __M81_COND_ZERO)
+	__real__ retval = __real__ x;
+      else
+	__real__ retval = sin_rx * m81(__ieee754_cosh) (__imag__ x);
+      __imag__ retval = cos_rx * m81(__ieee754_sinh) (__imag__ x);
+    }
+  else
+    {
+      unsigned long ix_cond = __m81_test (__imag__ x);
+
+      __real__ retval = __real__ x - __real__ x;
+      if (ix_cond & (__M81_COND_ZERO|__M81_COND_INF|__M81_COND_NAN))
+	__imag__ retval = __imag__ x;
+      else
+	__imag__ retval = __real__ retval;
+    }
+
+  return retval;
+}
+#define weak_aliasx(a,b) weak_alias(a,b)
+weak_aliasx (s(__csin), s(csin))
diff --git a/sysdeps/m68k/fpu/s_csinf.c b/sysdeps/m68k/fpu/s_csinf.c
new file mode 100644
index 0000000000..b760e192c3
--- /dev/null
+++ b/sysdeps/m68k/fpu/s_csinf.c
@@ -0,0 +1,3 @@
+#define SUFF f
+#define float_type float
+#include <s_csin.c>
diff --git a/sysdeps/m68k/fpu/s_csinh.c b/sysdeps/m68k/fpu/s_csinh.c
index c409ed0d8f..643a221b57 100644
--- a/sysdeps/m68k/fpu/s_csinh.c
+++ b/sysdeps/m68k/fpu/s_csinh.c
@@ -25,9 +25,6 @@
 #ifndef SUFF
 #define SUFF
 #endif
-#ifndef huge_val
-#define huge_val HUGE_VAL
-#endif
 #ifndef float_type
 #define float_type double
 #endif
@@ -40,87 +37,33 @@ __complex__ float_type
 s(__csinh) (__complex__ float_type x)
 {
   __complex__ float_type retval;
-  int negate = m81(__signbit) (__real__ x);
+  unsigned long ix_cond;
 
-  __real__ x = s(fabs) (__real__ x);
+  ix_cond = __m81_test (__imag__ x);
 
-  if (m81(__finite) (__real__ x))
+  if ((ix_cond & (__M81_COND_INF|__M81_COND_NAN)) == 0)
     {
-      if (m81(__finite) (__imag__ x))
-	{
-	  float_type sinh_val;
-	  float_type sin_ix, cos_ix;
-
-	  __asm ("fsincos%.x %2,%1:%0" : "=f" (sin_ix), "=f" (cos_ix)
-		 : "f" (__imag__ x));
-	  sinh_val = m81(__ieee754_sinh) (__real__ x);
-	  __real__ retval = cos_ix * sinh_val;
-	  __imag__ retval = sin_ix * sinh_val;
+      /* Imaginary part is finite.  */
+      float_type sin_ix, cos_ix;
 
-	  if (negate)
-	    __real__ retval = -__real__ retval;
-	}
-      else if (__real__ x == 0)
-	{
-	  __real__ retval = 0.0;
-	  __imag__ retval = 0.0/0.0;
-
-	  if (negate)
-	    __real__ retval = -__real__ retval;
-	}
+      __asm ("fsincos%.x %2,%1:%0" : "=f" (sin_ix), "=f" (cos_ix)
+	     : "f" (__imag__ x));
+      __real__ retval = cos_ix * m81(__ieee754_sinh) (__real__ x);
+      if (ix_cond & __M81_COND_ZERO)
+	__imag__ retval = __imag__ x;
       else
-	__real__ retval = __imag__ retval = 0.0/0.0;
+	__imag__ retval = sin_ix * m81(__ieee754_cosh) (__real__ x);
     }
-  else if (m81(__isinf) (__real__ x))
+  else
     {
-      if (__imag__ x == 0.0)
-	{
-	  __real__ retval = negate ? -huge_val : huge_val;
-	  __imag__ retval = __imag__ x;
-	}
-      else if (m81(__finite) (__imag__ x))
-	{
-	  float_type remainder, pi_2;
-	  int quadrant;
-	  __real__ retval = __imag__ retval = huge_val;
+      unsigned long rx_cond = __m81_test (__real__ x);
 
-	  __asm ("fmovecr %#0,%0\n\tfscale%.w %#-1,%0" : "=f" (pi_2));
-	  __asm ("fmod%.x %2,%0\n\tfmove%.l %/fpsr,%1"
-		 : "=f" (remainder), "=dm" (quadrant)
-		 : "f" (pi_2), "0" (__imag__ x));
-	  quadrant = (quadrant >> 16) & 0x83;
-	  if (quadrant & 0x80)
-	    quadrant ^= 0x83;
-	  if (negate)
-	    quadrant ^= 1;
-	  switch (quadrant)
-	    {
-	    default:
-	      break;
-	    case 1:
-	      __real__ retval = -__real__ retval;
-	      break;
-	    case 2:
-	      __real__ retval = -__real__ retval;
-	    case 3:
-	      __imag__ retval = -__imag__ retval;
-	      break;
-	    }
-	}
+      __imag__ retval = __imag__ x - __imag__ x;
+      if (rx_cond & (__M81_COND_ZERO|__M81_COND_INF|__M81_COND_NAN))
+	__real__ retval = __real__ x;
       else
-	{
-	  /* The subtraction raises the invalid exception.  */
-	  __real__ retval = huge_val;
-	  __imag__ retval = huge_val - huge_val;
-	}
+	__real__ retval = __imag__ retval;
     }
-  else if (__imag__ x == 0.0)
-    {
-      __real__ retval = 0.0/0.0;
-      __imag__ retval = __imag__ x;
-    }
-  else
-    __real__ retval = __imag__ retval = 0.0/0.0;
 
   return retval;
 }
diff --git a/sysdeps/m68k/fpu/s_csinhf.c b/sysdeps/m68k/fpu/s_csinhf.c
index 42c114b961..2f7a43e6a8 100644
--- a/sysdeps/m68k/fpu/s_csinhf.c
+++ b/sysdeps/m68k/fpu/s_csinhf.c
@@ -1,4 +1,3 @@
 #define SUFF f
 #define float_type float
-#define huge_val HUGE_VALF
 #include <s_csinh.c>
diff --git a/sysdeps/m68k/fpu/s_csinhl.c b/sysdeps/m68k/fpu/s_csinhl.c
index c8aa5c7d27..026a20e7be 100644
--- a/sysdeps/m68k/fpu/s_csinhl.c
+++ b/sysdeps/m68k/fpu/s_csinhl.c
@@ -1,4 +1,3 @@
 #define SUFF l
 #define float_type long double
-#define huge_val HUGE_VALL
 #include <s_csinh.c>
diff --git a/sysdeps/m68k/fpu/s_csinl.c b/sysdeps/m68k/fpu/s_csinl.c
new file mode 100644
index 0000000000..ea2dad0556
--- /dev/null
+++ b/sysdeps/m68k/fpu/s_csinl.c
@@ -0,0 +1,3 @@
+#define SUFF l
+#define float_type long double
+#include <s_csin.c>
diff --git a/sysdeps/unix/sysv/linux/abi-tag.h b/sysdeps/unix/sysv/linux/abi-tag.h
index 166e6a12f6..6c71eece85 100644
--- a/sysdeps/unix/sysv/linux/abi-tag.h
+++ b/sysdeps/unix/sysv/linux/abi-tag.h
@@ -10,7 +10,9 @@
 #define ABI_LINUX_MINOR	0
 #define ABI_LINUX_PATCH	0
 
-#define ABI_TAG ((ABI_LINUX_TAG << 24) |				      \
-		 (ABI_LINUX_MAJOR << 16) |				      \
-		 (ABI_LINUX_MINOR << 8) |				      \
+/* Don't use `|' in this expression, it is a comment character in the
+   assembler.  */
+#define ABI_TAG ((ABI_LINUX_TAG << 24) +				      \
+		 (ABI_LINUX_MAJOR << 16) +				      \
+		 (ABI_LINUX_MINOR << 8) +				      \
 		 (ABI_LINUX_PATCH << 0))
diff --git a/sysdeps/unix/sysv/linux/alpha/brk.S b/sysdeps/unix/sysv/linux/alpha/brk.S
index f44686b9a4..74fef64f64 100644
--- a/sysdeps/unix/sysv/linux/alpha/brk.S
+++ b/sysdeps/unix/sysv/linux/alpha/brk.S
@@ -37,8 +37,9 @@ __curbrk: .skip 8
 #endif
 
 	.text
-LEAF(__brk, 0)
+LEAF(__brk, 8)
 	ldgp	gp, 0(t12)
+	subq	sp, 8, sp
 #ifdef PROF
 	.set noat
 	lda	AT, _mcount
@@ -47,9 +48,14 @@ LEAF(__brk, 0)
 #endif
 	.prologue 1
 
+	/* Save the requested brk across the system call.  */
+	stq	a0, 0(sp)
+
 	ldiq	v0, __NR_brk
 	call_pal PAL_callsys
 
+	ldq	a0, 0(sp)
+
 	/* Be prepared for an OSF-style brk.  */
 	bne	a3, $err1
 	beq	v0, $ok
@@ -62,11 +68,13 @@ LEAF(__brk, 0)
 	/* Update __curbrk and return cleanly.  */
 	mov	zero, v0
 $ok:	stq	a0, __curbrk
+	addq	sp, 8, sp
 	ret
 
 	/* What a horrible way to die.  */
 $err0:	ldi	v0, ENOMEM
-$err1:	jmp	zero, __syscall_error
+$err1:	addq	sp, 8, sp
+	jmp	zero, __syscall_error
 
 	END(__brk)
 
diff --git a/sysdeps/unix/sysv/linux/alpha/clone.S b/sysdeps/unix/sysv/linux/alpha/clone.S
index 5d36e2588d..aab4e590a5 100644
--- a/sysdeps/unix/sysv/linux/alpha/clone.S
+++ b/sysdeps/unix/sysv/linux/alpha/clone.S
@@ -42,9 +42,12 @@ ENTRY(__clone)
 	beq	a0,$error		/* no NULL function pointers */
 	beq	a1,$error		/* no NULL stack pointers */
 
+	/* Save the fn ptr and arg on the new stack.  */
+	subq	a1,16,a1
+	stq	a0,0(a1)
+	stq	a3,8(a1)
+
 	/* Do the system call */
-	mov	a0,pv			/* get fn ptr out of the way */
-	mov	a3,t0			/* get fn arg out of the way */
 	mov	a2,a0
 	ldiq	v0,__NR_clone
 	call_pal PAL_callsys
@@ -73,8 +76,12 @@ thread_start:
 	mov	zero,fp
 	.prologue 0
 
+	/* Load up the arguments.  */
+	ldq	pv,0(sp)
+	ldq	a0,8(sp)
+	addq	sp,16,sp
+
 	/* Call the user's function */
-	mov	t0,a0
 	jsr	ra,(pv)
 	ldgp	gp,0(ra)
 
diff --git a/sysdeps/unix/sysv/linux/sys/mount.h b/sysdeps/unix/sysv/linux/sys/mount.h
index 59a1aa45be..08a2e3158f 100644
--- a/sysdeps/unix/sysv/linux/sys/mount.h
+++ b/sysdeps/unix/sysv/linux/sys/mount.h
@@ -1,5 +1,5 @@
 /* Header file for mounting/unmount Linux filesystems.
-   Copyright (C) 1996 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -17,13 +17,81 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+/* This is taken from /usr/include/linux/fs.h.  */
+
 #ifndef _SYS_MOUNT_H
 
 #define _SYS_MOUNT_H	1
 #include <features.h>
 
+#include <sys/ioctl.h>
+
 __BEGIN_DECLS
 
+#define BLOCK_SIZE	1024
+#define BLOCK_SIZE_BITS	10
+
+
+/* These are the fs-independent mount-flags: up to 16 flags are
+   supported  */
+#define MS_RDONLY	1	/* Mount read-only.  */
+#define MS_NOSUID	2	/* Ignore suid and sgid bits.  */
+#define MS_NODEV	4	/* Disallow access to device special files.  */
+#define MS_NOEXEC	8	/* Disallow program execution.  */
+#define MS_SYNCHRONOUS	16	/* Writes are synced at once.  */
+#define MS_REMOUNT	32	/* Alter flags of a mounted FS.  */
+#define MS_MANDLOCK	64	/* Allow mandatory locks on an FS.  */
+#define S_WRITE		128	/* Write on file/directory/symlink.  */
+#define S_APPEND	256	/* Append-only file.  */
+#define S_IMMUTABLE	512	/* Immutable file.  */
+#define MS_NOATIME	1024	/* Do not update access times.  */
+
+
+/* Flags that can be altered by MS_REMOUNT  */
+#define MS_RMT_MASK (MS_RDONLY | MS_MANDLOCK)
+
+
+/* Magic mount flag number. Has to be or-ed to the flag values.  */
+
+#define MS_MGC_VAL 0xc0ed0000	/* Magic flag number to indicate "new" flags */
+#define MS_MGC_MSK 0xffff0000	/* Magic flag number mask */
+
+
+/* Note that read-only etc flags are inode-specific: setting some
+   file-system flags just means all the inodes inherit those flags by
+   default. It might be possible to override it selectively if you
+   really wanted to with some ioctl() that is not currently
+   implemented.
+
+   Exception: MS_RDONLY is always applied to the entire file system.  */
+#define IS_RDONLY(inode) \
+     (((inode)->i_sb) && ((inode)->i_sb->s_flags & MS_RDONLY))
+#define DO_UPDATE_ATIME(inode) \
+     (!((inode)->i_flags & MS_NOATIME) && !IS_RDONLY (inode))
+#define IS_NOSUID(inode) ((inode)->i_flags & MS_NOSUID)
+#define IS_NODEV(inode) ((inode)->i_flags & MS_NODEV)
+#define IS_NOEXEC(inode) ((inode)->i_flags & MS_NOEXEC)
+#define IS_SYNC(inode) ((inode)->i_flags & MS_SYNCHRONOUS)
+#define IS_MANDLOCK(inode) ((inode)->i_flags & MS_MANDLOCK)
+
+#define IS_WRITABLE(inode) ((inode)->i_flags & S_WRITE)
+#define IS_APPEND(inode) ((inode)->i_flags & S_APPEND)
+#define IS_IMMUTABLE(inode) ((inode)->i_flags & S_IMMUTABLE)
+
+
+/* The read-only stuff doesn't really belong here, but any other place
+   is probably as bad and I don't want to create yet another include
+   file.  */
+
+#define BLKROSET   _IO(0x12, 93) /* Set device read-only (0 = read-write).  */
+#define BLKROGET   _IO(0x12, 94) /* Get read-only status (0 = read_write).  */
+#define BLKRRPART  _IO(0x12, 95) /* Re-read partition table.  */
+#define BLKGETSIZE _IO(0x12, 96) /* Return device size.  */
+#define BLKFLSBUF  _IO(0x12, 97) /* Flush buffer cache.  */
+#define BLKRASET   _IO(0x12, 98) /* Set read ahead for block device.  */
+#define BLKRAGET   _IO(0x12, 99) /* Get current read ahead setting.  */
+
+
 /* Mount a filesystem.  */
 extern int mount __P ((__const char *__special_file, __const char *__dir,
 		       __const char *__fstype, unsigned long int __rwflag,