about summary refs log tree commit diff
path: root/sysdeps/mach/hurd
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/mach/hurd')
-rw-r--r--sysdeps/mach/hurd/Dist17
-rw-r--r--sysdeps/mach/hurd/Subdirs10
-rw-r--r--sysdeps/mach/hurd/alpha/Dist1
-rw-r--r--sysdeps/mach/hurd/alpha/longjmp-ts.c3
-rw-r--r--sysdeps/mach/hurd/bits/ioctls.h1
-rw-r--r--sysdeps/mach/hurd/bits/posix_opt.h108
-rw-r--r--sysdeps/mach/hurd/bits/stat.h7
-rw-r--r--sysdeps/mach/hurd/dl-sysdep.h8
-rw-r--r--sysdeps/mach/hurd/errno.c1
-rw-r--r--sysdeps/mach/hurd/euidaccess.c3
-rw-r--r--sysdeps/mach/hurd/faccessat.c70
-rw-r--r--sysdeps/mach/hurd/fchmodat.c44
-rw-r--r--sysdeps/mach/hurd/fchownat.c46
-rw-r--r--sysdeps/mach/hurd/fdopendir.c58
-rw-r--r--sysdeps/mach/hurd/fgetxattr.c (renamed from sysdeps/mach/hurd/mips/init-fault.c)33
-rw-r--r--sysdeps/mach/hurd/flistxattr.c (renamed from sysdeps/mach/hurd/nfs/nfs.h)26
-rw-r--r--sysdeps/mach/hurd/fork.c5
-rw-r--r--sysdeps/mach/hurd/fremovexattr.c (renamed from sysdeps/mach/hurd/mips/longjmp-ctx.c)33
-rw-r--r--sysdeps/mach/hurd/fsetxattr.c34
-rw-r--r--sysdeps/mach/hurd/fxstatat.c33
-rw-r--r--sysdeps/mach/hurd/fxstatat64.c46
-rw-r--r--sysdeps/mach/hurd/getdents.c2
-rw-r--r--sysdeps/mach/hurd/getpeername.c14
-rw-r--r--sysdeps/mach/hurd/getresgid.c14
-rw-r--r--sysdeps/mach/hurd/getresuid.c14
-rw-r--r--sysdeps/mach/hurd/getsid.c3
-rw-r--r--sysdeps/mach/hurd/getxattr.c35
-rw-r--r--sysdeps/mach/hurd/hppa/bits/sigcontext.h94
-rw-r--r--sysdeps/mach/hurd/hppa/trampoline.c230
-rw-r--r--sysdeps/mach/hurd/i386/Dist3
-rw-r--r--sysdeps/mach/hurd/i386/init-first.c25
-rw-r--r--sysdeps/mach/hurd/i386/longjmp-ts.c3
-rw-r--r--sysdeps/mach/hurd/i386/tls.h4
-rw-r--r--sysdeps/mach/hurd/i386/trampoline.c7
-rw-r--r--sysdeps/mach/hurd/ifreq.c (renamed from sysdeps/mach/hurd/ifreq.h)21
-rw-r--r--sysdeps/mach/hurd/init-posix.c2
-rw-r--r--sysdeps/mach/hurd/ioctl.c22
-rw-r--r--sysdeps/mach/hurd/jmp-unwind.c20
-rw-r--r--sysdeps/mach/hurd/lgetxattr.c36
-rw-r--r--sysdeps/mach/hurd/linkat.c66
-rw-r--r--sysdeps/mach/hurd/listxattr.c35
-rw-r--r--sysdeps/mach/hurd/lsetxattr.c37
-rw-r--r--sysdeps/mach/hurd/mig-reply.c4
-rw-r--r--sysdeps/mach/hurd/mips/Dist3
-rw-r--r--sysdeps/mach/hurd/mips/bits/sigcontext.h80
-rw-r--r--sysdeps/mach/hurd/mips/dl-machine.c132
-rw-r--r--sysdeps/mach/hurd/mips/exc2signal.c97
-rw-r--r--sysdeps/mach/hurd/mips/init-first.c414
-rw-r--r--sysdeps/mach/hurd/mips/intr-msg.h127
-rw-r--r--sysdeps/mach/hurd/mips/longjmp-ts.c45
-rw-r--r--sysdeps/mach/hurd/mips/sigreturn.c223
-rw-r--r--sysdeps/mach/hurd/mips/trampoline.c292
-rw-r--r--sysdeps/mach/hurd/mkdirat.c42
-rw-r--r--sysdeps/mach/hurd/open.c8
-rw-r--r--sysdeps/mach/hurd/open64.c1
-rw-r--r--sysdeps/mach/hurd/openat.c62
-rw-r--r--sysdeps/mach/hurd/openat64.c1
-rw-r--r--sysdeps/mach/hurd/opendir.c75
-rw-r--r--sysdeps/mach/hurd/powerpc/Dist1
-rw-r--r--sysdeps/mach/hurd/powerpc/longjmp-ts.c3
-rw-r--r--sysdeps/mach/hurd/powerpc/register-dump.h4
-rw-r--r--sysdeps/mach/hurd/powerpc/trampoline.c7
-rw-r--r--sysdeps/mach/hurd/ppoll.c30
-rw-r--r--sysdeps/mach/hurd/profil.c4
-rw-r--r--sysdeps/mach/hurd/readdir64_r.c2
-rw-r--r--sysdeps/mach/hurd/recv.c6
-rw-r--r--sysdeps/mach/hurd/removexattr.c35
-rw-r--r--sysdeps/mach/hurd/setitimer.c12
-rw-r--r--sysdeps/mach/hurd/setresgid.c11
-rw-r--r--sysdeps/mach/hurd/setresuid.c11
-rw-r--r--sysdeps/mach/hurd/setxattr.c36
-rw-r--r--sysdeps/mach/hurd/sigaltstack.c2
-rw-r--r--sysdeps/mach/hurd/symlinkat.c74
-rw-r--r--sysdeps/mach/hurd/tls.h9
-rw-r--r--sysdeps/mach/hurd/unlinkat.c55
-rw-r--r--sysdeps/mach/hurd/xmknod.c86
-rw-r--r--sysdeps/mach/hurd/xmknodat.c118
77 files changed, 1337 insertions, 2049 deletions
diff --git a/sysdeps/mach/hurd/Dist b/sysdeps/mach/hurd/Dist
deleted file mode 100644
index 52c84297cb..0000000000
--- a/sysdeps/mach/hurd/Dist
+++ /dev/null
@@ -1,17 +0,0 @@
-cthreads.c
-errlist.c
-errnos.awk
-err_hurd.sub
-libc-ldscript
-libc_p-ldscript
-bits/libc-tsd.h
-net/ethernet.h
-net/if_arp.h
-net/if_ether.h
-net/if_ppp.h
-net/route.h
-nfs/nfs.h
-set-init.c
-siglist.h
-statfsconv.c
-xstatconv.c
diff --git a/sysdeps/mach/hurd/Subdirs b/sysdeps/mach/hurd/Subdirs
index 16b8348437..7a7757582a 100644
--- a/sysdeps/mach/hurd/Subdirs
+++ b/sysdeps/mach/hurd/Subdirs
@@ -1 +1,9 @@
-hurd
+# This file says that the hurd subdirectory should appear before all others.
+# The mach and hurd subdirectories have many generated header files which
+# much of the rest of the library depends on, so it is best to build them
+# first (and mach before hurd, at that).  The before-compile additions in
+# sysdeps/{mach,hurd}/Makefile should make it reliably work for these files
+# not to exist when making in other directories, but it will be slower that
+# way with more somewhat expensive `make' invocations.
+
+first hurd
diff --git a/sysdeps/mach/hurd/alpha/Dist b/sysdeps/mach/hurd/alpha/Dist
deleted file mode 100644
index c58180257e..0000000000
--- a/sysdeps/mach/hurd/alpha/Dist
+++ /dev/null
@@ -1 +0,0 @@
-static-start.S
diff --git a/sysdeps/mach/hurd/alpha/longjmp-ts.c b/sysdeps/mach/hurd/alpha/longjmp-ts.c
index b271d6d2a9..f472dbcb30 100644
--- a/sysdeps/mach/hurd/alpha/longjmp-ts.c
+++ b/sysdeps/mach/hurd/alpha/longjmp-ts.c
@@ -1,5 +1,5 @@
 /* Perform a `longjmp' on a Mach thread_state.  Alpha version.
-   Copyright (C) 2002 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2006 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
@@ -19,6 +19,7 @@
 
 #include <hurd/signal.h>
 #include <setjmp.h>
+#include <jmpbuf-offsets.h>
 #include <mach/thread_status.h>
 
 
diff --git a/sysdeps/mach/hurd/bits/ioctls.h b/sysdeps/mach/hurd/bits/ioctls.h
index 206058bf2f..06a73df75e 100644
--- a/sysdeps/mach/hurd/bits/ioctls.h
+++ b/sysdeps/mach/hurd/bits/ioctls.h
@@ -226,6 +226,7 @@ enum __ioctl_datum { IOC_8, IOC_16, IOC_32, IOC_64 };
 #define	SIOCSIFADDR	_IOW('i', 12, struct ifreq)	/* set ifnet address */
 #define	OSIOCGIFADDR	_IOWR('i',13, struct ifreq)	/* get ifnet address */
 #define	SIOCGIFADDR	_IOWR('i',33, struct ifreq)	/* get ifnet address */
+#define	SIOCGIFHWADDR	_IOWR('i',39, struct ifreq)	/* get hwaddress */
 #define	SIOCSIFDSTADDR	_IOW('i', 14, struct ifreq)	/* set p-p address */
 #define	OSIOCGIFDSTADDR	_IOWR('i',15, struct ifreq)	/* get p-p address */
 #define	SIOCGIFDSTADDR	_IOWR('i',34, struct ifreq)	/* get p-p address */
diff --git a/sysdeps/mach/hurd/bits/posix_opt.h b/sysdeps/mach/hurd/bits/posix_opt.h
index 326bebff7f..6747bc276e 100644
--- a/sysdeps/mach/hurd/bits/posix_opt.h
+++ b/sysdeps/mach/hurd/bits/posix_opt.h
@@ -1,5 +1,5 @@
 /* Define POSIX options for GNU/Hurd.
-   Copyright (C) 1998,2000,2001,2002 Free Software Foundation, Inc.
+   Copyright (C) 1998,2000,2001,2002,2006 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
@@ -31,13 +31,6 @@
 /* Processes have a saved set-user-ID and a saved set-group-ID.  */
 #define	_POSIX_SAVED_IDS	1
 
-#if 0				/* XXX implement aio_* */
-/* Asynchronous I/O is supported.  */
-#define _POSIX_ASYNCHRONOUS_IO	1
-/* Alternative name for Unix98.  */
-#define _LFS_ASYNCHRONOUS_IO	_POSIX_ASYNCHRONOUS_IO
-#endif
-
 /* Synchronizing file data is supported, but msync is missing.  */
 #undef _POSIX_SYNCHRONIZED_IO
 
@@ -47,15 +40,15 @@
 /* Mapping of files to memory is supported.  */
 #define	_POSIX_MAPPED_FILES	200112L
 
+/* Locking of all memory could be supported in future.  */
+#define	_POSIX_MEMLOCK	0
+
 /* Locking of ranges of memory is supported.  */
 #define	_POSIX_MEMLOCK_RANGE	200112L
 
 /* Setting of memory protections is supported.  */
 #define	_POSIX_MEMORY_PROTECTION	200112L
 
-/* POSIX.4 shared memory objects are supported (using regular files).  */
-#define _POSIX_SHARED_MEMORY_OBJECTS	_POSIX_MAPPED_FILES
-
 /* Elements of the `c_cc' member of `struct termios' structure
    can be disabled by using the value _POSIX_VDISABLE.  */
 #define _POSIX_VDISABLE			((unsigned char) -1)
@@ -67,13 +60,106 @@
 #undef _POSIX_NO_TRUNC		/* Overlong file names get error?  */
 #undef _POSIX_SYNC_IO		/* File supports O_SYNC et al?  */
 
+
+/* We do not have the POSIX threads interface.  */
+#define _POSIX_THREADS	-1
+
+/* We have the reentrant functions described in POSIX.  */
+#define _POSIX_REENTRANT_FUNCTIONS      1
+#define _POSIX_THREAD_SAFE_FUNCTIONS	200112L
+
+/* These are all things that won't be supported when _POSIX_THREADS is not.  */
+#define _POSIX_THREAD_PRIORITY_SCHEDULING	-1
+#define _POSIX_THREAD_ATTR_STACKSIZE		-1
+#define _POSIX_THREAD_ATTR_STACKADDR		-1
+#define _POSIX_SEMAPHORES			-1
+
+/* Real-time signals are not yet supported.  */
+#define _POSIX_REALTIME_SIGNALS	-1
+
+/* Asynchronous I/O might supported with the existing ABI.  */
+#define _POSIX_ASYNCHRONOUS_IO	0
+/* Alternative name for Unix98.  */
+#define _LFS_ASYNCHRONOUS_IO	_POSIX_ASYNCHRONOUS_IO
+
+/* The LFS support in asynchronous I/O is also available.  */
+#define _LFS64_ASYNCHRONOUS_IO	_POSIX_ASYNCHRONOUS_IO
+
+/* The rest of the LFS is also available.  */
+#define _LFS_LARGEFILE		1
+#define _LFS64_LARGEFILE	1
+#define _LFS64_STDIO		1
+
+/* POSIX.4 shared memory objects are supported (using regular files).  */
+#define _POSIX_SHARED_MEMORY_OBJECTS	_POSIX_MAPPED_FILES
+
+/* CPU-time clocks support needs to be checked at runtime.  */
+#define _POSIX_CPUTIME	0
+
+/* Clock support in threads must be also checked at runtime.  */
+#define _POSIX_THREAD_CPUTIME	0
+
 /* GNU libc provides regular expression handling.  */
 #define _POSIX_REGEXP	1
 
+/* Reader/Writer locks are not available.  */
+#define _POSIX_READER_WRITER_LOCKS	-1
+
 /* We have a POSIX shell.  */
 #define _POSIX_SHELL	1
 
+/* We cannot support the Timeouts option without _POSIX_THREADS.  */
+#define _POSIX_TIMEOUTS	-1
+
 /* The `spawn' function family is supported.  */
 #define _POSIX_SPAWN	200112L
 
+/* We do not have POSIX timers, but could in future without ABI change.  */
+#define _POSIX_TIMERS	0
+
+/* The barrier functions are not available.  */
+#define _POSIX_BARRIERS	-1
+
+/* POSIX message queues could be available in future.  */
+#define	_POSIX_MESSAGE_PASSING	0
+
+/* Thread process-shared synchronization is not supported.  */
+#define _POSIX_THREAD_PROCESS_SHARED	-1
+
+/* The monotonic clock might be available.  */
+#define _POSIX_MONOTONIC_CLOCK	0
+
+/* The clock selection interfaces are available.  */
+#define _POSIX_CLOCK_SELECTION	200112L
+
+/* Advisory information interfaces could be available in future.  */
+#define _POSIX_ADVISORY_INFO	0
+
+/* IPv6 support is available.  */
+#define _POSIX_IPV6	200112L
+
+/* Raw socket support is available.  */
+#define _POSIX_RAW_SOCKETS	200112L
+
+/* We have at least one terminal.  */
+#define _POSIX2_CHAR_TERM	200112L
+
+/* Neither process nor thread sporadic server interfaces is available.  */
+#define _POSIX_SPORADIC_SERVER	-1
+#define _POSIX_THREAD_SPORADIC_SERVER	-1
+
+/* trace.h is not available.  */
+#define _POSIX_TRACE	-1
+#define _POSIX_TRACE_EVENT_FILTER	-1
+#define _POSIX_TRACE_INHERIT	-1
+#define _POSIX_TRACE_LOG	-1
+
+/* Typed memory objects are not available.  */
+#define _POSIX_TYPED_MEMORY_OBJECTS	-1
+
+/* No support for priority inheritance or protection so far.  */
+#define _POSIX_THREAD_PRIO_INHERIT	-1
+#define _POSIX_THREAD_PRIO_PROTECT	-1
+
+
 #endif /* bits/posix_opt.h */
diff --git a/sysdeps/mach/hurd/bits/stat.h b/sysdeps/mach/hurd/bits/stat.h
index 172bc5ea8e..c3f96660cc 100644
--- a/sysdeps/mach/hurd/bits/stat.h
+++ b/sysdeps/mach/hurd/bits/stat.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 93, 94, 96, 97, 99, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1992,93,94,96,97,99,2000,2005 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
@@ -182,8 +182,11 @@ struct stat64
 /* All the bits relevant to translators */
 #define S_ITRANS	000070000000
 
+/* Definitely no mmaps to this.  */
+#define S_IMMAP0	000100000000
+
 /* ALL the unused bits.  */
-#define	S_ISPARE	(~(S_IFMT|S_ITRANS|S_INOCACHE|    \
+#define	S_ISPARE	(~(S_IFMT|S_ITRANS|S_INOCACHE|S_IMMAP0|    \
 			   S_IUSEUNK|S_IUNKNOWN|07777))
 #endif
 
diff --git a/sysdeps/mach/hurd/dl-sysdep.h b/sysdeps/mach/hurd/dl-sysdep.h
index 2dc9b0a910..4b21b779ef 100644
--- a/sysdeps/mach/hurd/dl-sysdep.h
+++ b/sysdeps/mach/hurd/dl-sysdep.h
@@ -1,5 +1,5 @@
 /* System-specific settings for dynamic linker code.  Hurd version.
-   Copyright (C) 2002 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2005 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
@@ -23,3 +23,9 @@
    (open, mmap, etc).  */
 
 #define RTLD_PRIVATE_ERRNO 0
+
+#ifdef SHARED
+/* _dl_argv cannot be attribute_relro, because the stack-switching
+   libc initializer for using cthreads might write into it.  */
+# define DL_ARGV_NOT_RELRO 1
+#endif
diff --git a/sysdeps/mach/hurd/errno.c b/sysdeps/mach/hurd/errno.c
new file mode 100644
index 0000000000..a29091b5e2
--- /dev/null
+++ b/sysdeps/mach/hurd/errno.c
@@ -0,0 +1 @@
+/* No definition of `errno' variable on the Hurd.  */
diff --git a/sysdeps/mach/hurd/euidaccess.c b/sysdeps/mach/hurd/euidaccess.c
index 4e72e2abb3..57f2a015cc 100644
--- a/sysdeps/mach/hurd/euidaccess.c
+++ b/sysdeps/mach/hurd/euidaccess.c
@@ -1,5 +1,5 @@
 /* Test for access to FILE using effective UID and GID.  Hurd version.
-   Copyright (C) 1991, 1995, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1991, 1995, 1997, 2006 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
@@ -57,3 +57,4 @@ __euidaccess (file, type)
   return 0;
 }
 weak_alias (__euidaccess, euidaccess)
+weak_alias (__euidaccess, eaccess)
diff --git a/sysdeps/mach/hurd/faccessat.c b/sysdeps/mach/hurd/faccessat.c
new file mode 100644
index 0000000000..bb3c9fe19f
--- /dev/null
+++ b/sysdeps/mach/hurd/faccessat.c
@@ -0,0 +1,70 @@
+/* Test for access to file, relative to open directory.  Hurd version.
+   Copyright (C) 2006 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <hurd.h>
+#include <hurd/fd.h>
+
+int
+faccessat (fd, file, type, flag)
+     int fd;
+     const char *file;
+     int type;
+     int flag;
+{
+  error_t err;
+  file_t port;
+  int allowed, flags;
+
+  if ((flag & AT_EACCESS) == 0)
+    {
+      if (fd == AT_FDCWD || file[0] == '/')
+	return __access (file, type);
+      __set_errno (ENOTSUP);	/* XXX later */
+      return -1;
+    }
+
+  port = __file_name_lookup_at (fd, flag &~ AT_EACCESS, file, 0, 0);
+  if (port == MACH_PORT_NULL)
+    return -1;
+
+  /* Find out what types of access we are allowed to this file.  */
+  err = __file_check_access (port, &allowed);
+  __mach_port_deallocate (__mach_task_self (), port);
+  if (err)
+    return __hurd_fail (err);
+
+  flags = 0;
+  if (type & R_OK)
+    flags |= O_READ;
+  if (type & W_OK)
+    flags |= O_WRITE;
+  if (type & X_OK)
+    flags |= O_EXEC;
+
+  if (flags & ~allowed)
+    /* We are not allowed all the requested types of access.  */
+    return __hurd_fail (EACCES);
+
+  return 0;
+}
diff --git a/sysdeps/mach/hurd/fchmodat.c b/sysdeps/mach/hurd/fchmodat.c
new file mode 100644
index 0000000000..d27e845274
--- /dev/null
+++ b/sysdeps/mach/hurd/fchmodat.c
@@ -0,0 +1,44 @@
+/* Change the protections of file relative to open directory.  Hurd version.
+   Copyright (C) 2006 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <hurd.h>
+#include <hurd/fd.h>
+
+int
+fchmodat (fd, file, mode, flag)
+     int fd;
+     const char *file;
+     mode_t mode;
+     int flag;
+{
+  error_t err;
+  file_t port = __file_name_lookup_at (fd, flag, file, 0, 0);
+  if (port == MACH_PORT_NULL)
+    return -1;
+  err = __file_chmod (port, mode);
+  __mach_port_deallocate (__mach_task_self (), port);
+  if (err)
+    return __hurd_fail (err);
+  return 0;
+}
diff --git a/sysdeps/mach/hurd/fchownat.c b/sysdeps/mach/hurd/fchownat.c
new file mode 100644
index 0000000000..1b99b29272
--- /dev/null
+++ b/sysdeps/mach/hurd/fchownat.c
@@ -0,0 +1,46 @@
+/* Change owner and group of a file relative to open directory.  Hurd version.
+   Copyright (C) 2006 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <hurd.h>
+#include <hurd/fd.h>
+
+/* Change the owner and group of FILE.  */
+int
+fchownat (fd, file, owner, group, flag)
+     int fd;
+     const char *file;
+     uid_t owner;
+     gid_t group;
+     int flag;
+{
+  error_t err;
+  file_t port = __file_name_lookup_at (fd, flag, file, 0, 0);
+  if (port == MACH_PORT_NULL)
+    return -1;
+  err = __file_chown (port, owner, group);
+  __mach_port_deallocate (__mach_task_self (), port);
+  if (err)
+    return __hurd_fail (err);
+  return 0;
+}
diff --git a/sysdeps/mach/hurd/fdopendir.c b/sysdeps/mach/hurd/fdopendir.c
new file mode 100644
index 0000000000..016f825f1d
--- /dev/null
+++ b/sysdeps/mach/hurd/fdopendir.c
@@ -0,0 +1,58 @@
+/* Open a directory stream from a file descriptor.  Hurd version.
+   Copyright (C) 2005, 2006 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <dirent.h>
+#include <errno.h>
+#include <hurd.h>
+#include <hurd/fd.h>
+#include <fcntl.h>
+
+DIR *_hurd_fd_opendir (struct hurd_fd *d); /* opendir.c */
+
+/* Open a directory stream on FD.  */
+DIR *
+__fdopendir (int fd)
+{
+  struct hurd_fd *d = _hurd_fd_get (fd);
+
+  if (d == NULL)
+    {
+      errno = EBADF;
+      return NULL;
+    }
+
+  /* Ensure that it's a directory.  */
+  error_t err = HURD_FD_PORT_USE
+    (d, ({
+	file_t dir = __file_name_lookup_under (port, "/",
+					       O_DIRECTORY | O_NOTRANS, 0);;
+	if (dir != MACH_PORT_NULL)
+	  __mach_port_deallocate (__mach_task_self (), dir);
+	dir != MACH_PORT_NULL ? 0 : errno;
+      }));
+
+  if (err)
+    {
+      errno = err;
+      return NULL;
+    }
+
+  return _hurd_fd_opendir (d);
+}
+weak_alias (__fdopendir, fdopendir)
diff --git a/sysdeps/mach/hurd/mips/init-fault.c b/sysdeps/mach/hurd/fgetxattr.c
index 05f48a3a56..2eb6db06c7 100644
--- a/sysdeps/mach/hurd/mips/init-fault.c
+++ b/sysdeps/mach/hurd/fgetxattr.c
@@ -1,5 +1,5 @@
-/* Set up a thread_state for proc_handle_exceptions.  MIPS version.
-   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Access to extended attributes on files.  Hurd version.
+   Copyright (C) 2004 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,25 +17,18 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <hurd/signal.h>
-#include <mach/thread_status.h>
-#include <string.h>
-#include <setjmp.h>
+#include <errno.h>
+#include <sys/xattr.h>
+#include <hurd.h>
+#include <hurd/xattr.h>
+#include <hurd/fd.h>
 
-extern jmp_buf _hurd_sigthread_fault_env;
-
-static char fault_stack[32];
-static volatile void
-faulted (void)
+ssize_t
+fgetxattr (int fd, const char *name, void *value, size_t size)
 {
-  __longjmp (_hurd_sigthread_fault_env, 1);
-}
+  error_t err;
 
-void
-_hurd_initialize_fault_recovery_state (void *state)
-{
-  struct mips_thread_state *ts = state;
-  memset (ts, 0, sizeof (*ts));
-  ts->r29 = (int) &fault_stack[sizeof (fault_stack)];
-  ts->pc = (int) &faulted;
+  err = HURD_DPORT_USE (fd, _hurd_xattr_get (port, name, value, &size));
+
+  return err ? __hurd_dfail (fd, err) : size;
 }
diff --git a/sysdeps/mach/hurd/nfs/nfs.h b/sysdeps/mach/hurd/flistxattr.c
index e83a874fe6..a577e4e393 100644
--- a/sysdeps/mach/hurd/nfs/nfs.h
+++ b/sysdeps/mach/hurd/flistxattr.c
@@ -1,5 +1,5 @@
-/* <nfs/nfs.h> -- ill-specified NFS-related definitions
-   Copyright (C) 1999 Free Software Foundation, Inc.
+/* Access to extended attributes on files.  Hurd version.
+   Copyright (C) 2005 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,16 +17,18 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#ifndef _NFS_NFS_H
-#define _NFS_NFS_H 1
+#include <errno.h>
+#include <sys/xattr.h>
+#include <hurd.h>
+#include <hurd/xattr.h>
+#include <hurd/fd.h>
 
-/* This file is empty for now.  Its contents do not seem to be
-   standardized in any way.  It exists solely for the sake of
-   <rpcsvc/bootparam_prot.h> which insists on including <nfs/nfs.h>.
+ssize_t
+flistxattr (int fd, char *list, size_t size)
+{
+  error_t err;
 
-   For the time being, we just provide this file here to smooth building
-   the libc distribution (i.e. librpcsvc).  We do not install this file for
-   users, since we haven't really figured out what the right thing to go
-   here is.  */
+  err = HURD_DPORT_USE (fd, _hurd_xattr_list (port, list, &size));
 
-#endif /* nfs/nfs.h */
+  return err ? __hurd_dfail (fd, err) : size;
+}
diff --git a/sysdeps/mach/hurd/fork.c b/sysdeps/mach/hurd/fork.c
index 8728596915..fa7da60204 100644
--- a/sysdeps/mach/hurd/fork.c
+++ b/sysdeps/mach/hurd/fork.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 1994,95,96,97,99,2001,02, 04 Free Software Foundation, Inc.
+/* Copyright (C) 1994,1995,1996,1997,1999,2001,2002,2004,2005
+	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
@@ -21,7 +22,7 @@
 #include <hurd.h>
 #include <hurd/signal.h>
 #include <setjmp.h>
-#include "thread_state.h"
+#include <thread_state.h>
 #include <sysdep.h>		/* For stack growth direction.  */
 #include "set-hooks.h"
 #include <assert.h>
diff --git a/sysdeps/mach/hurd/mips/longjmp-ctx.c b/sysdeps/mach/hurd/fremovexattr.c
index 66ee7b6fb8..5d3aca6093 100644
--- a/sysdeps/mach/hurd/mips/longjmp-ctx.c
+++ b/sysdeps/mach/hurd/fremovexattr.c
@@ -1,5 +1,5 @@
-/* Perform a `longjmp' on a `struct sigcontext'.  MIPS version.
-   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Access to extended attributes on files.  Hurd version.
+   Copyright (C) 2005 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,25 +17,18 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <setjmp.h>
-#include <hurd/signal.h>
-#include <string.h>
+#include <errno.h>
+#include <sys/xattr.h>
+#include <hurd.h>
+#include <hurd/xattr.h>
+#include <hurd/fd.h>
 
-void
-_hurd_longjmp_sigcontext (struct sigcontext *scp, jmp_buf env, int retval)
+int
+fremovexattr (int fd, const char *name)
 {
-  scp->sc_gpr[16] = env[0].__regs[0];
-  scp->sc_gpr[17] = env[0].__regs[1];
-  scp->sc_gpr[18] = env[0].__regs[2];
-  scp->sc_gpr[19] = env[0].__regs[3];
-  scp->sc_gpr[20] = env[0].__regs[4];
-  scp->sc_gpr[21] = env[0].__regs[5];
-  scp->sc_gpr[22] = env[0].__regs[6];
-  scp->sc_gpr[23] = env[0].__regs[7];
+  error_t err;
 
-  scp->sc_gpr[28] = (int) env[0].__gp;
-  scp->sc_fp = (int) env[0].__fp;
-  scp->sc_sp = (int) env[0].__sp;
-  scp->sc_pc = (int) env[0].__pc;
-  scp->sc_gpr[2] = retval ?: 1;
+  err = HURD_DPORT_USE (fd, _hurd_xattr_remove (port, name));
+
+  return err ? __hurd_dfail (fd, err) : 0;
 }
diff --git a/sysdeps/mach/hurd/fsetxattr.c b/sysdeps/mach/hurd/fsetxattr.c
new file mode 100644
index 0000000000..db8b676a06
--- /dev/null
+++ b/sysdeps/mach/hurd/fsetxattr.c
@@ -0,0 +1,34 @@
+/* Access to extended attributes on files.  Hurd version.
+   Copyright (C) 2006 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <sys/xattr.h>
+#include <hurd.h>
+#include <hurd/xattr.h>
+#include <hurd/fd.h>
+
+ssize_t
+fsetxattr (int fd, const char *name, const void *value, size_t size, int flags)
+{
+  error_t err;
+
+  err = HURD_DPORT_USE (fd, _hurd_xattr_set (port, name, value, size, flags));
+
+  return err ? __hurd_dfail (fd, err) : 0;
+}
diff --git a/sysdeps/mach/hurd/fxstatat.c b/sysdeps/mach/hurd/fxstatat.c
new file mode 100644
index 0000000000..dd9d2796eb
--- /dev/null
+++ b/sysdeps/mach/hurd/fxstatat.c
@@ -0,0 +1,33 @@
+/* Get information about file named relative to open directory.  Hurd version.
+   Copyright (C) 2006 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <stddef.h>
+#include <sys/stat.h>
+
+#include "xstatconv.c"
+
+int
+__fxstatat (int vers, int fd, const char *filename, struct stat *buf, int flag)
+{
+  struct stat64 buf64;
+  return (__fxstatat64 (vers, fd, filename, &buf64, flag)
+	  ?: xstat64_conv (buf, &buf64));
+}
+libc_hidden_def (__fxstatat)
diff --git a/sysdeps/mach/hurd/fxstatat64.c b/sysdeps/mach/hurd/fxstatat64.c
new file mode 100644
index 0000000000..6862e80d52
--- /dev/null
+++ b/sysdeps/mach/hurd/fxstatat64.c
@@ -0,0 +1,46 @@
+/* Get information about file named relative to open directory.  Hurd version.
+   Copyright (C) 2006 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <sys/stat.h>
+#include <hurd.h>
+#include <hurd/fd.h>
+
+/* Get information about the file descriptor FD in BUF.  */
+int
+__fxstatat64 (int vers, int fd, const char *filename, struct stat64 *buf,
+	      int flag)
+{
+  error_t err;
+  io_t port;
+
+  if (vers != _STAT_VER)
+    return __hurd_fail (EINVAL);
+
+  port = __file_name_lookup_at (fd, flag, filename, 0, 0);
+  if (port == MACH_PORT_NULL)
+    return -1;
+
+  err = __io_stat (port, buf);
+  __mach_port_deallocate (__mach_task_self (), port);
+
+  return __hurd_fail (err);
+}
diff --git a/sysdeps/mach/hurd/getdents.c b/sysdeps/mach/hurd/getdents.c
index 4775f983b4..d15be3b8f3 100644
--- a/sysdeps/mach/hurd/getdents.c
+++ b/sysdeps/mach/hurd/getdents.c
@@ -1 +1 @@
-#include <sysdeps/generic/getdents.c>
+#include <dirent/getdents.c>
diff --git a/sysdeps/mach/hurd/getpeername.c b/sysdeps/mach/hurd/getpeername.c
index 2e4f9f6a9d..325b6fd75d 100644
--- a/sysdeps/mach/hurd/getpeername.c
+++ b/sysdeps/mach/hurd/getpeername.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 1994, 1997, 1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1992,1994,1997,1999,2000,2005 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
@@ -47,14 +47,22 @@ __getpeername (int fd, __SOCKADDR_ARG addrarg, socklen_t *len)
 
   if (*len > buflen)
     *len = buflen;
-  
+
   if (buf != (char *) addr)
     {
       memcpy (addr, buf, *len);
       __vm_deallocate (__mach_task_self (), (vm_address_t) buf, buflen);
     }
 
-  addr->sa_family = type;
+  const sa_family_t family = type;
+  if (*len > offsetof (struct sockaddr, sa_family))
+    {
+      if (*len < (char *) (&addr->sa_family + 1) - (char *) addr)
+	memcpy (&addr->sa_family, &family,
+		*len - offsetof (struct sockaddr, sa_family));
+      else
+	addr->sa_family = family;
+    }
 
   return 0;
 }
diff --git a/sysdeps/mach/hurd/getresgid.c b/sysdeps/mach/hurd/getresgid.c
index a96aa49369..7847d213c4 100644
--- a/sysdeps/mach/hurd/getresgid.c
+++ b/sysdeps/mach/hurd/getresgid.c
@@ -1,5 +1,5 @@
-/* getresgid -- fetch effective group ID, real group ID, and saved-set group ID
-   Copyright (C) 2002 Free Software Foundation, Inc.
+/* getresgid -- fetch real group ID, effective group ID, and saved-set group ID
+   Copyright (C) 2002, 2006 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
@@ -22,13 +22,13 @@
 #include <hurd.h>
 #include <hurd/id.h>
 
-/* Fetch the effective group ID, real group ID, and saved-set group ID,
+/* Fetch the real group ID, effective group ID, and saved-set group ID,
    of the calling process.  */
 int
-__getresgid (gid_t *egid, gid_t *rgid, gid_t *sgid)
+__getresgid (gid_t *rgid, gid_t *egid, gid_t *sgid)
 {
   error_t err;
-  gid_t eff, real, saved;
+  gid_t real, eff, saved;
 
   HURD_CRITICAL_BEGIN;
   __mutex_lock (&_hurd_id.lock);
@@ -42,8 +42,8 @@ __getresgid (gid_t *egid, gid_t *rgid, gid_t *sgid)
       else
 	{
 	  real = _hurd_id.aux.gids[0];
-	  saved = _hurd_id.aux.ngids < 2 ? real :_hurd_id.aux.gids[1];
 	  eff = _hurd_id.gen.ngids < 1 ? real : _hurd_id.gen.gids[0];
+	  saved = _hurd_id.aux.ngids < 2 ? real : _hurd_id.aux.gids[1];
 	}
     }
 
@@ -53,8 +53,8 @@ __getresgid (gid_t *egid, gid_t *rgid, gid_t *sgid)
   if (err)
     return __hurd_fail (err);
 
-  *egid = eff;
   *rgid = real;
+  *egid = eff;
   *sgid = saved;
   return 0;
 }
diff --git a/sysdeps/mach/hurd/getresuid.c b/sysdeps/mach/hurd/getresuid.c
index f4bfaeaf56..668e463a39 100644
--- a/sysdeps/mach/hurd/getresuid.c
+++ b/sysdeps/mach/hurd/getresuid.c
@@ -1,5 +1,5 @@
-/* getresuid -- fetch effective user ID, real user ID, and saved-set user ID
-   Copyright (C) 2002 Free Software Foundation, Inc.
+/* getresuid -- fetch real user ID, effective user ID, and saved-set user ID
+   Copyright (C) 2002, 2006 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
@@ -22,13 +22,13 @@
 #include <hurd.h>
 #include <hurd/id.h>
 
-/* Fetch the effective user ID, real user ID, and saved-set user ID,
+/* Fetch the real user ID, effective user ID, and saved-set user ID,
    of the calling process.  */
 int
-__getresuid (uid_t *euid, uid_t *ruid, uid_t *suid)
+__getresuid (uid_t *ruid, uid_t *euid, uid_t *suid)
 {
   error_t err;
-  uid_t eff, real, saved;
+  uid_t real, eff, saved;
 
   HURD_CRITICAL_BEGIN;
   __mutex_lock (&_hurd_id.lock);
@@ -42,8 +42,8 @@ __getresuid (uid_t *euid, uid_t *ruid, uid_t *suid)
       else
 	{
 	  real = _hurd_id.aux.uids[0];
-	  saved = _hurd_id.aux.nuids < 2 ? real :_hurd_id.aux.uids[1];
 	  eff = _hurd_id.gen.nuids < 1 ? real : _hurd_id.gen.uids[0];
+	  saved = _hurd_id.aux.nuids < 2 ? real : _hurd_id.aux.uids[1];
 	}
     }
 
@@ -53,8 +53,8 @@ __getresuid (uid_t *euid, uid_t *ruid, uid_t *suid)
   if (err)
     return __hurd_fail (err);
 
-  *euid = eff;
   *ruid = real;
+  *euid = eff;
   *suid = saved;
   return 0;
 }
diff --git a/sysdeps/mach/hurd/getsid.c b/sysdeps/mach/hurd/getsid.c
index 57c10c58b7..9dcfa90fde 100644
--- a/sysdeps/mach/hurd/getsid.c
+++ b/sysdeps/mach/hurd/getsid.c
@@ -28,6 +28,9 @@ getsid (pid_t pid)
   error_t err;
   pid_t sid;
 
+  if (pid == 0)
+    pid = _hurd_pid;
+
   err = __USEPORT (PROC, __proc_getsid (port, pid, &sid));
   if (err)
     return (pid_t) __hurd_fail (err);
diff --git a/sysdeps/mach/hurd/getxattr.c b/sysdeps/mach/hurd/getxattr.c
new file mode 100644
index 0000000000..8f688a1d2f
--- /dev/null
+++ b/sysdeps/mach/hurd/getxattr.c
@@ -0,0 +1,35 @@
+/* Access to extended attributes on files.  Hurd version.
+   Copyright (C) 2004 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <sys/xattr.h>
+#include <hurd.h>
+#include <hurd/xattr.h>
+
+ssize_t
+getxattr (const char *path, const char *name, void *value, size_t size)
+{
+  error_t err;
+  file_t port = __file_name_lookup (path, 0, 0);
+  if (port == MACH_PORT_NULL)
+    return -1;
+  err = _hurd_xattr_get (port, name, value, &size);
+  __mach_port_deallocate (__mach_task_self (), port);
+  return err ? __hurd_fail (err) : size;
+}
diff --git a/sysdeps/mach/hurd/hppa/bits/sigcontext.h b/sysdeps/mach/hurd/hppa/bits/sigcontext.h
deleted file mode 100644
index 5db43fc22c..0000000000
--- a/sysdeps/mach/hurd/hppa/bits/sigcontext.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/* Machine-dependent signal context structure for GNU Hurd.  HPPA version.
-   Copyright (C) 1995,97,2001 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 Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
-# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
-#endif
-
-#ifndef sc_parisc_thread_state
-
-/* Signal handlers are actually called:
-   void handler (int sig, int code, struct sigcontext *scp);  */
-
-/* State of this thread when the signal was taken.  */
-struct sigcontext
-  {
-    /* These first members are machine-independent.  */
-
-    int sc_onstack;		/* Nonzero if running on sigstack.  */
-    __sigset_t sc_mask;		/* Blocked signals to restore.  */
-
-    /* MiG reply port this thread is using.  */
-    unsigned int sc_reply_port;
-
-    /* Port this thread is doing an interruptible RPC on.  */
-    unsigned int sc_intr_port;
-
-    /* Error code associated with this signal (interpreted as `error_t').  */
-    int sc_error;
-
-    /* All following members are machine-dependent.  The rest of this
-       structure is written to be laid out identically to a `struct
-       parisc_thread_state'.  trampoline.c knows this, so it must be
-       changed if this changes.  */
-
-#define sc_parisc_thread_state sc_flags /* Beginning of correspondence.  */
-    /* "General" registers $1..$31.  */
-    unsigned int sc_regs[31];
-
-    /* Control registers.  */
-    unsigned int sc_cr11;	/* sar */
-    /* These four registers make up the PC.  */
-    unsigned int iioq_head;
-    unsigned int iisq_head;
-    unsigned int iioq_tail;
-    unsigned int iisq_tail;
-    unsigned int sc_cr15;
-    unsigned int sc_cr19;
-    unsigned int sc_cr20;
-    unsigned int sc_cr21;
-    unsigned int sc_cr22;	/* ipsw */
-    unsigned int sc_bsd_goto;	/* unused */
-    unsigned int sc_sr4;
-    unsigned int sc_sr0;
-    unsigned int sc_sr1;
-    unsigned int sc_sr2;
-    unsigned int sc_sr3;
-    unsigned int sc_sr5;
-    unsigned int sc_sr6;
-    unsigned int sc_sr7;
-    unsigned int sc_cr0;
-    unsigned int sc_cr8;
-    unsigned int sc_cr9;
-    unsigned int sc_cr10;	/* unused */
-    unsigned int sc_cr12;
-    unsigned int sc_cr13;
-    unsigned int sc_cr24;	/* unused */
-    unsigned int sc_cr25;	/* unused */
-    unsigned int sc_cr26;	/* unused */
-    unsigned sc_mpsfu_high;	/* unused */
-    unsigned sc_mpsfu_low;	/* unused */
-    unsigned sc_mpsfu_ovflo;	/* unused */
-    int sc_pad;
-
-    /* Floating point registers $f0..$f31.  */
-    double sc_fpregs[32];
-  };
-
-#endif /* sc_parisc_thread_state */
diff --git a/sysdeps/mach/hurd/hppa/trampoline.c b/sysdeps/mach/hurd/hppa/trampoline.c
deleted file mode 100644
index bbb5b960ac..0000000000
--- a/sysdeps/mach/hurd/hppa/trampoline.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/* Set thread_state for sighandler, and sigcontext to recover.  HPPA version.
-   Copyright (C) 1995, 1997, 1998 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 Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <hurd/signal.h>
-#include "thread_state.h"
-#include <assert.h>
-#include <errno.h>
-#include "hurdfault.h"
-
-
-struct mach_msg_trap_regargs
-  {
-    /* These first four arguments are in registers 26..23.  */
-    mach_msg_size_t rcv_size;	/* arg3 */
-    mach_msg_size_t send_size;	/* arg2 */
-    mach_msg_option_t option;	/* arg1 */
-    mach_msg_header_t *msg;	/* arg0 */
-  };
-
-struct sigcontext *
-_hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
-			int signo, long int sigcode,
-			volatile int rpc_wait,
-			struct machine_thread_all_state *state)
-{
-  __label__ trampoline, rpc_wait_trampoline;
-  void *volatile sigsp;
-  struct sigcontext *scp;
-
-  if (ss->context)
-    {
-      /* We have a previous sigcontext that sigreturn was about
-	 to restore when another signal arrived.  We will just base
-	 our setup on that.  */
-      if (_hurdsig_catch_fault (SIGSEGV))
-	assert (_hurdsig_fault_sigcode >= (long int) ss->context &&
-		_hurdsig_fault_sigcode < (long int) (ss->context + 1));
-      else
-	{
-	  memcpy (&state->basic, &ss->context->sc_parisc_thread_state,
-		  sizeof (state->basic));
-	  state->set = (1 << PARISC_THREAD_STATE);
-	  assert (! rpc_wait);
-	  /* The intr_port slot was cleared before sigreturn sent us the
-	     sig_post that made us notice this pending signal, so
-	     _hurd_internal_post_signal wouldn't do interrupt_operation.
-	     After we return, our caller will set SCP->sc_intr_port (in the
-	     new context) from SS->intr_port and clear SS->intr_port.  Now
-	     that we are restoring this old context recorded by sigreturn,
-	     we want to restore its intr_port too; so store it in
-	     SS->intr_port now, so it will end up in SCP->sc_intr_port
-	     later.  */
-	  ss->intr_port = ss->context->sc_intr_port;
-	}
-      /* If the sigreturn context was bogus, just ignore it.  */
-      ss->context = NULL;
-    }
-  else if (! machine_get_basic_state (ss->thread, state))
-    return NULL;
-
-  if ((ss->actions[signo].sa_flags & SA_ONSTACK) &&
-      !(ss->sigaltstack.ss_flags & (SS_DISABLE|SS_ONSTACK)))
-    {
-      sigsp = ss->sigaltstack.ss_sp + ss->sigaltstack.ss_size;
-      ss->sigaltstack.ss_flags |= SS_ONSTACK;
-      /* XXX need to set up base of new stack for
-	 per-thread variables, cthreads.  */
-    }
-  else
-    sigsp = (char *) state->basic.uesp;
-
-  /* Push the signal context on the stack.  */
-  sigsp -= sizeof (*scp);
-  scp = sigsp;
-
-  if (_hurdsig_catch_fault (SIGSEGV))
-    {
-      assert (_hurdsig_fault_sigcode >= (long int) scp &&
-	      _hurdsig_fault_sigcode <= (long int) (scp + 1));
-      /* We got a fault trying to write the stack frame.
-	 We cannot set up the signal handler.
-	 Returning NULL tells our caller, who will nuke us with a SIGILL.  */
-      return NULL;
-    }
-  else
-    {
-      int ok;
-
-      /* Set up the sigcontext from the current state of the thread.  */
-
-      scp->sc_onstack = ss->sigaltstack.ss_flags & SS_ONSTACK ? 1 : 0;
-
-      /* struct sigcontext is laid out so that starting at sc_regs mimics a
-	 struct parisc_thread_state.  */
-      memcpy (&scp->sc_parisc_thread_state,
-	      &state->basic, sizeof (state->basic));
-
-      _hurdsig_end_catch_fault ();
-
-      if (! ok)
-	return NULL;
-    }
-
-  /* Modify the thread state to call the trampoline code on the new stack.  */
-  if (rpc_wait)
-    {
-      /* The signalee thread was blocked in a mach_msg_trap system call,
-	 still waiting for a reply.  We will have it run the special
-	 trampoline code which retries the message receive before running
-	 the signal handler.
-
-	 To do this we change the OPTION argument on its stack to enable only
-	 message reception, since the request message has already been
-	 sent.  */
-
-      struct mach_msg_trap_regargs *args = (void *) &state->basic.r23;
-
-      if (_hurdsig_catch_fault (SIGSEGV))
-	{
-	  assert (_hurdsig_fault_sigcode >= (long int) args &&
-		  _hurdsig_fault_sigcode < (long int) (args + 1));
-	  /* Faulted accessing ARGS.  Bomb.  */
-	  return NULL;
-	}
-
-      assert (args->option & MACH_RCV_MSG);
-      /* Disable the message-send, since it has already completed.  The
-	 calls we retry need only wait to receive the reply message.  */
-      args->option &= ~MACH_SEND_MSG;
-
-      /* Limit the time to receive the reply message, in case the server
-	 claimed that `interrupt_operation' succeeded but in fact the RPC
-	 is hung.  */
-      args->option |= MACH_RCV_TIMEOUT;
-      args->timeout = _hurd_interrupted_rpc_timeout;
-
-      _hurdsig_end_catch_fault ();
-
-      MACHINE_THREAD_STATE_SET_PC (&state->basic, &&rpc_wait_trampoline);
-      /* The reply-receiving trampoline code runs initially on the original
-	 user stack.  We pass it the signal stack pointer in %r5.  */
-      state->basic.r5 = (int) sigsp;
-      /* After doing the message receive, the trampoline code will need to
-	 update the %r28 value to be restored by sigreturn.  To simplify
-	 the assembly code, we pass the address of its slot in SCP to the
-	 trampoline code in %r4.  */
-      state->basic.r4 = (unsigned int) &scp->sc_regs[27];
-      /* Set up the arguments for the handler function in callee-saved
-	 registers that we will move to the argument registers after
-	 mach_msg_trap returns.  */
-      state->basic.r6 = signo;
-      state->basic.r7 = sigcode;
-      state->basic.r8 = (unsigned int) scp;
-    }
-  else
-    {
-      MACHINE_THREAD_STATE_SET_PC (&state->basic, &&trampoline);
-      state->basic.r20 = (unsigned int) sigsp;
-      /* Set up the arguments for the handler function.  */
-      state->basic.r26 = signo;
-      state->basic.r25 = sigcode;
-      state->basic.r24 = (unsigned int) scp;
-    }
-
-  /* We pass the handler function to the trampoline code in %r9.  */
-  state->basic.r9 = (unsigned int) handler;
-  /* For convenience, we pass the address of __sigreturn in %r10.  */
-  state->basic.r10 = (unsigned int) &__sigreturn;
-  /* The extra copy of SCP for the __sigreturn arg goes in %r8.  */
-  state->basic.r10 = (unsigned int) scp;
-
-  return scp;
-
-  /* The trampoline code follows.  This is not actually executed as part of
-     this function, it is just convenient to write it that way.  */
-
- rpc_wait_trampoline:
-  /* This is the entry point when we have an RPC reply message to receive
-     before running the handler.  The MACH_MSG_SEND bit has already been
-     cleared in the OPTION argument on our stack.  The interrupted user
-     stack pointer has not been changed, so the system call can find its
-     arguments; the signal stack pointer is in %ebx.  For our convenience,
-     %ecx points to the sc_eax member of the sigcontext.  */
-  asm volatile
-    (/* Retry the interrupted mach_msg system call.  */
-     "ldil L%0xC0000000,%r1\nble 4(%sr7,%r1)\n"
-     "ldi -25, %r22\n"		/* mach_msg_trap */
-     /* When the sigcontext was saved, %r28 was MACH_RCV_INTERRUPTED.  But
-	now the message receive has completed and the original caller of
-	the RPC (i.e. the code running when the signal arrived) needs to
-	see the final return value of the message receive in %r28.  So
-	store the new %r28 value into the sc_regs[27] member of the sigcontext
-	(whose address is in %r4 to make this code simpler).  */
-     "stw (%r4), %r28\n"
-     /* Switch to the signal stack.  */
-     "copy %r5, %r30\n"
-     /* Copy the handler arguments to the argument registers.  */
-     "copy %r6, %r26\n"
-     "copy %r7, %r25\n"
-     "copy %r8, %r24\n"
-     );
-
- trampoline:
-  /* Entry point for running the handler normally.  The arguments to the
-     handler function are already in the argument registers.  */
-  asm volatile
-    ("bv (%r9); nop"		/* Call the handler function.  */
-     "bv (%r10)\n"		/* Call __sigreturn (SCP); never returns.  */
-     "copy %r8, %r26"		/* Set up arg in delay slot.  */
-     : : "i" (&__sigreturn));
-
-  /* NOTREACHED */
-  return NULL;
-}
diff --git a/sysdeps/mach/hurd/i386/Dist b/sysdeps/mach/hurd/i386/Dist
deleted file mode 100644
index 82c44df00b..0000000000
--- a/sysdeps/mach/hurd/i386/Dist
+++ /dev/null
@@ -1,3 +0,0 @@
-static-start.S
-sys/io.h
-ioperm.c
diff --git a/sysdeps/mach/hurd/i386/init-first.c b/sysdeps/mach/hurd/i386/init-first.c
index caa232026d..f9a7a58deb 100644
--- a/sysdeps/mach/hurd/i386/init-first.c
+++ b/sysdeps/mach/hurd/i386/init-first.c
@@ -1,5 +1,6 @@
 /* Initialization code run first thing by the ELF startup code.  For i386/Hurd.
-   Copyright (C) 1995,96,97,98,99,2000,01,02,03,04 Free Software Foundation, Inc.
+   Copyright (C) 1995,96,97,98,99,2000,01,02,03,04,05
+	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
@@ -54,7 +55,7 @@ extern int __libc_argc attribute_hidden;
 extern char **__libc_argv attribute_hidden;
 extern char **_dl_argv;
 
-void *(*_cthread_init_routine) (void); /* Returns new SP to use.  */
+extern void *(*_cthread_init_routine) (void) __attribute__ ((weak));
 void (*_cthread_exit_routine) (int status) __attribute__ ((__noreturn__));
 
 /* Things that want to be run before _hurd_init or much anything else.
@@ -203,7 +204,7 @@ init (int *data)
      code as the return address, and the argument data immediately above
      that on the stack.  */
 
-  if (_cthread_init_routine)
+  if (&_cthread_init_routine && _cthread_init_routine)
     {
       /* Initialize cthreads, which will allocate us a new stack to run on.  */
       int *newsp = (*_cthread_init_routine) ();
@@ -271,7 +272,7 @@ init (int *data)
       /* The argument data is just above the stack frame we will unwind by
 	 returning.  Mutate our own return address to run the code below.  */
       usercode = data[-1];
-      ((void **) data)[-1] = call_init1;
+      data[-1] = (int) &call_init1;
       /* Force USERCODE into %eax and &init1 into %ecx, which are not
 	 restored by function return.  */
       asm volatile ("# a %0 c %1" : : "a" (usercode), "c" (&init1));
@@ -319,11 +320,11 @@ first_init (void)
    stack set up just as the user will see it, so it can switch stacks.  */
 
 void
-_dl_init_first (int argc, ...)
+_dl_init_first (void)
 {
   first_init ();
 
-  init (&argc);
+  init ((int *) __builtin_frame_address (0) + 2);
 }
 #endif
 
@@ -350,21 +351,23 @@ strong_alias (posixland_init, __libc_init_first);
    This poorly-named function is called by static-start.S,
    which should not exist at all.  */
 void
-_hurd_stack_setup (volatile int argc, ...)
+_hurd_stack_setup (void)
 {
+  intptr_t caller = (intptr_t) __builtin_return_address (0);
+
   void doinit (intptr_t *data)
     {
       /* This function gets called with the argument data at TOS.  */
-      void doinit1 (volatile int argc, ...)
+      void doinit1 (void)
 	{
-	  init ((int *) &argc);
+	  init ((int *) __builtin_frame_address (0) + 2);
 	}
 
       /* Push the user return address after the argument data, and then
          jump to `doinit1' (above), so it is as if __libc_init_first's
          caller had called `doinit1' with the argument data already on the
          stack.  */
-      *--data = (&argc)[-1];
+      *--data = caller;
       asm volatile ("movl %0, %%esp\n" /* Switch to new outermost stack.  */
 		    "movl $0, %%ebp\n" /* Clear outermost frame pointer.  */
 		    "jmp *%1" : : "r" (data), "r" (&doinit1) : "sp");
@@ -373,7 +376,7 @@ _hurd_stack_setup (volatile int argc, ...)
 
   first_init ();
 
-  _hurd_startup ((void **) &argc, &doinit);
+  _hurd_startup ((void **) __builtin_frame_address (0) + 2, &doinit);
 }
 #endif
 
diff --git a/sysdeps/mach/hurd/i386/longjmp-ts.c b/sysdeps/mach/hurd/i386/longjmp-ts.c
index 586ce6b015..c902002cbc 100644
--- a/sysdeps/mach/hurd/i386/longjmp-ts.c
+++ b/sysdeps/mach/hurd/i386/longjmp-ts.c
@@ -1,5 +1,5 @@
 /* Perform a `longjmp' on a Mach thread_state.  i386 version.
-   Copyright (C) 1991, 1994, 1995, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1991, 1994, 1995, 1997, 2006 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
@@ -19,6 +19,7 @@
 
 #include <hurd/signal.h>
 #include <setjmp.h>
+#include <jmpbuf-offsets.h>
 #include <mach/thread_status.h>
 
 
diff --git a/sysdeps/mach/hurd/i386/tls.h b/sysdeps/mach/hurd/i386/tls.h
index ff849716e0..223a47d2f2 100644
--- a/sysdeps/mach/hurd/i386/tls.h
+++ b/sysdeps/mach/hurd/i386/tls.h
@@ -98,7 +98,7 @@ _hurd_tls_init (tcbhead_t *tcb, int secondcall)
     {
       /* Fetch the selector set by the first call.  */
       int sel;
-      asm ("mov %%gs, %w0" : "=q" (sel));
+      asm ("mov %%gs, %w0" : "=q" (sel) : "0" (0));
       if (__builtin_expect (sel, 0x50) & 4) /* LDT selector */
 	{
 	  error_t err = __i386_set_ldt (tcb->self, sel, &desc, 1);
@@ -151,7 +151,7 @@ _hurd_tls_fork (thread_t child, struct i386_thread_state *state)
 {
   /* Fetch the selector set by _hurd_tls_init.  */
   int sel;
-  asm ("mov %%gs, %w0" : "=q" (sel));
+  asm ("mov %%gs, %w0" : "=q" (sel) : "0" (0));
   if (sel == state->ds)		/* _hurd_tls_init was never called.  */
     return 0;
 
diff --git a/sysdeps/mach/hurd/i386/trampoline.c b/sysdeps/mach/hurd/i386/trampoline.c
index 781a0441dc..dddc6f3ef6 100644
--- a/sysdeps/mach/hurd/i386/trampoline.c
+++ b/sysdeps/mach/hurd/i386/trampoline.c
@@ -1,5 +1,6 @@
 /* Set thread_state for sighandler, and sigcontext to recover.  i386 version.
-   Copyright (C) 1994, 95, 96, 97, 98, 99 Free Software Foundation, Inc.
+   Copyright (C) 1994,1995,1996,1997,1998,1999,2005
+	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
@@ -19,11 +20,11 @@
 
 #include <hurd/signal.h>
 #include <hurd/userlink.h>
-#include "thread_state.h"
+#include <thread_state.h>
 #include <assert.h>
 #include <errno.h>
 #include "hurdfault.h"
-#include "intr-msg.h"
+#include <intr-msg.h>
 
 
 struct sigcontext *
diff --git a/sysdeps/mach/hurd/ifreq.h b/sysdeps/mach/hurd/ifreq.c
index 77f0b9cac0..9da8a6803a 100644
--- a/sysdeps/mach/hurd/ifreq.h
+++ b/sysdeps/mach/hurd/ifreq.c
@@ -1,5 +1,5 @@
 /* Fetch the host's network interface list.  Hurd version.
-   Copyright (C) 2002 Free Software Foundation, Inc.
+   Copyright (C) 2002,2005 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,14 +17,13 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <net/if.h>
+#include <ifreq.h>
 #include <hurd.h>
 #include <hurd/pfinet.h>
-#include <sys/socket.h>
 #include <sys/mman.h>
 
 
-static inline void
+void
 __ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd)
 {
   file_t server;
@@ -64,17 +63,3 @@ __ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd)
     }
 
 }
-
-
-static inline struct ifreq *
-__if_nextreq (struct ifreq *ifr)
-{
-  return ifr + 1;
-}
-
-
-static inline void
-__if_freereq (struct ifreq *ifreqs, int num_ifs)
-{
-  __munmap (ifreqs, num_ifs * sizeof (struct ifreq));
-}
diff --git a/sysdeps/mach/hurd/init-posix.c b/sysdeps/mach/hurd/init-posix.c
index 3eecf62769..eaf6332fe1 100644
--- a/sysdeps/mach/hurd/init-posix.c
+++ b/sysdeps/mach/hurd/init-posix.c
@@ -1,2 +1,2 @@
 /* We don't need the unix/bsd version.  */
-#include <sysdeps/generic/init-posix.c>
+#include <posix/init-posix.c>
diff --git a/sysdeps/mach/hurd/ioctl.c b/sysdeps/mach/hurd/ioctl.c
index 3d590d5845..bcc78bc84e 100644
--- a/sysdeps/mach/hurd/ioctl.c
+++ b/sysdeps/mach/hurd/ioctl.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 1992,93,94,95,96,97,99,2000,02 Free Software Foundation, Inc.
+/* Copyright (C) 1992,93,94,95,96,97,99,2000,2002,2005
+	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
@@ -57,7 +58,16 @@ __ioctl (int fd, unsigned long int request, ...)
   struct
   {
 #ifdef MACH_MSG_TYPE_BIT
-    mig_reply_header_t header;
+    union
+    {
+      mig_reply_header_t header;
+      struct
+      {
+	mach_msg_header_t	Head;
+	int			RetCodeType;
+	kern_return_t		RetCode;
+      } header_typecheck;
+    };
     char data[3 * sizeof (mach_msg_type_t) +
 	     msg_align (_IOT_COUNT0 (type) * typesize (_IOT_TYPE0 (type))) +
 	     msg_align (_IOT_COUNT1 (type) * typesize (_IOT_TYPE1 (type))) +
@@ -136,9 +146,11 @@ __ioctl (int fd, unsigned long int request, ...)
 	     Rather than pointing to the value, ARG is the value itself.  */
 #ifdef MACH_MSG_TYPE_BIT
 	  *t++ = io2mach_type (1, _IOTS (integer_t));
-	  *((integer_t *) t)++ = (integer_t) arg;
+	  *(integer_t *) t = (integer_t) arg;
+	  t = (void *) t + sizeof (integer_t);
 #else
-	  *((integer_t *) p)++ = (integer_t) arg;
+	  *(integer_t *) p = (integer_t) arg;
+	  p = (void *) p + sizeof (integer_t);
 #endif
 	}
 
@@ -189,7 +201,7 @@ __ioctl (int fd, unsigned long int request, ...)
 	return MIG_TYPE_ERROR;
 
 #ifdef MACH_MSG_TYPE_BIT
-      if (*(int *) &msg.header.RetCodeType !=
+      if (msg.header_typecheck.RetCodeType !=
 	  ((union { mach_msg_type_t t; int i; })
 	   { t: io2mach_type (1, _IOTS (msg.header.RetCode)) }).i)
 	return MIG_TYPE_ERROR;
diff --git a/sysdeps/mach/hurd/jmp-unwind.c b/sysdeps/mach/hurd/jmp-unwind.c
index 4624ad9e26..e0e16e28b2 100644
--- a/sysdeps/mach/hurd/jmp-unwind.c
+++ b/sysdeps/mach/hurd/jmp-unwind.c
@@ -1,5 +1,5 @@
 /* _longjmp_unwind -- Clean up stack frames unwound by longjmp.  Hurd version.
-   Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+   Copyright (C) 1995,1996,2005,2006 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,17 +17,27 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <setjmp.h>
+#include <jmpbuf-unwind.h>
 #include <hurd/userlink.h>
 #include <hurd/signal.h>
 #include <hurd/sigpreempt.h>
 #include <assert.h>
+#include <stdint.h>
 
 
 #ifndef _JMPBUF_UNWINDS
-#error "<bits/setjmp.h> fails to define _JMPBUF_UNWINDS"
+#error "<jmpbuf-unwind.h> fails to define _JMPBUF_UNWINDS"
 #endif
 
+static inline uintptr_t
+demangle_ptr (uintptr_t x)
+{
+# ifdef PTR_DEMANGLE
+  PTR_DEMANGLE (x);
+# endif
+  return x;
+}
+
 /* This function is called by `longjmp' (with its arguments) to restore
    active resources to a sane state before the frames code using them are
    jumped out of.  */
@@ -46,7 +56,7 @@ _longjmp_unwind (jmp_buf env, int val)
 
   /* Remove local signal preemptors being unwound past.  */
   while (ss->preemptors &&
-	 _JMPBUF_UNWINDS (env[0].__jmpbuf, ss->preemptors))
+	 _JMPBUF_UNWINDS (env[0].__jmpbuf, ss->preemptors, demangle_ptr))
     ss->preemptors = ss->preemptors->next;
 
   __spin_unlock (&ss->lock);
@@ -56,7 +66,7 @@ _longjmp_unwind (jmp_buf env, int val)
      in stack frames being unwound by this jump.  */
 
   for (link = ss->active_resources;
-       link && _JMPBUF_UNWINDS (env[0].__jmpbuf, link);
+       link && _JMPBUF_UNWINDS (env[0].__jmpbuf, link, demangle_ptr);
        link = link->thread.next)
     /* Remove this link from the resource's users list,
        since the frame using the resource is being unwound.
diff --git a/sysdeps/mach/hurd/lgetxattr.c b/sysdeps/mach/hurd/lgetxattr.c
new file mode 100644
index 0000000000..5ab591575e
--- /dev/null
+++ b/sysdeps/mach/hurd/lgetxattr.c
@@ -0,0 +1,36 @@
+/* Access to extended attributes on files.  Hurd version.
+   Copyright (C) 2004 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <sys/xattr.h>
+#include <hurd.h>
+#include <hurd/xattr.h>
+#include <fcntl.h>
+
+ssize_t
+lgetxattr (const char *path, const char *name, void *value, size_t size)
+{
+  error_t err;
+  file_t port = __file_name_lookup (path, O_NOLINK, 0);
+  if (port == MACH_PORT_NULL)
+    return -1;
+  err = _hurd_xattr_get (port, name, value, &size);
+  __mach_port_deallocate (__mach_task_self (), port);
+  return err ? __hurd_fail (err) : size;
+}
diff --git a/sysdeps/mach/hurd/linkat.c b/sysdeps/mach/hurd/linkat.c
new file mode 100644
index 0000000000..1942144e0f
--- /dev/null
+++ b/sysdeps/mach/hurd/linkat.c
@@ -0,0 +1,66 @@
+/* Make a link between file names relative to open directories.  Hurd version.
+   Copyright (C) 2006 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <unistd.h>
+#include <hurd.h>
+#include <hurd/fd.h>
+
+
+/* Make a link to FROM relative to FROMFD called TO relative to TOFD.  */
+int
+linkat (fromfd, from, tofd, to, flags)
+     int fromfd;
+     const char *from;
+     int tofd;
+     const char *to;
+     int flags;
+{
+  error_t err;
+  file_t oldfile, linknode, todir;
+  char *toname;
+
+  oldfile = __file_name_lookup_at (fromfd, flags, from, 0, 0);
+  if (oldfile == MACH_PORT_NULL)
+    return -1;
+
+  /* The file_getlinknode RPC returns the port that should be passed to
+     the receiving filesystem (the one containing TODIR) in dir_link.  */
+
+  err = __file_getlinknode (oldfile, &linknode);
+  __mach_port_deallocate (__mach_task_self (), oldfile);
+  if (err)
+    return __hurd_fail (err);
+
+  todir = __file_name_split_at (tofd, to, &toname);
+  if (todir != MACH_PORT_NULL)
+    {
+      err = __dir_link (todir, linknode, toname, 1);
+      __mach_port_deallocate (__mach_task_self (), todir);
+    }
+  __mach_port_deallocate (__mach_task_self (), linknode);
+  if (todir == MACH_PORT_NULL)
+    return -1;
+
+  if (err)
+    return __hurd_fail (err);
+  return 0;
+}
diff --git a/sysdeps/mach/hurd/listxattr.c b/sysdeps/mach/hurd/listxattr.c
new file mode 100644
index 0000000000..5f84e88316
--- /dev/null
+++ b/sysdeps/mach/hurd/listxattr.c
@@ -0,0 +1,35 @@
+/* Access to extended attributes on files.  Hurd version.
+   Copyright (C) 2005 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <sys/xattr.h>
+#include <hurd.h>
+#include <hurd/xattr.h>
+
+ssize_t
+listxattr (const char *path, char *list, size_t size)
+{
+  error_t err;
+  file_t port = __file_name_lookup (path, 0, 0);
+  if (port == MACH_PORT_NULL)
+    return -1;
+  err = _hurd_xattr_list (port, list, &size);
+  __mach_port_deallocate (__mach_task_self (), port);
+  return err ? __hurd_fail (err) : size;
+}
diff --git a/sysdeps/mach/hurd/lsetxattr.c b/sysdeps/mach/hurd/lsetxattr.c
new file mode 100644
index 0000000000..c2eae40e3a
--- /dev/null
+++ b/sysdeps/mach/hurd/lsetxattr.c
@@ -0,0 +1,37 @@
+/* Access to extended attributes on files.  Hurd version.
+   Copyright (C) 2004 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <sys/xattr.h>
+#include <hurd.h>
+#include <hurd/xattr.h>
+#include <fcntl.h>
+
+ssize_t
+lsetxattr (const char *path, const char *name, const void *value, size_t size,
+	   int flags)
+{
+  error_t err;
+  file_t port = __file_name_lookup (path, O_NOLINK, 0);
+  if (port == MACH_PORT_NULL)
+    return -1;
+  err = _hurd_xattr_set (port, name, value, size, flags);
+  __mach_port_deallocate (__mach_task_self (), port);
+  return err ? __hurd_fail (err) : size;
+}
diff --git a/sysdeps/mach/hurd/mig-reply.c b/sysdeps/mach/hurd/mig-reply.c
index 78bac4bffc..5e40c147b4 100644
--- a/sysdeps/mach/hurd/mig-reply.c
+++ b/sysdeps/mach/hurd/mig-reply.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1994,1995,1996,1997,2005 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
@@ -22,7 +22,7 @@
 #define GETPORT \
   mach_port_t *portloc = \
     (mach_port_t *) __hurd_threadvar_location (_HURD_THREADVAR_MIG_REPLY)
-#define reply_port (use_threadvar ? *portloc : global_reply_port)
+#define reply_port (*(use_threadvar ? portloc : &global_reply_port))
 
 static int use_threadvar;
 static mach_port_t global_reply_port;
diff --git a/sysdeps/mach/hurd/mips/Dist b/sysdeps/mach/hurd/mips/Dist
deleted file mode 100644
index b6f3ffa4c3..0000000000
--- a/sysdeps/mach/hurd/mips/Dist
+++ /dev/null
@@ -1,3 +0,0 @@
-longjmp-ctx.c
-init-fault.c
-dl-machine.c
diff --git a/sysdeps/mach/hurd/mips/bits/sigcontext.h b/sysdeps/mach/hurd/mips/bits/sigcontext.h
deleted file mode 100644
index 14c618857e..0000000000
--- a/sysdeps/mach/hurd/mips/bits/sigcontext.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* Machine-dependent signal context structure for GNU Hurd.  MIPS version.
-   Copyright (C) 1994,97,2001 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 Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
-# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
-#endif
-
-#ifndef sc_mips_thread_state
-
-/* Signal handlers are actually called:
-   void handler (int sig, int code, struct sigcontext *scp);  */
-
-/* State of this thread when the signal was taken.  */
-struct sigcontext
-  {
-    /* These first members are machine-independent.  */
-
-    int sc_onstack;		/* Nonzero if running on sigstack.  */
-    __sigset_t sc_mask;		/* Blocked signals to restore.  */
-
-    /* MiG reply port this thread is using.  */
-    unsigned int sc_reply_port;
-
-    /* Port this thread is doing an interruptible RPC on.  */
-    unsigned int sc_intr_port;
-
-    /* Error code associated with this signal (interpreted as `error_t').  */
-    int sc_error;
-
-    /* All following members are machine-dependent.  The rest of this
-       structure is written to be laid out identically to:
-	{
-	  struct mips_thread_state ts;
-	  struct mips_exc_state es;
-	  struct mips_float_state fs;
-	}
-       trampoline.c knows this, so it must be changed if this changes.  */
-#define	sc_mips_thread_state sc_gpr /* Beginning of correspondence.  */
-    int sc_gpr[31];		/* "General" registers; [0] is r1.  */
-    int sc_mdlo, sc_mdhi;	/* Low and high multiplication results.  */
-    int sc_pc;			/* Instruction pointer.  */
-
-    /* struct mips_exc_state */
-#define sc_mips_exc_state sc_cause
-    unsigned int sc_cause;	/* Machine-level trap code.  */
-#define SC_CAUSE_SST	0x00000044
-    unsigned int sc_badvaddr;
-    unsigned int sc_coproc_used; /* Which coprocessors the thread has used.  */
-#define SC_COPROC_USE_COP0	1 /* (by definition) */
-#define SC_COPROC_USE_COP1	2 /* FPA */
-#define	SC_COPROC_USE_FPU	SC_COPROC_USE_COP1
-#define SC_COPROC_USE_COP2	4
-#define SC_COPROC_USE_COP3	8
-
-    /* struct mips_float_state
-       This is only filled in if the SC_COPROC_USE_FPU bit
-       is set in sc_coproc_used.  */
-#define sc_mips_float_state sc_fpr
-    int sc_fpr[32];		/* FP registers.  */
-    int sc_fpcsr;		/* FPU status register.  */
-    int sc_fpeir;		/* FP exception instruction register.  */
-  };
-
-#endif /* sc_mips_thread_state */
diff --git a/sysdeps/mach/hurd/mips/dl-machine.c b/sysdeps/mach/hurd/mips/dl-machine.c
deleted file mode 100644
index ce2d5db510..0000000000
--- a/sysdeps/mach/hurd/mips/dl-machine.c
+++ /dev/null
@@ -1,132 +0,0 @@
-/* Operating system support for run-time dynamic linker.  MIPS specific
-   stuffs on Hurd.
-   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
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <hurd.h>
-#include <link.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <sys/mman.h>
-#include <assert.h>
-#include <sysdep.h>
-#include <mach/mig_support.h>
-#include "../stdio-common/_itoa.h"
-#include <stdarg.h>
-#include <ctype.h>
-#include <sys/stat.h>
-#include <libintl.h>
-
-void weak_function
-abort (void)
-{
-  _exit (127);
-}
-
-
-#include <string.h>
-#include <mach/error.h>
-#include <errorlib.h>
-
-#undef _
-#define _(x) x
-
-/* Return a string describing the errno code in ERRNUM.  */
-char * weak_function
-_strerror_internal (int errnum, char *buf, size_t buflen)
-{
-  int system;
-  int sub;
-  int code;
-  const struct error_system *es;
-  extern void __mach_error_map_compat (int *);
-
-  __mach_error_map_compat (&errnum);
-
-  system = err_get_system (errnum);
-  sub = err_get_sub (errnum);
-  code = err_get_code (errnum);
-
-  if (system > err_max_system || ! __mach_error_systems[system].bad_sub)
-    {
-      const char *unk = _("Error in unknown error system: ");
-      const size_t unklen = strlen (unk);
-      char *p = buf + buflen;
-      *--p = '\0';
-      p = _itoa (errnum, p, 16, 1);
-      return memcpy (p - unklen, unk, unklen);
-    }
-
-  es = &__mach_error_systems[system];
-
-  if (sub >= es->max_sub)
-    return (char *) es->bad_sub;
-
-  if (code >= es->subsystem[sub].max_code)
-    {
-      const char *unk = _("Unknown error ");
-      const size_t unklen = strlen (unk);
-      char *p = buf + buflen;
-      size_t len = strlen (es->subsystem[sub].subsys_name);
-      *--p = '\0';
-      p = _itoa (errnum, p, 16, 1);
-      *p-- = ' ';
-      p = memcpy (p - len, es->subsystem[sub].subsys_name, len);
-      return memcpy (p - unklen, unk, unklen);
-    }
-
-  return (char *) _(es->subsystem[sub].codes[code]);
-}
-
-/* Read the whole contents of FILE into new mmap'd space with given
-   protections.  The size of the file is returned in SIZE.  */
-void *
-_dl_sysdep_read_whole_file (const char *file, size_t *size, int prot)
-{
-  struct stat stat;
-  mach_port_t memobj_rd;
-  void *contents;
-  error_t err;
-
-  memobj_rd = __open (file, O_RDONLY, 0);
-  if (memobj_rd)
-    {
-      err = __io_stat ((file_t) memobj_rd, &stat);
-      if (err)
-	{
-	  __hurd_fail (err);
-	  contents = 0;
-	}
-      else
-	{
-	  /* Map a copy of the file contents.  */
-	  contents = __mmap (0, stat.st_size, prot, MAP_COPY, memobj_rd, 0);
-	  if (contents == (void *)-1)
-	    contents = 0;
-	  else
-	    *size = stat.st_size;
-	}
-
-      __mach_port_deallocate (__mach_task_self (), memobj_rd);
-    }
-  else
-    contents = 0;
-
-  return contents;
-}
diff --git a/sysdeps/mach/hurd/mips/exc2signal.c b/sysdeps/mach/hurd/mips/exc2signal.c
deleted file mode 100644
index c505ae5b22..0000000000
--- a/sysdeps/mach/hurd/mips/exc2signal.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/* Translate Mach exception codes into signal numbers.  MIPS version.
-   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
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <hurd.h>
-#include <hurd/signal.h>
-#include <mach/exception.h>
-
-/* Translate the Mach exception codes, as received in an `exception_raise' RPC,
-   into a signal number and signal subcode.  */
-
-void
-_hurd_exception2signal (struct hurd_signal_detail *detail, int *signo)
-{
-  detail->error = 0;
-
-  switch (detail->exc)
-    {
-    default:
-      *signo = SIGIOT;
-      detail->code = detail->exc;
-      break;
-      
-    case EXC_BAD_ACCESS:
-      if (detail->exc_code == KERN_PROTECTION_FAILURE)
-	*signo = SIGSEGV;
-      else
-	*signo = SIGBUS;
-      detail->code = detail->exc_subcode;
-      detail->error = detail->exc_code;
-      break;
-
-    case EXC_BAD_INSTRUCTION:
-      *signo = SIGILL;
-      if (detail->exc_code == EXC_MIPS_II)
-	detail->code = detail->exc_subcode;
-      else
-	detail->code = 0;
-      break;
-      
-    case EXC_ARITHMETIC:
-      switch (detail->exc_code)
-	{
-	case EXC_MIPS_OV:	/* integer overflow */
-	  *signo = SIGFPE;
-	  detail->code = detail->exc_subcode;
-	  break;
-
-	default:
-	  *signo = SIGFPE;
-	  detail->code = 0;
-	  break;
-
-	case EXC_MIPS_INT:
-	  /* Subcode is the fp_status word saved by the hardware.
-	     Give an error code corresponding to the first bit set.  */
-	  if (detail->exc_subcode == EXC_MIPS_FLT_UNIMP)
-	    *signo = SIGILL;
-	  else
-	    *signo = SIGFPE;
-	  detail->code = detail->exc_subcode;
-	  break;
-	}
-      break;
-
-    case EXC_EMULATION:		
-      /* 3.0 doesn't give this one, why, I don't know.  */
-      *signo = SIGEMT;
-      detail->code = 0;
-      break;
-
-    case EXC_SOFTWARE:
-      *signo = SIGEMT;
-      detail->code = 0;
-      break;
-      
-    case EXC_BREAKPOINT:
-      *signo = SIGTRAP;
-      detail->code = 0;
-      break;
-    }
-}
diff --git a/sysdeps/mach/hurd/mips/init-first.c b/sysdeps/mach/hurd/mips/init-first.c
deleted file mode 100644
index 6f53e839b3..0000000000
--- a/sysdeps/mach/hurd/mips/init-first.c
+++ /dev/null
@@ -1,414 +0,0 @@
-/* Initialization code run first thing by the ELF startup code.  For Mips/Hurd.
-   Copyright (C) 1996,1997,1998,2000,01,02,03 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 Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <hurd.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include "hurdstartup.h"
-#include "set-hooks.h"
-#include "hurdmalloc.h"		/* XXX */
-
-extern void __mach_init (void);
-extern void __init_misc (int, char **, char **);
-#ifdef USE_NONOPTION_FLAGS
-extern void __getopt_clean_environment (char **);
-#endif
-#ifndef SHARED
-extern void _dl_non_dynamic_init (void) internal_function;
-#endif
-extern void __libc_global_ctors (void);
-
-unsigned int __hurd_threadvar_max;
-unsigned long int __hurd_threadvar_stack_offset;
-unsigned long int __hurd_threadvar_stack_mask;
-
-int __libc_multiple_libcs attribute_hidden = 1;
-
-int __libc_argc attribute_hidden;
-char **__libc_argv attribute_hidden;
-
-void *(*_cthread_init_routine) (void); /* Returns new SP to use.  */
-void (*_cthread_exit_routine) (int status) __attribute__ ((__noreturn__));
-
-
-/* Things that want to be run before _hurd_init or much anything else.
-   Importantly, these are called before anything tries to use malloc.  */
-DEFINE_HOOK (_hurd_preinit_hook, (void));
-
-static void
-init1 (int argc, char *arg0, ...)
-{
-  char **argv = &arg0;
-  char **envp = &argv[argc + 1];
-  struct hurd_startup_data *d;
-
-  __libc_argc = argc;
-  __libc_argv = argv;
-  __environ = envp;
-  while (*envp)
-    ++envp;
-  d = (void *) ++envp;
-
-  /* If we are the bootstrap task started by the kernel,
-     then after the environment pointers there is no Hurd
-     data block; the argument strings start there.  */
-  if ((void *) d != argv[0])
-    {
-      _hurd_init_dtable = d->dtable;
-      _hurd_init_dtablesize = d->dtablesize;
-
-      {
-	/* Check if the stack we are now on is different from
-	   the one described by _hurd_stack_{base,size}.  */
-
-	char dummy;
-	const vm_address_t newsp = (vm_address_t) &dummy;
-
-	if (d->stack_size != 0 && (newsp < d->stack_base ||
-				   newsp - d->stack_base > d->stack_size))
-	  /* The new stack pointer does not intersect with the
-	     stack the exec server set up for us, so free that stack.  */
-	  __vm_deallocate (__mach_task_self (), d->stack_base, d->stack_size);
-      }
-    }
-
-  if (__hurd_threadvar_stack_mask == 0)
-    {
-      /* We are not using cthreads, so we will have just a single allocated
-	 area for the per-thread variables of the main user thread.  */
-      unsigned long int i;
-      __hurd_threadvar_stack_offset
-	= (unsigned long int) malloc (__hurd_threadvar_max *
-				      sizeof (unsigned long int));
-      if (__hurd_threadvar_stack_offset == 0)
-	__libc_fatal ("Can't allocate single-threaded per-thread variables.");
-      for (i = 0; i < __hurd_threadvar_max; ++i)
-	((unsigned long int *) __hurd_threadvar_stack_offset)[i] = 0;
-    }
-
-  if ((void *) d != argv[0] && (d->portarray || d->intarray))
-    /* Initialize library data structures, start signal processing, etc.  */
-    _hurd_init (d->flags, argv,
-		d->portarray, d->portarraysize,
-		d->intarray, d->intarraysize);
-
-#ifndef SHARED
-  _dl_non_dynamic_init ();
-#endif
-  __init_misc (argc, argv, __environ);
-
-#ifdef USE_NONOPTION_FLAGS
-  /* This is a hack to make the special getopt in GNU libc working.  */
-  __getopt_clean_environment (envp);
-#endif
-
-#ifdef SHARED
-  __libc_global_ctors ();
-#endif
-
-  (void) &init1;
-}
-
-static void *
-__init (int *data)
-{
-  int argc = *data;
-  char **argv = (void *) (data + 1);
-  char **envp = &argv[argc + 1];
-  struct hurd_startup_data *d;
-
-  __environ = envp;
-  while (*envp)
-    ++envp;
-  d = (void *) ++envp;
-
-  /* The user might have defined a value for this, to get more variables.
-     Otherwise it will be zero on startup.  We must make sure it is set
-     properly before before cthreads initialization, so cthreads can know
-     how much space to leave for thread variables.  */
-  if (__hurd_threadvar_max < _HURD_THREADVAR_MAX)
-    __hurd_threadvar_max = _HURD_THREADVAR_MAX;
-
-
-  /* After possibly switching stacks, call `init1' (above) with the user
-     code as the return address, and the argument data immediately above
-     that on the stack.  */
-
-  if (_cthread_init_routine)
-    {
-      /* Initialize cthreads, which will allocate us a new stack to run on.  */
-      void *newsp = (*_cthread_init_routine) ();
-      struct hurd_startup_data *od;
-
-      /* Copy the argdata from the old stack to the new one.  */
-      newsp = memcpy (newsp - ((char *) &d[1] - (char *) data), data,
-		      (char *) d - (char *) data);
-
-      /* Set up the Hurd startup data block immediately following
-	 the argument and environment pointers on the new stack.  */
-      od = (newsp + ((char *) d - (char *) data));
-      if ((void *) argv[0] == d)
-	/* We were started up by the kernel with arguments on the stack.
-	   There is no Hurd startup data, so zero the block.  */
-	memset (od, 0, sizeof *od);
-      else
-	/* Copy the Hurd startup data block to the new stack.  */
-	*od = *d;
-
-      /* Push the user code address on the top of the new stack.  It will
-	 be the return address for `init1'; we will jump there with NEWSP
-	 as the stack pointer.  */
-      return newsp;
-    }
-
-  /* The argument data is just above the stack frame we will unwind by
-     returning.  */
-  return (void *) data;
-
-  (void) &__init;
-}
-
-#ifdef SHARED
-/* This function is called to initialize the shared C library.
-   It is called just before the user _start code from mips/elf/start.S,
-   with the stack set up as that code gets it.  */
-
-/* NOTE!  The linker notices the magical name `_init' and sets the DT_INIT
-   pointer in the dynamic section based solely on that.  It is convention
-   for this function to be in the `.init' section, but the symbol name is
-   the only thing that really matters!!  */
-/*void _init (int argc, ...) __attribute__ ((unused, section (".init")));*/
-
-#if __mips64
-asm ("\
-	.section .init,\"ax\",@progbits\n\
-	.align 3\n\
-	.globl _init\n\
-	.type _init,@function\n\
-	.ent _init\n\
-_init:\n\
-	.set noreorder\n\
-	.cpload $25\n\
-	.set reorder\n\
-	dsubu $29, 8*8\n\
-	.cprestore 6*8\n\
-	sd $16, 4*8($29)\n\
-	sd $31, 5*8($29)\n\
-	jal preinit\n\
-	sd $28, 6*8($29)\n\
-	move $16, $29 # Save the old stack pointer to s0 ($16)\n\
-	daddu $4, $29, 4*8\n\
-	jal __init\n\
-	# Restore saved registers from the old stack.\n\
-	ld $28, 6*8($16)\n\
-	ld $31, 5*8($16)\n\
-	ld $16, 4*8($16)\n\
-	move $29, $2 # set new sp to SP\n\
-call_init1:\n\
-	ld $4, 0($29)\n\
-	ld $5, 1*8($29)\n\
-	ld $6, 2*8($29)\n\
-	ld $7, 3*8($29)\n\
-	dla $25, init1\n\
-	jr $25\n\
-	.end _init\n\
-	.text\n\
-");
-#else
-asm ("\
-	.section .init,\"ax\",@progbits\n\
-	.align 2\n\
-	.globl _init\n\
-	.type _init,@function\n\
-	.ent _init\n\
-_init:\n\
-	.set noreorder\n\
-	.cpload $25\n\
-	.set reorder\n\
-	subu $29, 32\n\
-	.cprestore 24\n\
-	sw $16, 16($29)\n\
-	sw $31, 20($29)\n\
-	jal preinit\n\
-	sw $28, 24($29)\n\
-	move $16, $29 # Save the old stack pointer to s0 ($16)\n\
-	addu $4, $29, 32\n\
-	jal __init\n\
-	# Restore saved registers from the old stack.\n\
-	lw $28, 24($16)\n\
-	lw $31, 20($16)\n\
-	lw $16, 16($16)\n\
-	move $29, $2 # set new sp to SP\n\
-call_init1:\n\
-	lw $4, 0($29)\n\
-	lw $5, 4($29)\n\
-	lw $6, 8($29)\n\
-	lw $7, 12($29)\n\
-	la $25, init1\n\
-	jr $25\n\
-	.end _init\n\
-	.text\n\
-");
-#endif
-
-static void
-preinit (void)
-{
-  /* Initialize data structures so we can do RPCs.  */
-  __mach_init ();
-
-  RUN_HOOK (_hurd_preinit_hook, ());
-
-  (void) &preinit;
-}
-
-void __libc_init_first (int argc, ...)
-{
-}
-#endif
-
-#ifndef SHARED
-/* An assembler code wrapping c function __init.  */
-#ifdef __mips64
-asm ("\
-	.text\n\
-	.align 3\n\
-init:\n\
-	dsubu $29, 8*8\n\
-	sd $16, 4*8($29)\n\
-	sd $31, 5*8($29)\n\
-	move $16, $29\n\
-	jal __init\n\
-	ld $31, 5*8($16)\n\
-	ld $16, 4*8($16)\n\
-	move $29, $2 # set new sp to SP\n\
-call_init1:\n\
-	ld $4, 0($29)\n\
-	ld $5, 1*8($29)\n\
-	ld $6, 2*8($29)\n\
-	ld $7, 3*8($29)\n\
-	dla $25, init1\n\
-	jr $25\n\
-");
-#else
-asm ("\
-	.text\n\
-	.align 2\n\
-init:\n\
-	subu $29, 32\n\
-	sw $16, 16($29)\n\
-	sw $31, 20($29)\n\
-	move $16, $29\n\
-	jal __init\n\
-	lw $31, 20($16)\n\
-	lw $16, 16($16)\n\
-	move $29, $2 # set new sp to SP\n\
-call_init1:\n\
-	lw $4, 0($29)\n\
-	lw $5, 4($29)\n\
-	lw $6, 8($29)\n\
-	lw $7, 12($29)\n\
-	la $25, init1\n\
-	jr $25\n\
-");
-#endif
-
-/* An assembler code wrapping c function ___libc_init_first.
-   ___libc_init_first does an RPC call to flush cache to put doinit
-   function on the stack, so we should call __mach_init first in
-   this wrap. */
-#ifdef __mips64
-asm ("\
-	.text\n\
-	.align 3\n\
-	.globl __libc_init_first\n\
-__libc_init_first:\n\
-	dsubu $29, 8\n\
-	sd $31, 0($29)\n\
-	jal __mach_init\n\
-	ld $4, 0($29)\n\
-	ld $5, 1*8($29)\n\
-	ld $6, 2*8($29)\n\
-	ld $7, 3*8($29)\n\
-	j ___libc_init_first\n\
-");
-#else
-asm ("\
-	.text\n\
-	.align 2\n\
-	.globl __libc_init_first\n\
-__libc_init_first:\n\
-	subu $29, 4\n\
-	sw $31, 0($29)\n\
-	jal __mach_init\n\
-	lw $4, 0($29)\n\
-	lw $5, 4($29)\n\
-	lw $6, 8($29)\n\
-	lw $7, 12($29)\n\
-	j ___libc_init_first\n\
-");
-#endif
-
-static void
-___libc_init_first (int return_addr, int argc, ...)
-{
-  void doinit (int *data)
-    {
-#if 0
-      /* This function gets called with the argument data at TOS.  */
-      void doinit1 (int argc, ...)
-	{
-	  init (&argc);
-	}
-#endif
-      extern void init (int *data);
-
-      /* Push the user return address after the argument data, and then
-	 jump to `doinit1' (above), so it is as if __libc_init_first's
-	 caller had called `init' with the argument data already on the
-	 stack.  */
-      *--data = return_addr;
-
-#ifdef __mips64
-      asm volatile ("ld $31, 0(%0)\n" /* Load the original return address.  */
-		    "daddu $29, %0, 8\n" /* Switch to new outermost stack.  */
-		    "move $4, $29\n"
-		    "jr %1" : : "r" (data), "r" (&init));
-#else
-      asm volatile ("lw $31, 0(%0)\n" /* Load the original return address.  */
-		    "addu $29, %0, 4\n" /* Switch to new outermost stack.  */
-		    "move $4, $29\n"
-		    "jr %1" : : "r" (data), "r" (&init));
-#endif
-      /* NOTREACHED */
-    }
-
-#if 0
-  /* Initialize data structures so we can do RPCs.  */
-  __mach_init ();
-#endif
-
-  RUN_HOOK (_hurd_preinit_hook, ());
-
-  _hurd_startup ((void **) &argc, &doinit);
-
-  (void) &___libc_init_first;
-}
-#endif
diff --git a/sysdeps/mach/hurd/mips/intr-msg.h b/sysdeps/mach/hurd/mips/intr-msg.h
deleted file mode 100644
index 16c78972ac..0000000000
--- a/sysdeps/mach/hurd/mips/intr-msg.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/* Machine-dependent details of interruptible RPC messaging.  Mips version.
-   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
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-
-#ifdef __mips64
-#define INTR_MSG_TRAP(msg, option, send_size, rcv_size, rcv_name, timeout, notify) \
-({									      \
-  error_t err;								      \
-  mach_port_t __rcv_name = (rcv_name);					      \
-  mach_msg_timeout_t __timeout = (timeout);	       			      \
-  mach_port_t __notify = (notify);					      \
-  asm (".globl _hurd_intr_rpc_msg_do_trap\n" 				      \
-       ".globl _hurd_intr_rpc_msg_in_trap\n"				      \
-       "				move $4, %1\n"			      \
-       "				move $5, %2\n"			      \
-       "				move $6, %3\n"			      \
-       "				move $7, %4\n"			      \
-       "				move $8, %5\n"			      \
-       "				move $9, %6\n"			      \
-       "				move $10, %7\n"			      \
-       "				dli $2, -25\n"			      \
-       "_hurd_intr_rpc_msg_do_trap:	syscall\n"			      \
-       "_hurd_intr_rpc_msg_in_trap:	move %0, $2\n"			      \
-       : "=r" (err)							      \
-       : "r" (msg), "r" (option), "r" (send_size), "r" (rcv_size),	      \
-         "r" (__rcv_name), "r" (__timeout), "r" (__notify)		      \
-       : "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10",	      \
-         "$11", "$12", "$13", "$14", "$15", "$24", "$25", "$28");	      \
-  err;									      \
-})
-#else
-#define INTR_MSG_TRAP(msg, option, send_size, rcv_size, rcv_name, timeout, notify) \
-({									      \
-  error_t err;								      \
-  mach_port_t __rcv_name = (rcv_name);					      \
-  mach_msg_timeout_t __timeout = (timeout);	       			      \
-  mach_port_t __notify = (notify);					      \
-  asm (".globl _hurd_intr_rpc_msg_do_trap\n" 				      \
-       ".globl _hurd_intr_rpc_msg_in_trap\n"				      \
-       "				move $4, %1\n"			      \
-       "				move $5, %2\n"			      \
-       "				move $6, %3\n"			      \
-       "				move $7, %4\n"			      \
-       "				move $8, %5\n"			      \
-       "				move $9, %6\n"			      \
-       "				move $10, %7\n"			      \
-       "				li $2, -25\n"			      \
-       "_hurd_intr_rpc_msg_do_trap:	syscall\n"			      \
-       "_hurd_intr_rpc_msg_in_trap:	move %0, $2\n"			      \
-       : "=r" (err)							      \
-       : "r" (msg), "r" (option), "r" (send_size), "r" (rcv_size),	      \
-         "r" (__rcv_name), "r" (__timeout), "r" (__notify)		      \
-       : "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10",	      \
-         "$11", "$12", "$13", "$14", "$15", "$24", "$25", "$28");	      \
-  err;									      \
-})
-#endif
-
-static inline void
-INTR_MSG_BACK_OUT (struct mips_thread_state *state)
-{
-  return;
-}
-
-#include "hurdfault.h"
-
-static inline int
-SYSCALL_EXAMINE (struct mips_thread_state *state, int *callno)
-{
-  u_int32_t *p = (void *) (state->pc - 4);
-  int result;
-  if (_hurdsig_catch_memory_fault (p))
-    return 0;
-  if (result = (*p == 0x0000000c))
-    /* The PC is just after a `syscall' instruction.
-       This is a system call in progress; v0($2) holds the call number.  */
-    *callno = state->r2;
-  _hurdsig_end_catch_fault ();
-  return result;
-}
-
-
-struct mach_msg_trap_args
-  {
-    /* This is the order of arguments to mach_msg_trap.  */
-    mach_msg_header_t *msg;
-    mach_msg_option_t option;
-    mach_msg_size_t send_size;
-    mach_msg_size_t rcv_size;
-    mach_port_t rcv_name;
-    mach_msg_timeout_t timeout;
-    mach_port_t notify;
-  };
-
-
-static inline mach_port_t
-MSG_EXAMINE (struct mips_thread_state *state, int *msgid)
-{
-  mach_msg_header_t *msg;
-  mach_port_t send_port;
-
-  msg = (mach_msg_header_t *) state->r4;
-
-  if (_hurdsig_catch_memory_fault (msg))
-    return MACH_PORT_NULL;
-  send_port = msg->msgh_remote_port;
-  *msgid = msg->msgh_id;
-  _hurdsig_end_catch_fault ();
-
-  return send_port;
-}
diff --git a/sysdeps/mach/hurd/mips/longjmp-ts.c b/sysdeps/mach/hurd/mips/longjmp-ts.c
deleted file mode 100644
index 4c69e4e2b9..0000000000
--- a/sysdeps/mach/hurd/mips/longjmp-ts.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Perform a `longjmp' on a Mach thread_state.  MIPS version.
-   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
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <hurd/signal.h>
-#include <setjmp.h>
-#include <mach/thread_status.h>
-
-
-/* Set up STATE to do the equivalent of `longjmp (ENV, VAL);'.  */
-
-void
-_hurd_longjmp_thread_state (void *state, jmp_buf env, int val)
-{
-  struct mips_thread_state *ts = state;
-
-  ts->r16 = env[0].__jmpbuf[0].__regs[0];
-  ts->r17 = env[0].__jmpbuf[0].__regs[1];
-  ts->r18 = env[0].__jmpbuf[0].__regs[2];
-  ts->r19 = env[0].__jmpbuf[0].__regs[3];
-  ts->r20 = env[0].__jmpbuf[0].__regs[4];
-  ts->r21 = env[0].__jmpbuf[0].__regs[5];
-  ts->r22 = env[0].__jmpbuf[0].__regs[6];
-  ts->r23 = env[0].__jmpbuf[0].__regs[7];
-  ts->r28 = (int) env[0].__jmpbuf[0].__gp;
-  ts->r29 = (int) env[0].__jmpbuf[0].__sp;
-  ts->r30 = (int) env[0].__jmpbuf[0].__fp;
-  ts->pc = (int) env[0].__jmpbuf[0].__pc;
-  ts->r2 = val ?: 1;
-}
diff --git a/sysdeps/mach/hurd/mips/sigreturn.c b/sysdeps/mach/hurd/mips/sigreturn.c
deleted file mode 100644
index a9f7673eb5..0000000000
--- a/sysdeps/mach/hurd/mips/sigreturn.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/* Copyright (C) 1996, 1997, 1998 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 Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <hurd.h>
-#include <hurd/signal.h>
-#include <hurd/threadvar.h>
-#include <stdlib.h>
-#include <mach/mips/mips_instruction.h>
-
-int
-__sigreturn (struct sigcontext *scp)
-{
-  struct hurd_sigstate *ss;
-  struct hurd_userlink *link = (void *) &scp[1];
-  mach_port_t *reply_port;
-
-  if (scp == NULL || (scp->sc_mask & _SIG_CANT_MASK))
-    {
-      errno = EINVAL;
-      return -1;
-    }
-
-  ss = _hurd_self_sigstate ();
-  __spin_lock (&ss->lock);
-
-  /* Remove the link on the `active resources' chain added by
-     _hurd_setup_sighandler.  Its purpose was to make sure
-     that we got called; now we have, it is done.  */
-  _hurd_userlink_unlink (link);
-
-  /* Restore the set of blocked signals, and the intr_port slot.  */
-  ss->blocked = scp->sc_mask;
-  ss->intr_port = scp->sc_intr_port;
-
-  /* Check for pending signals that were blocked by the old set.  */
-  if (ss->pending & ~ss->blocked)
-    {
-      /* There are pending signals that just became unblocked.  Wake up the
-	 signal thread to deliver them.  But first, squirrel away SCP where
-	 the signal thread will notice it if it runs another handler, and
-	 arrange to have us called over again in the new reality.  */
-      ss->context = scp;
-      __spin_unlock (&ss->lock);
-      __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ());
-      /* If a pending signal was handled, sig_post never returned.  */
-      __spin_lock (&ss->lock);
-      ss->context = NULL;
-    }
-
-  if (scp->sc_onstack)
-    {
-      ss->sigaltstack.ss_flags &= ~SS_ONSTACK; /* XXX threadvars */
-      /* XXX cannot unlock until off sigstack */
-      abort ();
-    }
-  else
-    __spin_unlock (&ss->lock);
-
-  /* Destroy the MiG reply port used by the signal handler, and restore the
-     reply port in use by the thread when interrupted.  */
-  reply_port =
-    (mach_port_t *) __hurd_threadvar_location (_HURD_THREADVAR_MIG_REPLY);
-  if (*reply_port)
-    {
-      mach_port_t port = *reply_port;
-
-      /* Assigning MACH_PORT_DEAD here tells libc's mig_get_reply_port not to
-	 get another reply port, but avoids mig_dealloc_reply_port trying to
-	 deallocate it after the receive fails (which it will, because the
-	 reply port will be bogus, whether we do this or not).  */
-      *reply_port = MACH_PORT_DEAD;
-
-      __mach_port_destroy (__mach_task_self (), port);
-    }
-  *reply_port = scp->sc_reply_port;
-
-  if (scp->sc_coproc_used & SC_COPROC_USE_FPU)
-    {
-      /* Restore FPU state.  */
-#define restore_fpr(n) \
-  asm volatile ("l.d $f" #n ",%0" : : "m" (scp->sc_fpr[n]))
-
-      /* Restore floating-point registers. */
-#ifdef __mips64
-      restore_fpr (0);
-      restore_fpr (1);
-      restore_fpr (2);
-      restore_fpr (3);
-      restore_fpr (4);
-      restore_fpr (5);
-      restore_fpr (6);
-      restore_fpr (7);
-      restore_fpr (8);
-      restore_fpr (9);
-      restore_fpr (10);
-      restore_fpr (11);
-      restore_fpr (12);
-      restore_fpr (13);
-      restore_fpr (14);
-      restore_fpr (15);
-      restore_fpr (16);
-      restore_fpr (17);
-      restore_fpr (18);
-      restore_fpr (19);
-      restore_fpr (20);
-      restore_fpr (21);
-      restore_fpr (22);
-      restore_fpr (23);
-      restore_fpr (24);
-      restore_fpr (25);
-      restore_fpr (26);
-      restore_fpr (27);
-      restore_fpr (28);
-      restore_fpr (29);
-      restore_fpr (30);
-      restore_fpr (31);
-#else
-      restore_fpr (0);
-      restore_fpr (2);
-      restore_fpr (4);
-      restore_fpr (6);
-      restore_fpr (8);
-      restore_fpr (10);
-      restore_fpr (12);
-      restore_fpr (14);
-      restore_fpr (16);
-      restore_fpr (18);
-      restore_fpr (20);
-      restore_fpr (22);
-      restore_fpr (24);
-      restore_fpr (26);
-      restore_fpr (28);
-      restore_fpr (30);
-#endif
-
-      /* Restore the floating-point control/status register ($f31).  */
-      asm volatile ("ctc1 %0,$f31" : : "r" (scp->sc_fpcsr));
-    }
-
-  /* Load all the registers from the sigcontext.  */
-#ifdef __mips64
-#define restore_gpr(n) \
-  asm volatile ("ld $" #n ",%0" : : "m" (scpreg->sc_gpr[n - 1]))
-#else
-#define restore_gpr(n) \
-  asm volatile ("lw $" #n ",%0" : : "m" (scpreg->sc_gpr[n - 1]))
-#endif
-
-  {
-    register const struct sigcontext *const scpreg asm ("$1") = scp;
-    register int *at asm ("$1");
-
-    /* First restore the multiplication result registers.  The compiler
-       will use some temporary registers, so we do this before restoring
-       the general registers.  */
-    asm volatile ("mtlo %0" : : "r" (scpreg->sc_mdlo));
-    asm volatile ("mthi %0" : : "r" (scpreg->sc_mdhi));
-
-    /* In the word after the saved PC, store the saved $1 value.  */
-    (&scpreg->sc_pc)[1] = scpreg->sc_gpr[0];
-
-    asm volatile (".set noreorder; .set noat;");
-
-    /* Restore the normal registers.  */
-    restore_gpr (2);
-    restore_gpr (3);
-    restore_gpr (4);
-    restore_gpr (5);
-    restore_gpr (6);
-    restore_gpr (7);
-    restore_gpr (8);
-    restore_gpr (9);
-    restore_gpr (10);
-    restore_gpr (11);
-    restore_gpr (12);
-    restore_gpr (13);
-    restore_gpr (14);
-    restore_gpr (15);
-    restore_gpr (16);
-    restore_gpr (17);
-    restore_gpr (18);
-    restore_gpr (19);
-    restore_gpr (20);
-    restore_gpr (21);
-    restore_gpr (22);
-    restore_gpr (23);
-    restore_gpr (24);
-    restore_gpr (25);
-    /* Registers 26-27 are kernel-only.  */
-    restore_gpr (28);
-    restore_gpr (29);		/* Stack pointer.  */
-    restore_gpr (30);		/* Frame pointer.  */
-    restore_gpr (31);		/* Return address.  */
-
-    at = &scpreg->sc_pc;
-    /* This is an emulated instruction that will find at the address in $1
-       two words: the PC value to restore, and the $1 value to restore.  */
-    asm volatile (".word %0" : : "i" (op_sigreturn));
-    asm volatile (".set reorder; .set at;");
-    /* NOTREACHED */
-    return at;		/* To prevent optimization.  */
-  }
-
-  /* NOTREACHED */
-  return -1;
-}
-
-weak_alias (__sigreturn, sigreturn)
diff --git a/sysdeps/mach/hurd/mips/trampoline.c b/sysdeps/mach/hurd/mips/trampoline.c
deleted file mode 100644
index dd42dfc1c6..0000000000
--- a/sysdeps/mach/hurd/mips/trampoline.c
+++ /dev/null
@@ -1,292 +0,0 @@
-/* Set thread_state for sighandler, and sigcontext to recover.  MIPS version.
-   Copyright (C) 1996, 1997, 1998 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 Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <hurd/signal.h>
-#include <hurd/userlink.h>
-#include "thread_state.h"
-#include <assert.h>
-#include <errno.h>
-#include "hurdfault.h"
-#include "intr-msg.h"
-
-
-struct sigcontext *
-_hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
-			int signo, struct hurd_signal_detail *detail,
-			volatile int rpc_wait,
-			struct machine_thread_all_state *state)
-{
-  __label__ trampoline, rpc_wait_trampoline, firewall;
-  void *volatile sigsp;
-  struct sigcontext *scp;
-  struct 
-    {
-      int signo;
-      long int sigcode;
-      struct sigcontext *scp;	/* Points to ctx, below.  */
-      void *sigreturn_addr;
-      void *sigreturn_returns_here;
-      struct sigcontext *return_scp; /* Same; arg to sigreturn.  */
-      struct sigcontext ctx;
-      struct hurd_userlink link;
-    } *stackframe;
-
-  if (ss->context)
-    {
-      /* We have a previous sigcontext that sigreturn was about
-	 to restore when another signal arrived.  We will just base
-	 our setup on that.  */
-      if (! _hurdsig_catch_memory_fault (ss->context))
-	{
-	  memcpy (&state->basic, &ss->context->sc_mips_thread_state,
-		  sizeof (state->basic));
-	  memcpy (&state->exc, &ss->context->sc_mips_exc_state,
-		  sizeof (state->exc));
-	  state->set = (1 << MIPS_THREAD_STATE) | (1 << MIPS_EXC_STATE);
-	  if (state->exc.coproc_state & SC_COPROC_USE_FPU)
-	    {
-	      memcpy (&state->fpu, &ss->context->sc_mips_float_state,
-		      sizeof (state->fpu));
-	      state->set |= (1 << MIPS_FLOAT_STATE);
-	    }
-	}
-    }
-
-  if (! machine_get_basic_state (ss->thread, state))
-    return NULL;
-
-  /* Save the original SP in the gratuitous s0 ($16) slot.
-     We may need to reset the SP (the `r29' slot) to avoid clobbering an
-     interrupted RPC frame.  */
-  state->basic.r16 = state->basic.r29;
-
-  if ((ss->actions[signo].sa_flags & SA_ONSTACK) &&
-      !(ss->sigaltstack.ss_flags & (SS_DISABLE|SS_ONSTACK)))
-    {
-      sigsp = ss->sigaltstack.ss_sp + ss->sigaltstack.ss_size;
-      ss->sigaltstack.ss_flags |= SS_ONSTACK;
-      /* XXX need to set up base of new stack for
-	 per-thread variables, cthreads.  */
-    }
-  else
-    sigsp = (char *) state->basic.r29;
-
-  /* Push the arguments to call `trampoline' on the stack.  */
-  sigsp -= sizeof (*stackframe);
-  stackframe = sigsp;
-
-  if (_hurdsig_catch_memory_fault (stackframe))
-    {
-      /* We got a fault trying to write the stack frame.
-	 We cannot set up the signal handler.
-	 Returning NULL tells our caller, who will nuke us with a SIGILL.  */
-      return NULL;
-    }
-  else
-    {
-      int ok;
-
-      extern void _hurdsig_longjmp_from_handler (void *, jmp_buf, int);
-
-      /* Add a link to the thread's active-resources list.  We mark this as
-	 the only user of the "resource", so the cleanup function will be
-	 called by any longjmp which is unwinding past the signal frame.
-	 The cleanup function (in sigunwind.c) will make sure that all the
-	 appropriate cleanups done by sigreturn are taken care of.  */
-      stackframe->link.cleanup = &_hurdsig_longjmp_from_handler;
-      stackframe->link.cleanup_data = &stackframe->ctx;
-      stackframe->link.resource.next = NULL;
-      stackframe->link.resource.prevp = NULL;
-      stackframe->link.thread.next = ss->active_resources;
-      stackframe->link.thread.prevp = &ss->active_resources;
-      if (stackframe->link.thread.next)
-	stackframe->link.thread.next->thread.prevp
-	  = &stackframe->link.thread.next;
-      ss->active_resources = &stackframe->link;
-
-      /* Set up the arguments for the signal handler.  */
-      stackframe->signo = signo;
-      stackframe->sigcode = detail->code;
-      stackframe->scp = stackframe->return_scp = scp = &stackframe->ctx;
-      stackframe->sigreturn_addr = &__sigreturn;
-      stackframe->sigreturn_returns_here = &&firewall; /* Crash on return.  */
-
-      /* Set up the sigcontext from the current state of the thread.  */
-
-      scp->sc_onstack = ss->sigaltstack.ss_flags & SS_ONSTACK ? 1 : 0;
-
-      /* struct sigcontext is laid out so that starting at sc_gpr
-	 mimics a struct mips_thread_state.  */
-      memcpy (&scp->sc_mips_thread_state,
-	      &state->basic, sizeof (state->basic));
-
-      /* struct sigcontext is laid out so that starting at sc_cause
-	 mimics a struct mips_exc_state.  */
-      ok = machine_get_state (ss->thread, state, MIPS_EXC_STATE,
-			      &state->exc, &scp->sc_cause,
-			      sizeof (state->exc));
-
-      if (ok && (scp->sc_coproc_used & SC_COPROC_USE_FPU))
-	/* struct sigcontext is laid out so that starting at sc_fpr
-	   mimics a struct mips_float_state.  This state
-	   is only meaningful if the coprocessor was used.  */
-	  ok = machine_get_state (ss->thread, state, MIPS_FLOAT_STATE,
-				  &state->fpu, &scp->sc_mips_float_state,
-				  sizeof (state->fpu));
-
-      _hurdsig_end_catch_fault ();
-
-      if (! ok)
-	return NULL;
-    }
-
-  /* Modify the thread state to call the trampoline code on the new stack.  */
-  if (rpc_wait)
-    {
-      /* The signalee thread was blocked in a mach_msg_trap system call,
-	 still waiting for a reply.  We will have it run the special
-	 trampoline code which retries the message receive before running
-	 the signal handler.
-	 
-	 To do this we change the OPTION argument in its registers to
-	 enable only message reception, since the request message has
-	 already been sent.  */
-
-      /* The system call arguments are stored in consecutive registers
-	 starting with a0 ($4).  */
-      struct mach_msg_trap_args *args = (void *) &state->basic.r4;
-
-      if (_hurdsig_catch_memory_fault (args))
-	{
-	  /* Faulted accessing ARGS.  Bomb.  */
-	  return NULL;
-	}
-
-      assert (args->option & MACH_RCV_MSG);
-      /* Disable the message-send, since it has already completed.  The
-	 calls we retry need only wait to receive the reply message.  */
-      args->option &= ~MACH_SEND_MSG;
-
-      /* Limit the time to receive the reply message, in case the server
-	 claimed that `interrupt_operation' succeeded but in fact the RPC
-	 is hung.  */
-      args->option |= MACH_RCV_TIMEOUT;
-      args->timeout = _hurd_interrupted_rpc_timeout;
-
-      _hurdsig_end_catch_fault ();
-
-      state->basic.pc = (int) &&rpc_wait_trampoline;
-      /* The reply-receiving trampoline code runs initially on the original
-	 user stack.  We pass it the signal stack pointer in s4 ($20).  */
-      state->basic.r29 = state->basic.r16; /* Restore mach_msg syscall SP.  */
-      state->basic.r20 = (int) sigsp;
-      /* After doing the message receive, the trampoline code will need to
-	 update the v0 ($2) value to be restored by sigreturn.  To simplify
-	 the assembly code, we pass the address of its slot in SCP to the
-	 trampoline code in s5 ($21).  */
-      state->basic.r21 = (int) &scp->sc_gpr[1];
-      /* We must preserve the mach_msg_trap args in a0..t2 ($4..$10).
-	 Pass the handler args to the trampoline code in s1..s3 ($17..$19).  */
-      state->basic.r17 = signo;
-      state->basic.r18 = detail->code;
-      state->basic.r19 = (int) scp;
-    }
-  else
-    {
-      state->basic.pc = (int) &&trampoline;
-      state->basic.r29 = (int) sigsp;
-      state->basic.r4 = signo;
-      state->basic.r5 = detail->code;
-      state->basic.r6 = (int) scp;
-    }
-
-  /* We pass the handler function to the trampoline code in s6 ($22).  */
-  state->basic.r22 = (int) handler;
-  /* In the callee-saved register s0 ($16), we save the SCP value to pass
-     to __sigreturn after the handler returns.  */
-  state->basic.r16 = (int) scp;
-
-  return scp;
-
-  /* The trampoline code follows.  This is not actually executed as part of
-     this function, it is just convenient to write it that way.  */
-
- rpc_wait_trampoline:
-  /* This is the entry point when we have an RPC reply message to receive
-     before running the handler.  The MACH_MSG_SEND bit has already been
-     cleared in the OPTION argument in our registers.  For our convenience,
-     $3 points to the sc_gpr[1] member of the sigcontext (saved v0 ($2)).  */
-  asm volatile
-    (".set noat; .set noreorder; .set nomacro\n"
-     /* Retry the interrupted mach_msg system call.  */
-#ifdef __mips64
-     "dli $2, -25\n"		/* mach_msg_trap */
-#else
-     "li $2, -25\n"		/* mach_msg_trap */
-#endif
-     "syscall\n"
-     /* When the sigcontext was saved, v0 was MACH_RCV_INTERRUPTED.  But
-	now the message receive has completed and the original caller of
-	the RPC (i.e. the code running when the signal arrived) needs to
-	see the final return value of the message receive in v0.  So
-	store the new v0 value into the sc_gpr[1] member of the sigcontext
-	(whose address is in s5 to make this code simpler).  */
-#ifdef __mips64
-     "sd $2, ($21)\n"
-#else
-     "sw $2, ($21)\n"
-#endif
-     /* Since the argument registers needed to have the mach_msg_trap
-	arguments, we've stored the arguments to the handler function
-	in registers s1..s3 ($17..$19).  */
-     "move $4, $17\n"
-     "move $5, $18\n"
-     "move $6, $19\n"
-     /* Switch to the signal stack.  */
-     "move $29, $20\n");
-
- trampoline:
-  /* Entry point for running the handler normally.  The arguments to the
-     handler function are already in the standard registers:
-
-       a0	SIGNO
-       a1	SIGCODE
-       a2	SCP
-     */
-  asm volatile
-    ("move $25, $22\n"		/* Copy s6 to t9 for MIPS ABI.  */
-     "jal $25; nop\n"		/* Call the handler function.  */
-     /* Call __sigreturn (SCP); this cannot return.  */
-#ifdef __mips64
-     "dla $1,%0\n"
-#else
-     "la $1,%0\n"
-#endif
-     "j $1\n"
-     "move $4, $16"		/* Set up arg from saved SCP in delay slot.  */
-     : : "i" (&__sigreturn));
-
-  /* NOTREACHED */
-  asm volatile (".set reorder; .set at; .set macro");
-
- firewall:
-  asm volatile ("hlt: j hlt");
-
-  return NULL;
-}
diff --git a/sysdeps/mach/hurd/mkdirat.c b/sysdeps/mach/hurd/mkdirat.c
new file mode 100644
index 0000000000..321d59f2fd
--- /dev/null
+++ b/sysdeps/mach/hurd/mkdirat.c
@@ -0,0 +1,42 @@
+/* Create a directory named relative to another open directory.  Hurd version.
+   Copyright (C) 1991,1993,1994,1995,1996,1997,2002,2006
+	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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <stddef.h>
+#include <sys/stat.h>
+#include <hurd.h>
+
+int
+mkdirat (fd, path, mode)
+     int fd;
+     const char *path;
+     mode_t mode;
+{
+  error_t err;
+  const char *name;
+  file_t parent = __directory_name_split (path, (char **) &name);
+  if (parent == MACH_PORT_NULL)
+    return -1;
+  err = __dir_mkdir (parent, name, mode & ~_hurd_umask);
+  __mach_port_deallocate (__mach_task_self (), parent);
+  if (err)
+    return __hurd_fail (err);
+  return 0;
+}
diff --git a/sysdeps/mach/hurd/open.c b/sysdeps/mach/hurd/open.c
index dd575a47b1..bdfed5e311 100644
--- a/sysdeps/mach/hurd/open.c
+++ b/sysdeps/mach/hurd/open.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992,93,94,95,97,2000,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1992,93,94,95,97,2000,2002,2006 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
@@ -51,3 +51,9 @@ libc_hidden_def (__libc_open)
 weak_alias (__libc_open, __open)
 libc_hidden_weak (__open)
 weak_alias (__libc_open, open)
+
+/* open64 is just the same as open for us.  */
+weak_alias (__libc_open, __libc_open64)
+weak_alias (__libc_open, __open64)
+libc_hidden_weak (_open64)
+weak_alias (__libc_open, open64)
diff --git a/sysdeps/mach/hurd/open64.c b/sysdeps/mach/hurd/open64.c
new file mode 100644
index 0000000000..018ac94f28
--- /dev/null
+++ b/sysdeps/mach/hurd/open64.c
@@ -0,0 +1 @@
+/* open64 is defined in open.c as an alias.  */
diff --git a/sysdeps/mach/hurd/openat.c b/sysdeps/mach/hurd/openat.c
new file mode 100644
index 0000000000..1faf857e16
--- /dev/null
+++ b/sysdeps/mach/hurd/openat.c
@@ -0,0 +1,62 @@
+/* openat -- Open a file named relative to an open directory.  Hurd version.
+   Copyright (C) 2006 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <sys/stat.h>
+#include <hurd.h>
+#include <hurd/fd.h>
+
+/* Open FILE with access OFLAG.  Interpret relative paths relative to
+   the directory associated with FD.  If OFLAG includes O_CREAT, a
+   third argument is the file protection.  */
+int
+__openat (fd, file, oflag)
+     int fd;
+     const char *file;
+     int oflag;
+{
+  int mode;
+  io_t port;
+
+  if (oflag & O_CREAT)
+    {
+      va_list arg;
+      va_start (arg, oflag);
+      mode = va_arg (arg, int);
+      va_end (arg);
+    }
+  else
+    mode = 0;
+
+  port = __file_name_lookup_at (fd, 0, file, oflag, mode);
+  if (port == MACH_PORT_NULL)
+    return -1;
+
+  return _hurd_intern_fd (port, oflag, 1);
+}
+libc_hidden_def (__openat)
+weak_alias (__openat, openat)
+
+/* openat64 is just the same as openat for us.  */
+weak_alias (__openat, __openat64)
+libc_hidden_weak (__openat64)
+weak_alias (__openat, openat64)
diff --git a/sysdeps/mach/hurd/openat64.c b/sysdeps/mach/hurd/openat64.c
new file mode 100644
index 0000000000..15d9d6a183
--- /dev/null
+++ b/sysdeps/mach/hurd/openat64.c
@@ -0,0 +1 @@
+/* openat64 is defined in openat.c as an alias.  */
diff --git a/sysdeps/mach/hurd/opendir.c b/sysdeps/mach/hurd/opendir.c
index a1ff947f06..23e04ede0e 100644
--- a/sysdeps/mach/hurd/opendir.c
+++ b/sysdeps/mach/hurd/opendir.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993,94,95,96,97,98,2001,2003 Free Software Foundation, Inc.
+/* Copyright (C) 1993,1994,1995,1996,1997,1998,2001,2003,2005,2006
+	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
@@ -32,62 +33,29 @@
 #include "dirstream.h"
 
 
-/* Open a directory stream on NAME.  */
+/* Open a directory stream on a file descriptor in Hurd internal form.
+   We do no checking here on the descriptor.  */
 DIR *
-__opendir (const char *name)
+_hurd_fd_opendir (struct hurd_fd *d)
 {
   DIR *dirp;
-  int fd;
-  struct hurd_fd *d;
 
-  if (name[0] == '\0')
+  if (d == NULL)
     {
-      /* POSIX.1-1990 says an empty name gets ENOENT;
-	 but `open' might like it fine.  */
-      __set_errno (ENOENT);
+      errno = EBADF;
       return NULL;
     }
 
-  {
-    /* Append trailing slash to directory name to force ENOTDIR
-       if it's not a directory.
-
-       We open using the O_NONBLOCK flag so that a nondirectory with
-       blocking behavior (FIFO or device) gets ENOTDIR immediately
-       rather than waiting for the special file's open wakeup predicate.  */
-
-    size_t len = strlen (name);
-    if (name[len - 1] == '/')
-      fd = __open (name, O_RDONLY | O_NONBLOCK);
-    else
-      {
-	char n[len + 2];
-	memcpy (n, name, len);
-	n[len] = '/';
-	n[len + 1] = '\0';
-	fd = __open (n, O_RDONLY | O_NONBLOCK);
-      }
-  }
-  if (fd < 0)
-    return NULL;
-
   dirp = (DIR *) malloc (sizeof (DIR));
   if (dirp == NULL)
-    {
-      __close (fd);
-      return NULL;
-    }
-
-  /* Extract the pointer to the descriptor structure.  */
-  __mutex_lock (&_hurd_dtable_lock);
-  d = dirp->__fd = _hurd_dtable[fd];
-  __mutex_unlock (&_hurd_dtable_lock);
+    return NULL;
 
   /* Set the descriptor to close on exec. */
   __spin_lock (&d->port.lock);
   d->flags |= FD_CLOEXEC;
   __spin_unlock (&d->port.lock);
 
+  dirp->__fd = d;
   dirp->__data = dirp->__ptr = NULL;
   dirp->__entry_data = dirp->__entry_ptr = 0;
   dirp->__allocation = 0;
@@ -97,4 +65,29 @@ __opendir (const char *name)
 
   return dirp;
 }
+
+
+/* Open a directory stream on NAME.  */
+DIR *
+__opendir (const char *name)
+{
+  if (name[0] == '\0')
+    {
+      /* POSIX.1-1990 says an empty name gets ENOENT;
+	 but `open' might like it fine.  */
+      __set_errno (ENOENT);
+      return NULL;
+    }
+
+  int fd = __open (name, O_RDONLY | O_NONBLOCK | O_DIRECTORY);
+  if (fd < 0)
+    return NULL;
+
+  /* Extract the pointer to the descriptor structure.  */
+  DIR *dirp = _hurd_fd_opendir (_hurd_fd_get (fd));
+  if (dirp == NULL)
+    __close (fd);
+
+  return dirp;
+}
 weak_alias (__opendir, opendir)
diff --git a/sysdeps/mach/hurd/powerpc/Dist b/sysdeps/mach/hurd/powerpc/Dist
deleted file mode 100644
index c58180257e..0000000000
--- a/sysdeps/mach/hurd/powerpc/Dist
+++ /dev/null
@@ -1 +0,0 @@
-static-start.S
diff --git a/sysdeps/mach/hurd/powerpc/longjmp-ts.c b/sysdeps/mach/hurd/powerpc/longjmp-ts.c
index 4a59f16aa8..757366bc47 100644
--- a/sysdeps/mach/hurd/powerpc/longjmp-ts.c
+++ b/sysdeps/mach/hurd/powerpc/longjmp-ts.c
@@ -1,5 +1,5 @@
 /* Perform a `longjmp' on a Mach thread_state.  PowerPC version.
-   Copyright (C) 1991,94,95,97,2001 Free Software Foundation, Inc.
+   Copyright (C) 1991,94,95,97,2001, 2006 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
@@ -19,6 +19,7 @@
 
 #include <hurd/signal.h>
 #include <setjmp.h>
+#include <jmpbuf-offsets.h>
 #include <mach/thread_status.h>
 
 
diff --git a/sysdeps/mach/hurd/powerpc/register-dump.h b/sysdeps/mach/hurd/powerpc/register-dump.h
index 0377175227..c0b1d06236 100644
--- a/sysdeps/mach/hurd/powerpc/register-dump.h
+++ b/sysdeps/mach/hurd/powerpc/register-dump.h
@@ -1,5 +1,5 @@
 /* Dump registers.  PowerPC/Hurd version.
-   Copyright (C) 1998, 2001 Free Software Foundation, Inc.
+   Copyright (C) 1998, 2001, 2006 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
@@ -113,7 +113,7 @@ register_dump (int fd, struct sigcontext *ctx)
     }
 
   /* Write the output.  */
-  write (fd, buffer, sizeof(buffer));
+  write (fd, buffer, sizeof(buffer) - 1);
 }
 
 #define REGISTER_DUMP \
diff --git a/sysdeps/mach/hurd/powerpc/trampoline.c b/sysdeps/mach/hurd/powerpc/trampoline.c
index 4e5d675258..4e1ea4b9d9 100644
--- a/sysdeps/mach/hurd/powerpc/trampoline.c
+++ b/sysdeps/mach/hurd/powerpc/trampoline.c
@@ -1,5 +1,6 @@
 /* Set thread_state for sighandler, and sigcontext to recover.  For PowerPC.
-   Copyright (C) 1994,95,96,97,98,99,2001 Free Software Foundation, Inc.
+   Copyright (C) 1994,1995,1996,1997,1998,1999,2001,2005
+	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
@@ -19,11 +20,11 @@
 
 #include <hurd/signal.h>
 #include <hurd/userlink.h>
-#include "thread_state.h"
+#include <thread_state.h>
 #include <assert.h>
 #include <errno.h>
 #include "hurdfault.h"
-#include "intr-msg.h"
+#include <intr-msg.h>
 
 struct sigcontext *
 _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
diff --git a/sysdeps/mach/hurd/ppoll.c b/sysdeps/mach/hurd/ppoll.c
new file mode 100644
index 0000000000..693bc13839
--- /dev/null
+++ b/sysdeps/mach/hurd/ppoll.c
@@ -0,0 +1,30 @@
+/* poll file descriptors.  Hurd version.
+   Copyright (C) 2006 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <sys/poll.h>
+#include <sys/time.h>
+#include <hurd.h>
+#include <hurd/fd.h>
+
+int
+ppoll (struct pollfd *fds, nfds_t nfds,
+       const struct timespec *timeout, const sigset_t *sigmask)
+{
+  return _hurd_select (nfds, fds, NULL, NULL, NULL, timeout, sigmask);
+}
diff --git a/sysdeps/mach/hurd/profil.c b/sysdeps/mach/hurd/profil.c
index d212872643..0426f67b6f 100644
--- a/sysdeps/mach/hurd/profil.c
+++ b/sysdeps/mach/hurd/profil.c
@@ -1,5 +1,5 @@
 /* Low-level statistical profiling support function.  Mach/Hurd version.
-   Copyright (C) 1995, 1996, 1997, 2000, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 2000, 2002, 2005 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
@@ -49,6 +49,7 @@ static kern_return_t profil_task_get_sampled_pcs (mach_port_t,
 						  sampled_pc_array_t,
 						  mach_msg_type_number_t *);
 static void fetch_samples (void);
+static void profile_waiter (void);
 
 /* Enable statistical profiling, writing samples of the PC into at most
    SIZE bytes of SAMPLE_BUFFER; every processor clock tick while profiling
@@ -64,7 +65,6 @@ update_waiter (u_short *sample_buffer, size_t size, size_t offset, u_int scale)
   if (profile_thread == MACH_PORT_NULL)
     {
       /* Set up the profiling collector thread.  */
-      static void profile_waiter (void);
       err = __thread_create (__mach_task_self (), &profile_thread);
       if (! err)
 	err = __mach_setup_thread (__mach_task_self (), profile_thread,
diff --git a/sysdeps/mach/hurd/readdir64_r.c b/sysdeps/mach/hurd/readdir64_r.c
index c26b35bb70..5b5a7fe362 100644
--- a/sysdeps/mach/hurd/readdir64_r.c
+++ b/sysdeps/mach/hurd/readdir64_r.c
@@ -109,4 +109,4 @@ __readdir64_r (DIR *dirp, struct dirent64 *entry, struct dirent64 **result)
   return dp ? 0 : err ? errno : 0;
 }
 
-weak_alias(__readdir64_r, readdir64_r)
+weak_alias (__readdir64_r, readdir64_r)
diff --git a/sysdeps/mach/hurd/recv.c b/sysdeps/mach/hurd/recv.c
index a2b8fd5be5..b001729d18 100644
--- a/sysdeps/mach/hurd/recv.c
+++ b/sysdeps/mach/hurd/recv.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1994, 1997, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1994,1997,2001,2005 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
@@ -26,9 +26,8 @@
 /* Read N bytes into BUF from socket FD.
    Returns the number read or -1 for errors.  */
 
-/* XXX should be __recv ? */
 ssize_t
-recv (fd, buf, n, flags)
+__recv (fd, buf, n, flags)
      int fd;
      void *buf;
      size_t n;
@@ -62,3 +61,4 @@ recv (fd, buf, n, flags)
 
   return nread;
 }
+weak_alias (__recv, recv)
diff --git a/sysdeps/mach/hurd/removexattr.c b/sysdeps/mach/hurd/removexattr.c
new file mode 100644
index 0000000000..bbfee3d304
--- /dev/null
+++ b/sysdeps/mach/hurd/removexattr.c
@@ -0,0 +1,35 @@
+/* Access to extended attributes on files.  Hurd version.
+   Copyright (C) 2005 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <sys/xattr.h>
+#include <hurd.h>
+#include <hurd/xattr.h>
+
+ssize_t
+removexattr (const char *path, const char *name)
+{
+  error_t err;
+  file_t port = __file_name_lookup (path, 0, 0);
+  if (port == MACH_PORT_NULL)
+    return -1;
+  err = _hurd_xattr_remove (port, name);
+  __mach_port_deallocate (__mach_task_self (), port);
+  return __hurd_fail (err);
+}
diff --git a/sysdeps/mach/hurd/setitimer.c b/sysdeps/mach/hurd/setitimer.c
index 9fef56287d..fec64a8cb5 100644
--- a/sysdeps/mach/hurd/setitimer.c
+++ b/sysdeps/mach/hurd/setitimer.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 1994,1995,1996,1997,2000,2001 Free Software Foundation, Inc.
+/* Copyright (C) 1994,1995,1996,1997,2000,2001,2005
+	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
@@ -41,7 +42,7 @@ static void
 quantize_timeval (struct timeval *tv)
 {
   static time_t quantum = -1;
-  
+
   if (quantum == -1)
     quantum = 1000000 / __getclktck ();
 
@@ -127,14 +128,15 @@ timer_thread (void)
 }
 
 
+/* Forward declaration.  */
+static int setitimer_locked (const struct itimerval *new,
+			     struct itimerval *old, void *crit);
+
 static sighandler_t
 restart_itimer (struct hurd_signal_preemptor *preemptor,
 		struct hurd_sigstate *ss,
 		int *signo, struct hurd_signal_detail *detail)
 {
-  static int setitimer_locked (const struct itimerval *new,
-			       struct itimerval *old, void *crit);
-
   /* This function gets called in the signal thread
      each time a SIGALRM is arriving (even if blocked).  */
   struct itimerval it;
diff --git a/sysdeps/mach/hurd/setresgid.c b/sysdeps/mach/hurd/setresgid.c
index d0ee412b46..8fcf26eaf1 100644
--- a/sysdeps/mach/hurd/setresgid.c
+++ b/sysdeps/mach/hurd/setresgid.c
@@ -1,5 +1,5 @@
-/* setresgid -- set effective group ID, real group ID, and saved-set group ID
-   Copyright (C) 2002 Free Software Foundation, Inc.
+/* setresgid -- set real group ID, effective group ID, and saved-set group ID
+   Copyright (C) 2002, 2005, 2006 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
@@ -22,10 +22,10 @@
 #include <hurd.h>
 #include <hurd/id.h>
 
-/* Set the effective group ID, real group ID, and saved-set group ID,
-   of the calling process to EGID, RGID, and SGID, respectively.  */
+/* Set the real group ID, effective group ID, and saved-set group ID,
+   of the calling process to RGID, EGID, and SGID, respectively.  */
 int
-__setresgid (gid_t egid, gid_t rgid, gid_t sgid)
+__setresgid (gid_t rgid, gid_t egid, gid_t sgid)
 {
   auth_t newauth;
   error_t err;
@@ -75,3 +75,4 @@ __setresgid (gid_t egid, gid_t rgid, gid_t sgid)
   return err;
 }
 libc_hidden_def (__setresgid)
+weak_alias (__setresgid, setresgid)
diff --git a/sysdeps/mach/hurd/setresuid.c b/sysdeps/mach/hurd/setresuid.c
index 2d05dbc850..ccf8d08d40 100644
--- a/sysdeps/mach/hurd/setresuid.c
+++ b/sysdeps/mach/hurd/setresuid.c
@@ -1,5 +1,5 @@
-/* setresuid -- set effective user ID, real user ID, and saved-set user ID
-   Copyright (C) 2002 Free Software Foundation, Inc.
+/* setresuid -- set real user ID, effective user ID, and saved-set user ID
+   Copyright (C) 2002, 2005, 2006 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
@@ -22,10 +22,10 @@
 #include <hurd.h>
 #include <hurd/id.h>
 
-/* Set the effective user ID, real user ID, and saved-set user ID,
-   of the calling process to EUID, RUID, and SUID, respectively.  */
+/* Set the real user ID, effective user ID, and saved-set user ID,
+   of the calling process to RUID, EUID, and SUID, respectively.  */
 int
-__setresuid (uid_t euid, uid_t ruid, uid_t suid)
+__setresuid (uid_t ruid, uid_t euid, uid_t suid)
 {
   auth_t newauth;
   error_t err;
@@ -75,3 +75,4 @@ __setresuid (uid_t euid, uid_t ruid, uid_t suid)
   return err;
 }
 libc_hidden_def (__setresuid)
+weak_alias (__setresuid, setresuid)
diff --git a/sysdeps/mach/hurd/setxattr.c b/sysdeps/mach/hurd/setxattr.c
new file mode 100644
index 0000000000..afabc8ee06
--- /dev/null
+++ b/sysdeps/mach/hurd/setxattr.c
@@ -0,0 +1,36 @@
+/* Access to extended attributes on files.  Hurd version.
+   Copyright (C) 2006 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <sys/xattr.h>
+#include <hurd.h>
+#include <hurd/xattr.h>
+
+ssize_t
+setxattr (const char *path, const char *name, const void *value, size_t size,
+	  int flags)
+{
+  error_t err;
+  file_t port = __file_name_lookup (path, 0, 0);
+  if (port == MACH_PORT_NULL)
+    return -1;
+  err = _hurd_xattr_set (port, name, value, size, flags);
+  __mach_port_deallocate (__mach_task_self (), port);
+  return __hurd_fail (err);
+}
diff --git a/sysdeps/mach/hurd/sigaltstack.c b/sysdeps/mach/hurd/sigaltstack.c
index ea3e07d26b..5b2f06561b 100644
--- a/sysdeps/mach/hurd/sigaltstack.c
+++ b/sysdeps/mach/hurd/sigaltstack.c
@@ -60,4 +60,4 @@ __sigaltstack (argss, oss)
 
   return 0;
 }
-weak_alias(__sigaltstack, sigaltstack)
+weak_alias (__sigaltstack, sigaltstack)
diff --git a/sysdeps/mach/hurd/symlinkat.c b/sysdeps/mach/hurd/symlinkat.c
new file mode 100644
index 0000000000..9a51c66d8d
--- /dev/null
+++ b/sysdeps/mach/hurd/symlinkat.c
@@ -0,0 +1,74 @@
+/* Create a symbolic link named relative to an open directory.  Hurd version.
+   Copyright (C) 1991,1992,1993,1994,1995,1996,1997,2006
+	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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <unistd.h>
+#include <hurd.h>
+#include <hurd/paths.h>
+#include <hurd/fd.h>
+#include <string.h>
+
+
+/* Make a link to FROM called TO relative to FD.  */
+int
+symlinkat (from, fd, to)
+     const char *from;
+     int fd;
+     const char *to;
+{
+  error_t err;
+  file_t dir, node;
+  char *name;
+  const size_t len = strlen (from) + 1;
+  char buf[sizeof (_HURD_SYMLINK) + len];
+
+  /* A symlink is a file whose translator is "/hurd/symlink\0target\0".  */
+
+  memcpy (buf, _HURD_SYMLINK, sizeof (_HURD_SYMLINK));
+  memcpy (&buf[sizeof (_HURD_SYMLINK)], from, len);
+
+  dir = __file_name_split_at (fd, to, &name);
+  if (dir == MACH_PORT_NULL)
+    return -1;
+
+  /* Create a new, unlinked node in the target directory.  */
+  err = __dir_mkfile (dir, O_WRITE, 0777 & ~_hurd_umask, &node);
+
+  if (! err)
+    /* Set the node's translator to make it a symlink.  */
+    err = __file_set_translator (node,
+				 FS_TRANS_EXCL|FS_TRANS_SET,
+				 FS_TRANS_EXCL|FS_TRANS_SET, 0,
+				 buf, sizeof (_HURD_SYMLINK) + len,
+				 MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND);
+
+  if (! err)
+    /* Link the node, now a valid symlink, into the target directory.  */
+    err = __dir_link (dir, node, name, 1);
+
+  __mach_port_deallocate (__mach_task_self (), dir);
+  __mach_port_deallocate (__mach_task_self (), node);
+
+  if (err)
+    return __hurd_fail (err);
+  return 0;
+}
diff --git a/sysdeps/mach/hurd/tls.h b/sysdeps/mach/hurd/tls.h
index bc15b4dab6..cce42ef374 100644
--- a/sysdeps/mach/hurd/tls.h
+++ b/sysdeps/mach/hurd/tls.h
@@ -1,5 +1,5 @@
 /* Definitions for thread-local data handling.  Hurd version.
-   Copyright (C) 2003 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2005 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
@@ -23,6 +23,7 @@
 #if defined HAVE_TLS_SUPPORT && !defined ASSEMBLER
 
 # include <stddef.h>
+# include <stdbool.h>
 # include <mach/mig_errors.h>
 # include <mach.h>
 
@@ -31,7 +32,11 @@
 typedef union dtv
 {
   size_t counter;
-  void *pointer;
+  struct
+  {
+    void *val;
+    bool is_static;
+  } pointer;
 } dtv_t;
 
 
diff --git a/sysdeps/mach/hurd/unlinkat.c b/sysdeps/mach/hurd/unlinkat.c
new file mode 100644
index 0000000000..7740c5a297
--- /dev/null
+++ b/sysdeps/mach/hurd/unlinkat.c
@@ -0,0 +1,55 @@
+/* unlinkat -- Remove a name relative to an open directory.  Hurd version.
+   Copyright (C) 2006 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <unistd.h>
+#include <hurd.h>
+#include <hurd/fd.h>
+
+
+/* Remove the link named NAME.  */
+int
+unlinkat (fd, name, flag)
+     int fd;
+     const char *name;
+     int flag;
+{
+  error_t err;
+  file_t dir;
+  const char *file;
+
+  if ((flag &~ AT_REMOVEDIR) != 0)
+    {
+      __set_errno (EINVAL);
+      return -1;
+    }
+
+  dir = __directory_name_split_at (fd, name, (char **) &file);
+  if (dir == MACH_PORT_NULL)
+    return -1;
+
+  err = ((flag & AT_REMOVEDIR) ? __dir_rmdir : __dir_unlink) (dir, file);
+  __mach_port_deallocate (__mach_task_self (), dir);
+
+  if (err)
+    return __hurd_fail (err);
+  return 0;
+}
diff --git a/sysdeps/mach/hurd/xmknod.c b/sysdeps/mach/hurd/xmknod.c
index 2989215d9c..5f40188fb6 100644
--- a/sysdeps/mach/hurd/xmknod.c
+++ b/sysdeps/mach/hurd/xmknod.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 1991,92,93,94,95,96,99,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1991,1992,1993,1994,1995,1996,1999,2002,2005,2006
+	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 +18,10 @@
    02111-1307 USA.  */
 
 #include <errno.h>
-#include <sys/stat.h>
-#include <hurd.h>
-#include <hurd/paths.h>
 #include <fcntl.h>
-#include "stdio-common/_itoa.h"
-#include <string.h>
+#include <stddef.h>
 #include <sys/types.h>
+#include <sys/stat.h>
 
 
 /* Create a device file named FILE_NAME, with permission and special bits MODE
@@ -32,80 +30,6 @@
 int
 __xmknod (int vers, const char *file_name, mode_t mode, dev_t *dev)
 {
-  error_t err;
-  file_t dir, node;
-  char *name;
-  char buf[100], *bp;
-  const char *translator;
-  size_t len;
-
-  if (vers != _MKNOD_VER)
-    return __hurd_fail (EINVAL);
-
-  if (S_ISCHR (mode))
-    {
-      translator = _HURD_CHRDEV;
-      len = sizeof (_HURD_CHRDEV);
-    }
-  else if (S_ISBLK (mode))
-    {
-      translator = _HURD_BLKDEV;
-      len = sizeof (_HURD_BLKDEV);
-    }
-  else if (S_ISFIFO (mode))
-    {
-      translator = _HURD_FIFO;
-      len = sizeof (_HURD_FIFO);
-    }
-  else
-    {
-      errno = EINVAL;
-      return -1;
-    }
-
-  if (! S_ISFIFO (mode))
-    {
-      /* We set the translator to "ifmt\0major\0minor\0", where IFMT
-	 depends on the S_IFMT bits of our MODE argument, and MAJOR and
-	 MINOR are ASCII decimal (octal or hex would do as well)
-	 representations of our arguments.  Thus the convention is that
-	 CHRDEV and BLKDEV translators are invoked with two non-switch
-	 arguments, giving the major and minor device numbers in %i format. */
-
-      bp = buf + sizeof (buf);
-      *--bp = '\0';
-      bp = _itoa (minor (*dev), bp, 10, 0);
-      *--bp = '\0';
-      bp = _itoa (major (*dev), bp, 10, 0);
-      memcpy (bp - len, translator, len);
-      translator = bp - len;
-      len = buf + sizeof (buf) - translator;
-    }
-
-  dir = __file_name_split (file_name, &name);
-  if (dir == MACH_PORT_NULL)
-    return -1;
-
-  /* Create a new, unlinked node in the target directory.  */
-  err = __dir_mkfile (dir, O_WRITE, (mode & ~S_IFMT) & ~_hurd_umask, &node);
-
-  if (! err)
-    /* Set the node's translator to make it a device.  */
-    err = __file_set_translator (node,
-				 FS_TRANS_EXCL | FS_TRANS_SET,
-				 FS_TRANS_EXCL | FS_TRANS_SET, 0,
-				 translator, len,
-				 MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND);
-
-  if (! err)
-    /* Link the node, now a valid device, into the target directory.  */
-    err = __dir_link (dir, node, name, 1);
-
-  __mach_port_deallocate (__mach_task_self (), dir);
-  __mach_port_deallocate (__mach_task_self (), node);
-
-  if (err)
-    return __hurd_fail (err);
-  return 0;
+  return __xmknodat (vers, AT_FDCWD, file_name, mode, dev);
 }
 libc_hidden_def (__xmknod)
diff --git a/sysdeps/mach/hurd/xmknodat.c b/sysdeps/mach/hurd/xmknodat.c
new file mode 100644
index 0000000000..b2227593c9
--- /dev/null
+++ b/sysdeps/mach/hurd/xmknodat.c
@@ -0,0 +1,118 @@
+/* Create a device file relative to an open directory.  Hurd version.
+   Copyright (C) 1991,1992,1993,1994,1995,1996,1999,2002,2005,2006
+	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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <sys/stat.h>
+#include <hurd.h>
+#include <hurd/fd.h>
+#include <hurd/paths.h>
+#include <fcntl.h>
+#include "stdio-common/_itoa.h"
+#include <string.h>
+#include <sys/types.h>
+
+/* Create a device file named PATH relative to FD, with permission and
+   special bits MODE and device number DEV (which can be constructed
+   from major and minor device numbers with the `makedev' macro
+   above).  */
+int
+__xmknodat (int vers, int fd, const char *path, mode_t mode, dev_t *dev)
+{
+  error_t err;
+  file_t dir, node;
+  char *name;
+  char buf[100], *bp;
+  const char *translator;
+  size_t len;
+
+  if (vers != _MKNOD_VER)
+    return __hurd_fail (EINVAL);
+
+  if (S_ISCHR (mode))
+    {
+      translator = _HURD_CHRDEV;
+      len = sizeof (_HURD_CHRDEV);
+    }
+  else if (S_ISBLK (mode))
+    {
+      translator = _HURD_BLKDEV;
+      len = sizeof (_HURD_BLKDEV);
+    }
+  else if (S_ISFIFO (mode))
+    {
+      translator = _HURD_FIFO;
+      len = sizeof (_HURD_FIFO);
+    }
+  else if (S_ISREG (mode))
+    {
+      translator = NULL;
+      len = 0;
+    }
+  else
+    {
+      errno = EINVAL;
+      return -1;
+    }
+
+  if (translator != NULL && ! S_ISFIFO (mode))
+    {
+      /* We set the translator to "ifmt\0major\0minor\0", where IFMT
+	 depends on the S_IFMT bits of our MODE argument, and MAJOR and
+	 MINOR are ASCII decimal (octal or hex would do as well)
+	 representations of our arguments.  Thus the convention is that
+	 CHRDEV and BLKDEV translators are invoked with two non-switch
+	 arguments, giving the major and minor device numbers in %i format. */
+
+      bp = buf + sizeof (buf);
+      *--bp = '\0';
+      bp = _itoa (minor (*dev), bp, 10, 0);
+      *--bp = '\0';
+      bp = _itoa (major (*dev), bp, 10, 0);
+      memcpy (bp - len, translator, len);
+      translator = bp - len;
+      len = buf + sizeof (buf) - translator;
+    }
+
+  dir = __file_name_split_at (fd, path, &name);
+  if (dir == MACH_PORT_NULL)
+    return -1;
+
+  /* Create a new, unlinked node in the target directory.  */
+  err = __dir_mkfile (dir, O_WRITE, (mode & ~S_IFMT) & ~_hurd_umask, &node);
+
+  if (! err && translator != NULL)
+    /* Set the node's translator to make it a device.  */
+    err = __file_set_translator (node,
+				 FS_TRANS_EXCL | FS_TRANS_SET,
+				 FS_TRANS_EXCL | FS_TRANS_SET, 0,
+				 translator, len,
+				 MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND);
+
+  if (! err)
+    /* Link the node, now a valid device, into the target directory.  */
+    err = __dir_link (dir, node, name, 1);
+
+  __mach_port_deallocate (__mach_task_self (), dir);
+  __mach_port_deallocate (__mach_task_self (), node);
+
+  if (err)
+    return __hurd_fail (err);
+  return 0;
+}