about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1996-08-11 01:08:23 +0000
committerUlrich Drepper <drepper@redhat.com>1996-08-11 01:08:23 +0000
commit267ca16a67be70e0361c212e805d43884aee4506 (patch)
tree5866c33fdf3e7366ae9d89ed71e0683fbbf8517c
parentf2b5d40e87c64a1bd855e9408bd81ab508eade87 (diff)
downloadglibc-267ca16a67be70e0361c212e805d43884aee4506.tar.gz
glibc-267ca16a67be70e0361c212e805d43884aee4506.tar.xz
glibc-267ca16a67be70e0361c212e805d43884aee4506.zip
Sat Aug 10 13:17:27 1996  David Mosberger-Tang  <davidm@azstarnet.com>

	* shadow.h: New file.

	* sysdeps/unix/sysv/linux/netinet/in.h: Move
 	__BEGIN_DECLS/__END_DECLS up so ntohl() et al are bracketed as
 	well.

	* socket/sys/socket.h [__cplusplus]: Use old-style __SOCKADDR_ARG.
	g++ 2.7.2 (and earlier) has no transparent unions support.

Fri Aug  9 18:50:06 1996  David Mosberger-Tang  <davidm@azstarnet.com>

	* sysdeps/unix/sysv/linux/alpha/ioperm.c (_bus_base_sparse): New
	function to determine the base address of sparse bus memory.
	(APECS_*): Rename to CIA_*.
	(APECS_SPARSE_MEM, CIA_SPARSE_MEM): New macros.
	(platform): Add sparse_bus_memory_base member and initialize.
	(sparse_bus_memory_base): New variable.

Tue Aug  6 10:23:18 1996  David Mosberger-Tang  <davidm@azstarnet.com>

	* sysdeps/posix/ttyname_r.c (ttyname_r),
	sysdeps/posix/ttyname.c (ttyname): Return -1/NULL if
	!__isatty(fd) (POSIX.1 says so.)

	* sysdeps/unix/getlogin.c (getlogin): Fix to check fd 0 only.
  	This is not a gross hack, after all---for compatibility,
 	getlogin() really should check fd 0 only and not try to base its
 	operation on the controlling tty.

Wed Jul 17 10:54:20 1996  David Mosberger-Tang  <davidm@azstarnet.com>

	* sysdeps/unix/getlogin.c (getlogin): Add static variable NAME,
 	change utmp_data from static to auto.

Sun Aug 11 02:56:08 1996  Ulrich Drepper  <drepper@cygnus.com>

	* posix/unistd.h [__USE_MISC]: Add prototype for `nice'.
	Reported by David Mosberger-Tang.
-rw-r--r--ChangeLog41
-rw-r--r--gmon/sys/gmon.h8
-rw-r--r--grp/fgetgrent_r.c63
-rw-r--r--io/fts.h1
-rw-r--r--nss/nss_files/files-spwd.c37
-rw-r--r--nss/spwd-lookup.c22
-rw-r--r--pwd/fgetpwent_r.c65
-rw-r--r--shadow/Makefile29
-rw-r--r--shadow/fgetspent.c31
-rw-r--r--shadow/fgetspent_r.c56
-rw-r--r--shadow/getspent.c30
-rw-r--r--shadow/getspent_r.c30
-rw-r--r--shadow/getspnam.c30
-rw-r--r--shadow/getspnam_r.c30
-rw-r--r--shadow/putspent.c80
-rw-r--r--shadow/sgetspent.c46
-rw-r--r--shadow/sgetspent_r.c72
-rw-r--r--shadow/shadow.h108
-rw-r--r--stdio-common/scanf3.c1
-rw-r--r--string/argz.h8
-rw-r--r--sysdeps/i386/i686/Implies2
-rw-r--r--sysdeps/libm-ieee754/s_isnan.c1
-rw-r--r--sysdeps/posix/tempname.c1
-rw-r--r--sysdeps/unix/sysv/linux/alpha/clone.S118
-rw-r--r--sysdeps/unix/sysv/linux/direntry.h22
-rw-r--r--sysdeps/unix/sysv/linux/ftime.c3
-rw-r--r--sysdeps/unix/sysv/linux/i386/clone.S80
-rw-r--r--sysdeps/unix/sysv/linux/m68k/resourcebits.h3
-rw-r--r--sysdeps/unix/sysv/linux/sys/acct.h3
-rw-r--r--sysdeps/unix/sysv/linux/sys/io.h13
-rw-r--r--sysdeps/unix/sysv/linux/sys/klog.h26
-rw-r--r--sysdeps/unix/sysv/linux/sys/module.h23
-rw-r--r--sysdeps/unix/sysv/linux/sys/timex.h9
33 files changed, 1062 insertions, 30 deletions
diff --git a/ChangeLog b/ChangeLog
index ef3a011895..6b9e3b98ea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,44 @@
+Sat Aug 10 13:17:27 1996  David Mosberger-Tang  <davidm@azstarnet.com>
+
+	* shadow.h: New file.
+
+	* sysdeps/unix/sysv/linux/netinet/in.h: Move
+ 	__BEGIN_DECLS/__END_DECLS up so ntohl() et al are bracketed as
+ 	well.
+
+	* socket/sys/socket.h [__cplusplus]: Use old-style __SOCKADDR_ARG.
+	g++ 2.7.2 (and earlier) has no transparent unions support.
+
+Fri Aug  9 18:50:06 1996  David Mosberger-Tang  <davidm@azstarnet.com>
+
+	* sysdeps/unix/sysv/linux/alpha/ioperm.c (_bus_base_sparse): New
+	function to determine the base address of sparse bus memory.
+	(APECS_*): Rename to CIA_*.
+	(APECS_SPARSE_MEM, CIA_SPARSE_MEM): New macros.
+	(platform): Add sparse_bus_memory_base member and initialize.
+	(sparse_bus_memory_base): New variable.
+
+Tue Aug  6 10:23:18 1996  David Mosberger-Tang  <davidm@azstarnet.com>
+
+	* sysdeps/posix/ttyname_r.c (ttyname_r),
+	sysdeps/posix/ttyname.c (ttyname): Return -1/NULL if
+	!__isatty(fd) (POSIX.1 says so.)
+
+	* sysdeps/unix/getlogin.c (getlogin): Fix to check fd 0 only.
+  	This is not a gross hack, after all---for compatibility,
+ 	getlogin() really should check fd 0 only and not try to base its
+ 	operation on the controlling tty.
+
+Wed Jul 17 10:54:20 1996  David Mosberger-Tang  <davidm@azstarnet.com>
+
+	* sysdeps/unix/getlogin.c (getlogin): Add static variable NAME,
+ 	change utmp_data from static to auto.
+
+Sun Aug 11 02:56:08 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+	* posix/unistd.h [__USE_MISC]: Add prototype for `nice'.
+	Reported by David Mosberger-Tang.
+
 Sat Aug 10 02:05:28 1996  Richard Henderson  <richard@twiddle.tamu.edu>
 
 	* sysdeps/libm-ieee754/s_isnan.c [NO_LONG_DOUBLE]: Add strong
diff --git a/gmon/sys/gmon.h b/gmon/sys/gmon.h
index 8cbd6bdeda..d963797cd2 100644
--- a/gmon/sys/gmon.h
+++ b/gmon/sys/gmon.h
@@ -33,10 +33,12 @@
  *	@(#)gmon.h	8.2 (Berkeley) 1/4/94
  */
 
-#ifndef _SYS_GMON_H_
-#define _SYS_GMON_H_
+#ifndef	_SYS_GMON_H_
 
-#include <sys/cdefs.h>
+#define	_SYS_GMON_H_	1
+#include <features.h>
+
+#include <sys/types.h>
 
 /*
  * See gmon_out.h for gmon.out format.
diff --git a/grp/fgetgrent_r.c b/grp/fgetgrent_r.c
new file mode 100644
index 0000000000..f8b8d97d25
--- /dev/null
+++ b/grp/fgetgrent_r.c
@@ -0,0 +1,63 @@
+/* Copyright (C) 1991, 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <ctype.h>
+#include <grp.h>
+#include <stdio.h>
+
+/* Define a line parsing function using the common code
+   used in the nss_files module.  */
+
+#define STRUCTURE	group
+#define ENTNAME		grent
+struct grent_data {};
+
+#define TRAILING_LIST_MEMBER		gr_mem
+#define TRAILING_LIST_SEPARATOR_P(c)	((c) == ',')
+#include "../nss/nss_files/files-parse.c"
+LINE_PARSER
+(,
+ STRING_FIELD (result->gr_name, ISCOLON, 0);
+ STRING_FIELD (result->gr_passwd, ISCOLON, 0);
+ INT_FIELD (result->gr_gid, ISCOLON, 0, 10,);
+ )
+
+
+/* Read one entry from the given stream.  */
+struct group *
+__fgetgrent_r (FILE *stream, struct group *result, char *buffer, int buflen)
+{
+  char *p;
+
+  do
+    {
+      p = fgets (buffer, buflen, stream);
+      if (p == NULL)
+	return NULL;
+
+      /* Skip leading blanks.  */
+      while (isspace (*p))
+	++p;
+    } while (*p == '\0' || *p == '#' ||	/* Ignore empty and comment lines.  */
+	     /* Parse the line.  If it is invalid, loop to
+		get the next line of the file to parse.  */
+	     ! parse_line (p, result, (void *) buffer, buflen));
+
+  return result;
+}
+weak_alias (__fgetgrent_r, fgetgrent_r)
diff --git a/io/fts.h b/io/fts.h
index 643a027c2c..a6548c2d79 100644
--- a/io/fts.h
+++ b/io/fts.h
@@ -37,6 +37,7 @@
 #define	_FTS_H_
 
 #include <sys/cdefs.h>
+#include <sys/types.h>
 
 typedef struct {
 	struct _ftsent *fts_cur;	/* current node */
diff --git a/nss/nss_files/files-spwd.c b/nss/nss_files/files-spwd.c
new file mode 100644
index 0000000000..df0106bdd6
--- /dev/null
+++ b/nss/nss_files/files-spwd.c
@@ -0,0 +1,37 @@
+/* User file parser in nss_files module.
+Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <shadow.h>
+
+#define STRUCTURE	spwd
+#define ENTNAME		spent
+#define DATABASE	"shadow"
+struct spent_data {};
+
+/* Our parser function is already defined in sgetspent_r.c, so use that
+   to parse lines from the database file.  */
+#define EXTERN_PARSER
+#include "files-parse.c"
+#include GENERIC
+
+DB_LOOKUP (spnam, 1 + strlen (name), (".%s", name),
+	   {
+	     if (! strcmp (name, result->sp_namp))
+	       break;
+	   }, const char *name)
diff --git a/nss/spwd-lookup.c b/nss/spwd-lookup.c
new file mode 100644
index 0000000000..8832805f44
--- /dev/null
+++ b/nss/spwd-lookup.c
@@ -0,0 +1,22 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#define DATABASE_NAME shadow
+
+#include "XXX-lookup.c"
diff --git a/pwd/fgetpwent_r.c b/pwd/fgetpwent_r.c
new file mode 100644
index 0000000000..9b58e61009
--- /dev/null
+++ b/pwd/fgetpwent_r.c
@@ -0,0 +1,65 @@
+/* Copyright (C) 1991, 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <ctype.h>
+#include <stdio.h>
+#include <pwd.h>
+
+/* Define a line parsing function using the common code
+   used in the nss_files module.  */
+
+#define STRUCTURE	passwd
+#define ENTNAME		pwent
+struct pwent_data {};
+
+#include "../nss/nss_files/files-parse.c"
+LINE_PARSER
+(,
+ STRING_FIELD (result->pw_name, ISCOLON, 0);
+ STRING_FIELD (result->pw_passwd, ISCOLON, 0);
+ INT_FIELD (result->pw_uid, ISCOLON, 0, 10,);
+ INT_FIELD (result->pw_gid, ISCOLON, 0, 10,);
+ STRING_FIELD (result->pw_gecos, ISCOLON, 0);
+ STRING_FIELD (result->pw_dir, ISCOLON, 0);
+ result->pw_shell = line;
+ )
+
+
+/* Read one entry from the given stream.  */
+struct passwd *
+__fgetpwent_r (FILE *stream, struct passwd *result, char *buffer, int buflen)
+{
+  char *p;
+
+  do
+    {
+      p = fgets (buffer, buflen, stream);
+      if (p == NULL)
+	return NULL;
+
+      /* Skip leading blanks.  */
+      while (isspace (*p))
+	++p;
+    } while (*p == '\0' || *p == '#' ||	/* Ignore empty and comment lines.  */
+	     /* Parse the line.  If it is invalid, loop to
+		get the next line of the file to parse.  */
+	     ! parse_line (p, result, (void *) buffer, buflen));
+
+  return result;
+}
+weak_alias (__fgetpwent_r, fgetpwent_r)
diff --git a/shadow/Makefile b/shadow/Makefile
new file mode 100644
index 0000000000..943881f1f1
--- /dev/null
+++ b/shadow/Makefile
@@ -0,0 +1,29 @@
+# Copyright (C) 1996 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+
+# You should have received a copy of the GNU Library General Public
+# License along with the GNU C Library; see the file COPYING.LIB.  If
+# not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+#
+#	Makefile for shadow.
+#
+subdir	:= shadow
+
+headers		= shadow.h
+routines	= getspent getspnam sgetspent fgetspent putspent \
+		  getspent_r getspnam_r sgetspent_r fgetspent_r
+
+
+include ../Rules
diff --git a/shadow/fgetspent.c b/shadow/fgetspent.c
new file mode 100644
index 0000000000..d6c4e4fc05
--- /dev/null
+++ b/shadow/fgetspent.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <shadow.h>
+#include <stdio.h>
+
+
+/* Read one shadow entry from the given stream.  */
+struct spwd *
+fgetspent (FILE *stream)
+{
+  static char buffer[BUFSIZ];
+  static struct spwd result;
+
+  return __fgetspent_r (stream, &result, buffer, sizeof buffer);
+}
diff --git a/shadow/fgetspent_r.c b/shadow/fgetspent_r.c
new file mode 100644
index 0000000000..6521517a6f
--- /dev/null
+++ b/shadow/fgetspent_r.c
@@ -0,0 +1,56 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <ctype.h>
+#include <shadow.h>
+#include <stdio.h>
+
+/* Define a line parsing function using the common code
+   used in the nss_files module.  */
+
+#define STRUCTURE	spwd
+#define ENTNAME		spent
+#define	EXTERN_PARSER	1
+struct spent_data {};
+
+#include "../nss/nss_files/files-parse.c"
+
+
+/* Read one shadow entry from the given stream.  */
+struct spwd *
+__fgetspent_r (FILE *stream, struct spwd *result, char *buffer, int buflen)
+{
+  char *p;
+
+  do
+    {
+      p = fgets (buffer, buflen, stream);
+      if (p == NULL)
+	return NULL;
+
+      /* Skip leading blanks.  */
+      while (isspace (*p))
+	++p;
+    } while (*p == '\0' || *p == '#' ||	/* Ignore empty and comment lines.  */
+	     /* Parse the line.  If it is invalid, loop to
+		get the next line of the file to parse.  */
+	     ! parse_line (buffer, (void *) result, NULL, 0));
+
+  return result;
+}
+weak_alias (__fgetspent_r, fgetspent_r)
diff --git a/shadow/getspent.c b/shadow/getspent.c
new file mode 100644
index 0000000000..4266959bc1
--- /dev/null
+++ b/shadow/getspent.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <shadow.h>
+
+
+#define LOOKUP_TYPE	struct spwd
+#define SETFUNC_NAME	setspent
+#define	GETFUNC_NAME	getspent
+#define	ENDFUNC_NAME	endspent
+#define DATABASE_NAME	shadow
+#define BUFLEN		1024
+
+#include "../nss/getXXent.c"
diff --git a/shadow/getspent_r.c b/shadow/getspent_r.c
new file mode 100644
index 0000000000..d5f1546a9e
--- /dev/null
+++ b/shadow/getspent_r.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of/tes
+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 <shadow.h>
+
+
+#define LOOKUP_TYPE	struct spwd
+#define SETFUNC_NAME	setspent
+#define	GETFUNC_NAME	getspent
+#define	ENDFUNC_NAME	endspent
+#define DATABASE_NAME	shadow
+#define BUFLEN		1024
+
+#include "../nss/getXXent_r.c"
diff --git a/shadow/getspnam.c b/shadow/getspnam.c
new file mode 100644
index 0000000000..6d82f28999
--- /dev/null
+++ b/shadow/getspnam.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <shadow.h>
+
+
+#define LOOKUP_TYPE	struct spwd
+#define FUNCTION_NAME	getspnam
+#define DATABASE_NAME	shadow
+#define ADD_PARAMS	const char *name
+#define ADD_VARIABLES	name
+#define BUFLEN		1024
+
+#include "../nss/getXXbyYY.c"
diff --git a/shadow/getspnam_r.c b/shadow/getspnam_r.c
new file mode 100644
index 0000000000..148c94011d
--- /dev/null
+++ b/shadow/getspnam_r.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <shadow.h>
+
+
+#define LOOKUP_TYPE	struct spwd
+#define FUNCTION_NAME	getspnam
+#define DATABASE_NAME	shadow
+#define ADD_PARAMS	const char *name
+#define ADD_VARIABLES	name
+#define BUFLEN		1024
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/shadow/putspent.c b/shadow/putspent.c
new file mode 100644
index 0000000000..59dbfda172
--- /dev/null
+++ b/shadow/putspent.c
@@ -0,0 +1,80 @@
+/* Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <errno.h>
+#include <stdio.h>
+#include <shadow.h>
+
+
+/* Write an entry to the given stream.
+   This must know the format of the password file.  */
+int
+putspent (const struct spwd *p, FILE *stream)
+{
+  int errors = 0;
+
+  if (fprintf (stream, "%s:%s", p->sp_namp, p->sp_pwdp) < 0)
+    ++errors;
+
+  if ((p->sp_lstchg != (time_t) -1
+       && fprintf (stream, "%ld", p->sp_lstchg) < 0)
+      || (p->sp_lstchg == (time_t) -1
+	  && putc (':', stream) == EOF))
+    ++errors;
+
+  if ((p->sp_min != (time_t) -1
+       && fprintf (stream, "%ld", p->sp_min) < 0)
+      || (p->sp_min == (time_t) -1
+	  && putc (':', stream) == EOF))
+    ++errors;
+
+  if ((p->sp_max != (time_t) -1
+       && fprintf (stream, "%ld", p->sp_max) < 0)
+      || (p->sp_max == (time_t) -1
+	  && putc (':', stream) == EOF))
+    ++errors;
+
+  if ((p->sp_warn != (time_t) -1
+       && fprintf (stream, "%ld", p->sp_warn) < 0)
+      || (p->sp_warn == (time_t) -1
+	  && putc (':', stream) == EOF))
+    ++errors;
+
+  if ((p->sp_inact != (time_t) -1
+       && fprintf (stream, "%ld", p->sp_inact) < 0)
+      || (p->sp_inact == (time_t) -1
+	  && putc (':', stream) == EOF))
+    ++errors;
+
+  if ((p->sp_expire != (time_t) -1
+       && fprintf (stream, "%ld", p->sp_expire) < 0)
+      || (p->sp_expire == (time_t) -1
+	  && putc (':', stream) == EOF))
+    ++errors;
+
+  if ((p->sp_flag != -1l
+       && fprintf (stream, "%ld", p->sp_flag) < 0)
+      || (p->sp_flag == -1l
+	  && putc (':', stream) == EOF))
+    ++errors;
+
+  if (putc ('\n', stream) == EOF)
+    ++errors;
+
+  return errors ? -1 : 0;
+}
diff --git a/shadow/sgetspent.c b/shadow/sgetspent.c
new file mode 100644
index 0000000000..a3c61f9026
--- /dev/null
+++ b/shadow/sgetspent.c
@@ -0,0 +1,46 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <shadow.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+
+/* Read one shadow entry from the given stream.  */
+struct spwd *
+sgetspent (const char *string)
+{
+  static struct spwd result;
+  static int max_size = 0;
+  static char *buffer = NULL;
+  int len;
+
+  len = strlen (string) + 1;
+  if (len > max_size)
+    {
+      max_size = MAX (128, len + 32);
+      buffer = realloc (buffer, max_size);
+      if (buffer == NULL)
+	return NULL;
+    }
+
+  return __sgetspent_r (string, &result, buffer, max_size);
+}
diff --git a/shadow/sgetspent_r.c b/shadow/sgetspent_r.c
new file mode 100644
index 0000000000..3ad72f0c0a
--- /dev/null
+++ b/shadow/sgetspent_r.c
@@ -0,0 +1,72 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <ctype.h>
+#include <shadow.h>
+#include <stdio.h>
+#include <string.h>
+
+/* Define a line parsing function using the common code
+   used in the nss_files module.  */
+
+#define STRUCTURE	spwd
+#define ENTNAME		spent
+struct spent_data {};
+
+#include "../nss/nss_files/files-parse.c"
+LINE_PARSER
+(,
+ STRING_FIELD (result->sp_namp, ISCOLON, 0);
+ STRING_FIELD (result->sp_pwdp, ISCOLON, 0);
+ INT_FIELD (result->sp_lstchg, ISCOLON, 0, 10, (time_t));
+ INT_FIELD (result->sp_min, ISCOLON, 0, 10, (time_t));
+ INT_FIELD (result->sp_max, ISCOLON, 0, 10, (time_t));
+ while (isspace (*line))
+   ++line;
+ if (*line == '\0')
+   {
+     /* The old form.  */
+     result->sp_warn = (time_t) -1;
+     result->sp_inact = (time_t) -1;
+     result->sp_expire = (time_t) -1;
+     result->sp_flag = (time_t) -1;
+   }
+ else
+   {
+     INT_FIELD (result->sp_warn, ISCOLON, 0, 10, (time_t));
+     INT_FIELD (result->sp_inact, ISCOLON, 0, 10, (time_t));
+     INT_FIELD (result->sp_expire, ISCOLON, 0, 10, (time_t));
+     while (isspace (*line))
+       ++line;
+     if (*line == '\0')
+       result->sp_flag = -1;
+     else
+       INT_FIELD (result->sp_flag, ISCOLON, 0, 10, );
+   }
+ )
+
+
+/* Read one shadow entry from the given stream.  */
+struct spwd *
+__sgetspent_r (const char *string, struct spwd *result, char *buffer,
+	       int buflen)
+{
+  return parse_line (strncpy (string, buffer, buflen), result, NULL, 0)
+    ? result : NULL;
+}
+weak_alias (__sgetspent_r, sgetspent_r)
diff --git a/shadow/shadow.h b/shadow/shadow.h
new file mode 100644
index 0000000000..88199a9856
--- /dev/null
+++ b/shadow/shadow.h
@@ -0,0 +1,108 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Declaration of types and functions for shadow password suite.  */
+
+#ifndef _SHADOW_H
+
+#define _SHADOW_H	1
+#include <features.h>
+
+#define	__need_FILE
+#include <stdio.h>
+#define	__need_time_t
+#include <time.h>
+
+/* Paths to the userd files.  */
+#define	SHADOW "/etc/shadow"
+
+
+__BEGIN_DECLS
+
+/* Structure of the password file.  */
+struct spwd
+{
+  char *sp_namp;		/* Login name.  */
+  char *sp_pwdp;		/* Encrypted password.  */
+  __time_t sp_lstchg;		/* Date of last change.  */
+  __time_t sp_min;		/* Minimum number of days between changes.  */
+  __time_t sp_max;		/* Maximum number of days between changes.  */
+  __time_t sp_warn;		/* Number of days to warn user to change
+				   the password.  */
+  __time_t sp_inact;		/* Number of days the account may be
+				   inactive.  */
+  __time_t sp_expire;		/* Number of days since 700101 until account
+				   expires.  */
+  unsigned long int sp_flag;	/* Reserved.  */
+};
+
+
+/* Open database for reading.  */
+extern void setspent __P ((void));
+
+/* Close database.  */
+extern void endspent __P ((void));
+
+/* Get next entry from database, perhaps after opening the file.  */
+extern struct spwd *getspent __P ((void));
+
+/* Get shadow entry matching NAME.  */
+extern struct spwd *getspnam __P ((__const char *__name));
+
+/* Read shadow entry from STRING.  */
+extern struct spwd *sgetspent __P ((__const char *__string));
+
+/* Read next shadow entry from STREAM.  */
+extern struct spwd *fgetspent __P ((FILE *__stream));
+
+/* Write line containing shadow password entry to stream.  */
+extern int putspent __P ((__const struct spwd *__p, FILE *__stream));
+
+
+#ifdef	__USE_REENTRANT
+/* Reentrant versions of some of the functions above.  */
+extern struct spwd *__getspent_r __P ((struct spwd *__result_buf,
+				       char *__buffer, int __buflen));
+extern struct spwd *getspent_r __P ((struct spwd *__result_buf,
+				     char *__buffer, int __buflen));
+
+extern struct spwd *__getspnam_r __P ((__const char *__name,
+				       struct spwd *__result_buf,
+				       char *__buffer, int __buflen));
+extern struct spwd *getspnam_r __P ((__const char *__name,
+				     struct spwd *__result_buf,
+				     char *__buffer, int __buflen));
+
+extern struct spwd *__sgetspent_r __P ((__const char *__string,
+					struct spwd *__result_buf,
+					char *__buffer, int __buflen));
+extern struct spwd *sgetspent_r __P ((__const char *__string,
+				      struct spwd *__result_buf,
+				      char *__buffer, int __buflen));
+
+extern struct spwd *__fgetspent_r __P ((FILE *__stream,
+					struct spwd *__result_buf,
+					char *__buffer, int __buflen));
+extern struct spwd *fgetspent_r __P ((FILE *__stream,
+				      struct spwd *__result_buf,
+				      char *__buffer, int __buflen));
+#endif	/* reentrant */
+
+__END_DECLS
+
+#endif /* shadow.h */
diff --git a/stdio-common/scanf3.c b/stdio-common/scanf3.c
index 1a77522482..6c840ed428 100644
--- a/stdio-common/scanf3.c
+++ b/stdio-common/scanf3.c
@@ -26,5 +26,4 @@ int main(int arc, char *argv)
     abort ();
 
   return 0;
-  return 0;
 }
diff --git a/string/argz.h b/string/argz.h
index d9314e6bef..b6906d976e 100644
--- a/string/argz.h
+++ b/string/argz.h
@@ -27,12 +27,14 @@
 
 __BEGIN_DECLS
 
+#ifdef __USE_GNU
+
 /* Make a '\0' separated arg vector from a unix argv vector, returning it in
    ARGZ, and the total length in LEN.  If a memory allocation error occurs,
    ENOMEM is returned, otherwise 0.  The result can be destroyed using free. */
-extern error_t __argz_create __P ((char *const __argv[], char **__argz,
+extern error_t __argz_create __P ((char *__const __argv[], char **__argz,
 				   size_t *__len));
-extern error_t argz_create __P ((char *const __argv[], char **__argz,
+extern error_t argz_create __P ((char *__const __argv[], char **__argz,
 				 size_t *__len));
 
 /* Make a '\0' separated arg vector from a SEP separated list in
@@ -130,4 +132,6 @@ argz_next (char *__argz, size_t __argz_len, const char *__entry)
 }
 #endif /* optimizing GCC2 */
 
+#endif /* use GNU */
+
 #endif /* __ARGZ_H__ */
diff --git a/sysdeps/i386/i686/Implies b/sysdeps/i386/i686/Implies
new file mode 100644
index 0000000000..75fde78977
--- /dev/null
+++ b/sysdeps/i386/i686/Implies
@@ -0,0 +1,2 @@
+# Code optimized for i586 is better than simple i386 code.
+i386/i586
diff --git a/sysdeps/libm-ieee754/s_isnan.c b/sysdeps/libm-ieee754/s_isnan.c
index 4d8983c9b3..1aed525af1 100644
--- a/sysdeps/libm-ieee754/s_isnan.c
+++ b/sysdeps/libm-ieee754/s_isnan.c
@@ -38,5 +38,6 @@ static char rcsid[] = "$NetBSD: s_isnan.c,v 1.8 1995/05/10 20:47:36 jtc Exp $";
 }
 weak_alias (__isnan, isnan)
 #ifdef NO_LONG_DOUBLE
+strong_alias (__isnan, __isnanl)
 weak_alias (__isnan, isnanl)
 #endif
diff --git a/sysdeps/posix/tempname.c b/sysdeps/posix/tempname.c
index 5881febf81..0f088ec915 100644
--- a/sysdeps/posix/tempname.c
+++ b/sysdeps/posix/tempname.c
@@ -202,7 +202,6 @@ __stdio_gen_tempname (const char *dir, const char *pfx, int dir_search,
 		  goto lose;
 		}
 	      fp->file._flags &= ~_IO_DELETE_DONT_CLOSE;
-	      fp->file._IO_file_flags = 0;
 
 	      *streamptr = (FILE *) fp;
 #else
diff --git a/sysdeps/unix/sysv/linux/alpha/clone.S b/sysdeps/unix/sysv/linux/alpha/clone.S
new file mode 100644
index 0000000000..a1ef324956
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/clone.S
@@ -0,0 +1,118 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+   Contributed by Richard Henderson (rth@tamu.edu)
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/* clone() is even more special than fork() as it mucks with stacks
+   and invokes a function in the right context after its all over.  */
+
+#include <sysdep.h>
+#include <errnos.h>
+
+/* int clone(int (*fn)(), void *child_stack, int flags, int nargs, ...) */
+
+        .text
+ENTRY(__clone)
+	lda	sp,-16(sp)
+	.frame	sp,16,$26,0
+	/* Save rest of argument registers for varargs-type work.  */
+	stq	a4,0(sp)
+	stq	a5,8(sp)
+	.prologue 1
+
+	/* Sanity check arguments.  */
+	sextl	a3,a3
+	ldiq	v0,EINVAL
+	beq	a0,$error		/* no NULL function pointers */
+	beq	a1,$error		/* no NULL stack pointers */
+	blt	a3,$error		/* no negative argument counts */
+
+	/* Allocate space on the new stack and copy args over */
+	mov	a3,t0			/* save nargs for thread_start */
+	s8addq	a3,sp,t1
+1:	ldq	t2,-8(t1)
+	subq	t1,8,t1
+	stq	t2,-8(a1)
+	subq	a3,1,a3
+	subq	a1,8,a1
+	bne	a3,1b
+
+	/* Do the system call */
+	mov	a0,pv			/* get fn ptr out of the way */
+	mov	a2,a0
+	ldiq	v0,__NR_clone
+	call_pal PAL_callsys
+
+	bne	a3,$error
+	beq	v0,thread_start
+
+	/* Successful return from the parent */
+	lda	sp,16(sp)
+	ret
+
+	/* Something bad happened -- no child created */
+$error:
+	br	gp,1f
+1:	ldgp	gp,0(gp)
+	lda	sp,16(sp)
+	jmp	zero,__syscall_error
+
+	END(__clone)
+
+/* Load up the arguments to the function.  Put this block of code in
+   its own function so that we can terminate the stack trace with our
+   debug info.
+
+   At this point we have $t0=nargs, $pv=fn, $sp=&arg[0].  */
+
+	.ent thread_start
+thread_start:
+	.frame fp,0,zero,0
+	mov	zero,fp
+	.prologue 0
+
+	/* Calculate address of jump into argument loading code */
+	cmple	t0,6,t2		/* no more than 6 args in registers */
+	cmoveq	t2,6,t0
+	br	v0,1f		/* find address of arg0 */
+1:	lda	v0,$arg0-1b(v0)
+	s4addq	t0,zero,t1
+	subq	v0,t1,v0
+	jmp	(v0)
+
+	/* Load the integer register arguments */
+	ldq	a5,40(sp)
+	ldq	a4,32(sp)
+	ldq	a3,24(sp)
+	ldq	a2,16(sp)
+	ldq	a1,8(sp)
+	ldq	a0,0(sp)
+$arg0:
+
+	/* Adjust stack to remove the arguments we just loaded */
+	s8addq	t0,sp,sp
+
+	/* Call the user's function */
+	jsr	ra,(pv)
+	ldgp	gp,0(ra)
+
+	/* Call _exit rather than doing it inline for breakpoint purposes */
+	mov	v0,a0
+	jsr	ra,_exit
+
+	.end thread_start
+
+weak_alias(__clone, clone)
diff --git a/sysdeps/unix/sysv/linux/direntry.h b/sysdeps/unix/sysv/linux/direntry.h
index 1d661d642a..732a068461 100644
--- a/sysdeps/unix/sysv/linux/direntry.h
+++ b/sysdeps/unix/sysv/linux/direntry.h
@@ -1,8 +1,26 @@
-/* Get `struct dirent' from the Linux kernel header file.  */
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
 
 #ifndef _DIRENTRY_H
-#define _DIRENTRY_H
+#define _DIRENTRY_H	1
 
+/* Get `struct dirent' from the Linux kernel header file.  */
+#include <asm/posix_types.h>
 #include <linux/dirent.h>
 
 #define d_fileno	d_ino	/* backwards compatibility */
diff --git a/sysdeps/unix/sysv/linux/ftime.c b/sysdeps/unix/sysv/linux/ftime.c
new file mode 100644
index 0000000000..e8b5e6e60b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/ftime.c
@@ -0,0 +1,3 @@
+/* Linux defines the ftime system call but doesn't actually implement
+   it.  Use the generic implementation.  */
+#include <sysdeps/generic/ftime.c>
diff --git a/sysdeps/unix/sysv/linux/i386/clone.S b/sysdeps/unix/sysv/linux/i386/clone.S
new file mode 100644
index 0000000000..02f561927e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/clone.S
@@ -0,0 +1,80 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+   Contributed by Richard Henderson (rth@tamu.edu)
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/* clone() is even more special than fork() as it mucks with stacks
+   and invokes a function in the right context after its all over.  */
+
+#include <sysdep.h>
+#include <errnos.h>
+
+/* int clone(int (*fn)(), void *child_stack, int flags, int nargs, ...) */
+
+        .text
+ENTRY(__clone)
+	/* Sanity check arguments.  */
+	movl	$-EINVAL,%eax
+	movl	4(%esp),%ecx		/* no NULL function pointers */
+	testl	%ecx,%ecx
+	jz	syscall_error
+	movl	8(%esp),%ecx		/* no NULL stack pointers */
+	testl	%ecx,%ecx
+	jz	syscall_error
+	movl	16(%esp),%edx		/* no negative argument counts */
+	testl	%edx,%edx
+	js	syscall_error
+
+	/* Allocate space on the new stack and copy args over */
+	movl	%edx,%eax
+	negl	%eax
+	lea	-4(%ecx,%eax,4),%ecx
+	jz	2f
+1:	movl	16(%esp,%edx,4),%eax
+	movl	%eax,0(%ecx,%edx,4)
+	dec	%edx
+	jnz	1b
+2:
+	/* Save the function pointer as the zeroth argument.
+	   It will be popped off in the child in the ebx frobbing below.  */
+	movl	4(%esp),%eax
+	movl	%eax,0(%ecx)
+
+	/* Do the system call */
+	pushl	%ebx
+	movl	16(%esp),%ebx
+	movl	$SYS_ify(clone),%eax
+	int	$0x80
+	popl	%ebx
+
+	test	%eax,%eax
+	jl	syscall_error
+	jz	thread_start
+
+	ret
+
+	SYSCALL_ERROR_HANDLER
+
+thread_start:
+	subl	%ebp,%ebp	/* terminate the stack frame */
+	call	*%ebx
+#ifdef PIC
+	call	_exit@PLT
+#else
+	call	_exit
+#endif
+
+weak_alias(__clone, clone)
diff --git a/sysdeps/unix/sysv/linux/m68k/resourcebits.h b/sysdeps/unix/sysv/linux/m68k/resourcebits.h
index 65cc6e550a..d2f2daef91 100644
--- a/sysdeps/unix/sysv/linux/m68k/resourcebits.h
+++ b/sysdeps/unix/sysv/linux/m68k/resourcebits.h
@@ -54,6 +54,9 @@ enum __rlimit_resource
     /* Locked-in-memory address space.  */
     RLIMIT_MEMLOCK,
 #define	RLIMIT_MEMLOCK	RLIMIT_MEMLOCK
+    /* Address space limit.  */
+    RLIMIT_AS,
+#define	RLIMIT_AS	RLIMIT_AS
 
     RLIMIT_NLIMITS,		/* Number of limit flavors.  */
     RLIM_NLIMITS = RLIMIT_NLIMITS /* Traditional name for same.  */
diff --git a/sysdeps/unix/sysv/linux/sys/acct.h b/sysdeps/unix/sysv/linux/sys/acct.h
index adb2da7a99..da039307d1 100644
--- a/sysdeps/unix/sysv/linux/sys/acct.h
+++ b/sysdeps/unix/sysv/linux/sys/acct.h
@@ -21,6 +21,9 @@ Boston, MA 02111-1307, USA.  */
 #define _SYS_ACCT_H	1
 #include <features.h>
 
+#define	__need_time_t
+#include <time.h>
+
 /* Get needed constants.  */
 #include <linux/acct.h>
 
diff --git a/sysdeps/unix/sysv/linux/sys/io.h b/sysdeps/unix/sysv/linux/sys/io.h
index d44850f025..6f0b9aba14 100644
--- a/sysdeps/unix/sysv/linux/sys/io.h
+++ b/sysdeps/unix/sysv/linux/sys/io.h
@@ -16,9 +16,12 @@ License along with the GNU C Library; see the file COPYING.LIB.  If
 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 Cambridge, MA 02139, USA.  */
 
-#ifndef _SYS_IO_H
-#define _SYS_IO_H
+#ifndef	_SYS_IO_H
 
+#define	_SYS_IO_H	1
+#include <features.h>
+
+/* Get constants from kernel header files. */
 #include <asm/io.h>
 
 /* If TURN_ON is TRUE, request for permission to do direct i/o on the
@@ -28,12 +31,12 @@ Cambridge, MA 02139, USA.  */
    Portability note: not all Linux platforms support this call.  Most
    platforms based on the PC I/O architecture probably will, however.
    E.g., Linux/Alpha for Alpha PCs supports this.  */
-extern int ioperm __P((unsigned long __from, unsigned long __num,
-		       int __turn_on));
+extern int ioperm __P ((unsigned long int __from, unsigned long int __num,
+			int __turn_on));
 
 /* Set the I/O privilege level to LEVEL.  If LEVEL>3, permission to
    access any I/O port is granted.  This call requires root
    privileges. */
-extern int iopl __P((int __level));
+extern int iopl __P ((int __level));
 
 #endif /* _SYS_IO_H */
diff --git a/sysdeps/unix/sysv/linux/sys/klog.h b/sysdeps/unix/sysv/linux/sys/klog.h
index b8a39d6492..91811c3e32 100644
--- a/sysdeps/unix/sysv/linux/sys/klog.h
+++ b/sysdeps/unix/sysv/linux/sys/klog.h
@@ -1,10 +1,30 @@
-#ifndef _SYS_KLOG_H
-#define _SYS_KLOG_H
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#ifndef	_SYS_KLOG_H
+
+#define	_SYS_KLOG_H	1
+#include <features.h>
 
 /* Control the kernel's logging facility.  This corresponds exactly to
    the kernel's syslog system call, but that name is easily confused
    with the user-level syslog facility, which is something completely
    different.  */
-extern int klogctl __P((int type, char *bufp, int len));
+extern int klogctl __P ((int __type, char *__bufp, int __len));
 
 #endif /* _SYS_KLOG_H */
diff --git a/sysdeps/unix/sysv/linux/sys/module.h b/sysdeps/unix/sysv/linux/sys/module.h
index 5c4dbcea37..1062854704 100644
--- a/sysdeps/unix/sysv/linux/sys/module.h
+++ b/sysdeps/unix/sysv/linux/sys/module.h
@@ -1,21 +1,24 @@
-#ifndef _SYS_MODULE_H
-#define _SYS_MODULE_H
+#ifndef	_SYS_MODULE_H
 
+#define	_SYS_MODULE_H	1
 #include <features.h>
 
+#define __need_size_t
+#include <stddef.h>
+
 #include <linux/module.h>
 
 /* Return number of kernel symbols if TABLE == NULL, otherwise, return
    kernel symbols in TABLE.  TABLE must be large enough to hold all
    kernel symbols.  */
-extern int get_kernel_syms __P((struct kernel_sym * table));
+extern int get_kernel_syms __P ((struct kernel_sym * table));
 
 /* Create a new module of name MODULE_NAME and of size SIZE bytes.
    The return address is the starting address of the new module or -1L
    if the module cannot be created (the return value needs to be cast
    to (long) to detect the error condition).  */
-extern unsigned long create_module __P((const char * module_name,
-					size_t size));
+extern unsigned long create_module __P ((__const char * module_name,
+					 size_t size));
 
 /* Initialize the module called MODULE_NAME with the CONTENTSSIZE
    bytes starting at address CONTENTS.  CONTENTS normally contains the
@@ -25,12 +28,12 @@ extern unsigned long create_module __P((const char * module_name,
    ROUTINES.cleanup is executed.  SYMTAB is NULL if the module does
    not want to export symbols by itself, or a pointer to a symbol
    table if the module wants to register its own symbols.  */
-extern int init_module __P((const char * module_name,
-			    const void * contents, size_t contentssize,
-			    struct mod_routines * routines,
-			    struct symbol_table * symtab));
+extern int init_module __P ((__const char * module_name,
+			     __const void * contents, size_t contentssize,
+			     struct mod_routines * routines,
+			     struct symbol_table * symtab));
 
 /* Delete the module named MODULE_NAME from the kernel.  */
-extern int delete_module __P((const char *module_name));
+extern int delete_module __P ((__const char *module_name));
 
 #endif /* _SYS_MODULE_H */
diff --git a/sysdeps/unix/sysv/linux/sys/timex.h b/sysdeps/unix/sysv/linux/sys/timex.h
index fad47cd607..8543b0deae 100644
--- a/sysdeps/unix/sysv/linux/sys/timex.h
+++ b/sysdeps/unix/sysv/linux/sys/timex.h
@@ -1,4 +1,5 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Library General Public License as
@@ -15,10 +16,12 @@ License along with the GNU C Library; see the file COPYING.LIB.  If
 not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
-#ifndef _SYS_TIMEX_H
-#define _SYS_TIMEX_H
+#ifndef	_SYS_TIMEX_H
 
+#define	_SYS_TIMEX_H	1
 #include <features.h>
+
+#include <sys/time.h>
 #include <linux/timex.h>
 
 __BEGIN_DECLS