[prev in list] [next in list] [prev in thread] [next in thread] 

List:       hurd-commit
Subject:    [hurd] 01/01: hurd.hurd-console.init: Actually make ENABLE=false in default work.
From:       Samuel Thibault <sthibault () moszumanska ! debian ! org>
Date:       2014-01-14 23:19:19
Message-ID: E1W3DGR-0007PV-RJ () moszumanska ! debian ! org
[Download RAW message or body]

This is an automated email from the git hooks/post-receive script.

sthibault pushed a commit to branch master
in repository hurd.

commit 94f3c71706e2e5e864ed0a91c54d9ac14ccc22b7
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Tue Jan 14 23:19:08 2014 +0000

    hurd.hurd-console.init: Actually make ENABLE=false in default work.
---
 Makeconf                                           |   2 +-
 Makefile                                           |   5 +-
 TODO                                               |   2 +-
 config.guess                                       | 140 +++++---
 config.sub                                         |  17 +-
 config/ttys                                        |  16 +-
 configure.ac                                       |  10 +-
 console-client/bdf.c                               |   2 +
 console-client/xkb/xkb-data/keymap/hurd            | 182 +++++-----
 daemons/rc.sh                                      |  63 +++-
 daemons/runsystem.sh                               |   6 +-
 debian/changelog                                   |   6 +
 debian/hurd.hurd-console.init                      |   2 +
 doc/hurd.texi                                      |  24 +-
 exec/Makefile                                      |   3 +-
 exec/exec.c                                        |  48 ++-
 exec/hashexec.c                                    | 130 ++++---
 exec/main.c                                        |   2 +
 exec/priv.h                                        |   5 +-
 hurd/exec.defs                                     |   4 +-
 hurd/fs.defs                                       |  10 +-
 hurd/hurd_types.h                                  |   9 +-
 hurd/process.defs                                  |   6 +-
 hurd/process_request.defs                          |   5 +-
 include/pids.h                                     |   7 +-
 init/Makefile                                      |   2 +-
 init/init.c                                        | 103 ++++--
 libdde-linux26/contrib/include/linux/etherdevice.h |  27 ++
 libdde-linux26/contrib/include/linux/ethtool.h     |  36 +-
 libdde-linux26/contrib/include/linux/kernel.h      |   2 +
 libdde-linux26/contrib/include/linux/netdevice.h   |  90 ++++-
 libdde-linux26/contrib/include/linux/pci.h         |   1 +
 libdde-linux26/contrib/include/linux/pci_ids.h     | 177 +++++++---
 libdde-linux26/contrib/include/linux/phy.h         |  19 +-
 libdde-linux26/contrib/include/linux/skbuff.h      |  20 +-
 libdde-linux26/contrib/include/linux/workqueue.h   |  23 +-
 libdde-linux26/contrib/kernel/rcupdate.c           |   1 +
 libdde-linux26/contrib/net/core/skb_dma_map.c      |  12 +-
 libdde-linux26/include/linux/kernel.h              |   2 +
 libdde-linux26/lib/src/Makefile                    |   3 +
 libdde-linux26/lib/src/net/core/dev.c              | 389 +++++++++++++++++++--
 libdde-linux26/lib/src/net/sched/sch_generic.c     |  40 ++-
 libdiskfs/Makefile                                 |   3 +-
 libdiskfs/boot-start.c                             |  26 +-
 libdiskfs/demuxer.c                                |   2 +
 libdiskfs/file-exec.c                              |  81 ++++-
 libdiskfs/file-utimes.c                            |   4 +-
 libdiskfs/init-init.c                              |   3 +
 libdiskfs/node-times.c                             |   6 +-
 libdiskfs/opts-common.c                            |   2 +-
 libfshelp/start-translator-long.c                  |  26 +-
 libmachdev/ds_routines.c                           |   2 +-
 libmachdev/net.c                                   |   4 +-
 libnetfs/Makefile                                  |   3 +-
 libnetfs/demuxer.c                                 |   2 +
 libnetfs/file-exec.c                               |  73 +++-
 libports/manage-multithread.c                      |   7 +
 libtrivfs/Makefile                                 |   4 +-
 libtrivfs/demuxer.c                                |   2 +
 libtrivfs/file-exec.c                              |  27 +-
 libtrivfs/trivfs.h                                 |   1 +
 pfinet/linux-src/net/ipv4/devinet.c                |   2 +
 pfinet/options.c                                   | 381 ++++++++++++++------
 proc/Makefile                                      |   2 +-
 proc/main.c                                        |   9 +-
 proc/mgt.c                                         |  76 ++--
 proc/pgrp.c                                        |   4 +-
 proc/proc.h                                        |  10 +-
 proc/stubs.c                                       |   3 +-
 proc/wait.c                                        |   4 +-
 procfs/Makefile                                    |  47 +--
 procfs/main.c                                      |   4 +-
 random/random.c                                    |   2 +-
 sutils/MAKEDEV.sh                                  |   2 +-
 trans/Makefile                                     |   7 +-
 trans/fakeroot.c                                   |  64 +++-
 trans/proxy-defpager.c                             |   5 +-
 utils/fakeauth.c                                   |   9 +-
 utils/login.c                                      |  28 +-
 utils/mount.c                                      |   3 +-
 utils/rpctrace.c                                   |   4 +
 utils/shd.c                                        |   9 +-
 utils/uptime.sh                                    |   2 +-
 83 files changed, 1970 insertions(+), 638 deletions(-)

diff --git a/Makeconf b/Makeconf
index 5cf995d..b8d7a29 100644
--- a/Makeconf
+++ b/Makeconf
@@ -575,7 +575,7 @@ vpath %.defs $(top_srcdir)/hurd
 # These we want to find in the libc include directory...
 mach_defs_names = bootstrap exc mach mach4 \
 	mach_host mach_port mach_timer_reply memory_object \
-	memory_object_default notify
+	memory_object_default notify experimental
 device_defs_names = dev_forward device device_reply device_request
 
 mach_defs = $(addsuffix .defs,$(mach_defs_names))
diff --git a/Makefile b/Makefile
index 106f2f6..8adbf91 100644
--- a/Makefile
+++ b/Makefile
@@ -28,7 +28,8 @@ include ./Makeconf
 # Hurd libraries
 lib-subdirs = libshouldbeinlibc libihash libiohelp libports libthreads \
 	      libpager libfshelp libdiskfs libtrivfs libps \
-	      libnetfs libpipe libstore libhurdbugaddr libftpconn libcons
+	      libnetfs libpipe libstore libhurdbugaddr libftpconn libcons \
+	      libmachdev libbpf libddekit libhurd-slab eth-filter eth-multiplexer
 
 # Hurd programs
 prog-subdirs = auth proc exec init term \
@@ -37,7 +38,7 @@ prog-subdirs = auth proc exec init term \
 	       login daemons boot console \
 	       hostmux usermux ftpfs trans \
 	       console-client utils sutils \
-	       benchmarks fstests
+	       benchmarks fstests procfs random devnode
 
 ifeq ($(HAVE_SUN_RPC),yes)
 prog-subdirs += nfs nfsd
diff --git a/TODO b/TODO
index d2500dc..297ac98 100644
--- a/TODO
+++ b/TODO
@@ -135,7 +135,7 @@ See `tasks', the exported task list.
 
 ** libtrivfs
 *** Allow for read/write/exec to be passed down.
-*** Implement file_exec when appropriate. !!
+*** Implement file_exec_file_name when appropriate. !!
 *** Provide for the visible owner, etc., to be held in command-line args
     instead of the underlying node, when it's important. !!
 
diff --git a/config.guess b/config.guess
index f475ceb..b79252d 100755
--- a/config.guess
+++ b/config.guess
@@ -2,7 +2,7 @@
 # Attempt to guess a canonical system name.
 #   Copyright 1992-2013 Free Software Foundation, Inc.
 
-timestamp='2013-02-12'
+timestamp='2013-06-10'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -132,6 +132,27 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
 UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
 UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
 
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	LIBC=gnu
+
+	eval $set_cc_for_build
+	cat <<-EOF > $dummy.c
+	#include <features.h>
+	#if defined(__UCLIBC__)
+	LIBC=uclibc
+	#elif defined(__dietlibc__)
+	LIBC=dietlibc
+	#else
+	LIBC=gnu
+	#endif
+	EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+	;;
+esac
+
 # Note: order is significant - the case branches are not exclusive.
 
 case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
@@ -853,21 +874,21 @@ EOF
 	exit ;;
     *:GNU:*:*)
 	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo \
${UNAME_RELEASE}|sed -e 's,/.*$,,'` +	echo `echo ${UNAME_MACHINE}|sed -e \
's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`  exit ;;
     *:GNU/*:*:*)
 	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr \
'[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu +	echo \
${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' \
'[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}  exit ;;
     i*86:Minix:*:*)
 	echo ${UNAME_MACHINE}-pc-minix
 	exit ;;
     aarch64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     aarch64_be:Linux:*:*)
 	UNAME_MACHINE=aarch64_be
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     alpha:Linux:*:*)
 	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
@@ -880,59 +901,54 @@ EOF
 	  EV68*) UNAME_MACHINE=alphaev68 ;;
 	esac
 	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     arm*:Linux:*:*)
 	eval $set_cc_for_build
 	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
 	    | grep -q __ARM_EABI__
 	then
-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	else
 	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
 		| grep -q __ARM_PCS_VFP
 	    then
-		echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
 	    else
-		echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
 	    fi
 	fi
 	exit ;;
     avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     cris:Linux:*:*)
-	echo ${UNAME_MACHINE}-axis-linux-gnu
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 	exit ;;
     crisv32:Linux:*:*)
-	echo ${UNAME_MACHINE}-axis-linux-gnu
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 	exit ;;
     frv:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     hexagon:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     i*86:Linux:*:*)
-	LIBC=gnu
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
-	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     mips:Linux:*:* | mips64:Linux:*:*)
 	eval $set_cc_for_build
@@ -951,57 +967,63 @@ EOF
 	#endif
 EOF
 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
 	;;
     or1k:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     or32:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     padre:Linux:*:*)
-	echo sparc-unknown-linux-gnu
+	echo sparc-unknown-linux-${LIBC}
 	exit ;;
     parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
+	echo hppa64-unknown-linux-${LIBC}
 	exit ;;
     parisc:Linux:*:* | hppa:Linux:*:*)
 	# Look for CPU level
 	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
+	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+	  *)    echo hppa-unknown-linux-${LIBC} ;;
 	esac
 	exit ;;
     ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
+	echo powerpc64-unknown-linux-${LIBC}
 	exit ;;
     ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
+	echo powerpc-unknown-linux-${LIBC}
+	exit ;;
+    ppc64le:Linux:*:*)
+	echo powerpc64le-unknown-linux-${LIBC}
+	exit ;;
+    ppcle:Linux:*:*)
+	echo powerpcle-unknown-linux-${LIBC}
 	exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
+	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
 	exit ;;
     sh64*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     tile*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
+	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
 	exit ;;
     x86_64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     xtensa*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     i*86:DYNIX/ptx:4*:*)
 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
@@ -1234,19 +1256,21 @@ EOF
 	exit ;;
     *:Darwin:*:*)
 	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    i386)
-		eval $set_cc_for_build
-		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		      grep IS_64BIT_ARCH >/dev/null
-		  then
-		      UNAME_PROCESSOR="x86_64"
-		  fi
-		fi ;;
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
+	eval $set_cc_for_build
+	if test "$UNAME_PROCESSOR" = unknown ; then
+	    UNAME_PROCESSOR=powerpc
+	fi
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		case $UNAME_PROCESSOR in
+		    i386) UNAME_PROCESSOR=x86_64 ;;
+		    powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		esac
+	    fi
+	fi
 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
 	exit ;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
diff --git a/config.sub b/config.sub
index 872199a..9633db7 100755
--- a/config.sub
+++ b/config.sub
@@ -2,7 +2,7 @@
 # Configuration validation subroutine script.
 #   Copyright 1992-2013 Free Software Foundation, Inc.
 
-timestamp='2013-02-12'
+timestamp='2013-08-10'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -252,12 +252,12 @@ case $basic_machine in
 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
 	| am33_2.0 \
-	| arc \
+	| arc | arceb \
 	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
 	| avr | avr32 \
 	| be32 | be64 \
 	| bfin \
-	| c4x | clipper \
+	| c4x | c8051 | clipper \
 	| d10v | d30v | dlx | dsp16xx \
 	| epiphany \
 	| fido | fr30 | frv \
@@ -366,13 +366,13 @@ case $basic_machine in
 	| aarch64-* | aarch64_be-* \
 	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 	| avr-* | avr32-* \
 	| be32-* | be64-* \
 	| bfin-* | bs2000-* \
 	| c[123]* | c30-* | [cjt]90-* | c4x-* \
-	| clipper-* | craynv-* | cydra-* \
+	| c8051-* | clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
 	| elxsi-* \
 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
@@ -794,7 +794,7 @@ case $basic_machine in
 		os=-mingw64
 		;;
 	mingw32)
-		basic_machine=i386-pc
+		basic_machine=i686-pc
 		os=-mingw32
 		;;
 	mingw32ce)
@@ -830,7 +830,7 @@ case $basic_machine in
 		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
 		;;
 	msys)
-		basic_machine=i386-pc
+		basic_machine=i686-pc
 		os=-msys
 		;;
 	mvs)
@@ -1546,6 +1546,9 @@ case $basic_machine in
 	c4x-* | tic4x-*)
 		os=-coff
 		;;
+	c8051-*)
+		os=-elf
+		;;
 	hexagon-*)
 		os=-elf
 		;;
diff --git a/config/ttys b/config/ttys
index 2b3464d..60f4815 100644
--- a/config/ttys
+++ b/config/ttys
@@ -4,11 +4,11 @@
 
 # name	program				type		status	comments
 
-console	"/libexec/getty 9600"		mach-gnu-color	on	secure trusted console
-tty1	"/libexec/getty 38400"		hurd		on	secure trusted console
-tty2	"/libexec/getty 38400"		hurd		on	secure trusted console
-tty3	"/libexec/getty 38400"		hurd		on	secure trusted console
-tty4	"/libexec/getty 38400"		hurd		on	secure trusted console
-tty5	"/libexec/getty 38400"		hurd		on	secure trusted console
-tty6	"/libexec/getty 38400"		hurd		on	secure trusted console
-#com0	"/libexec/getty 9600"		dialup		on	secure
+console	"/sbin/getty 9600"		mach-gnu-color	on	secure trusted console
+tty1	"/sbin/getty 38400"		hurd		on	secure trusted console
+tty2	"/sbin/getty 38400"		hurd		on	secure trusted console
+tty3	"/sbin/getty 38400"		hurd		on	secure trusted console
+tty4	"/sbin/getty 38400"		hurd		on	secure trusted console
+tty5	"/sbin/getty 38400"		hurd		on	secure trusted console
+tty6	"/sbin/getty 38400"		hurd		on	secure trusted console
+#com0	"/sbin/getty 9600"		dialup		on	secure
diff --git a/configure.ac b/configure.ac
index d822dd2..cd018a0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -160,8 +160,8 @@ else
 fi
 AC_SUBST(VERSIONING)
 
-# Check if libc contains getgrouplist and/or uselocale.
-AC_CHECK_FUNCS(getgrouplist uselocale)
+# Check if libc contains these functions.
+AC_CHECK_FUNCS(getgrouplist uselocale file_exec_file_name exec_exec_file_name \
_hurd_exec_file_name)  
 
 # From glibc HEAD, 2007-11-07.
@@ -227,6 +227,12 @@ AC_SUBST(boot_store_types)dnl
 AC_MSG_CHECKING(boot store types)
 AC_MSG_RESULT($boot_store_types)
 
+AC_CHECK_LIB(pciaccess, pci_system_init, LIBPCIACCESS=-lpciaccess, LIBPCIACCESS=no)
+AC_SUBST(LIBPCIACCESS)
+if test "$LIBPCIACCESS" = "no"; then
+  AC_MSG_ERROR([libpciaccess must be install in order to use libddekit])
+fi
+
 # Check for ncursesw, which is needed for the console-curses client.
 hurd_LIB_NCURSESW
 
diff --git a/console-client/bdf.c b/console-client/bdf.c
index f62a247..a6cd5d5 100644
--- a/console-client/bdf.c
+++ b/console-client/bdf.c
@@ -415,8 +415,10 @@ bdf_read (FILE *filep, bdf_font_t *font, int *linecount)
 	     glyphs.  */
 	  if (!strcmp (line, "ENDFONT"))
 	    {
+	      /*
 	      if (parser.glyphs != bdf->glyphs_count)
 		err = BDF_COUNT_MISMATCH;
+	      */
 	      done = 1;
 	    }
 	  else
diff --git a/console-client/xkb/xkb-data/keymap/hurd \
b/console-client/xkb/xkb-data/keymap/hurd index b123f2b..3d47277 100644
--- a/console-client/xkb/xkb-data/keymap/hurd
+++ b/console-client/xkb/xkb-data/keymap/hurd
@@ -4,7 +4,7 @@
 xkb_keymap "Hurd" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
                "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};
                
     xkb_symbols 	{ include "pc(pc105)+us+hurd+group(win_switch)+compose(menu)"	};
     xkb_geometry 	{ include "pc"			};
 };
@@ -12,7 +12,7 @@ xkb_keymap "Hurd" {
 default xkb_keymap "us" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"		};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+us+hurd"		};  xkb_geometry	{ include "pc"			};
 };
@@ -21,21 +21,21 @@ default xkb_keymap "us" {
 xkb_keymap "ar" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+ara+hurd"	};  xkb_geometry	{ include \
"pc(pc102)"		};  };
 xkb_keymap "be"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+be+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "bg"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+bg+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
@@ -43,7 +43,7 @@ xkb_keymap "bg"	{
 xkb_keymap "br"	{
     xkb_keycodes	{ include "xfree86"	};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+br+hurd"	};  xkb_geometry 	{ include \
"pc(abnt2)"		};  };
@@ -53,168 +53,168 @@ xkb_keymap "br"	{
 xkb_keymap "cz" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+cz+hurd"	};  xkb_geometry	{ include "pc"			};
 };
 xkb_keymap "de"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+de+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "ch_de"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+ch(de)+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "ch_fr"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+ch(fr)+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "dk"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+dk+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "dvorak" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+us(dvorak)+hurd"};  xkb_geometry	{ include \
"pc(pc102)"		};  };
 xkb_keymap "en_US" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  xkb_symbols \
{ include "pc(pc105)+us+hurd"	};  xkb_geometry 	{ include "pc"			};
 };
 xkb_keymap "es"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+es+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "fr"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+fr+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "fr-latin9" {
     xkb_keycodes        { include "xfree86"             };
     xkb_types           { include "default+hurd"        };
-    xkb_compatibility   { include "default"             };
+    xkb_compatibility   { include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"             };  \
xkb_symbols         { include "pc(pc105)+fr-latin9+hurd" };  xkb_geometry        { \
include "pc"           	};  };
 xkb_keymap "fr_CA"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+ca+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "gb"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+gb+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "hr"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+hr+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "it"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+it+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "jp106" {
     xkb_keycodes	{ include "xfree86"	};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "jp(jp106)+hurd"	};  xkb_geometry	{ include "pc(jp106)"		};
 };
 xkb_keymap "lt"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+lt+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "lt_std"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+lt(std)+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "lv"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+lv+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "mk" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+mk+hurd"	};  xkb_geometry	{ include "pc(pc102)"		};
 };
 xkb_keymap "mt" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+mt+hurd"	};  xkb_geometry	{ include "pc(pc102)"		};
 };
 xkb_keymap "neo"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include \
"default+caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)"		}; +    \
xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)+caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)"		};
  xkb_symbols		{ include "pc(pc105)+de(neo)+hurd"	};
     xkb_geometry 	{ include "pc(pc102)"		};
 };
 xkb_keymap "no"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+no+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "pl"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+pl+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "pt"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+pt+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
@@ -222,49 +222,49 @@ xkb_keymap "pt"	{
 xkb_keymap "ro" {
     xkb_keycodes	{ include "xfree86"			};
     xkb_types		{ include "default+hurd"		};
-    xkb_compatibility	{ include "default"			};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"			};  \
xkb_symbols		{ include "pc(pc105)+ro(pc101)+hurd"	};  xkb_geometry	{ include \
"pc(pc101)"			};  };
 xkb_keymap "ro_microsoft" {
     xkb_keycodes	{ include "xfree86"			};
     xkb_types		{ include "default+hurd"		};
-    xkb_compatibility	{ include "default"			};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"			};  \
xkb_symbols		{ include "pc(pc105)+ro(pc105)+hurd"	};  xkb_geometry	{ include \
"pc(pc105)"			};  };
 xkb_keymap "ru"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+ru+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "se_FI"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+fi+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "se_SE"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+se+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "sl" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+si+hurd"	};  xkb_geometry	{ include "pc(pc102)"		};
 };
 xkb_keymap "sl_SI" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+si+hurd"	};  xkb_geometry	{ include "pc(pc102)"		};
 };
@@ -274,7 +274,7 @@ xkb_keymap "sl_SI" {
 xkb_keymap "sk" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+sk+hurd"	};  xkb_geometry	{ include "pc"			};
 };
@@ -282,49 +282,49 @@ xkb_keymap "sk" {
 xkb_keymap "syr" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default" 		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" 		};  \
xkb_symbols		{ include "pc(pc105)+syr+hurd"	};  xkb_geometry	{ include \
"pc(pc102)"		};  };    
 xkb_keymap "th"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+th+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "th_tis"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+th(tis)+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "th_pat"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+th(pat)+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "tr" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+tr+hurd"	};  xkb_geometry	{ include "pc(pc102)"		};
 };
 xkb_keymap "uk" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+uk)+hurd"	};  xkb_geometry	{ include \
"pc(pc102)"		};  };
 xkb_keymap "us_flexpro" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "us(pc105)+hurd"	};  xkb_geometry	{ include \
"keytronic(FlexPro)"	};  };
@@ -334,14 +334,14 @@ xkb_keymap "us_flexpro" {
 xkb_keymap "us_intl" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "us(pc101)+us(intl)+hurd"	};  xkb_geometry	{ include "pc"			};
 };
 xkb_keymap "us_microsoft" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "us(pc105)+hurd"	};  xkb_geometry	{ include "microsoft"		};
 };
@@ -349,7 +349,7 @@ xkb_keymap "us_microsoft" {
 xkb_keymap "uz" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+uz+hurd"	};  xkb_geometry	{ include "pc(pc102)"		};
 };
@@ -358,35 +358,35 @@ xkb_keymap "uz" {
 xkb_keymap "cz_qwerty" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+cz(qwerty)+hurd"	};  xkb_geometry	{ include \
"pc"			};  };
 xkb_keymap "de_CH"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+ch(de)+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "fr_CH"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+ch(fr)+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "mt_us" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+mt(us)+hurd"	};  xkb_geometry	{ include \
"pc(pc102)"		};  };
 xkb_keymap "sk_qwerty" {
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+sk(qwerty)+hurd"	};  xkb_geometry	{ include \
"pc"			};  };
@@ -395,266 +395,266 @@ xkb_keymap "sk_qwerty" {
 xkb_keymap "al"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+al+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "ara"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+ara+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "bd"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+bd+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "by"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+by+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "in"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+in+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "ba"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+ba+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "ca"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+ca+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "cn"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+cn+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "nl"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+nl+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "bt"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+bt+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "epo"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+epo+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "ee"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+ee+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "et"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+et+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "fi"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+fi+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "ge"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+ge+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "gr"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+gr+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "il"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+il+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "hu"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+hu+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "is"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+is+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "ie"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+ie+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "jp"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+jp+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "kz"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+kz+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "kh"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+kh+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "kg"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+kg+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "kr"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+kr+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "la"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+la+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "latam"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+latam+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "np"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+np+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "ir"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+ir+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "rs"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+rs+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "pk"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+pk+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "lk"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+lk+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "si"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+si+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "se"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+se+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "ch"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+ch+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "tr"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+tr+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "ua"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+ua+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
 xkb_keymap "vn"	{
     xkb_keycodes	{ include "xfree86"		};
     xkb_types		{ include "default+hurd"	};
-    xkb_compatibility	{ include "default"		};
+    xkb_compatibility	{ include \
"basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)"		};  \
xkb_symbols		{ include "pc(pc105)+vn+hurd"	};  xkb_geometry 	{ include \
"pc(pc102)"		};  };
diff --git a/daemons/rc.sh b/daemons/rc.sh
index 5cf44fa..2b16192 100644
--- a/daemons/rc.sh
+++ b/daemons/rc.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-PATH=/bin:/sbin
+PATH=/bin:/sbin:/usr/bin:/usr/sbin
 
 # Start the default pager.  It will bail if there is already one running.
 /hurd/mach-defpager
@@ -19,14 +19,17 @@ then
 	echo Automatic boot in progress...
 	date
 
-	/sbin/fsck --preen --writable
+	fsysopts / --update --readonly
+	/sbin/fsck -p -A
 
 	case $? in
 	# Successful completion
 	0)
+		fsysopts / --update --writable
 		;;
 	# Filesystem modified (but ok now)
 	1)
+		fsysopts / --update --writable
 		;;
 	# Filesystem modified, filesystem should be restarted
 	# Ideally we would only restart the filesystem
@@ -90,12 +93,32 @@ if test -d /tmp; then
 
 fi
 if test -d /var/run; then
-  (cd /var/run && { rm -rf -- *; cp /dev/null utmp; chmod 644 utmp; })
+  (cd /var/run && {
+    find . ! -type d ! -name utmp ! -name innd.pid \
+      -exec rm -f -- {} \;
+    cp /dev/null utmp
+    if grep -q ^utmp: /etc/group
+    then
+	chmod 664 utmp
+	chgrp utmp utmp
+    fi; })
 fi
+
+# until we properly start /etc/rcS.d
+rm -fr /run/*
+mkdir -p /run/lock /run/shm
+chmod 1777 /run/lock /run/shm
+: > /run/utmp
+
 echo done
 
-# This file must exist for e2fsck to work. XXX
-touch /var/run/mtab
+# See whether procfs is set up
+if ! test -e /proc/cmdline ; then
+  settrans -c /proc /hurd/procfs --compatible
+fi
+
+# This file must exist for e2fsck to work.
+ln -s /proc/mounts /var/run/mtab
 
 #echo -n restoring pty permissions...
 #chmod 666 /dev/tty[pqrs]*
@@ -109,15 +132,25 @@ touch /var/run/mtab
 
 chmod 664 /etc/motd
 
-echo -n starting daemons:
-
-/sbin/syslogd	&& echo -n ' syslogd'
-/sbin/inetd	&& echo -n ' inetd'
-
-if test -x /sbin/sendmail -a -r /etc/sendmail.cf; then
-  /sbin/sendmail -bd -q30m	&& echo -n ' sendmail'
-fi
-
-echo .
+(
+	trap ":" INT QUIT TSTP
+
+	if [ -d /etc/rc.boot ]
+	then
+		for i in /etc/rc.boot/S*
+		do
+			[ ! -f $i ] && continue
+			$i start
+		done
+	fi
+	if [ -d /etc/rc2.d ]
+	then
+		for i in /etc/rc2.d/S*
+		do
+			[ ! -f $i ] && continue
+			$i start
+		done
+	fi
+)
 
 date
diff --git a/daemons/runsystem.sh b/daemons/runsystem.sh
index f4f2771..3384479 100644
--- a/daemons/runsystem.sh
+++ b/daemons/runsystem.sh
@@ -11,7 +11,7 @@
 ### Where to find programs, etc.
 ###
 
-PATH=/bin:/sbin
+PATH=/bin:/sbin:/usr/bin:/usr/sbin
 export PATH
 
 umask 022
@@ -23,8 +23,8 @@ fallback_shells='/bin/sh /bin/bash /bin/csh /bin/ash /bin/shd'
 SHELL=/bin/sh
 
 # Programs that do multi-user startup.
-RUNCOM=/libexec/rc
-RUNTTYS=/libexec/runttys
+RUNCOM=/etc/hurd/rc
+RUNTTYS=/sbin/runttys
 # Signals that we should pass down to runttys.
 runttys_sigs='TERM INT HUP TSTP'
 
diff --git a/debian/changelog b/debian/changelog
index 9bb0240..9cc7be8 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+hurd (1:0.5.git20140113-2) UNRELEASED; urgency=low
+
+  * hurd.hurd-console.init: Actually make ENABLE=false in default work.
+
+ -- Samuel Thibault <sthibault@debian.org>  Tue, 19 Nov 2013 00:21:47 +0100
+
 hurd (1:0.5.git20140113-1) unstable; urgency=low
 
   [ Samuel Thibault ]
diff --git a/debian/hurd.hurd-console.init b/debian/hurd.hurd-console.init
index cac6fc2..095e8cb 100644
--- a/debian/hurd.hurd-console.init
+++ b/debian/hurd.hurd-console.init
@@ -25,6 +25,8 @@ SCRIPTNAME=/etc/init.d/hurd-$NAME
 # Read configuration variable file if it is present
 [ -r /etc/default/hurd-$NAME ] && . /etc/default/hurd-$NAME
 
+[ "$ENABLE" = true ] || exit 0
+
 # Augment the arguments.
 DAEMON_ARGS="${DAEMON_ARGS} ${DISPLAY} ${KBD} ${KBD_REPEAT} \
              ${SPEAKER} ${MOUSE} ${MOUSE_REPEAT}"
diff --git a/doc/hurd.texi b/doc/hurd.texi
index 07ddfb4..6e79c3e 100644
--- a/doc/hurd.texi
+++ b/doc/hurd.texi
@@ -102,7 +102,7 @@ This file documents the GNU Hurd kernel component.  This edition \
of the  documentation was last updated for version @value{VERSION} of the Hurd.
 
 Copyright @copyright{} 1994, 1996, 1998, 1999, 2000, 2001, 2002, 2003,
-2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
+2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
 @quotation
 Permission is granted to make and distribute verbatim copies of
@@ -566,7 +566,7 @@ The @option{--multiboot-command-line} option tells the file \
system server that  it is a root filesystem, which triggers it to run \
@command{/hurd/init} as PID  1.  @command{/hurd/init} starts the @command{/hurd/proc} \
and  @command{/hurd/auth} servers.  After the servers are launched
-@command{/hurd/init} starts the @command{/libexec/runsystem.sh} script to
+@command{/hurd/init} starts the @command{/etc/hurd/runsystem.sh} script to
 finish booting.
 
 After the Hurd has been booted, other sets of core Hurd servers can be
@@ -2737,10 +2737,10 @@ write the file.
 @node Program Execution
 @subsection Program Execution
 
-@findex file_exec
+@findex file_exec_file_name
 Execution of programs on the Hurd is done through fileservers with the
-@code{file_exec} RPC.  The fileserver is expected to verify that the
-user is allowed to execute the file, make whatever modifications to the
+@code{file_exec_file_name} RPC.  The fileserver is expected to verify that
+the user is allowed to execute the file, make whatever modifications to the
 ports are necessary for setuid execution, and then invoke the standard
 execserver found on @file{/servers/exec}.
 
@@ -2752,13 +2752,13 @@ The file must be opened for execution; if it is not, \
@code{EBADF} should  be returned.  In addition, at least one of the execute bits must \
be on.  A  failure of this check should result in @code{EACCES}---not
 @code{ENOEXEC}.  It is not proper for the fileserver ever to respond to
-the @code{file_exec} RPC with @code{ENOEXEC}.
+the @code{file_exec_file_name} RPC with @code{ENOEXEC}.
 
 If either the setuid or setgid bits are set, the server needs to
 construct a new authentication handle with the additional new ID's.
-Then all the ports passed to @code{file_exec} need to be reauthenticated
-with the new handle.  If the fileserver is unable to make the new
-authentication handle (for example, because it is not running as root)
+Then all the ports passed to @code{file_exec_file_name} need to be
+reauthenticated with the new handle.  If the fileserver is unable to make the
+new authentication handle (for example, because it is not running as root)
 it is not acceptable to return an error; in such a case the server
 should simply silently fail to implement the setuid/setgid semantics.
 
@@ -2766,14 +2766,14 @@ If the setuid/setgid transformation adds a new uid or gid to \
the user's  authentication handle that was not previously present (as opposed to
 merely reordering them), then the @code{EXEC_SECURE} and
 @code{EXEC_NEWTASK} flags should both be added in the call to
-@code{exec_exec}.
+@code{exec_exec_file_name}.
 
 The server then needs to open a new port onto the executed file which
 will not share any file pointers with the port the user passed in,
 opened with @code{O_READ}.  Finally, all the information (mutated
 appropriately for setuid/setgid) should be sent to the execserver with
-@code{exec_exec}.  Whatever error code @code{exec_exec} returns should
-returned to the caller of @code{file_exec}.
+@code{exec_exec_file_name}.  Whatever error code @code{exec_exec_file_name}
+returns should be returned to the caller of @code{file_exec_file_name}.
 
 @node File Locking
 @subsection File Locking
diff --git a/exec/Makefile b/exec/Makefile
index 3ef742d..a285c13 100644
--- a/exec/Makefile
+++ b/exec/Makefile
@@ -22,7 +22,7 @@ makemode := server
 
 SRCS = exec.c main.c hashexec.c hostarch.c
 OBJS = main.o hostarch.o exec.o hashexec.o \
-       execServer.o exec_startupServer.o
+       execServer.o exec_startupServer.o exec_experimentalServer.o
 
 target = exec
 #targets = exec exec.static
@@ -30,6 +30,7 @@ HURDLIBS = trivfs fshelp iohelp ports ihash shouldbeinlibc
 OTHERLIBS = -lpthread
 
 exec-MIGSFLAGS = -imacros $(srcdir)/execmutations.h
+exec_experimental-MIGSFLAGS = -imacros $(srcdir)/execmutations.h
 
 include ../Makeconf
 
diff --git a/exec/exec.c b/exec/exec.c
index fad9492..5dc7998 100644
--- a/exec/exec.c
+++ b/exec/exec.c
@@ -1,6 +1,6 @@
 /* GNU Hurd standard exec server.
-   Copyright (C) 1992,93,94,95,96,98,99,2000,01,02,04
-   	Free Software Foundation, Inc.
+   Copyright (C) 1992 ,1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+   2002, 2004, 2010 Free Software Foundation, Inc.
    Written by Roland McGrath.
 
    Can exec ELF format directly.
@@ -738,6 +738,7 @@ static error_t
 do_exec (file_t file,
 	 task_t oldtask,
 	 int flags,
+	 char *filename,
 	 char *argv, mach_msg_type_number_t argvlen, boolean_t argv_copy,
 	 char *envp, mach_msg_type_number_t envplen, boolean_t envp_copy,
 	 mach_port_t *dtable, mach_msg_type_number_t dtablesize,
@@ -796,7 +797,7 @@ do_exec (file_t file,
     {
       /* Check for a #! executable file.  */
       check_hashbang (&e,
-		      file, oldtask, flags,
+		      file, oldtask, flags, filename,
 		      argv, argvlen, argv_copy,
 		      envp, envplen, envp_copy,
 		      dtable, dtablesize, dtable_copy,
@@ -1356,6 +1357,7 @@ do_exec (file_t file,
   return e.error;
 }
 
+/* Deprecated.  */
 kern_return_t
 S_exec_exec (struct trivfs_protid *protid,
 	     file_t file,
@@ -1372,13 +1374,51 @@ S_exec_exec (struct trivfs_protid *protid,
 	     mach_port_t *deallocnames, mach_msg_type_number_t ndeallocnames,
 	     mach_port_t *destroynames, mach_msg_type_number_t ndestroynames)
 {
+  return S_exec_exec_file_name (protid,
+				file,
+				oldtask,
+				flags,
+				"",
+				argv, argvlen, argv_copy,
+				envp, envplen, envp_copy,
+				dtable, dtablesize,
+				dtable_copy,
+				portarray, nports,
+				portarray_copy,
+				intarray, nints,
+				intarray_copy,
+				deallocnames, ndeallocnames,
+				destroynames, ndestroynames);
+}
+
+kern_return_t
+S_exec_exec_file_name (struct trivfs_protid *protid,
+		       file_t file,
+		       task_t oldtask,
+		       int flags,
+		       char *filename,
+		       char *argv, mach_msg_type_number_t argvlen,
+		       boolean_t argv_copy,
+		       char *envp, mach_msg_type_number_t envplen,
+		       boolean_t envp_copy,
+		       mach_port_t *dtable, mach_msg_type_number_t dtablesize,
+		       boolean_t dtable_copy,
+		       mach_port_t *portarray, mach_msg_type_number_t nports,
+		       boolean_t portarray_copy,
+		       int *intarray, mach_msg_type_number_t nints,
+		       boolean_t intarray_copy,
+		       mach_port_t *deallocnames,
+		       mach_msg_type_number_t ndeallocnames,
+		       mach_port_t *destroynames,
+		       mach_msg_type_number_t ndestroynames)
+{
   if (! protid)
     return EOPNOTSUPP;
 
   /* There were no user-specified exec servers,
      or none of them could be found.  */
 
-  return do_exec (file, oldtask, flags,
+  return do_exec (file, oldtask, flags, filename,
 		  argv, argvlen, argv_copy,
 		  envp, envplen, envp_copy,
 		  dtable, dtablesize, dtable_copy,
diff --git a/exec/hashexec.c b/exec/hashexec.c
index 5641218..3f6f916 100644
--- a/exec/hashexec.c
+++ b/exec/hashexec.c
@@ -1,5 +1,6 @@
 /* GNU Hurd standard exec server, #! script execution support.
-   Copyright (C) 1995,96,97,98,99,2000,02 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2010
+   Free Software Foundation, Inc.
    Written by Roland McGrath.
 
 This file is part of the GNU Hurd.
@@ -23,6 +24,9 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, \
USA.  */  #include <unistd.h>
 #include <envz.h>
 #include <sys/param.h>
+#ifdef HAVE_FILE_EXEC_FILE_NAME
+#include <hurd/fs_experimental.h>
+#endif
 
 /* This is called to check E for a #! interpreter specification.  E has
    already been prepared (successfully) and checked (unsuccessfully).  If
@@ -35,6 +39,7 @@ check_hashbang (struct execdata *e,
 		file_t file,
 		task_t oldtask,
 		int flags,
+		char *file_name_exec,
 		char *argv, u_int argvlen, boolean_t argv_copy,
 		char *envp, u_int envplen, boolean_t envp_copy,
 		mach_port_t *dtable, u_int dtablesize, boolean_t dtable_copy,
@@ -225,10 +230,13 @@ check_hashbang (struct execdata *e,
 	    file_name = NULL;
 	  else if (! (flags & EXEC_SECURE))
 	    {
-	      /* Try to figure out the file's name.  We guess that if ARGV[0]
-		 contains a slash, it might be the name of the file; and that
-		 if it contains no slash, looking for files named by ARGV[0] in
-		 the `PATH' environment variable might find it.  */
+	      /* Try to figure out the file's name.  If FILE_NAME_EXEC
+		 is not NULL and not the empty string, then it's the
+		 file's name.  Otherwise we guess that if ARGV[0]
+		 contains a slash, it might be the name of the file;
+		 and that if it contains no slash, looking for files
+		 named by ARGV[0] in the `PATH' environment variable
+		 might find it.  */
 
 	      error_t error;
 	      char *name;
@@ -264,48 +272,58 @@ check_hashbang (struct execdata *e,
 		  return err;
 		}
 
-	      error = io_identity (file, &fileid, &filefsid, &fileno);
-	      if (error)
-		goto out;
-	      mach_port_deallocate (mach_task_self (), filefsid);
-
-	      if (memchr (argv, '\0', argvlen) == NULL)
-		{
-		  name = alloca (argvlen + 1);
-		  bcopy (argv, name, argvlen);
-		  name[argvlen] = '\0';
-		}
+	      if (file_name_exec && file_name_exec[0] != '\0')
+		name = file_name_exec;
 	      else
-		name = argv;
-
-	      if (strchr (name, '/') != NULL)
-		error = lookup (name, 0, &name_file);
-	      else if ((error = hurd_catch_signal
-			(sigmask (SIGBUS) | sigmask (SIGSEGV),
-			 (vm_address_t) envp, (vm_address_t) envp + envplen,
-			 &search_path, SIG_ERR)))
-		name_file = MACH_PORT_NULL;
-
-	      if (!error && name_file != MACH_PORT_NULL)
 		{
-		  mach_port_t id, fsid;
-		  ino_t ino;
-		  error = io_identity (name_file, &id, &fsid, &ino);
-		  mach_port_deallocate (mach_task_self (), name_file);
-		  if (!error)
+		  /* Try to locate the file.  */
+		  error = io_identity (file, &fileid, &filefsid, &fileno);
+		  if (error)
+		    goto out;
+		  mach_port_deallocate (mach_task_self (), filefsid);
+
+		  if (memchr (argv, '\0', argvlen) == NULL)
 		    {
-		      mach_port_deallocate (mach_task_self (), fsid);
-		      mach_port_deallocate (mach_task_self (), id);
+		      name = alloca (argvlen + 1);
+		      bcopy (argv, name, argvlen);
+		      name[argvlen] = '\0';
 		    }
-		  if (!error && id == fileid)
+		  else
+		    name = argv;
+
+		  if (strchr (name, '/') != NULL)
+		    error = lookup (name, 0, &name_file);
+		  else if ((error = hurd_catch_signal
+			    (sigmask (SIGBUS) | sigmask (SIGSEGV),
+			     (vm_address_t) envp, (vm_address_t) envp + envplen,
+			     &search_path, SIG_ERR)))
+		    name_file = MACH_PORT_NULL;
+
+		  /* See whether we found the right file.  */
+		  if (!error && name_file != MACH_PORT_NULL)
 		    {
-		      file_name = name;
-		      free_file_name = free_name;
+		      mach_port_t id, fsid;
+		      ino_t ino;
+		      error = io_identity (name_file, &id, &fsid, &ino);
+		      mach_port_deallocate (mach_task_self (), name_file);
+		      if (!error)
+			{
+			  mach_port_deallocate (mach_task_self (), fsid);
+			  mach_port_deallocate (mach_task_self (), id);
+			  if (id != fileid)
+			    error = 1;
+			}
 		    }
-		  else if (free_name)
-		    free (name);
 		}
 
+	      if (!error)
+		{
+		  file_name = name;
+		  free_file_name = free_name;
+		}
+	      else if (free_name)
+		free (name);
+
 	      mach_port_deallocate (mach_task_self (), fileid);
 	    }
 
@@ -415,16 +433,32 @@ check_hashbang (struct execdata *e,
     /* We cannot open the interpreter file to execute it.  Lose!  */
     return;
 
+#ifdef HAVE_FILE_EXEC_FILE_NAME
   /* Execute the interpreter program.  */
-  e->error = file_exec (interp_file,
-			oldtask, flags,
-			new_argv, new_argvlen, envp, envplen,
-			new_dtable ?: dtable, MACH_MSG_TYPE_COPY_SEND,
-			new_dtable ? new_dtablesize : dtablesize,
-			portarray, MACH_MSG_TYPE_COPY_SEND, nports,
-			intarray, nints,
-			deallocnames, ndeallocnames,
-			destroynames, ndestroynames);
+  e->error = file_exec_file_name (interp_file,
+				  oldtask, flags, interp,
+				  new_argv, new_argvlen, envp, envplen,
+				  new_dtable ?: dtable,
+				  MACH_MSG_TYPE_COPY_SEND,
+				  new_dtable ? new_dtablesize : dtablesize,
+				  portarray, MACH_MSG_TYPE_COPY_SEND, nports,
+				  intarray, nints,
+				  deallocnames, ndeallocnames,
+				  destroynames, ndestroynames);
+  /* For backwards compatibility.  Just drop it when we kill file_exec.  */
+  if (e->error == MIG_BAD_ID)
+#endif
+    e->error = file_exec (interp_file,
+			  oldtask, flags,
+			  new_argv, new_argvlen, envp, envplen,
+			  new_dtable ?: dtable, MACH_MSG_TYPE_COPY_SEND,
+			  new_dtable ? new_dtablesize : dtablesize,
+			  portarray, MACH_MSG_TYPE_COPY_SEND, nports,
+			  intarray, nints,
+			  deallocnames, ndeallocnames,
+			  destroynames, ndestroynames);
+
+
   mach_port_deallocate (mach_task_self (), interp_file);
   munmap (new_argv, new_argvlen);
 
diff --git a/exec/main.c b/exec/main.c
index 41b1db4..c885466 100644
--- a/exec/main.c
+++ b/exec/main.c
@@ -50,10 +50,12 @@ static int
 exec_demuxer (mach_msg_header_t *inp, mach_msg_header_t *outp)
 {
   mig_routine_t exec_server_routine (mach_msg_header_t *);
+  mig_routine_t exec_experimental_server_routine (mach_msg_header_t *);
   mig_routine_t exec_startup_server_routine (mach_msg_header_t *);
 
   mig_routine_t routine;
   if ((routine = exec_server_routine (inp)) ||
+      (routine = exec_experimental_server_routine (inp)) ||
       (routine = NULL, trivfs_demuxer (inp, outp)) ||
       (routine = exec_startup_server_routine (inp)))
     {
diff --git a/exec/priv.h b/exec/priv.h
index 85e03ae..cfd73be 100644
--- a/exec/priv.h
+++ b/exec/priv.h
@@ -1,5 +1,6 @@
 /* GNU Hurd standard exec server, private declarations.
-   Copyright (C) 1992,93,94,95,96,99,2000,02, 04 Free Software Foundation, Inc.
+   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2002, 2004,
+   2010 Free Software Foundation, Inc.
    Written by Roland McGrath.
 
 This file is part of the GNU Hurd.
@@ -32,6 +33,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, \
USA.  */  #include <link.h>		/* This gives us the ElfW macro.  */
 #include <fcntl.h>
 #include "exec_S.h"
+#include "exec_experimental_S.h"
 
 
 #ifndef exec_priv_h
@@ -134,6 +136,7 @@ void check_hashbang (struct execdata *e,
 		     file_t file,
 		     task_t oldtask,
 		     int flags,
+		     char *filename,
 		     char *argv, u_int argvlen, boolean_t argv_copy,
 		     char *envp, u_int envplen, boolean_t envp_copy,
 		     mach_port_t *dtable, u_int dtablesize,
diff --git a/hurd/exec.defs b/hurd/exec.defs
index 2888fb1..7433cc2 100644
--- a/hurd/exec.defs
+++ b/hurd/exec.defs
@@ -1,5 +1,6 @@
 /* Interface definitions for the exec servers.
-   Copyright (C) 1991,92,93,94,95,2001 Free Software Foundation, Inc.
+   Copyright (C) 1991, 1992, 1993, 1994, 1995, 2001, 2010
+   Free Software Foundation, Inc.
 
 This file is part of the GNU Hurd.
 
@@ -29,6 +30,7 @@ EXEC_IMPORTS
 
 INTR_INTERFACE
 
+/* Deprecated: use exec_exec_file_name instead.  */
 routine exec_exec (
 	execserver: file_t;
 	file: mach_port_send_t;
diff --git a/hurd/fs.defs b/hurd/fs.defs
index 52d83bd..1aced0c 100644
--- a/hurd/fs.defs
+++ b/hurd/fs.defs
@@ -1,5 +1,6 @@
 /* Definitions for the filesystem interface.
-   Copyright (C) 1994,95,96,97,98,99,2002 Free Software Foundation, Inc.
+   Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2002, 2010
+   Free Software Foundation, Inc.
 
 This file is part of the GNU Hurd.
 
@@ -35,7 +36,8 @@ INTR_INTERFACE
 /* Overlay a task with a file.  Necessary initialization, including
    authentication changes associated with set[ug]id execution must be
    handled by the filesystem.  Filesystems normally implement this by
-   using exec_newtask or exec_loadtask as appropriate.  */
+   using exec_newtask or exec_loadtask as appropriate.
+   Deprecated: use file_exec_file_name instead.  */
 routine file_exec (
 	exec_file: file_t;
 	RPT
@@ -129,8 +131,8 @@ routine file_lock_stat (
    (regardless of the current open modes for this port).  ALLOWED is a
    bitwise OR of O_READ, O_WRITE, and O_EXEC.  This is not necessarily the
    same as what an open or exec would allow; O_EXEC is set for root even if
-   no executable bits are on (in which case file_exec should fail) and
-   O_WRITE is set a directory can be modified, even though it can't be
+   no executable bits are on (in which case file_exec_file_name should fail)
+   and O_WRITE is set a directory can be modified, even though it can't be
    written directly.  */
 routine file_check_access (
 	file: file_t;
diff --git a/hurd/hurd_types.h b/hurd/hurd_types.h
index 7d1bb73..5e470eb 100644
--- a/hurd/hurd_types.h
+++ b/hurd/hurd_types.h
@@ -1,5 +1,6 @@
 /* C declarations for Hurd server interfaces
-   Copyright (C) 1993,94,95,96,98,99,2001,02 Free Software Foundation, Inc.
+   Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2001, 2002,
+   2010 Free Software Foundation, Inc.
 
 This file is part of the GNU Hurd.
 
@@ -78,7 +79,7 @@ typedef struct timespec timespec_t;
 /* Many such parameters and flags are also defined in various libc
    headers. */
 
-/* Bits for flags in fs.defs:file_exec and exec.defs:exec_* calls: */
+/* Bits for flags in fs.defs:file_exec_file_name and exec.defs:exec_* calls: */
 #define EXEC_NEWTASK	0x00000001 /* Create new task; kill old one.  */
 #define EXEC_SECURE	0x00000002 /* Use secure values of portarray, etc. */
 #define EXEC_DEFAULTS	0x00000004 /* Use defaults for unspecified ports.  */
@@ -344,7 +345,7 @@ typedef int *procinfo_t;
 #define FSTYPE_MEMFS   0x00000019 /* In-core filesystem */
 #define FSTYPE_ISO9660 0x0000001a /* ISO9660 */
 
-/* Standard port assignments for file_exec and exec_* */
+/* Standard port assignments for file_exec_file_name and exec_* */
 enum
   {
     INIT_PORT_CWDIR,
@@ -358,7 +359,7 @@ enum
     INIT_PORT_MAX
   };
 
-/* Standard ints for file_exec and exec_* */
+/* Standard ints for file_exec_file_name and exec_* */
 enum
   {
     INIT_UMASK,
diff --git a/hurd/process.defs b/hurd/process.defs
index bf90556..8c17666 100644
--- a/hurd/process.defs
+++ b/hurd/process.defs
@@ -373,7 +373,11 @@ routine proc_getnports (
 
 /*** Routines related to early server bootstrapping ***/
 
-skip;  /* Reserved for proc_set_init_task */
+/* Set the task of process HURD_PID_INIT. Only the startup process
+   HURD_PID_STARTUP may use this interface.  */
+routine proc_set_init_task (
+       process: process_t;
+       task: task_t);
 
 /* Inform the process server that the process is important.  */
 routine proc_mark_important (
diff --git a/hurd/process_request.defs b/hurd/process_request.defs
index 38e7146..cb8f083 100644
--- a/hurd/process_request.defs
+++ b/hurd/process_request.defs
@@ -374,7 +374,10 @@ simpleroutine proc_getnports_request (
 
 /*** Routines related to early server bootstrapping ***/
 
-skip;  /* Reserved for proc_set_init_task */
+simpleroutine proc_set_init_task_request (
+       process: process_t;
+       ureplyport reply: reply_port_t;
+       task: task_t);
 
 /* Inform the process server that the process is important.  */
 simpleroutine proc_mark_important_request (
diff --git a/include/pids.h b/include/pids.h
index 22415f4..dff7635 100644
--- a/include/pids.h
+++ b/include/pids.h
@@ -22,8 +22,9 @@
 #ifndef _HURD_PROCESSES_H
 #define _HURD_PROCESSES_H
 
-#define HURD_PID_STARTUP	1
-#define HURD_PID_KERNEL		2
-#define HURD_PID_PROC		3
+#define HURD_PID_INIT		1
+#define HURD_PID_STARTUP	2
+#define HURD_PID_KERNEL		3
+#define HURD_PID_PROC		4
 
 #endif  /* _HURD_PROCESSES_H */
diff --git a/init/Makefile b/init/Makefile
index ffb82ff..5ae3b50 100644
--- a/init/Makefile
+++ b/init/Makefile
@@ -21,7 +21,7 @@ makemode := server
 SRCS = init.c stubs.c
 OBJS = $(SRCS:.c=.o) \
        startupServer.o notifyServer.o startup_replyUser.o msgServer.o \
-       startup_notifyUser.o
+       startup_notifyUser.o processUser.o
 target = init
 HURDLIBS = shouldbeinlibc
 
diff --git a/init/init.c b/init/init.c
index b7b40bd..b49c5f2 100644
--- a/init/init.c
+++ b/init/init.c
@@ -1,7 +1,7 @@
 /* Start and maintain hurd core servers and system run state
 
    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-     2005, 2008, 2013 Free Software Foundation, Inc.
+     2005, 2008, 2010, 2013 Free Software Foundation, Inc.
    This file is part of the GNU Hurd.
 
    The GNU Hurd is free software; you can redistribute it and/or modify
@@ -24,6 +24,9 @@
    one file. */
 #include <hurd.h>
 #include <hurd/fs.h>
+#ifdef HAVE_FILE_EXEC_FILE_NAME
+#include <hurd/fs_experimental.h>
+#endif
 #include <hurd/fsys.h>
 #include <device/device.h>
 #include <stdio.h>
@@ -376,13 +379,28 @@ run (const char *server, mach_port_t *ports, task_t *task)
 	      printf ("Pausing for %s\n", prog);
 	      getchar ();
 	    }
-	  err = file_exec (file, *task, 0,
-			   (char *)prog, strlen (prog) + 1, /* Args.  */
-			   startup_envz, startup_envz_len,
-			   default_dtable, MACH_MSG_TYPE_COPY_SEND, 3,
-			   ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX,
-			   default_ints, INIT_INT_MAX,
-			   NULL, 0, NULL, 0);
+#ifdef HAVE_FILE_EXEC_FILE_NAME
+	  err = file_exec_file_name (file, *task, 0, (char *)prog,
+				     (char *)prog,
+				     strlen (prog) + 1, /* Args.  */
+				     startup_envz, startup_envz_len,
+				     default_dtable,
+				     MACH_MSG_TYPE_COPY_SEND, 3,
+				     ports, MACH_MSG_TYPE_COPY_SEND,
+				     INIT_PORT_MAX,
+				     default_ints, INIT_INT_MAX,
+				     NULL, 0, NULL, 0);
+	  /* For backwards compatibility.  Just drop it when we kill
+	     file_exec.  */
+	  if (err == MIG_BAD_ID)
+#endif
+	    err = file_exec (file, *task, 0,
+			     (char *)prog, strlen (prog) + 1, /* Args.  */
+			     startup_envz, startup_envz_len,
+			     default_dtable, MACH_MSG_TYPE_COPY_SEND, 3,
+			     ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX,
+			     default_ints, INIT_INT_MAX,
+			     NULL, 0, NULL, 0);
 	  if (!err)
 	    break;
 
@@ -469,14 +487,27 @@ run_for_real (char *filename, char *args, int arglen, \
mach_port_t ctty,  ++progname;
   else
     progname = filename;
-  err = file_exec (file, task, 0,
-		   args, arglen,
-		   startup_envz, startup_envz_len,
-		   default_dtable, MACH_MSG_TYPE_COPY_SEND, 3,
-		   default_ports, MACH_MSG_TYPE_COPY_SEND,
-		   INIT_PORT_MAX,
-		   default_ints, INIT_INT_MAX,
-		   NULL, 0, NULL, 0);
+#ifdef HAVE_FILE_EXEC_FILE_NAME
+  err = file_exec_file_name (file, task, 0, filename,
+			     args, arglen,
+			     startup_envz, startup_envz_len,
+			     default_dtable, MACH_MSG_TYPE_COPY_SEND, 3,
+			     default_ports, MACH_MSG_TYPE_COPY_SEND,
+			     INIT_PORT_MAX,
+			     default_ints, INIT_INT_MAX,
+			     NULL, 0, NULL, 0);
+  /* For backwards compatibility.  Just drop it when we kill file_exec.  */
+  if (err == MIG_BAD_ID)
+#endif
+    err = file_exec (file, task, 0,
+		     args, arglen,
+		     startup_envz, startup_envz_len,
+		     default_dtable, MACH_MSG_TYPE_COPY_SEND, 3,
+		     default_ports, MACH_MSG_TYPE_COPY_SEND,
+		     INIT_PORT_MAX,
+		     default_ints, INIT_INT_MAX,
+		     NULL, 0, NULL, 0);
+
   mach_port_deallocate (mach_task_self (), default_ports[INIT_PORT_PROC]);
   mach_port_deallocate (mach_task_self (), task);
   if (ctty != MACH_PORT_NULL)
@@ -896,7 +927,7 @@ frob_kernel_process (void)
 /** Running userland.  **/
 
 /* In the "split-init" setup, we just run a single program (usually
-   /libexec/runsystem) that is not expected to ever exit (or stop).
+   /etc/hurd/runsystem) that is not expected to ever exit (or stop).
    If it does exit (or can't be started), we go to an emergency single-user
    shell as a fallback.  */
 
@@ -1013,7 +1044,7 @@ process_signal (int signo)
     }
 }
 
-/* Start the child program PROG.  It is run via /libexec/console-run
+/* Start the child program PROG.  It is run via /sbin/console-run
    with the given additional arguments.  */
 static int
 start_child (const char *prog, char **progargs)
@@ -1025,7 +1056,7 @@ start_child (const char *prog, char **progargs)
 
   if (progargs == 0)
     {
-      const char *argv[] = { "/libexec/console-run", prog, 0 };
+      const char *argv[] = { "/sbin/console-run", prog, 0 };
       err = argz_create ((char **) argv, &args, &arglen);
     }
   else
@@ -1035,7 +1066,7 @@ start_child (const char *prog, char **progargs)
 	++argc;
       {
 	const char *argv[2 + argc + 1];
-	argv[0] = "/libexec/console-run";
+	argv[0] = "/sbin/console-run";
 	argv[1] = prog;
 	argv[2 + argc] = 0;
 	while (argc-- > 0)
@@ -1058,7 +1089,7 @@ start_child (const char *prog, char **progargs)
 	       NULL, 0,	/* OSF Mach */
 #endif
 	       0, &child_task);
-  proc_child (procserver, child_task);
+  proc_set_init_task (procserver, child_task);
   proc_task2pid (procserver, child_task, &child_pid);
   proc_task2proc (procserver, child_task, &default_ports[INIT_PORT_PROC]);
 
@@ -1068,13 +1099,26 @@ start_child (const char *prog, char **progargs)
       getchar ();
     }
 
-  err = file_exec (file, child_task, 0,
-		   args, arglen,
-		   startup_envz, startup_envz_len,
-		   NULL, MACH_MSG_TYPE_COPY_SEND, 0, /* No fds.  */
-		   default_ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX,
-		   default_ints, INIT_INT_MAX,
-		   NULL, 0, NULL, 0);
+#ifdef HAVE_FILE_EXEC_FILE_NAME
+  err = file_exec_file_name (file, child_task, 0, args,
+			     args, arglen,
+			     startup_envz, startup_envz_len,
+			     NULL, MACH_MSG_TYPE_COPY_SEND, 0, /* No fds.  */
+			     default_ports, MACH_MSG_TYPE_COPY_SEND,
+			     INIT_PORT_MAX,
+			     default_ints, INIT_INT_MAX,
+			     NULL, 0, NULL, 0);
+  /* For backwards compatibility.  Just drop it when we kill file_exec.  */
+  if (err == MIG_BAD_ID)
+#endif
+    err = file_exec (file, child_task, 0,
+		     args, arglen,
+		     startup_envz, startup_envz_len,
+		     NULL, MACH_MSG_TYPE_COPY_SEND, 0, /* No fds.  */
+		     default_ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX,
+		     default_ints, INIT_INT_MAX,
+		     NULL, 0, NULL, 0);
+
   proc_mark_important (default_ports[INIT_PORT_PROC]);
   mach_port_deallocate (mach_task_self (), default_ports[INIT_PORT_PROC]);
   mach_port_deallocate (mach_task_self (), file);
@@ -1095,7 +1139,8 @@ launch_something (const char *why)
   static unsigned int try;
   static const char *const tries[] =
   {
-    "/libexec/runsystem",
+    "/etc/hurd/runsystem",
+    "/etc/hurd/runsystem.gnu",
     _PATH_BSHELL,
     "/bin/shd",			/* XXX */
   };
diff --git a/libdde-linux26/contrib/include/linux/etherdevice.h \
b/libdde-linux26/contrib/include/linux/etherdevice.h index 1cb0f0b..fbb3836 100644
--- a/libdde-linux26/contrib/include/linux/etherdevice.h
+++ b/libdde-linux26/contrib/include/linux/etherdevice.h
@@ -182,6 +182,33 @@ static inline unsigned compare_ether_addr_64bits(const u8 \
addr1[6+2],  return compare_ether_addr(addr1, addr2);
 #endif
 }
+
+/**
+ * is_etherdev_addr - Tell if given Ethernet address belongs to the device.
+ * @dev: Pointer to a device structure
+ * @addr: Pointer to a six-byte array containing the Ethernet address
+ *
+ * Compare passed address with all addresses of the device. Return true if the
+ * address if one of the device addresses.
+ *
+ * Note that this function calls compare_ether_addr_64bits() so take care of
+ * the right padding.
+ */
+static inline bool is_etherdev_addr(const struct net_device *dev,
+				    const u8 addr[6 + 2])
+{
+	struct netdev_hw_addr *ha;
+	int res = 1;
+
+	rcu_read_lock();
+	for_each_dev_addr(dev, ha) {
+		res = compare_ether_addr_64bits(addr, ha->addr);
+		if (!res)
+			break;
+	}
+	rcu_read_unlock();
+	return !res;
+}
 #endif	/* __KERNEL__ */
 
 #endif	/* _LINUX_ETHERDEVICE_H */
diff --git a/libdde-linux26/contrib/include/linux/ethtool.h \
b/libdde-linux26/contrib/include/linux/ethtool.h index 27c67a5..45f34dc 100644
--- a/libdde-linux26/contrib/include/linux/ethtool.h
+++ b/libdde-linux26/contrib/include/linux/ethtool.h
@@ -25,11 +25,14 @@ struct ethtool_cmd {
 	__u8	phy_address;
 	__u8	transceiver;	/* Which transceiver to use */
 	__u8	autoneg;	/* Enable or disable autonegotiation */
+	__u8	mdio_support;
 	__u32	maxtxpkt;	/* Tx pkts before generating tx int */
 	__u32	maxrxpkt;	/* Rx pkts before generating rx int */
 	__u16	speed_hi;
-	__u16	reserved2;
-	__u32	reserved[3];
+	__u8	eth_tp_mdix;
+	__u8	reserved2;
+	__u32	lp_advertising;	/* Features the link partner advertises */
+	__u32	reserved[2];
 };
 
 static inline void ethtool_cmd_speed_set(struct ethtool_cmd *ep,
@@ -469,6 +472,13 @@ struct ethtool_ops {
 #define	ETHTOOL_SRXFH		0x0000002a /* Set RX flow hash configuration */
 #define ETHTOOL_GGRO		0x0000002b /* Get GRO enable (ethtool_value) */
 #define ETHTOOL_SGRO		0x0000002c /* Set GRO enable (ethtool_value) */
+#define	ETHTOOL_GRXRINGS	0x0000002d /* Get RX rings available for LB */
+#define	ETHTOOL_GRXCLSRLCNT	0x0000002e /* Get RX class rule count */
+#define	ETHTOOL_GRXCLSRULE	0x0000002f /* Get RX classification rule */
+#define	ETHTOOL_GRXCLSRLALL	0x00000030 /* Get all RX classification rule */
+#define	ETHTOOL_SRXCLSRLDEL	0x00000031 /* Delete RX classification rule */
+#define	ETHTOOL_SRXCLSRLINS	0x00000032 /* Insert RX classification rule */
+#define	ETHTOOL_FLASHDEV	0x00000033 /* Flash firmware to device */
 
 /* compatibility with older code */
 #define SPARC_ETH_GSET		ETHTOOL_GSET
@@ -491,6 +501,11 @@ struct ethtool_ops {
 #define SUPPORTED_Pause			(1 << 13)
 #define SUPPORTED_Asym_Pause		(1 << 14)
 #define SUPPORTED_2500baseX_Full	(1 << 15)
+#define SUPPORTED_Backplane		(1 << 16)
+#define SUPPORTED_1000baseKX_Full	(1 << 17)
+#define SUPPORTED_10000baseKX4_Full	(1 << 18)
+#define SUPPORTED_10000baseKR_Full	(1 << 19)
+#define SUPPORTED_10000baseR_FEC	(1 << 20)
 
 /* Indicates what features are advertised by the interface. */
 #define ADVERTISED_10baseT_Half		(1 << 0)
@@ -509,6 +524,11 @@ struct ethtool_ops {
 #define ADVERTISED_Pause		(1 << 13)
 #define ADVERTISED_Asym_Pause		(1 << 14)
 #define ADVERTISED_2500baseX_Full	(1 << 15)
+#define ADVERTISED_Backplane		(1 << 16)
+#define ADVERTISED_1000baseKX_Full	(1 << 17)
+#define ADVERTISED_10000baseKX4_Full	(1 << 18)
+#define ADVERTISED_10000baseKR_Full	(1 << 19)
+#define ADVERTISED_10000baseR_FEC	(1 << 20)
 
 /* The following are all involved in forcing a particular link
  * mode for the device for setting things.  When getting the
@@ -533,6 +553,7 @@ struct ethtool_ops {
 #define PORT_MII		0x02
 #define PORT_FIBRE		0x03
 #define PORT_BNC		0x04
+#define PORT_OTHER		0xff
 
 /* Which transceiver to use. */
 #define XCVR_INTERNAL		0x00
@@ -547,6 +568,11 @@ struct ethtool_ops {
 #define AUTONEG_DISABLE		0x00
 #define AUTONEG_ENABLE		0x01
 
+/* Mode MDI or MDI-X */
+#define ETH_TP_MDI_INVALID	0x00
+#define ETH_TP_MDI		0x01
+#define ETH_TP_MDI_X		0x02
+
 /* Wake-On-Lan options. */
 #define WAKE_PHY		(1 << 0)
 #define WAKE_UCAST		(1 << 1)
@@ -565,6 +591,11 @@ struct ethtool_ops {
 #define	UDP_V6_FLOW	0x06
 #define	SCTP_V6_FLOW	0x07
 #define	AH_ESP_V6_FLOW	0x08
+#define	AH_V4_FLOW	0x09
+#define	ESP_V4_FLOW	0x0a
+#define	AH_V6_FLOW	0x0b
+#define	ESP_V6_FLOW	0x0c
+#define	IP_USER_FLOW	0x0d
 
 /* L3-L4 network traffic flow hash options */
 #define	RXH_DEV_PORT	(1 << 0)
@@ -577,5 +608,6 @@ struct ethtool_ops {
 #define	RXH_L4_B_2_3	(1 << 7) /* dst port in case of TCP/UDP/SCTP */
 #define	RXH_DISCARD	(1 << 31)
 
+#define	RX_CLS_FLOW_DISC	0xffffffffffffffffULL
 
 #endif /* _LINUX_ETHTOOL_H */
diff --git a/libdde-linux26/contrib/include/linux/kernel.h \
b/libdde-linux26/contrib/include/linux/kernel.h index 7fa3718..0bded10 100644
--- a/libdde-linux26/contrib/include/linux/kernel.h
+++ b/libdde-linux26/contrib/include/linux/kernel.h
@@ -353,6 +353,8 @@ static inline char *pack_hex_byte(char *buf, u8 byte)
         printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)
 #define pr_info(fmt, ...) \
         printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
+#define pr_cont(fmt, ...) \
+        printk(KERN_CONT fmt, ##__VA_ARGS__)
 
 /* If you are writing a driver, please use dev_dbg instead */
 #if defined(DEBUG)
diff --git a/libdde-linux26/contrib/include/linux/netdevice.h \
b/libdde-linux26/contrib/include/linux/netdevice.h index 6593667..4414989 100644
--- a/libdde-linux26/contrib/include/linux/netdevice.h
+++ b/libdde-linux26/contrib/include/linux/netdevice.h
@@ -37,6 +37,7 @@
 #include <asm/byteorder.h>
 
 #include <linux/device.h>
+#include <linux/rculist.h>
 #include <linux/percpu.h>
 #include <linux/dmaengine.h>
 #include <linux/workqueue.h>
@@ -81,17 +82,19 @@ struct wireless_dev;
 #define net_xmit_eval(e)	((e) == NET_XMIT_CN? 0 : (e))
 #define net_xmit_errno(e)	((e) != NET_XMIT_CN ? -ENOBUFS : 0)
 
+/* Driver transmit return codes */
+enum netdev_tx {
+	NETDEV_TX_OK = 0,	/* driver took care of packet */
+	NETDEV_TX_BUSY,		/* driver tx path was busy*/
+	NETDEV_TX_LOCKED = -1,	/* driver tx lock was already taken */
+};
+typedef enum netdev_tx netdev_tx_t;
+
 #endif
 
 #define MAX_ADDR_LEN	32		/* Largest hardware address length */
 
-/* Driver transmit return codes */
-#define NETDEV_TX_OK 0		/* driver took care of packet */
-#define NETDEV_TX_BUSY 1	/* driver tx path was busy*/
-#define NETDEV_TX_LOCKED -1	/* driver tx lock was already taken */
-
 #ifdef  __KERNEL__
-
 /*
  *	Compute the worst case header length according to the protocols
  *	used.
@@ -209,6 +212,24 @@ struct dev_addr_list
 #define dmi_users	da_users
 #define dmi_gusers	da_gusers
 
+struct netdev_hw_addr {
+	struct list_head	list;
+	unsigned char		addr[MAX_ADDR_LEN];
+	unsigned char		type;
+#define NETDEV_HW_ADDR_T_LAN		1
+#define NETDEV_HW_ADDR_T_SAN		2
+#define NETDEV_HW_ADDR_T_SLAVE		3
+#define NETDEV_HW_ADDR_T_UNICAST	4
+	int			refcount;
+	bool			synced;
+	struct rcu_head		rcu_head;
+};
+
+struct netdev_hw_addr_list {
+	struct list_head	list;
+	int			count;
+};
+
 struct hh_cache
 {
 	struct hh_cache *hh_next;	/* Next entry			     */
@@ -441,6 +462,10 @@ struct netdev_queue {
 	spinlock_t		_xmit_lock;
 	int			xmit_lock_owner;
 	struct Qdisc		*qdisc_sleeping;
+	/*
+	 * please use this field instead of dev->trans_start
+	 */
+	unsigned long		trans_start;
 } ____cacheline_aligned_in_smp;
 
 
@@ -467,9 +492,11 @@ struct netdev_queue {
  *     This function is called when network device transistions to the down
  *     state.
  *
- * int (*ndo_start_xmit)(struct sk_buff *skb, struct net_device *dev);
+ * netdev_tx_t (*ndo_start_xmit)(struct sk_buff *skb,
+ *                               struct net_device *dev);
  *	Called when a packet needs to be transmitted.
- *	Must return NETDEV_TX_OK , NETDEV_TX_BUSY, or NETDEV_TX_LOCKED,
+ *	Must return NETDEV_TX_OK , NETDEV_TX_BUSY.
+ *        (can also return NETDEV_TX_LOCKED iff NETIF_F_LLTX)
  *	Required can not be NULL.
  *
  * u16 (*ndo_select_queue)(struct net_device *dev, struct sk_buff *skb);
@@ -540,7 +567,7 @@ struct net_device_ops {
 	void			(*ndo_uninit)(struct net_device *dev);
 	int			(*ndo_open)(struct net_device *dev);
 	int			(*ndo_stop)(struct net_device *dev);
-	int			(*ndo_start_xmit) (struct sk_buff *skb,
+	netdev_tx_t		(*ndo_start_xmit) (struct sk_buff *skb,
 						   struct net_device *dev);
 	u16			(*ndo_select_queue)(struct net_device *dev,
 						    struct sk_buff *skb);
@@ -724,10 +751,10 @@ struct net_device
 	unsigned char		addr_len;	/* hardware address length	*/
 	unsigned short          dev_id;		/* for shared network cards */
 
-	spinlock_t		addr_list_lock;
-	struct dev_addr_list	*uc_list;	/* Secondary unicast mac addresses */
-	int			uc_count;	/* Number of installed ucasts	*/
+	struct netdev_hw_addr_list	uc;	/* Secondary unicast
+						   mac addresses */
 	int			uc_promisc;
+	spinlock_t		addr_list_lock;
 	struct dev_addr_list	*mc_list;	/* Multicast mac addresses	*/
 	int			mc_count;	/* Number of installed mcasts	*/
 	unsigned int		promiscuity;
@@ -753,8 +780,12 @@ struct net_device
  */
 	unsigned long		last_rx;	/* Time of last Rx	*/
 	/* Interface address info used in eth_type_trans() */
-	unsigned char		dev_addr[MAX_ADDR_LEN];	/* hw address, (before bcast 
-							   because most packets are unicast) */
+	unsigned char		*dev_addr;	/* hw address, (before bcast
+						   because most packets are
+						   unicast) */
+
+	struct netdev_hw_addr_list	dev_addrs; /* list of device
+						      hw addresses */
 
 	unsigned char		broadcast[MAX_ADDR_LEN];	/* hw bcast add	*/
 
@@ -774,6 +805,11 @@ struct net_device
  * One part is mostly used on xmit path (device)
  */
 	/* These may be needed for future network-power-down code. */
+
+	/*
+	 * trans_start here is expensive for high speed devices on SMP,
+	 * please use netdev_queue->trans_start instead.
+	 */
 	unsigned long		trans_start;	/* Time (in jiffies) of last Tx	*/
 
 	int			watchdog_timeo; /* used by dev_watchdog() */
@@ -1450,6 +1486,8 @@ static inline int netif_carrier_ok(const struct net_device \
*dev)  return !test_bit(__LINK_STATE_NOCARRIER, &dev->state);
 }
 
+extern unsigned long dev_trans_start(struct net_device *dev);
+
 extern void __netdev_watchdog_up(struct net_device *dev);
 
 extern void netif_carrier_on(struct net_device *dev);
@@ -1764,6 +1802,13 @@ static inline void netif_addr_unlock_bh(struct net_device \
*dev)  spin_unlock_bh(&dev->addr_list_lock);
 }
 
+/*
+ * dev_addrs walker. Should be used only for read access. Call with
+ * rcu_read_lock held.
+ */
+#define for_each_dev_addr(dev, ha) \
+		list_for_each_entry_rcu(ha, &dev->dev_addrs.list, list)
+
 /* These functions live elsewhere (drivers/net/net_init.c, but related) */
 
 extern void		ether_setup(struct net_device *dev);
@@ -1776,11 +1821,24 @@ extern struct net_device *alloc_netdev_mq(int sizeof_priv, \
const char *name,  alloc_netdev_mq(sizeof_priv, name, setup, 1)
 extern int		register_netdev(struct net_device *dev);
 extern void		unregister_netdev(struct net_device *dev);
+
+/* Functions used for device addresses handling */
+extern int dev_addr_add(struct net_device *dev, unsigned char *addr,
+			unsigned char addr_type);
+extern int dev_addr_del(struct net_device *dev, unsigned char *addr,
+			unsigned char addr_type);
+extern int dev_addr_add_multiple(struct net_device *to_dev,
+				 struct net_device *from_dev,
+				 unsigned char addr_type);
+extern int dev_addr_del_multiple(struct net_device *to_dev,
+				 struct net_device *from_dev,
+				 unsigned char addr_type);
+
 /* Functions used for secondary unicast and multicast support */
 extern void		dev_set_rx_mode(struct net_device *dev);
 extern void		__dev_set_rx_mode(struct net_device *dev);
-extern int		dev_unicast_delete(struct net_device *dev, void *addr, int alen);
-extern int		dev_unicast_add(struct net_device *dev, void *addr, int alen);
+extern int		dev_unicast_delete(struct net_device *dev, void *addr);
+extern int		dev_unicast_add(struct net_device *dev, void *addr);
 extern int		dev_unicast_sync(struct net_device *to, struct net_device *from);
 extern void		dev_unicast_unsync(struct net_device *to, struct net_device *from);
 extern int 		dev_mc_delete(struct net_device *dev, void *addr, int alen, int all);
diff --git a/libdde-linux26/contrib/include/linux/pci.h \
b/libdde-linux26/contrib/include/linux/pci.h index 7bd624b..c7fb660 100644
--- a/libdde-linux26/contrib/include/linux/pci.h
+++ b/libdde-linux26/contrib/include/linux/pci.h
@@ -256,6 +256,7 @@ struct pci_dev {
 	unsigned int	ari_enabled:1;	/* ARI forwarding */
 	unsigned int	is_managed:1;
 	unsigned int	is_pcie:1;
+	unsigned int    needs_freset:1; /* Dev requires fundamental reset */
 	unsigned int	state_saved:1;
 	pci_dev_flags_t dev_flags;
 	atomic_t	enable_cnt;	/* pci_enable_device has been called */
diff --git a/libdde-linux26/contrib/include/linux/pci_ids.h \
b/libdde-linux26/contrib/include/linux/pci_ids.h index aca8c45..a339386 100644
--- a/libdde-linux26/contrib/include/linux/pci_ids.h
+++ b/libdde-linux26/contrib/include/linux/pci_ids.h
@@ -2,6 +2,9 @@
  *	PCI Class, Vendor and Device IDs
  *
  *	Please keep sorted.
+ *
+ *	Do not add new entries to this file unless the definitions
+ *	are shared between multiple drivers.
  */
 
 /* Device classes and subclasses */
@@ -104,6 +107,7 @@
 #define PCI_CLASS_SERIAL_USB_UHCI	0x0c0300
 #define PCI_CLASS_SERIAL_USB_OHCI	0x0c0310
 #define PCI_CLASS_SERIAL_USB_EHCI	0x0c0320
+#define PCI_CLASS_SERIAL_USB_XHCI	0x0c0330
 #define PCI_CLASS_SERIAL_FIBER		0x0c04
 #define PCI_CLASS_SERIAL_SMBUS		0x0c05
 
@@ -389,6 +393,9 @@
 #define PCI_DEVICE_ID_VLSI_82C147	0x0105
 #define PCI_DEVICE_ID_VLSI_VAS96011	0x0702
 
+/* AMD RD890 Chipset */
+#define PCI_DEVICE_ID_RD890_IOMMU	0x5a23
+
 #define PCI_VENDOR_ID_ADL		0x1005
 #define PCI_DEVICE_ID_ADL_2301		0x2301
 
@@ -478,6 +485,9 @@
 #define PCI_DEVICE_ID_IBM_ICOM_V2_ONE_PORT_RVX_ONE_PORT_MDM_PCIE 0x0361
 #define PCI_DEVICE_ID_IBM_ICOM_FOUR_PORT_MODEL	0x252
 
+#define PCI_SUBVENDOR_ID_IBM		0x1014
+#define PCI_SUBDEVICE_ID_IBM_SATURN_SERIAL_ONE_PORT	0x03d4
+
 #define PCI_VENDOR_ID_UNISYS		0x1018
 #define PCI_DEVICE_ID_UNISYS_DMA_DIRECTOR 0x001C
 
@@ -526,6 +536,7 @@
 #define PCI_DEVICE_ID_AMD_OPUS_7443	0x7443
 #define PCI_DEVICE_ID_AMD_VIPER_7443	0x7443
 #define PCI_DEVICE_ID_AMD_OPUS_7445	0x7445
+#define PCI_DEVICE_ID_AMD_8111_PCI	0x7460
 #define PCI_DEVICE_ID_AMD_8111_LPC	0x7468
 #define PCI_DEVICE_ID_AMD_8111_IDE	0x7469
 #define PCI_DEVICE_ID_AMD_8111_SMBUS2	0x746a
@@ -535,6 +546,8 @@
 #define PCI_DEVICE_ID_AMD_8131_BRIDGE	0x7450
 #define PCI_DEVICE_ID_AMD_8131_APIC	0x7451
 #define PCI_DEVICE_ID_AMD_8132_BRIDGE	0x7458
+#define PCI_DEVICE_ID_AMD_HUDSON2_SMBUS	0x780b
+#define PCI_DEVICE_ID_AMD_CS5535_IDE    0x208F
 #define PCI_DEVICE_ID_AMD_CS5536_ISA    0x2090
 #define PCI_DEVICE_ID_AMD_CS5536_FLASH  0x2091
 #define PCI_DEVICE_ID_AMD_CS5536_AUDIO  0x2093
@@ -543,9 +556,10 @@
 #define PCI_DEVICE_ID_AMD_CS5536_UDC    0x2096
 #define PCI_DEVICE_ID_AMD_CS5536_UOC    0x2097
 #define PCI_DEVICE_ID_AMD_CS5536_IDE    0x209A
-
 #define PCI_DEVICE_ID_AMD_LX_VIDEO  0x2081
 #define PCI_DEVICE_ID_AMD_LX_AES    0x2082
+#define PCI_DEVICE_ID_AMD_HUDSON2_IDE		0x780c
+#define PCI_DEVICE_ID_AMD_HUDSON2_SATA_IDE	0x7800
 
 #define PCI_VENDOR_ID_TRIDENT		0x1023
 #define PCI_DEVICE_ID_TRIDENT_4DWAVE_DX	0x2000
@@ -591,6 +605,8 @@
 #define PCI_DEVICE_ID_MATROX_G550	0x2527
 #define PCI_DEVICE_ID_MATROX_VIA	0x4536
 
+#define PCI_VENDOR_ID_MOBILITY_ELECTRONICS	0x14f2
+
 #define PCI_VENDOR_ID_CT		0x102c
 #define PCI_DEVICE_ID_CT_69000		0x00c0
 #define PCI_DEVICE_ID_CT_65545		0x00d8
@@ -766,6 +782,7 @@
 #define PCI_DEVICE_ID_TI_X515		0x8036
 #define PCI_DEVICE_ID_TI_XX12		0x8039
 #define PCI_DEVICE_ID_TI_XX12_FM	0x803b
+#define PCI_DEVICE_ID_TI_XIO2000A	0x8231
 #define PCI_DEVICE_ID_TI_1130		0xac12
 #define PCI_DEVICE_ID_TI_1031		0xac13
 #define PCI_DEVICE_ID_TI_1131		0xac15
@@ -834,6 +851,8 @@
 #define PCI_DEVICE_ID_PROMISE_20276	0x5275
 #define PCI_DEVICE_ID_PROMISE_20277	0x7275
 
+#define PCI_VENDOR_ID_FOXCONN		0x105b
+
 #define PCI_VENDOR_ID_UMC		0x1060
 #define PCI_DEVICE_ID_UMC_UM8673F	0x0101
 #define PCI_DEVICE_ID_UMC_UM8886BF	0x673a
@@ -873,6 +892,7 @@
 #define PCI_DEVICE_ID_APPLE_SH_SUNGEM   0x0051
 #define PCI_DEVICE_ID_APPLE_U3L_AGP	0x0058
 #define PCI_DEVICE_ID_APPLE_U3H_AGP	0x0059
+#define PCI_DEVICE_ID_APPLE_U4_PCIE	0x005b
 #define PCI_DEVICE_ID_APPLE_IPID2_AGP	0x0066
 #define PCI_DEVICE_ID_APPLE_IPID2_ATA	0x0069
 #define PCI_DEVICE_ID_APPLE_IPID2_FW	0x006a
@@ -941,6 +961,32 @@
 #define PCI_DEVICE_ID_SUN_TOMATILLO	0xa801
 #define PCI_DEVICE_ID_SUN_CASSINI	0xabba
 
+#define PCI_VENDOR_ID_NI		0x1093
+#define PCI_DEVICE_ID_NI_PCI2322	0xd130
+#define PCI_DEVICE_ID_NI_PCI2324	0xd140
+#define PCI_DEVICE_ID_NI_PCI2328	0xd150
+#define PCI_DEVICE_ID_NI_PXI8422_2322	0xd190
+#define PCI_DEVICE_ID_NI_PXI8422_2324	0xd1a0
+#define PCI_DEVICE_ID_NI_PXI8420_2322	0xd1d0
+#define PCI_DEVICE_ID_NI_PXI8420_2324	0xd1e0
+#define PCI_DEVICE_ID_NI_PXI8420_2328	0xd1f0
+#define PCI_DEVICE_ID_NI_PXI8420_23216	0xd1f1
+#define PCI_DEVICE_ID_NI_PCI2322I	0xd250
+#define PCI_DEVICE_ID_NI_PCI2324I	0xd270
+#define PCI_DEVICE_ID_NI_PCI23216	0xd2b0
+#define PCI_DEVICE_ID_NI_PXI8430_2322	0x7080
+#define PCI_DEVICE_ID_NI_PCI8430_2322	0x70db
+#define PCI_DEVICE_ID_NI_PXI8430_2324	0x70dd
+#define PCI_DEVICE_ID_NI_PCI8430_2324	0x70df
+#define PCI_DEVICE_ID_NI_PXI8430_2328	0x70e2
+#define PCI_DEVICE_ID_NI_PCI8430_2328	0x70e4
+#define PCI_DEVICE_ID_NI_PXI8430_23216	0x70e6
+#define PCI_DEVICE_ID_NI_PCI8430_23216	0x70e7
+#define PCI_DEVICE_ID_NI_PXI8432_2322	0x70e8
+#define PCI_DEVICE_ID_NI_PCI8432_2322	0x70ea
+#define PCI_DEVICE_ID_NI_PXI8432_2324	0x70ec
+#define PCI_DEVICE_ID_NI_PCI8432_2324	0x70ee
+
 #define PCI_VENDOR_ID_CMD		0x1095
 #define PCI_DEVICE_ID_CMD_643		0x0643
 #define PCI_DEVICE_ID_CMD_646		0x0646
@@ -976,6 +1022,7 @@
 #define PCI_DEVICE_ID_PLX_PCI200SYN	0x3196
 #define PCI_DEVICE_ID_PLX_9030          0x9030
 #define PCI_DEVICE_ID_PLX_9050		0x9050
+#define PCI_DEVICE_ID_PLX_9056		0x9056
 #define PCI_DEVICE_ID_PLX_9080		0x9080
 #define PCI_DEVICE_ID_PLX_GTEK_SERIAL2	0xa001
 
@@ -1037,8 +1084,6 @@
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SMBUS	0x0034
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE	0x0035
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA	0x0036
-#define PCI_DEVICE_ID_NVIDIA_NVENET_10		0x0037
-#define PCI_DEVICE_ID_NVIDIA_NVENET_11		0x0038
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA2	0x003e
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE_6800_ULTRA 0x0040
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE_6800       0x0041
@@ -1049,21 +1094,16 @@
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE	0x0053
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA	0x0054
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA2	0x0055
-#define PCI_DEVICE_ID_NVIDIA_NVENET_8		0x0056
-#define PCI_DEVICE_ID_NVIDIA_NVENET_9		0x0057
 #define PCI_DEVICE_ID_NVIDIA_CK804_AUDIO	0x0059
 #define PCI_DEVICE_ID_NVIDIA_CK804_PCIE		0x005d
 #define PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS	0x0064
 #define PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE	0x0065
-#define PCI_DEVICE_ID_NVIDIA_NVENET_2		0x0066
 #define PCI_DEVICE_ID_NVIDIA_MCP2_MODEM		0x0069
 #define PCI_DEVICE_ID_NVIDIA_MCP2_AUDIO		0x006a
 #define PCI_DEVICE_ID_NVIDIA_NFORCE2S_SMBUS	0x0084
 #define PCI_DEVICE_ID_NVIDIA_NFORCE2S_IDE	0x0085
-#define PCI_DEVICE_ID_NVIDIA_NVENET_4		0x0086
 #define PCI_DEVICE_ID_NVIDIA_MCP2S_MODEM	0x0089
 #define PCI_DEVICE_ID_NVIDIA_CK8_AUDIO		0x008a
-#define PCI_DEVICE_ID_NVIDIA_NVENET_5		0x008c
 #define PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA	0x008e
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE_7800_GT   0x0090
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE_7800_GTX	0x0091
@@ -1079,15 +1119,12 @@
 #define PCI_DEVICE_ID_NVIDIA_NFORCE3		0x00d1
 #define PCI_DEVICE_ID_NVIDIA_NFORCE3_SMBUS	0x00d4
 #define PCI_DEVICE_ID_NVIDIA_NFORCE3_IDE	0x00d5
-#define PCI_DEVICE_ID_NVIDIA_NVENET_3		0x00d6
 #define PCI_DEVICE_ID_NVIDIA_MCP3_MODEM		0x00d9
 #define PCI_DEVICE_ID_NVIDIA_MCP3_AUDIO		0x00da
-#define PCI_DEVICE_ID_NVIDIA_NVENET_7		0x00df
 #define PCI_DEVICE_ID_NVIDIA_NFORCE3S		0x00e1
 #define PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA	0x00e3
 #define PCI_DEVICE_ID_NVIDIA_NFORCE3S_SMBUS	0x00e4
 #define PCI_DEVICE_ID_NVIDIA_NFORCE3S_IDE	0x00e5
-#define PCI_DEVICE_ID_NVIDIA_NVENET_6		0x00e6
 #define PCI_DEVICE_ID_NVIDIA_CK8S_AUDIO		0x00ea
 #define PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2	0x00ee
 #define PCIE_DEVICE_ID_NVIDIA_GEFORCE_6800_ALT1 0x00f0
@@ -1147,7 +1184,6 @@
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_SMBUS	0x01b4
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_IDE		0x01bc
 #define PCI_DEVICE_ID_NVIDIA_MCP1_MODEM		0x01c1
-#define PCI_DEVICE_ID_NVIDIA_NVENET_1		0x01c3
 #define PCI_DEVICE_ID_NVIDIA_NFORCE2		0x01e0
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE3		0x0200
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE3_1		0x0201
@@ -1170,8 +1206,6 @@
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE	0x036E
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA	0x037E
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA2	0x037F
-#define PCI_DEVICE_ID_NVIDIA_NVENET_12		0x0268
-#define PCI_DEVICE_ID_NVIDIA_NVENET_13		0x0269
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800	0x0280
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800_8X    0x0281
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800SE     0x0282
@@ -1218,42 +1252,22 @@
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700_2    0x0348
 #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO1000       0x034C
 #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1100         0x034E
-#define PCI_DEVICE_ID_NVIDIA_NVENET_14              0x0372
 #define PCI_DEVICE_ID_NVIDIA_NVENET_15              0x0373
-#define PCI_DEVICE_ID_NVIDIA_NVENET_16              0x03E5
-#define PCI_DEVICE_ID_NVIDIA_NVENET_17              0x03E6
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA      0x03E7
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SMBUS	    0x03EB
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE       0x03EC
-#define PCI_DEVICE_ID_NVIDIA_NVENET_18              0x03EE
-#define PCI_DEVICE_ID_NVIDIA_NVENET_19              0x03EF
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA2     0x03F6
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA3     0x03F7
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_SMBUS	    0x0446
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE	    0x0448
-#define PCI_DEVICE_ID_NVIDIA_NVENET_20              0x0450
-#define PCI_DEVICE_ID_NVIDIA_NVENET_21              0x0451
-#define PCI_DEVICE_ID_NVIDIA_NVENET_22              0x0452
-#define PCI_DEVICE_ID_NVIDIA_NVENET_23              0x0453
-#define PCI_DEVICE_ID_NVIDIA_NVENET_24              0x054C
-#define PCI_DEVICE_ID_NVIDIA_NVENET_25              0x054D
-#define PCI_DEVICE_ID_NVIDIA_NVENET_26              0x054E
-#define PCI_DEVICE_ID_NVIDIA_NVENET_27              0x054F
-#define PCI_DEVICE_ID_NVIDIA_NVENET_28              0x07DC
-#define PCI_DEVICE_ID_NVIDIA_NVENET_29              0x07DD
-#define PCI_DEVICE_ID_NVIDIA_NVENET_30              0x07DE
-#define PCI_DEVICE_ID_NVIDIA_NVENET_31              0x07DF
+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_SMBUS     0x0542
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE       0x0560
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE       0x056C
+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP78S_SMBUS    0x0752
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE       0x0759
-#define PCI_DEVICE_ID_NVIDIA_NVENET_32              0x0760
-#define PCI_DEVICE_ID_NVIDIA_NVENET_33              0x0761
-#define PCI_DEVICE_ID_NVIDIA_NVENET_34              0x0762
-#define PCI_DEVICE_ID_NVIDIA_NVENET_35              0x0763
-#define PCI_DEVICE_ID_NVIDIA_NVENET_36              0x0AB0
-#define PCI_DEVICE_ID_NVIDIA_NVENET_37              0x0AB1
-#define PCI_DEVICE_ID_NVIDIA_NVENET_38              0x0AB2
-#define PCI_DEVICE_ID_NVIDIA_NVENET_39              0x0AB3
+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_SMBUS     0x07D8
+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP79_SMBUS     0x0AA2
+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA	    0x0D85
 
 #define PCI_VENDOR_ID_IMS		0x10e0
 #define PCI_DEVICE_ID_IMS_TT128		0x9128
@@ -1281,6 +1295,13 @@
 
 #define PCI_VENDOR_ID_CREATIVE		0x1102 /* duplicate: ECTIVA */
 #define PCI_DEVICE_ID_CREATIVE_EMU10K1	0x0002
+#define PCI_DEVICE_ID_CREATIVE_20K1	0x0005
+#define PCI_DEVICE_ID_CREATIVE_20K2	0x000b
+#define PCI_SUBDEVICE_ID_CREATIVE_SB0760	0x0024
+#define PCI_SUBDEVICE_ID_CREATIVE_SB08801	0x0041
+#define PCI_SUBDEVICE_ID_CREATIVE_SB08802	0x0042
+#define PCI_SUBDEVICE_ID_CREATIVE_SB08803	0x0043
+#define PCI_SUBDEVICE_ID_CREATIVE_HENDRIX	0x6000
 
 #define PCI_VENDOR_ID_ECTIVA		0x1102 /* duplicate: CREATIVE */
 #define PCI_DEVICE_ID_ECTIVA_EV1938	0x8938
@@ -1373,7 +1394,7 @@
 #define PCI_DEVICE_ID_VIA_82C598_1	0x8598
 #define PCI_DEVICE_ID_VIA_838X_1	0xB188
 #define PCI_DEVICE_ID_VIA_83_87XX_1	0xB198
-#define PCI_DEVICE_ID_VIA_C409_IDE	0XC409
+#define PCI_DEVICE_ID_VIA_VX855_IDE	0xC409
 #define PCI_DEVICE_ID_VIA_ANON		0xFFFF
 
 #define PCI_VENDOR_ID_SIEMENS           0x110A
@@ -1473,6 +1494,7 @@
 #define PCI_DEVICE_ID_SERVERWORKS_HT1000IDE 0x0214
 #define PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2 0x0217
 #define PCI_DEVICE_ID_SERVERWORKS_CSB6LPC 0x0227
+#define PCI_DEVICE_ID_SERVERWORKS_HT1100LD 0x0408
 
 #define PCI_VENDOR_ID_SBE		0x1176
 #define PCI_DEVICE_ID_SBE_WANXL100	0x0301
@@ -1516,6 +1538,8 @@
 #define PCI_DEVICE_ID_ARTOP_ATP860R	0x0007
 #define PCI_DEVICE_ID_ARTOP_ATP865	0x0008
 #define PCI_DEVICE_ID_ARTOP_ATP865R	0x0009
+#define PCI_DEVICE_ID_ARTOP_ATP867A	0x000A
+#define PCI_DEVICE_ID_ARTOP_ATP867B	0x000B
 #define PCI_DEVICE_ID_ARTOP_AEC7610	0x8002
 #define PCI_DEVICE_ID_ARTOP_AEC7612UW	0x8010
 #define PCI_DEVICE_ID_ARTOP_AEC7612U	0x8020
@@ -1813,6 +1837,10 @@
 #define PCI_SUBDEVICE_ID_HYPERCOPE_METRO	0x0107
 #define PCI_SUBDEVICE_ID_HYPERCOPE_CHAMP2	0x0108
 
+#define PCI_VENDOR_ID_DIGIGRAM		0x1369
+#define PCI_SUBDEVICE_ID_DIGIGRAM_LX6464ES_SERIAL_SUBSYSTEM	0xc001
+#define PCI_SUBDEVICE_ID_DIGIGRAM_LX6464ES_CAE_SERIAL_SUBSYSTEM	0xc002
+
 #define PCI_VENDOR_ID_KAWASAKI		0x136b
 #define PCI_DEVICE_ID_MCHIP_KL5A72002	0xff01
 
@@ -1880,6 +1908,8 @@
 #define PCI_SUBDEVICE_ID_CCD_SWYX4S	0xB540
 #define PCI_SUBDEVICE_ID_CCD_JH4S20	0xB550
 #define PCI_SUBDEVICE_ID_CCD_IOB8ST_1	0xB552
+#define PCI_SUBDEVICE_ID_CCD_JHSE1	0xB553
+#define PCI_SUBDEVICE_ID_CCD_JH8S	0xB55B
 #define PCI_SUBDEVICE_ID_CCD_BN4S	0xB560
 #define PCI_SUBDEVICE_ID_CCD_BN8S	0xB562
 #define PCI_SUBDEVICE_ID_CCD_BNE1	0xB563
@@ -1932,6 +1962,8 @@
 #define PCI_DEVICE_ID_LAVA_DSERIAL	0x0100 /* 2x 16550 */
 #define PCI_DEVICE_ID_LAVA_QUATRO_A	0x0101 /* 2x 16550, half of 4 port */
 #define PCI_DEVICE_ID_LAVA_QUATRO_B	0x0102 /* 2x 16550, half of 4 port */
+#define PCI_DEVICE_ID_LAVA_QUATTRO_A	0x0120 /* 2x 16550A, half of 4 port */
+#define PCI_DEVICE_ID_LAVA_QUATTRO_B	0x0121 /* 2x 16550A, half of 4 port */
 #define PCI_DEVICE_ID_LAVA_OCTO_A	0x0180 /* 4x 16550A, half of 8 port */
 #define PCI_DEVICE_ID_LAVA_OCTO_B	0x0181 /* 4x 16550A, half of 8 port */
 #define PCI_DEVICE_ID_LAVA_PORT_PLUS	0x0200 /* 2x 16650 */
@@ -1962,15 +1994,21 @@
 #define PCI_DEVICE_ID_OXSEMI_PCIe952_1_U	0xC118
 #define PCI_DEVICE_ID_OXSEMI_PCIe952_1_GU	0xC11C
 #define PCI_DEVICE_ID_OXSEMI_16PCI954	0x9501
+#define PCI_DEVICE_ID_OXSEMI_C950	0x950B
 #define PCI_DEVICE_ID_OXSEMI_16PCI95N	0x9511
 #define PCI_DEVICE_ID_OXSEMI_16PCI954PP	0x9513
 #define PCI_DEVICE_ID_OXSEMI_16PCI952	0x9521
 #define PCI_DEVICE_ID_OXSEMI_16PCI952PP	0x9523
+#define PCI_SUBDEVICE_ID_OXSEMI_C950	0x0001
 
 #define PCI_VENDOR_ID_CHELSIO		0x1425
 
 #define PCI_VENDOR_ID_SAMSUNG		0x144d
 
+#define PCI_VENDOR_ID_GIGABYTE		0x1458
+
+#define PCI_VENDOR_ID_AMBIT		0x1468
+
 #define PCI_VENDOR_ID_MYRICOM		0x14c1
 
 #define PCI_VENDOR_ID_TITAN		0x14D2
@@ -1998,6 +2036,7 @@
 #define PCI_DEVICE_ID_AFAVLAB_P030	0x2182
 #define PCI_SUBDEVICE_ID_AFAVLAB_P061		0x2150
 
+#define PCI_VENDOR_ID_BCM_GVC          0x14a4
 #define PCI_VENDOR_ID_BROADCOM		0x14e4
 #define PCI_DEVICE_ID_TIGON3_5752	0x1600
 #define PCI_DEVICE_ID_TIGON3_5752M	0x1601
@@ -2047,7 +2086,6 @@
 #define PCI_DEVICE_ID_TIGON3_5787M	0x1693
 #define PCI_DEVICE_ID_TIGON3_5782	0x1696
 #define PCI_DEVICE_ID_TIGON3_5784	0x1698
-#define PCI_DEVICE_ID_TIGON3_5785	0x1699
 #define PCI_DEVICE_ID_TIGON3_5786	0x169a
 #define PCI_DEVICE_ID_TIGON3_5787	0x169b
 #define PCI_DEVICE_ID_TIGON3_5788	0x169c
@@ -2077,6 +2115,7 @@
 #define PCI_VENDOR_ID_MAINPINE		0x1522
 #define PCI_DEVICE_ID_MAINPINE_PBRIDGE	0x0100
 #define PCI_VENDOR_ID_ENE		0x1524
+#define PCI_DEVICE_ID_ENE_CB710_FLASH	0x0510
 #define PCI_DEVICE_ID_ENE_CB712_SD	0x0550
 #define PCI_DEVICE_ID_ENE_CB712_SD_2	0x0551
 #define PCI_DEVICE_ID_ENE_CB714_SD	0x0750
@@ -2112,6 +2151,8 @@
 #define PCI_DEVICE_ID_MELLANOX_SINAI_OLD 0x5e8c
 #define PCI_DEVICE_ID_MELLANOX_SINAI	0x6274
 
+#define PCI_VENDOR_ID_DFI		0x15bd
+
 #define PCI_VENDOR_ID_QUICKNET		0x15e2
 #define PCI_DEVICE_ID_QUICKNET_XJ	0x0500
 
@@ -2131,6 +2172,10 @@
 #define PCI_DEVICE_ID_ADDIDATA_APCI7420_3      0x700D
 #define PCI_DEVICE_ID_ADDIDATA_APCI7300_3      0x700E
 #define PCI_DEVICE_ID_ADDIDATA_APCI7800_3      0x700F
+#define PCI_DEVICE_ID_ADDIDATA_APCIe7300       0x7010
+#define PCI_DEVICE_ID_ADDIDATA_APCIe7420       0x7011
+#define PCI_DEVICE_ID_ADDIDATA_APCIe7500       0x7012
+#define PCI_DEVICE_ID_ADDIDATA_APCIe7800       0x7013
 
 #define PCI_VENDOR_ID_PDC		0x15e9
 
@@ -2215,10 +2260,20 @@
 
 #define PCI_VENDOR_ID_TOPSPIN		0x1867
 
+#define PCI_VENDOR_ID_SILAN		0x1904
+
 #define PCI_VENDOR_ID_TDI               0x192E
 #define PCI_DEVICE_ID_TDI_EHCI          0x0101
 
 #define PCI_VENDOR_ID_FREESCALE		0x1957
+#define PCI_DEVICE_ID_MPC8315E		0x00b4
+#define PCI_DEVICE_ID_MPC8315		0x00b5
+#define PCI_DEVICE_ID_MPC8314E		0x00b6
+#define PCI_DEVICE_ID_MPC8314		0x00b7
+#define PCI_DEVICE_ID_MPC8378E		0x00c4
+#define PCI_DEVICE_ID_MPC8378		0x00c5
+#define PCI_DEVICE_ID_MPC8377E		0x00c6
+#define PCI_DEVICE_ID_MPC8377		0x00c7
 #define PCI_DEVICE_ID_MPC8548E		0x0012
 #define PCI_DEVICE_ID_MPC8548		0x0013
 #define PCI_DEVICE_ID_MPC8543E		0x0014
@@ -2226,6 +2281,8 @@
 #define PCI_DEVICE_ID_MPC8547E		0x0018
 #define PCI_DEVICE_ID_MPC8545E		0x0019
 #define PCI_DEVICE_ID_MPC8545		0x001a
+#define PCI_DEVICE_ID_MPC8569E		0x0061
+#define PCI_DEVICE_ID_MPC8569		0x0060
 #define PCI_DEVICE_ID_MPC8568E		0x0020
 #define PCI_DEVICE_ID_MPC8568		0x0021
 #define PCI_DEVICE_ID_MPC8567E		0x0022
@@ -2238,6 +2295,22 @@
 #define PCI_DEVICE_ID_MPC8572		0x0041
 #define PCI_DEVICE_ID_MPC8536E		0x0050
 #define PCI_DEVICE_ID_MPC8536		0x0051
+#define PCI_DEVICE_ID_P2020E		0x0070
+#define PCI_DEVICE_ID_P2020		0x0071
+#define PCI_DEVICE_ID_P2010E		0x0078
+#define PCI_DEVICE_ID_P2010		0x0079
+#define PCI_DEVICE_ID_P1020E		0x0100
+#define PCI_DEVICE_ID_P1020		0x0101
+#define PCI_DEVICE_ID_P1011E		0x0108
+#define PCI_DEVICE_ID_P1011		0x0109
+#define PCI_DEVICE_ID_P1022E		0x0110
+#define PCI_DEVICE_ID_P1022		0x0111
+#define PCI_DEVICE_ID_P1013E		0x0118
+#define PCI_DEVICE_ID_P1013		0x0119
+#define PCI_DEVICE_ID_P4080E		0x0400
+#define PCI_DEVICE_ID_P4080		0x0401
+#define PCI_DEVICE_ID_P4040E		0x0408
+#define PCI_DEVICE_ID_P4040		0x0409
 #define PCI_DEVICE_ID_MPC8641		0x7010
 #define PCI_DEVICE_ID_MPC8641D		0x7011
 #define PCI_DEVICE_ID_MPC8610		0x7018
@@ -2251,6 +2324,7 @@
 #define PCI_VENDOR_ID_JMICRON		0x197B
 #define PCI_DEVICE_ID_JMICRON_JMB360	0x2360
 #define PCI_DEVICE_ID_JMICRON_JMB361	0x2361
+#define PCI_DEVICE_ID_JMICRON_JMB362	0x2362
 #define PCI_DEVICE_ID_JMICRON_JMB363	0x2363
 #define PCI_DEVICE_ID_JMICRON_JMB365	0x2365
 #define PCI_DEVICE_ID_JMICRON_JMB366	0x2366
@@ -2263,6 +2337,10 @@
 #define PCI_DEVICE_ID_KORENIX_JETCARDF0	0x1600
 #define PCI_DEVICE_ID_KORENIX_JETCARDF1	0x16ff
 
+#define PCI_VENDOR_ID_QMI		0x1a32
+
+#define PCI_VENDOR_ID_AZWAVE		0x1a3b
+
 #define PCI_VENDOR_ID_TEKRAM		0x1de1
 #define PCI_DEVICE_ID_TEKRAM_DC290	0xdc29
 
@@ -2342,6 +2420,9 @@
 #define PCI_DEVICE_ID_INTEL_82840_HB	0x1a21
 #define PCI_DEVICE_ID_INTEL_82845_HB	0x1a30
 #define PCI_DEVICE_ID_INTEL_IOAT	0x1a38
+#define PCI_DEVICE_ID_INTEL_CPT_SMBUS	0x1c22
+#define PCI_DEVICE_ID_INTEL_CPT_LPC1	0x1c42
+#define PCI_DEVICE_ID_INTEL_CPT_LPC2	0x1c43
 #define PCI_DEVICE_ID_INTEL_82801AA_0	0x2410
 #define PCI_DEVICE_ID_INTEL_82801AA_1	0x2411
 #define PCI_DEVICE_ID_INTEL_82801AA_3	0x2413
@@ -2373,6 +2454,7 @@
 #define PCI_DEVICE_ID_INTEL_82801CA_12	0x248c
 #define PCI_DEVICE_ID_INTEL_82801DB_0	0x24c0
 #define PCI_DEVICE_ID_INTEL_82801DB_1	0x24c1
+#define PCI_DEVICE_ID_INTEL_82801DB_2	0x24c2
 #define PCI_DEVICE_ID_INTEL_82801DB_3	0x24c3
 #define PCI_DEVICE_ID_INTEL_82801DB_5	0x24c5
 #define PCI_DEVICE_ID_INTEL_82801DB_6	0x24c6
@@ -2463,6 +2545,8 @@
 #define PCI_DEVICE_ID_INTEL_IOAT_TBG3	0x3433
 #define PCI_DEVICE_ID_INTEL_82830_HB	0x3575
 #define PCI_DEVICE_ID_INTEL_82830_CGC	0x3577
+#define PCI_DEVICE_ID_INTEL_82854_HB	0x358c
+#define PCI_DEVICE_ID_INTEL_82854_IG	0x358e
 #define PCI_DEVICE_ID_INTEL_82855GM_HB	0x3580
 #define PCI_DEVICE_ID_INTEL_82855GM_IG	0x3582
 #define PCI_DEVICE_ID_INTEL_E7520_MCH	0x3590
@@ -2476,6 +2560,16 @@
 #define PCI_DEVICE_ID_INTEL_E7525_MCH	0x359e
 #define PCI_DEVICE_ID_INTEL_IOAT_CNB	0x360b
 #define PCI_DEVICE_ID_INTEL_FBD_CNB	0x360c
+#define PCI_DEVICE_ID_INTEL_IOAT_JSF0	0x3710
+#define PCI_DEVICE_ID_INTEL_IOAT_JSF1	0x3711
+#define PCI_DEVICE_ID_INTEL_IOAT_JSF2	0x3712
+#define PCI_DEVICE_ID_INTEL_IOAT_JSF3	0x3713
+#define PCI_DEVICE_ID_INTEL_IOAT_JSF4	0x3714
+#define PCI_DEVICE_ID_INTEL_IOAT_JSF5	0x3715
+#define PCI_DEVICE_ID_INTEL_IOAT_JSF6	0x3716
+#define PCI_DEVICE_ID_INTEL_IOAT_JSF7	0x3717
+#define PCI_DEVICE_ID_INTEL_IOAT_JSF8	0x3718
+#define PCI_DEVICE_ID_INTEL_IOAT_JSF9	0x3719
 #define PCI_DEVICE_ID_INTEL_ICH10_0	0x3a14
 #define PCI_DEVICE_ID_INTEL_ICH10_1	0x3a16
 #define PCI_DEVICE_ID_INTEL_ICH10_2	0x3a18
@@ -2606,6 +2700,7 @@
 #define PCI_DEVICE_ID_NETMOS_9835	0x9835
 #define PCI_DEVICE_ID_NETMOS_9845	0x9845
 #define PCI_DEVICE_ID_NETMOS_9855	0x9855
+#define PCI_DEVICE_ID_NETMOS_9901	0x9901
 
 #define PCI_VENDOR_ID_3COM_2		0xa727
 
diff --git a/libdde-linux26/contrib/include/linux/phy.h \
b/libdde-linux26/contrib/include/linux/phy.h index d7e54d9..b1368b8 100644
--- a/libdde-linux26/contrib/include/linux/phy.h
+++ b/libdde-linux26/contrib/include/linux/phy.h
@@ -79,7 +79,7 @@ typedef enum {
  * Need to be a little smaller than phydev->dev.bus_id to leave room
  * for the ":%02x"
  */
-#define MII_BUS_ID_SIZE	(BUS_ID_SIZE - 3)
+#define MII_BUS_ID_SIZE	(20 - 3)
 
 /*
  * The Bus class for PHYs.  Devices which provide access to
@@ -315,8 +315,7 @@ struct phy_device {
 
 	/* Interrupt and Polling infrastructure */
 	struct work_struct phy_queue;
-	struct work_struct state_queue;
-	struct timer_list phy_timer;
+	struct delayed_work state_queue;
 	atomic_t irq_disable;
 
 	struct mutex lock;
@@ -389,6 +388,12 @@ struct phy_driver {
 	/* Enables or disables interrupts */
 	int (*config_intr)(struct phy_device *phydev);
 
+	/*
+	 * Checks if the PHY generated an interrupt.
+	 * For multi-PHY devices with shared PHY interrupt pin
+	 */
+	int (*did_interrupt)(struct phy_device *phydev);
+
 	/* Clears up any memory if needed */
 	void (*remove)(struct phy_device *phydev);
 
@@ -402,7 +407,7 @@ struct phy_driver {
 /* A Structure for boards to register fixups with the PHY Lib */
 struct phy_fixup {
 	struct list_head list;
-	char bus_id[BUS_ID_SIZE];
+	char bus_id[20];
 	u32 phy_uid;
 	u32 phy_uid_mask;
 	int (*run)(struct phy_device *phydev);
@@ -439,10 +444,16 @@ static inline int phy_write(struct phy_device *phydev, u16 \
regnum, u16 val)  
 int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id);
 struct phy_device* get_phy_device(struct mii_bus *bus, int addr);
+int phy_device_register(struct phy_device *phy);
 int phy_clear_interrupt(struct phy_device *phydev);
 int phy_config_interrupt(struct phy_device *phydev, u32 interrupts);
+int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
+		u32 flags, phy_interface_t interface);
 struct phy_device * phy_attach(struct net_device *dev,
 		const char *bus_id, u32 flags, phy_interface_t interface);
+int phy_connect_direct(struct net_device *dev, struct phy_device *phydev,
+		void (*handler)(struct net_device *), u32 flags,
+		phy_interface_t interface);
 struct phy_device * phy_connect(struct net_device *dev, const char *bus_id,
 		void (*handler)(struct net_device *), u32 flags,
 		phy_interface_t interface);
diff --git a/libdde-linux26/contrib/include/linux/skbuff.h \
b/libdde-linux26/contrib/include/linux/skbuff.h index a9e9534..745f615 100644
--- a/libdde-linux26/contrib/include/linux/skbuff.h
+++ b/libdde-linux26/contrib/include/linux/skbuff.h
@@ -142,6 +142,9 @@ struct skb_shared_info {
 	atomic_t	dataref;
 	unsigned short	nr_frags;
 	unsigned short	gso_size;
+#ifdef CONFIG_HAS_DMA
+	dma_addr_t	dma_head;
+#endif
 	/* Warning: this field is not always filled in (UFO)! */
 	unsigned short	gso_segs;
 	unsigned short  gso_type;
@@ -152,7 +155,7 @@ struct skb_shared_info {
 	struct sk_buff	*frag_list;
 	skb_frag_t	frags[MAX_SKB_FRAGS];
 #ifdef CONFIG_HAS_DMA
-	dma_addr_t	dma_maps[MAX_SKB_FRAGS + 1];
+	dma_addr_t	dma_maps[MAX_SKB_FRAGS];
 #endif
 };
 
@@ -1900,6 +1903,21 @@ static inline void skb_copy_queue_mapping(struct sk_buff *to, \
const struct sk_bu  to->queue_mapping = from->queue_mapping;
 }
 
+static inline void skb_record_rx_queue(struct sk_buff *skb, u16 rx_queue)
+{
+	skb->queue_mapping = rx_queue + 1;
+}
+
+static inline u16 skb_get_rx_queue(struct sk_buff *skb)
+{
+	return skb->queue_mapping - 1;
+}
+
+static inline bool skb_rx_queue_recorded(struct sk_buff *skb)
+{
+	return (skb->queue_mapping != 0);
+}
+
 #ifdef CONFIG_XFRM
 static inline struct sec_path *skb_sec_path(struct sk_buff *skb)
 {
diff --git a/libdde-linux26/contrib/include/linux/workqueue.h \
b/libdde-linux26/contrib/include/linux/workqueue.h index 3cd51e5..cf24c20 100644
--- a/libdde-linux26/contrib/include/linux/workqueue.h
+++ b/libdde-linux26/contrib/include/linux/workqueue.h
@@ -41,6 +41,11 @@ struct delayed_work {
 	struct timer_list timer;
 };
 
+static inline struct delayed_work *to_delayed_work(struct work_struct *work)
+{
+	return container_of(work, struct delayed_work, work);
+}
+
 struct execute_work {
 	struct work_struct work;
 };
@@ -89,7 +94,7 @@ struct execute_work {
 /*
  * initialize all of a work item in one go
  *
- * NOTE! No point in using "atomic_long_set()": useing a direct
+ * NOTE! No point in using "atomic_long_set()": using a direct
  * assignment of the work data initializer allows the compiler
  * to generate better code.
  */
@@ -202,6 +207,7 @@ extern int queue_delayed_work_on(int cpu, struct workqueue_struct \
*wq,  
 extern void flush_workqueue(struct workqueue_struct *wq);
 extern void flush_scheduled_work(void);
+extern void flush_delayed_work(struct delayed_work *work);
 
 extern int schedule_work(struct work_struct *work);
 extern int schedule_work_on(int cpu, struct work_struct *work);
@@ -235,6 +241,21 @@ static inline int cancel_delayed_work(struct delayed_work *work)
 	return ret;
 }
 
+/*
+ * Like above, but uses del_timer() instead of del_timer_sync(). This means,
+ * if it returns 0 the timer function may be running and the queueing is in
+ * progress.
+ */
+static inline int __cancel_delayed_work(struct delayed_work *work)
+{
+	int ret;
+
+	ret = del_timer(&work->timer);
+	if (ret)
+		work_clear_pending(&work->work);
+	return ret;
+}
+
 extern int cancel_delayed_work_sync(struct delayed_work *work);
 
 /* Obsolete. use cancel_delayed_work_sync() */
diff --git a/libdde-linux26/contrib/kernel/rcupdate.c \
b/libdde-linux26/contrib/kernel/rcupdate.c index cae8a05..c6bfa1a 100644
--- a/libdde-linux26/contrib/kernel/rcupdate.c
+++ b/libdde-linux26/contrib/kernel/rcupdate.c
@@ -180,6 +180,7 @@ void __init rcu_init(void)
 {
 	__rcu_init();
 }
+core_initcall(rcu_init);
 
 void rcu_scheduler_starting(void)
 {
diff --git a/libdde-linux26/contrib/net/core/skb_dma_map.c \
b/libdde-linux26/contrib/net/core/skb_dma_map.c index 8623492..07d4ac5 100644
--- a/libdde-linux26/contrib/net/core/skb_dma_map.c
+++ b/libdde-linux26/contrib/net/core/skb_dma_map.c
@@ -20,7 +20,7 @@ int skb_dma_map(struct device *dev, struct sk_buff *skb,
 	if (dma_mapping_error(dev, map))
 		goto out_err;
 
-	sp->dma_maps[0] = map;
+	sp->dma_head = map;
 	for (i = 0; i < sp->nr_frags; i++) {
 		skb_frag_t *fp = &sp->frags[i];
 
@@ -28,7 +28,7 @@ int skb_dma_map(struct device *dev, struct sk_buff *skb,
 				   fp->size, dir);
 		if (dma_mapping_error(dev, map))
 			goto unwind;
-		sp->dma_maps[i + 1] = map;
+		sp->dma_maps[i] = map;
 	}
 	sp->num_dma_maps = i + 1;
 
@@ -38,10 +38,10 @@ unwind:
 	while (--i >= 0) {
 		skb_frag_t *fp = &sp->frags[i];
 
-		dma_unmap_page(dev, sp->dma_maps[i + 1],
+		dma_unmap_page(dev, sp->dma_maps[i],
 			       fp->size, dir);
 	}
-	dma_unmap_single(dev, sp->dma_maps[0],
+	dma_unmap_single(dev, sp->dma_head,
 			 skb_headlen(skb), dir);
 out_err:
 	return -ENOMEM;
@@ -54,12 +54,12 @@ void skb_dma_unmap(struct device *dev, struct sk_buff *skb,
 	struct skb_shared_info *sp = skb_shinfo(skb);
 	int i;
 
-	dma_unmap_single(dev, sp->dma_maps[0],
+	dma_unmap_single(dev, sp->dma_head,
 			 skb_headlen(skb), dir);
 	for (i = 0; i < sp->nr_frags; i++) {
 		skb_frag_t *fp = &sp->frags[i];
 
-		dma_unmap_page(dev, sp->dma_maps[i + 1],
+		dma_unmap_page(dev, sp->dma_maps[i],
 			       fp->size, dir);
 	}
 }
diff --git a/libdde-linux26/include/linux/kernel.h \
b/libdde-linux26/include/linux/kernel.h index 573ed07..6354939 100644
--- a/libdde-linux26/include/linux/kernel.h
+++ b/libdde-linux26/include/linux/kernel.h
@@ -363,6 +363,8 @@ static inline char *pack_hex_byte(char *buf, u8 byte)
         printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)
 #define pr_info(fmt, ...) \
         printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
+#define pr_cont(fmt, ...) \
+        printk(KERN_CONT fmt, ##__VA_ARGS__)
 
 #if defined(DEBUG)
 #ifndef DDE_LINUX
diff --git a/libdde-linux26/lib/src/Makefile b/libdde-linux26/lib/src/Makefile
index 4f1ec09..abcc533 100644
--- a/libdde-linux26/lib/src/Makefile
+++ b/libdde-linux26/lib/src/Makefile
@@ -91,6 +91,8 @@ SRC_C_libdde_linux26.o.a += \
 				kernel/kthread.c \
 				kernel/mutex.c \
 				kernel/notifier.c \
+				kernel/rcupdate.c \
+				kernel/rcuclassic.c \
 				kernel/resource.c \
 				kernel/rwsem.c \
 				kernel/sched.c \
@@ -106,6 +108,7 @@ SRC_C_libdde_linux26.o.a += \
 				lib/crc32.c \
 				lib/ctype.c \
 				lib/cpumask.c \
+				lib/devres.c \
 				lib/find_next_bit.c \
 				lib/hexdump.c \
 				lib/idr.c \
diff --git a/libdde-linux26/lib/src/net/core/dev.c \
b/libdde-linux26/lib/src/net/core/dev.c index cf03652..3c3a1d1 100644
--- a/libdde-linux26/lib/src/net/core/dev.c
+++ b/libdde-linux26/lib/src/net/core/dev.c
@@ -1731,6 +1731,13 @@ static u16 simple_tx_hash(struct net_device *dev, struct \
sk_buff *skb)  simple_tx_hashrnd_initialized = 1;
 	}
 
+	if (skb_rx_queue_recorded(skb)) {
+		u32 val = skb_get_rx_queue(skb);
+
+		hash = jhash_1word(val, simple_tx_hashrnd);
+		goto out;
+	}
+
 	switch (skb->protocol) {
 	case htons(ETH_P_IP):
 		if (!(ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)))
@@ -1768,6 +1775,7 @@ static u16 simple_tx_hash(struct net_device *dev, struct \
sk_buff *skb)  
 	hash = jhash_3words(addr1, addr2, ports, simple_tx_hashrnd);
 
+out:
 	return (u16) (((u64) hash * dev->real_num_tx_queues) >> 32);
 }
 
@@ -3377,10 +3385,10 @@ void __dev_set_rx_mode(struct net_device *dev)
 		/* Unicast addresses changes may only happen under the rtnl,
 		 * therefore calling __dev_set_promiscuity here is safe.
 		 */
-		if (dev->uc_count > 0 && !dev->uc_promisc) {
+		if (dev->uc.count > 0 && !dev->uc_promisc) {
 			__dev_set_promiscuity(dev, 1);
 			dev->uc_promisc = 1;
-		} else if (dev->uc_count == 0 && dev->uc_promisc) {
+		} else if (dev->uc.count == 0 && dev->uc_promisc) {
 			__dev_set_promiscuity(dev, -1);
 			dev->uc_promisc = 0;
 		}
@@ -3397,6 +3405,316 @@ void dev_set_rx_mode(struct net_device *dev)
 	netif_addr_unlock_bh(dev);
 }
 
+/* hw addresses list handling functions */
+
+static int __hw_addr_add(struct netdev_hw_addr_list *list, unsigned char *addr,
+			 int addr_len, unsigned char addr_type)
+{
+	struct netdev_hw_addr *ha;
+	int alloc_size;
+
+	if (addr_len > MAX_ADDR_LEN)
+		return -EINVAL;
+
+	list_for_each_entry(ha, &list->list, list) {
+		if (!memcmp(ha->addr, addr, addr_len) &&
+		    ha->type == addr_type) {
+			ha->refcount++;
+			return 0;
+		}
+	}
+
+
+	alloc_size = sizeof(*ha);
+	if (alloc_size < L1_CACHE_BYTES)
+		alloc_size = L1_CACHE_BYTES;
+	ha = kmalloc(alloc_size, GFP_ATOMIC);
+	if (!ha)
+		return -ENOMEM;
+	memcpy(ha->addr, addr, addr_len);
+	ha->type = addr_type;
+	ha->refcount = 1;
+	ha->synced = false;
+	list_add_tail_rcu(&ha->list, &list->list);
+	list->count++;
+	return 0;
+}
+
+static void ha_rcu_free(struct rcu_head *head)
+{
+	struct netdev_hw_addr *ha;
+
+	ha = container_of(head, struct netdev_hw_addr, rcu_head);
+	kfree(ha);
+}
+
+static int __hw_addr_del(struct netdev_hw_addr_list *list, unsigned char *addr,
+			 int addr_len, unsigned char addr_type)
+{
+	struct netdev_hw_addr *ha;
+
+	list_for_each_entry(ha, &list->list, list) {
+		if (!memcmp(ha->addr, addr, addr_len) &&
+		    (ha->type == addr_type || !addr_type)) {
+			if (--ha->refcount)
+				return 0;
+			list_del_rcu(&ha->list);
+			call_rcu(&ha->rcu_head, ha_rcu_free);
+			list->count--;
+			return 0;
+		}
+	}
+	return -ENOENT;
+}
+
+static int __hw_addr_add_multiple(struct netdev_hw_addr_list *to_list,
+				  struct netdev_hw_addr_list *from_list,
+				  int addr_len,
+				  unsigned char addr_type)
+{
+	int err;
+	struct netdev_hw_addr *ha, *ha2;
+	unsigned char type;
+
+	list_for_each_entry(ha, &from_list->list, list) {
+		type = addr_type ? addr_type : ha->type;
+		err = __hw_addr_add(to_list, ha->addr, addr_len, type);
+		if (err)
+			goto unroll;
+	}
+	return 0;
+
+unroll:
+	list_for_each_entry(ha2, &from_list->list, list) {
+		if (ha2 == ha)
+			break;
+		type = addr_type ? addr_type : ha2->type;
+		__hw_addr_del(to_list, ha2->addr, addr_len, type);
+	}
+	return err;
+}
+
+static void __hw_addr_del_multiple(struct netdev_hw_addr_list *to_list,
+				   struct netdev_hw_addr_list *from_list,
+				   int addr_len,
+				   unsigned char addr_type)
+{
+	struct netdev_hw_addr *ha;
+	unsigned char type;
+
+	list_for_each_entry(ha, &from_list->list, list) {
+		type = addr_type ? addr_type : ha->type;
+		__hw_addr_del(to_list, ha->addr, addr_len, addr_type);
+	}
+}
+
+static int __hw_addr_sync(struct netdev_hw_addr_list *to_list,
+			  struct netdev_hw_addr_list *from_list,
+			  int addr_len)
+{
+	int err = 0;
+	struct netdev_hw_addr *ha, *tmp;
+
+	list_for_each_entry_safe(ha, tmp, &from_list->list, list) {
+		if (!ha->synced) {
+			err = __hw_addr_add(to_list, ha->addr,
+					    addr_len, ha->type);
+			if (err)
+				break;
+			ha->synced = true;
+			ha->refcount++;
+		} else if (ha->refcount == 1) {
+			__hw_addr_del(to_list, ha->addr, addr_len, ha->type);
+			__hw_addr_del(from_list, ha->addr, addr_len, ha->type);
+		}
+	}
+	return err;
+}
+
+static void __hw_addr_unsync(struct netdev_hw_addr_list *to_list,
+			     struct netdev_hw_addr_list *from_list,
+			     int addr_len)
+{
+	struct netdev_hw_addr *ha, *tmp;
+
+	list_for_each_entry_safe(ha, tmp, &from_list->list, list) {
+		if (ha->synced) {
+			__hw_addr_del(to_list, ha->addr,
+				      addr_len, ha->type);
+			ha->synced = false;
+			__hw_addr_del(from_list, ha->addr,
+				      addr_len, ha->type);
+		}
+	}
+}
+
+static void __hw_addr_flush(struct netdev_hw_addr_list *list)
+{
+	struct netdev_hw_addr *ha, *tmp;
+
+	list_for_each_entry_safe(ha, tmp, &list->list, list) {
+		list_del_rcu(&ha->list);
+		call_rcu(&ha->rcu_head, ha_rcu_free);
+	}
+	list->count = 0;
+}
+
+static void __hw_addr_init(struct netdev_hw_addr_list *list)
+{
+	INIT_LIST_HEAD(&list->list);
+	list->count = 0;
+}
+
+/* Device addresses handling functions */
+
+static void dev_addr_flush(struct net_device *dev)
+{
+	/* rtnl_mutex must be held here */
+
+	__hw_addr_flush(&dev->dev_addrs);
+	dev->dev_addr = NULL;
+}
+
+static int dev_addr_init(struct net_device *dev)
+{
+	unsigned char addr[MAX_ADDR_LEN];
+	struct netdev_hw_addr *ha;
+	int err;
+
+	/* rtnl_mutex must be held here */
+
+	__hw_addr_init(&dev->dev_addrs);
+	memset(addr, 0, sizeof(addr));
+	err = __hw_addr_add(&dev->dev_addrs, addr, sizeof(addr),
+			    NETDEV_HW_ADDR_T_LAN);
+	if (!err) {
+		/*
+		 * Get the first (previously created) address from the list
+		 * and set dev_addr pointer to this location.
+		 */
+		ha = list_first_entry(&dev->dev_addrs.list,
+				      struct netdev_hw_addr, list);
+		dev->dev_addr = ha->addr;
+	}
+	return err;
+}
+
+/**
+ *	dev_addr_add	- Add a device address
+ *	@dev: device
+ *	@addr: address to add
+ *	@addr_type: address type
+ *
+ *	Add a device address to the device or increase the reference count if
+ *	it already exists.
+ *
+ *	The caller must hold the rtnl_mutex.
+ */
+int dev_addr_add(struct net_device *dev, unsigned char *addr,
+		 unsigned char addr_type)
+{
+	int err;
+
+	ASSERT_RTNL();
+
+	err = __hw_addr_add(&dev->dev_addrs, addr, dev->addr_len, addr_type);
+	if (!err)
+		call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
+	return err;
+}
+EXPORT_SYMBOL(dev_addr_add);
+
+/**
+ *	dev_addr_del	- Release a device address.
+ *	@dev: device
+ *	@addr: address to delete
+ *	@addr_type: address type
+ *
+ *	Release reference to a device address and remove it from the device
+ *	if the reference count drops to zero.
+ *
+ *	The caller must hold the rtnl_mutex.
+ */
+int dev_addr_del(struct net_device *dev, unsigned char *addr,
+		 unsigned char addr_type)
+{
+	int err;
+	struct netdev_hw_addr *ha;
+
+	ASSERT_RTNL();
+
+	/*
+	 * We can not remove the first address from the list because
+	 * dev->dev_addr points to that.
+	 */
+	ha = list_first_entry(&dev->dev_addrs.list,
+			      struct netdev_hw_addr, list);
+	if (ha->addr == dev->dev_addr && ha->refcount == 1)
+		return -ENOENT;
+
+	err = __hw_addr_del(&dev->dev_addrs, addr, dev->addr_len,
+			    addr_type);
+	if (!err)
+		call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
+	return err;
+}
+EXPORT_SYMBOL(dev_addr_del);
+
+/**
+ *	dev_addr_add_multiple	- Add device addresses from another device
+ *	@to_dev: device to which addresses will be added
+ *	@from_dev: device from which addresses will be added
+ *	@addr_type: address type - 0 means type will be used from from_dev
+ *
+ *	Add device addresses of the one device to another.
+ **
+ *	The caller must hold the rtnl_mutex.
+ */
+int dev_addr_add_multiple(struct net_device *to_dev,
+			  struct net_device *from_dev,
+			  unsigned char addr_type)
+{
+	int err;
+
+	ASSERT_RTNL();
+
+	if (from_dev->addr_len != to_dev->addr_len)
+		return -EINVAL;
+	err = __hw_addr_add_multiple(&to_dev->dev_addrs, &from_dev->dev_addrs,
+				     to_dev->addr_len, addr_type);
+	if (!err)
+		call_netdevice_notifiers(NETDEV_CHANGEADDR, to_dev);
+	return err;
+}
+EXPORT_SYMBOL(dev_addr_add_multiple);
+
+/**
+ *	dev_addr_del_multiple	- Delete device addresses by another device
+ *	@to_dev: device where the addresses will be deleted
+ *	@from_dev: device by which addresses the addresses will be deleted
+ *	@addr_type: address type - 0 means type will used from from_dev
+ *
+ *	Deletes addresses in to device by the list of addresses in from device.
+ *
+ *	The caller must hold the rtnl_mutex.
+ */
+int dev_addr_del_multiple(struct net_device *to_dev,
+			  struct net_device *from_dev,
+			  unsigned char addr_type)
+{
+	ASSERT_RTNL();
+
+	if (from_dev->addr_len != to_dev->addr_len)
+		return -EINVAL;
+	__hw_addr_del_multiple(&to_dev->dev_addrs, &from_dev->dev_addrs,
+			       to_dev->addr_len, addr_type);
+	call_netdevice_notifiers(NETDEV_CHANGEADDR, to_dev);
+	return 0;
+}
+EXPORT_SYMBOL(dev_addr_del_multiple);
+
+/* multicast addresses handling functions */
+
 int __dev_addr_delete(struct dev_addr_list **list, int *count,
 		      void *addr, int alen, int glbl)
 {
@@ -3459,24 +3777,22 @@ int __dev_addr_add(struct dev_addr_list **list, int *count,
  *	dev_unicast_delete	- Release secondary unicast address.
  *	@dev: device
  *	@addr: address to delete
- *	@alen: length of @addr
  *
  *	Release reference to a secondary unicast address and remove it
  *	from the device if the reference count drops to zero.
  *
  * 	The caller must hold the rtnl_mutex.
  */
-int dev_unicast_delete(struct net_device *dev, void *addr, int alen)
+int dev_unicast_delete(struct net_device *dev, void *addr)
 {
 	int err;
 
 	ASSERT_RTNL();
 
-	netif_addr_lock_bh(dev);
-	err = __dev_addr_delete(&dev->uc_list, &dev->uc_count, addr, alen, 0);
+	err = __hw_addr_del(&dev->uc, addr, dev->addr_len,
+			    NETDEV_HW_ADDR_T_UNICAST);
 	if (!err)
 		__dev_set_rx_mode(dev);
-	netif_addr_unlock_bh(dev);
 	return err;
 }
 EXPORT_SYMBOL(dev_unicast_delete);
@@ -3485,24 +3801,22 @@ EXPORT_SYMBOL(dev_unicast_delete);
  *	dev_unicast_add		- add a secondary unicast address
  *	@dev: device
  *	@addr: address to add
- *	@alen: length of @addr
  *
  *	Add a secondary unicast address to the device or increase
  *	the reference count if it already exists.
  *
  *	The caller must hold the rtnl_mutex.
  */
-int dev_unicast_add(struct net_device *dev, void *addr, int alen)
+int dev_unicast_add(struct net_device *dev, void *addr)
 {
 	int err;
 
 	ASSERT_RTNL();
 
-	netif_addr_lock_bh(dev);
-	err = __dev_addr_add(&dev->uc_list, &dev->uc_count, addr, alen, 0);
+	err = __hw_addr_add(&dev->uc, addr, dev->addr_len,
+			    NETDEV_HW_ADDR_T_UNICAST);
 	if (!err)
 		__dev_set_rx_mode(dev);
-	netif_addr_unlock_bh(dev);
 	return err;
 }
 EXPORT_SYMBOL(dev_unicast_add);
@@ -3559,8 +3873,7 @@ void __dev_addr_unsync(struct dev_addr_list **to, int \
                *to_count,
  *	@from: source device
  *
  *	Add newly added addresses to the destination device and release
- *	addresses that have no users left. The source device must be
- *	locked by netif_addr_lock_bh.
+ *	addresses that have no users left.
  *
  *	This function is intended to be called from the dev->set_rx_mode
  *	function of layered software devices.
@@ -3569,12 +3882,14 @@ int dev_unicast_sync(struct net_device *to, struct net_device \
*from)  {
 	int err = 0;
 
-	netif_addr_lock_bh(to);
-	err = __dev_addr_sync(&to->uc_list, &to->uc_count,
-			      &from->uc_list, &from->uc_count);
+	ASSERT_RTNL();
+
+	if (to->addr_len != from->addr_len)
+		return -EINVAL;
+
+	err = __hw_addr_sync(&to->uc, &from->uc, to->addr_len);
 	if (!err)
 		__dev_set_rx_mode(to);
-	netif_addr_unlock_bh(to);
 	return err;
 }
 EXPORT_SYMBOL(dev_unicast_sync);
@@ -3590,18 +3905,31 @@ EXPORT_SYMBOL(dev_unicast_sync);
  */
 void dev_unicast_unsync(struct net_device *to, struct net_device *from)
 {
-	netif_addr_lock_bh(from);
-	netif_addr_lock(to);
+	ASSERT_RTNL();
 
-	__dev_addr_unsync(&to->uc_list, &to->uc_count,
-			  &from->uc_list, &from->uc_count);
-	__dev_set_rx_mode(to);
+	if (to->addr_len != from->addr_len)
+		return;
 
-	netif_addr_unlock(to);
-	netif_addr_unlock_bh(from);
+	__hw_addr_unsync(&to->uc, &from->uc, to->addr_len);
+	__dev_set_rx_mode(to);
 }
 EXPORT_SYMBOL(dev_unicast_unsync);
 
+static void dev_unicast_flush(struct net_device *dev)
+{
+	/* rtnl_mutex must be held here */
+
+	__hw_addr_flush(&dev->uc);
+}
+
+static void dev_unicast_init(struct net_device *dev)
+{
+	/* rtnl_mutex must be held here */
+
+	__hw_addr_init(&dev->uc);
+}
+
+
 static void __dev_addr_discard(struct dev_addr_list **list)
 {
 	struct dev_addr_list *tmp;
@@ -3620,9 +3948,6 @@ static void dev_addr_discard(struct net_device *dev)
 {
 	netif_addr_lock_bh(dev);
 
-	__dev_addr_discard(&dev->uc_list);
-	dev->uc_count = 0;
-
 	__dev_addr_discard(&dev->mc_list);
 	dev->mc_count = 0;
 
@@ -4213,6 +4538,7 @@ static void rollback_registered(struct net_device *dev)
 	/*
 	 *	Flush the unicast and multicast chains
 	 */
+	dev_unicast_flush(dev);
 	dev_addr_discard(dev);
 
 	if (dev->netdev_ops->ndo_uninit)
@@ -4729,6 +5055,8 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char \
*name,  dev = (struct net_device *)
 		(((long)p + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST);
 	dev->padded = (char *)dev - (char *)p;
+	dev_unicast_init(dev);
+
 	dev_net_set(dev, &init_net);
 
 	dev->_tx = tx;
@@ -4737,6 +5065,7 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char \
*name,  
 	dev->gso_max_size = GSO_MAX_SIZE;
 
+	dev_addr_init(dev);
 	netdev_init_queues(dev);
 
 	INIT_LIST_HEAD(&dev->napi_list);
@@ -4762,6 +5091,9 @@ void free_netdev(struct net_device *dev)
 
 	kfree(dev->_tx);
 
+	/* Flush device addresses */
+	dev_addr_flush(dev);
+
 	list_for_each_entry_safe(p, n, &dev->napi_list, dev_list)
 		netif_napi_del(p);
 
@@ -4923,6 +5255,7 @@ int dev_change_net_namespace(struct net_device *dev, struct net \
*net, const char  /*
 	 *	Flush the unicast and multicast chains
 	 */
+	dev_unicast_flush(dev);
 	dev_addr_discard(dev);
 
 	netdev_unregister_kobject(dev);
diff --git a/libdde-linux26/lib/src/net/sched/sch_generic.c \
b/libdde-linux26/lib/src/net/sched/sch_generic.c index a2acd6c..252ac98 100644
--- a/libdde-linux26/lib/src/net/sched/sch_generic.c
+++ b/libdde-linux26/lib/src/net/sched/sch_generic.c
@@ -200,6 +200,21 @@ void __qdisc_run(struct Qdisc *q)
 	clear_bit(__QDISC_STATE_RUNNING, &q->state);
 }
 
+unsigned long dev_trans_start(struct net_device *dev)
+{
+	unsigned long val, res = dev->trans_start;
+	unsigned int i;
+
+	for (i = 0; i < dev->num_tx_queues; i++) {
+		val = netdev_get_tx_queue(dev, i)->trans_start;
+		if (val && time_after(val, res))
+			res = val;
+	}
+	dev->trans_start = res;
+	return res;
+}
+EXPORT_SYMBOL(dev_trans_start);
+
 static void dev_watchdog(unsigned long arg)
 {
 	struct net_device *dev = (struct net_device *)arg;
@@ -209,25 +224,30 @@ static void dev_watchdog(unsigned long arg)
 		if (netif_device_present(dev) &&
 		    netif_running(dev) &&
 		    netif_carrier_ok(dev)) {
-			int some_queue_stopped = 0;
+			int some_queue_timedout = 0;
 			unsigned int i;
+			unsigned long trans_start;
 
 			for (i = 0; i < dev->num_tx_queues; i++) {
 				struct netdev_queue *txq;
 
 				txq = netdev_get_tx_queue(dev, i);
-				if (netif_tx_queue_stopped(txq)) {
-					some_queue_stopped = 1;
+				/*
+				 * old device drivers set dev->trans_start
+				 */
+				trans_start = txq->trans_start ? : dev->trans_start;
+				if (netif_tx_queue_stopped(txq) &&
+				    time_after(jiffies, (trans_start +
+							 dev->watchdog_timeo))) {
+					some_queue_timedout = 1;
 					break;
 				}
 			}
 
-			if (some_queue_stopped &&
-			    time_after(jiffies, (dev->trans_start +
-						 dev->watchdog_timeo))) {
+			if (some_queue_timedout) {
 				char drivername[64];
-				WARN_ONCE(1, KERN_INFO "NETDEV WATCHDOG: %s (%s): transmit timed out\n",
-				       dev->name, netdev_drivername(dev, drivername, 64));
+				WARN_ONCE(1, KERN_INFO "NETDEV WATCHDOG: %s (%s): transmit queue %u timed \
out\n", +				       dev->name, netdev_drivername(dev, drivername, 64), i);
 				dev->netdev_ops->ndo_tx_timeout(dev);
 			}
 			if (!mod_timer(&dev->watchdog_timer,
@@ -612,8 +632,10 @@ static void transition_one_qdisc(struct net_device *dev,
 		clear_bit(__QDISC_STATE_DEACTIVATED, &new_qdisc->state);
 
 	rcu_assign_pointer(dev_queue->qdisc, new_qdisc);
-	if (need_watchdog_p && new_qdisc != &noqueue_qdisc)
+	if (need_watchdog_p && new_qdisc != &noqueue_qdisc) {
+		dev_queue->trans_start = 0;
 		*need_watchdog_p = 1;
+	}
 }
 
 void dev_activate(struct net_device *dev)
diff --git a/libdiskfs/Makefile b/libdiskfs/Makefile
index 03c2e2b..c1dd567 100644
--- a/libdiskfs/Makefile
+++ b/libdiskfs/Makefile
@@ -56,7 +56,7 @@ OTHERSRCS = conch-fetch.c conch-set.c dir-clear.c dir-init.c \
dir-renamed.c \  SRCS = $(OTHERSRCS) $(FSSRCS) $(IOSRCS) $(FSYSSRCS) $(IFSOCKSRCS)
 installhdrs = diskfs.h diskfs-pager.h
 
-MIGSTUBS = fsServer.o ioServer.o fsysServer.o exec_startupServer.o \
+MIGSTUBS = fsServer.o fs_experimentalServer.o ioServer.o fsysServer.o \
exec_startupServer.o \  fsys_replyUser.o fs_notifyUser.o ifsockServer.o \
 	startup_notifyServer.o
 OBJS = $(sort $(SRCS:.c=.o) $(MIGSTUBS))
@@ -66,6 +66,7 @@ LDLIBS += -lpthread
 
 fsys-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h -DREPLY_PORTS
 fs-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h
+fs_experimental-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h
 io-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h
 ifsock-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h
 MIGCOMSFLAGS = -prefix diskfs_
diff --git a/libdiskfs/boot-start.c b/libdiskfs/boot-start.c
index 6d9a773..f0fb3f2 100644
--- a/libdiskfs/boot-start.c
+++ b/libdiskfs/boot-start.c
@@ -128,8 +128,13 @@ diskfs_start_bootstrap ()
       assert (_hurd_ports);
       assert (_hurd_ports[INIT_PORT_CRDIR].port != MACH_PORT_NULL);
       diskfs_exec = file_name_lookup (_SERVERS_EXEC, 0, 0);
-      if (diskfs_exec == MACH_PORT_NULL)
-	error (1, errno, "%s", _SERVERS_EXEC);
+      if (diskfs_exec == MACH_PORT_NULL) 
+	{
+	  /* Debian specifc work-around for install bootstrapping.  */
+	  diskfs_exec = file_name_lookup ("/tmp/exec", 0, 0);
+	  if (diskfs_exec == MACH_PORT_NULL)
+	    error (1, errno, "%s", _SERVERS_EXEC);
+	}
       else
 	{
 #ifndef NDEBUG
@@ -179,8 +184,15 @@ diskfs_start_bootstrap ()
 			&retry, pathbuf, &execnode);
       if (err)
 	{
-	  error (0, err, "cannot set translator on %s", _SERVERS_EXEC);
-	  mach_port_deallocate (mach_task_self (), diskfs_exec_ctl);
+          /* If /servers/exec is not available (which is the case during
+             installation, try /tmp/exec as well.  */
+          err = dir_lookup (root_pt, "/tmp/exec", O_NOTRANS, 0,
+	            	    &retry, pathbuf, &execnode);
+	  if (err) 
+	    {
+	      error (0, err, "cannot set translator on %s", _SERVERS_EXEC);
+	      mach_port_deallocate (mach_task_self (), diskfs_exec_ctl);
+	    }
 	}
       else
 	{
@@ -196,7 +208,7 @@ diskfs_start_bootstrap ()
       diskfs_exec_ctl = MACH_PORT_NULL;	/* Not used after this.  */
     }
 
-  /* Cache the exec server port for file_exec to use.  */
+  /* Cache the exec server port for file_exec_file_name to use.  */
   _hurd_port_set (&_diskfs_exec_portcell, diskfs_exec);
 
   if (_diskfs_boot_command)
@@ -407,6 +419,10 @@ diskfs_execboot_fsys_startup (mach_port_t port, int flags,
 
   err = dir_lookup (rootport, _SERVERS_EXEC, flags|O_NOTRANS, 0,
 		    &retry, pathbuf, real);
+  if (err) 
+    /* Try /tmp/exec as well, in case we're installing.  */
+    err = dir_lookup (rootport, "/tmp/exec", flags|O_NOTRANS|O_CREAT, 0,
+	  	      &retry, pathbuf, real);
   assert_perror (err);
   assert (retry == FS_RETRY_NORMAL);
   assert (pathbuf[0] == '\0');
diff --git a/libdiskfs/demuxer.c b/libdiskfs/demuxer.c
index 5412f26..3401cec 100644
--- a/libdiskfs/demuxer.c
+++ b/libdiskfs/demuxer.c
@@ -23,6 +23,7 @@ diskfs_demuxer (mach_msg_header_t *inp,
 {
   mig_routine_t diskfs_io_server_routine (mach_msg_header_t *);
   mig_routine_t diskfs_fs_server_routine (mach_msg_header_t *);
+  mig_routine_t diskfs_fs_experimental_server_routine (mach_msg_header_t *);
   mig_routine_t ports_notify_server_routine (mach_msg_header_t *);
   mig_routine_t diskfs_fsys_server_routine (mach_msg_header_t *);
   mig_routine_t ports_interrupt_server_routine (mach_msg_header_t *);
@@ -33,6 +34,7 @@ diskfs_demuxer (mach_msg_header_t *inp,
   mig_routine_t routine;
   if ((routine = diskfs_io_server_routine (inp)) ||
       (routine = diskfs_fs_server_routine (inp)) ||
+      (routine = diskfs_fs_experimental_server_routine (inp)) ||
       (routine = ports_notify_server_routine (inp)) ||
       (routine = diskfs_fsys_server_routine (inp)) ||
       (routine = ports_interrupt_server_routine (inp)) ||
diff --git a/libdiskfs/file-exec.c b/libdiskfs/file-exec.c
index 9572dbe..3fe4059 100644
--- a/libdiskfs/file-exec.c
+++ b/libdiskfs/file-exec.c
@@ -1,5 +1,6 @@
-/* File execution (file_exec RPC) for diskfs servers, using exec server.
-   Copyright (C) 1993,94,95,96,97,98,2000,02 Free Software Foundation, Inc.
+/* File execution (file_exec_file_name RPC) for diskfs servers, using exec server.
+   Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2002,
+   2010 Free Software Foundation, Inc.
 
 This file is part of the GNU Hurd.
 
@@ -21,10 +22,14 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, \
USA.  */  
 #include "priv.h"
 #include "fs_S.h"
+#include "fs_experimental_S.h"
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <hurd/exec.h>
 #include <hurd/paths.h>
+#ifdef HAVE_EXEC_EXEC_FILE_NAME
+#include <hurd/exec_experimental.h>
+#endif
 #include <string.h>
 #include <idvec.h>
 
@@ -47,6 +52,39 @@ diskfs_S_file_exec (struct protid *cred,
 		    mach_port_t *destroynames,
 		    size_t destroynameslen)
 {
+  return diskfs_S_file_exec_file_name (cred,
+				       task,
+				       flags,
+				       "",
+				       argv, argvlen,
+				       envp, envplen,
+				       fds, fdslen,
+				       portarray, portarraylen,
+				       intarray, intarraylen,
+				       deallocnames, deallocnameslen,
+				       destroynames, destroynameslen);
+}
+
+kern_return_t
+diskfs_S_file_exec_file_name (struct protid *cred,
+			      task_t task,
+			      int flags,
+			      char *filename,
+			      char *argv,
+			      size_t argvlen,
+			      char *envp,
+			      size_t envplen,
+			      mach_port_t *fds,
+			      size_t fdslen,
+			      mach_port_t *portarray,
+			      size_t portarraylen,
+			      int *intarray,
+			      size_t intarraylen,
+			      mach_port_t *deallocnames,
+			      size_t deallocnameslen,
+			      mach_port_t *destroynames,
+			      size_t destroynameslen)
+{
   struct node *np;
   uid_t uid;
   gid_t gid;
@@ -136,9 +174,9 @@ diskfs_S_file_exec (struct protid *cred,
 
   if (! err)
     /* Make a new peropen for the exec server to access the file, since any
-       seeking the exec server might want to do should not affect the
-       original peropen on which file_exec was called.  (The new protid for
-       this peropen clones the caller's iouser to preserve the caller's
+       seeking the exec server might want to do should not affect the original
+       peropen on which file_exec_file_name was called.  (The new protid
+       for this peropen clones the caller's iouser to preserve the caller's
        authentication credentials.)  The new peropen's openmodes must have
        O_READ even if the caller had only O_EXEC privilege, so the exec
        server can read the executable file.  We also include O_EXEC so that
@@ -159,14 +197,31 @@ diskfs_S_file_exec (struct protid *cred,
       do
 	{
 	  right = ports_get_send_right (newpi);
-	  err = exec_exec (execserver,
-			   right, MACH_MSG_TYPE_COPY_SEND,
-			   task, flags, argv, argvlen, envp, envplen,
-			   fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
-			   portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen,
-			   intarray, intarraylen,
-			   deallocnames, deallocnameslen,
-			   destroynames, destroynameslen);
+#ifdef HAVE_EXEC_EXEC_FILE_NAME
+	  err = exec_exec_file_name (execserver,
+				     right, MACH_MSG_TYPE_COPY_SEND,
+				     task, flags, filename,
+				     argv, argvlen, envp, envplen,
+				     fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
+				     portarray, MACH_MSG_TYPE_COPY_SEND,
+				     portarraylen,
+				     intarray, intarraylen,
+				     deallocnames, deallocnameslen,
+				     destroynames, destroynameslen);
+	  /* For backwards compatibility.  Just drop it when we kill
+	     exec_exec.  */
+	  if (err == MIG_BAD_ID)
+#endif
+	    err = exec_exec (execserver,
+			     right, MACH_MSG_TYPE_COPY_SEND,
+			     task, flags, argv, argvlen, envp, envplen,
+			     fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
+			     portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen,
+			     intarray, intarraylen,
+			     deallocnames, deallocnameslen,
+			     destroynames, destroynameslen);
+
+
 	  mach_port_deallocate (mach_task_self (), right);
 	  if (err == MACH_SEND_INVALID_DEST)
 	    {
diff --git a/libdiskfs/file-utimes.c b/libdiskfs/file-utimes.c
index 39fac50..7ac5d50 100644
--- a/libdiskfs/file-utimes.c
+++ b/libdiskfs/file-utimes.c
@@ -33,7 +33,7 @@ diskfs_S_file_utimes (struct protid *cred,
 			 else
 			   {
 			     np->dn_stat.st_atim.tv_sec = atime.seconds;
-			     np->dn_stat.st_atim.tv_nsec = atime.microseconds * 1000;
+			     np->dn_stat.st_atim.tv_nsec = 0;
 			     np->dn_set_atime = 0;
 			   }
 			 
@@ -42,7 +42,7 @@ diskfs_S_file_utimes (struct protid *cred,
 			 else
 			   {
 			     np->dn_stat.st_mtim.tv_sec = mtime.seconds;
-			     np->dn_stat.st_mtim.tv_nsec = mtime.microseconds * 1000;
+			     np->dn_stat.st_mtim.tv_nsec = 0;
 			     np->dn_set_mtime = 0;
 			   }
 			 
diff --git a/libdiskfs/init-init.c b/libdiskfs/init-init.c
index 35be7ed..cb9fcf5 100644
--- a/libdiskfs/init-init.c
+++ b/libdiskfs/init-init.c
@@ -57,6 +57,9 @@ diskfs_init_diskfs (void)
 {
   error_t err;
 
+  /* See `node-create.c'.  */
+  _diskfs_no_inherit_dir_group = 1;
+
   if (diskfs_boot_filesystem ())
     /* This is a boot filesystem, we have to do some things specially.  */
     {
diff --git a/libdiskfs/node-times.c b/libdiskfs/node-times.c
index 67f0142..d4a7388 100644
--- a/libdiskfs/node-times.c
+++ b/libdiskfs/node-times.c
@@ -53,21 +53,21 @@ diskfs_set_node_times (struct node *np)
   if (np->dn_set_mtime)
     {
       np->dn_stat.st_mtim.tv_sec = t.tv_sec;
-      np->dn_stat.st_mtim.tv_nsec = t.tv_usec * 1000;
+      np->dn_stat.st_mtim.tv_nsec = 0;
       np->dn_stat_dirty = 1;
       np->dn_set_mtime = 0;
     }
   if (np->dn_set_atime)
     {
       np->dn_stat.st_atim.tv_sec = t.tv_sec;
-      np->dn_stat.st_atim.tv_nsec = t.tv_usec * 1000;
+      np->dn_stat.st_atim.tv_nsec = 0;
       np->dn_stat_dirty = 1;
       np->dn_set_atime = 0;
     }
   if (np->dn_set_ctime)
     {
       np->dn_stat.st_ctim.tv_sec = t.tv_sec;
-      np->dn_stat.st_ctim.tv_nsec = t.tv_usec * 1000;
+      np->dn_stat.st_ctim.tv_nsec = 0;
       np->dn_stat_dirty = 1;
       np->dn_set_ctime = 0;
     }
diff --git a/libdiskfs/opts-common.c b/libdiskfs/opts-common.c
index d37c286..e3cbd31 100644
--- a/libdiskfs/opts-common.c
+++ b/libdiskfs/opts-common.c
@@ -52,7 +52,7 @@ const struct argp_option diskfs_common_options[] =
   {"nogrpid",    0,   0, OPTION_ALIAS | OPTION_HIDDEN},
   {"sysvgroups", 0,   0, OPTION_ALIAS | OPTION_HIDDEN},
   {"inherit-dir-group", OPT_INHERIT_DIR_GROUP, 0, 0,
-   "Create new nodes with gid of parent dir (default)"},
+   "Create new nodes with gid of parent dir"},
   {"grpid",    0,   0, OPTION_ALIAS | OPTION_HIDDEN},
   {"bsdgroups", 0,   0, OPTION_ALIAS | OPTION_HIDDEN},
   {0, 0}
diff --git a/libfshelp/start-translator-long.c b/libfshelp/start-translator-long.c
index 64a20be..8927c0d 100644
--- a/libfshelp/start-translator-long.c
+++ b/libfshelp/start-translator-long.c
@@ -1,5 +1,6 @@
 /*
-   Copyright (C) 1995,96,99,2000,02, 04 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1999, 2000, 2002, 2004, 2010
+   Free Software Foundation, Inc.
    Written by Miles Bader and Michael I. Bushnell.
 
    This file is part of the GNU Hurd.
@@ -27,6 +28,9 @@
 #include <string.h>
 #include <assert.h>
 #include "fshelp.h"
+#ifdef HAVE_FILE_EXEC_FILE_NAME
+#include <hurd/fs_experimental.h>
+#endif
 
 
 /* The data passed in the various messages we're interested in.  */
@@ -272,12 +276,22 @@ fshelp_start_translator_long (fshelp_open_fn_t \
underlying_open_fn,  saveport = ports[INIT_PORT_BOOTSTRAP];
   ports[INIT_PORT_BOOTSTRAP] = bootstrap;
 
+#ifdef HAVE_FILE_EXEC_FILE_NAME
   /* Try and exec the translator in TASK...  */
-  err = file_exec (executable, task, EXEC_DEFAULTS,
-		   argz, argz_len, 0, 0,
-		   fds, fds_type, fds_len,
-		   ports, ports_type, ports_len,
-		   ints, ints_len, 0, 0, 0, 0);
+  err = file_exec_file_name (executable, task, EXEC_DEFAULTS, name,
+			     argz, argz_len, 0, 0,
+			     fds, fds_type, fds_len,
+			     ports, ports_type, ports_len,
+			     ints, ints_len, 0, 0, 0, 0);
+  /* For backwards compatibility.  Just drop it when we kill file_exec.  */
+  if (err == MIG_BAD_ID)
+#endif
+    err = file_exec (executable, task, EXEC_DEFAULTS,
+		     argz, argz_len, 0, 0,
+		     fds, fds_type, fds_len,
+		     ports, ports_type, ports_len,
+		     ints, ints_len, 0, 0, 0, 0);
+
   ports_moved = 1;
 
   if (ports_type == MACH_MSG_TYPE_COPY_SEND)
diff --git a/libmachdev/ds_routines.c b/libmachdev/ds_routines.c
index d22fb2f..62b3ee3 100644
--- a/libmachdev/ds_routines.c
+++ b/libmachdev/ds_routines.c
@@ -205,7 +205,7 @@ ds_device_close (device_t dev)
   ret = (device->emul_ops->close
 	 ? (*device->emul_ops->close) (device->emul_data)
 	 : D_SUCCESS);
-  mach_device_deallocate (device_to_pi (device));
+  //mach_device_deallocate (device_to_pi (device));
 
   ports_port_deref (device_to_pi (device));
   return ret;
diff --git a/libmachdev/net.c b/libmachdev/net.c
index 501c9bb..00a019b 100644
--- a/libmachdev/net.c
+++ b/libmachdev/net.c
@@ -212,7 +212,7 @@ deliver_msg(struct net_rcv_msg *msg, if_filter_list_t *ifp)
 			  MACH_SEND_MSG|MACH_SEND_TIMEOUT,
 			  msg->msg_hdr.msgh_size, 0, MACH_PORT_NULL,
 			  0, MACH_PORT_NULL);
-	  if (err != MACH_MSG_SUCCESS)
+	  if (0 && err != MACH_MSG_SUCCESS)
 	    {
 	      /* TODO: remove from filter */
 	    }
@@ -375,7 +375,7 @@ device_open (mach_port_t reply_port, mach_msg_type_name_t \
reply_port_type,  }
 
   *devp = ports_get_right (nd);
-  *devicePoly = MACH_MSG_TYPE_COPY_SEND;
+  *devicePoly = MACH_MSG_TYPE_MAKE_SEND;
   return D_SUCCESS;
 }
 
diff --git a/libnetfs/Makefile b/libnetfs/Makefile
index 1a71b49..6bbb80e 100644
--- a/libnetfs/Makefile
+++ b/libnetfs/Makefile
@@ -59,12 +59,13 @@ SRCS= $(OTHERSRCS) $(FSSRCS) $(IOSRCS) $(FSYSSRCS) $(IFSOCKSRCS)
 
 installhdrs=netfs.h
 
-MIGSTUBS= ioServer.o fsServer.o fsysServer.o fsys_replyUser.o ifsockServer.o
+MIGSTUBS= ioServer.o fsServer.o fs_experimentalServer.o fsysServer.o \
fsys_replyUser.o ifsockServer.o  
 OBJS=$(sort $(SRCS:.c=.o) $(MIGSTUBS))
 
 fsys-MIGSFLAGS = -imacros $(srcdir)/mutations.h -DREPLY_PORTS
 fs-MIGSFLAGS = -imacros $(srcdir)/mutations.h
+fs_experimental-MIGSFLAGS = -imacros $(srcdir)/mutations.h
 io-MIGSFLAGS = -imacros $(srcdir)/mutations.h
 ifsock-MIGSFLAGS = -imacros $(srcdir)/mutations.h
 MIGCOMSFLAGS = -prefix netfs_
diff --git a/libnetfs/demuxer.c b/libnetfs/demuxer.c
index 8ef4d86..5a38ca2 100644
--- a/libnetfs/demuxer.c
+++ b/libnetfs/demuxer.c
@@ -26,6 +26,7 @@ netfs_demuxer (mach_msg_header_t *inp,
 {
   mig_routine_t netfs_io_server_routine (mach_msg_header_t *);
   mig_routine_t netfs_fs_server_routine (mach_msg_header_t *);
+  mig_routine_t netfs_fs_experimental_server_routine (mach_msg_header_t *);
   mig_routine_t ports_notify_server_routine (mach_msg_header_t *);
   mig_routine_t netfs_fsys_server_routine (mach_msg_header_t *);
   mig_routine_t ports_interrupt_server_routine (mach_msg_header_t *);
@@ -34,6 +35,7 @@ netfs_demuxer (mach_msg_header_t *inp,
   mig_routine_t routine;
   if ((routine = netfs_io_server_routine (inp)) ||
       (routine = netfs_fs_server_routine (inp)) ||
+      (routine = netfs_fs_experimental_server_routine (inp)) ||
       (routine = ports_notify_server_routine (inp)) ||
       (routine = netfs_fsys_server_routine (inp)) ||
       (routine = ports_interrupt_server_routine (inp)) ||
diff --git a/libnetfs/file-exec.c b/libnetfs/file-exec.c
index 638f0ae..ffaf598 100644
--- a/libnetfs/file-exec.c
+++ b/libnetfs/file-exec.c
@@ -1,5 +1,6 @@
 /*
-   Copyright (C) 1996,97,2000,01,02 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 2000, 2001, 2002, 2010
+   Free Software Foundation, Inc.
    Written by Michael I. Bushnell, p/BSG.
 
    This file is part of the GNU Hurd.
@@ -23,10 +24,14 @@
 #include "netfs.h"
 #include "execserver.h"
 #include "fs_S.h"
+#include "fs_experimental_S.h"
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <hurd/exec.h>
 #include <hurd/paths.h>
+#ifdef HAVE_EXEC_EXEC_FILE_NAME
+#include <hurd/exec_experimental.h>
+#endif
 #include <string.h>
 #include <idvec.h>
 
@@ -49,6 +54,39 @@ netfs_S_file_exec (struct protid *cred,
 		   mach_port_t *destroynames,
 		   size_t destroynameslen)
 {
+  return netfs_S_file_exec_file_name (cred,
+				      task,
+				      flags,
+				      "",
+				      argv, argvlen,
+				      envp, envplen,
+				      fds, fdslen,
+				      portarray, portarraylen,
+				      intarray, intarraylen,
+				      deallocnames, deallocnameslen,
+				      destroynames, destroynameslen);
+}
+
+kern_return_t
+netfs_S_file_exec_file_name (struct protid *cred,
+			     task_t task,
+			     int flags,
+			     char *filename,
+			     char *argv,
+			     size_t argvlen,
+			     char *envp,
+			     size_t envplen,
+			     mach_port_t *fds,
+			     size_t fdslen,
+			     mach_port_t *portarray,
+			     size_t portarraylen,
+			     int *intarray,
+			     size_t intarraylen,
+			     mach_port_t *deallocnames,
+			     size_t deallocnameslen,
+			     mach_port_t *destroynames,
+			     size_t destroynameslen)
+{
   struct node *np;
   error_t err;
   uid_t uid;
@@ -133,14 +171,31 @@ netfs_S_file_exec (struct protid *cred,
 	  if (newpi)
 	    {
 	      right = ports_get_send_right (newpi);
-	      err = exec_exec (_netfs_exec,
-			       right, MACH_MSG_TYPE_COPY_SEND,
-			       task, flags, argv, argvlen, envp, envplen,
-			       fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
-			       portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen,
-			       intarray, intarraylen,
-			       deallocnames, deallocnameslen,
-			       destroynames, destroynameslen);
+#ifdef HAVE_EXEC_EXEC_FILE_NAME
+	      err = exec_exec_file_name (_netfs_exec,
+					 right, MACH_MSG_TYPE_COPY_SEND,
+					 task, flags, filename,
+					 argv, argvlen, envp, envplen,
+					 fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
+					 portarray, MACH_MSG_TYPE_COPY_SEND,
+					 portarraylen,
+					 intarray, intarraylen,
+					 deallocnames, deallocnameslen,
+					 destroynames, destroynameslen);
+	      /* For backwards compatibility.  Just drop it when we kill
+		 exec_exec.  */
+	      if (err == MIG_BAD_ID)
+#endif
+		err = exec_exec (_netfs_exec,
+				 right, MACH_MSG_TYPE_COPY_SEND,
+				 task, flags, argv, argvlen, envp, envplen,
+				 fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
+				 portarray, MACH_MSG_TYPE_COPY_SEND,
+				 portarraylen,
+				 intarray, intarraylen,
+				 deallocnames, deallocnameslen,
+				 destroynames, destroynameslen);
+
 	      mach_port_deallocate (mach_task_self (), right);
 	      ports_port_deref (newpi);
 	    }
diff --git a/libports/manage-multithread.c b/libports/manage-multithread.c
index 64e442f..008f805 100644
--- a/libports/manage-multithread.c
+++ b/libports/manage-multithread.c
@@ -28,6 +28,10 @@
 
 #define STACK_SIZE (64 * 1024)
 
+/* FIXME Until threadvars are completely replaced with correct TLS, use this
+   hack to set the stack size.  */
+size_t __pthread_stack_default_size = STACK_SIZE;
+
 #define THREAD_PRI 2
 
 /* XXX To reduce starvation, the priority of new threads is initially
@@ -106,6 +110,7 @@ ports_manage_port_operations_multithread (struct port_bucket \
*bucket,  
   auto void * thread_function (void *);
 
+  /* FIXME This is currently a no-op.  */
   pthread_attr_init (&attr);
   pthread_attr_setstacksize (&attr, STACK_SIZE);
 
@@ -236,5 +241,7 @@ ports_manage_port_operations_multithread (struct port_bucket \
*bucket,  return NULL;
     }
 
+  thread_timeout = global_timeout = 0; /* XXX */
+
   thread_function ((void *) 1);
 }
diff --git a/libtrivfs/Makefile b/libtrivfs/Makefile
index 241b76d..c6bd3f8 100644
--- a/libtrivfs/Makefile
+++ b/libtrivfs/Makefile
@@ -44,7 +44,7 @@ OTHERSRCS=demuxer.c protid-clean.c protid-dup.c cntl-create.c \
 
 SRCS=$(FSSRCS) $(IOSRCS) $(FSYSSRCS) $(OTHERSRCS)
 
-MIGSTUBS=fsServer.o ioServer.o fsysServer.o fsys_replyUser.o
+MIGSTUBS=fsServer.o fs_experimentalServer.o ioServer.o fsysServer.o fsys_replyUser.o
 
 libname = libtrivfs
 HURDLIBS = fshelp iohelp ports shouldbeinlibc
@@ -54,7 +54,7 @@ MIGCOMSFLAGS = -prefix trivfs_
 installhdrs := trivfs.h
 mig-sheader-prefix = trivfs_
 ifndef no_deps
-installhdrs += $(patsubst %,trivfs_%_S.h,fs io fsys)
+installhdrs += $(patsubst %,trivfs_%_S.h,fs fs_experimental io fsys)
 endif
 
 include ../Makeconf
diff --git a/libtrivfs/demuxer.c b/libtrivfs/demuxer.c
index 411699f..df7f5b9 100644
--- a/libtrivfs/demuxer.c
+++ b/libtrivfs/demuxer.c
@@ -27,6 +27,7 @@ trivfs_demuxer (mach_msg_header_t *inp,
 {
   mig_routine_t trivfs_io_server_routine (mach_msg_header_t *);
   mig_routine_t trivfs_fs_server_routine (mach_msg_header_t *);
+  mig_routine_t trivfs_fs_experimental_server_routine (mach_msg_header_t *);
   mig_routine_t ports_notify_server_routine (mach_msg_header_t *);
   mig_routine_t trivfs_fsys_server_routine (mach_msg_header_t *);
   mig_routine_t ports_interrupt_server_routine (mach_msg_header_t *);
@@ -35,6 +36,7 @@ trivfs_demuxer (mach_msg_header_t *inp,
   mig_routine_t routine;
   if ((routine = trivfs_io_server_routine (inp)) ||
       (routine = trivfs_fs_server_routine (inp)) ||
+      (routine = trivfs_fs_experimental_server_routine (inp)) ||
       (routine = ports_notify_server_routine (inp)) ||
       (routine = trivfs_fsys_server_routine (inp)) ||
       (routine = ports_interrupt_server_routine (inp)))
diff --git a/libtrivfs/file-exec.c b/libtrivfs/file-exec.c
index a3ab048..f626955 100644
--- a/libtrivfs/file-exec.c
+++ b/libtrivfs/file-exec.c
@@ -1,5 +1,5 @@
 /*
-   Copyright (C) 1994,2002 Free Software Foundation, Inc.
+   Copyright (C) 1994, 2002, 2010 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -40,3 +40,28 @@ trivfs_S_file_exec (trivfs_protid_t exec_file,
 {
   return EOPNOTSUPP;
 }
+
+kern_return_t
+trivfs_S_file_exec_file_name (trivfs_protid_t exec_file,
+			      mach_port_t reply,
+			      mach_msg_type_name_t replyPoly,
+			      mach_port_t exec_task,
+			      int flags,
+			      string_t filename,
+			      data_t argv,
+			      mach_msg_type_number_t argvCnt,
+			      data_t envp,
+			      mach_msg_type_number_t envpCnt,
+			      portarray_t fdarray,
+			      mach_msg_type_number_t fdarrayCnt,
+			      portarray_t portarray,
+			      mach_msg_type_number_t portarrayCnt,
+			      intarray_t intarray,
+			      mach_msg_type_number_t intarrayCnt,
+			      mach_port_array_t deallocnames,
+			      mach_msg_type_number_t deallocnamesCnt,
+			      mach_port_array_t destroynames,
+			      mach_msg_type_number_t destroynamesCnt)
+{
+  return EOPNOTSUPP;
+}
diff --git a/libtrivfs/trivfs.h b/libtrivfs/trivfs.h
index cf817b5..dba5dad 100644
--- a/libtrivfs/trivfs.h
+++ b/libtrivfs/trivfs.h
@@ -299,6 +299,7 @@ extern size_t trivfs_num_dynamic_port_buckets;
 /* These are the MiG-generated headers that declare prototypes
    for the server functions.  */
 #include <hurd/trivfs_fs_S.h>
+#include <hurd/trivfs_fs_experimental_S.h>
 #include <hurd/trivfs_io_S.h>
 #include <hurd/trivfs_fsys_S.h>
 
diff --git a/pfinet/linux-src/net/ipv4/devinet.c \
b/pfinet/linux-src/net/ipv4/devinet.c index 0416ee8..a566743 100644
--- a/pfinet/linux-src/net/ipv4/devinet.c
+++ b/pfinet/linux-src/net/ipv4/devinet.c
@@ -214,10 +214,12 @@ inet_insert_ifa(struct in_device *in_dev, struct in_ifaddr \
*ifa)  {
 	struct in_ifaddr *ifa1, **ifap, **last_primary;
 
+#ifndef _HURD_
 	if (ifa->ifa_local == 0) {
 		inet_free_ifa(ifa);
 		return 0;
 	}
+#endif
 
 	ifa->ifa_flags &= ~IFA_F_SECONDARY;
 	last_primary = &in_dev->ifa_list;
diff --git a/pfinet/options.c b/pfinet/options.c
index 1d0a9e1..4115518 100644
--- a/pfinet/options.c
+++ b/pfinet/options.c
@@ -60,23 +60,26 @@ extern struct inet6_dev *ipv6_find_idev (struct device *dev);
 extern int inet6_addr_add (int ifindex, struct in6_addr *pfx, int plen);
 extern int inet6_addr_del (int ifindex, struct in6_addr *pfx, int plen);
 
+#ifdef CONFIG_IPV6
+static struct rt6_info * ipv6_get_dflt_router (void);
+#endif
+
 
 /* Pfinet options.  Used for both startup and runtime.  */
 static const struct argp_option options[] =
 {
-  {"interface", 'i', "DEVICE",  0,  "Network interface to use", 1},
+  {"interface", 'i', "DEVICE",   0,  "Network interface to use", 1},
   {0,0,0,0,"These apply to a given interface:", 2},
-  {"address",   'a', "ADDRESS", 0, "Set the network address"},
-  {"netmask",   'm', "MASK",    0, "Set the netmask"},
-  {"peer",      'p', "ADDRESS", 0, "Set the peer address"},
-  {"gateway",   'g', "ADDRESS", 0, "Set the default gateway"},
-  {"ipv4",      '4', "NAME",    0, "Put active IPv4 translator on NAME"},
+  {"address",   'a', "ADDRESS",  OPTION_ARG_OPTIONAL, "Set the network address"},
+  {"netmask",   'm', "MASK",     OPTION_ARG_OPTIONAL, "Set the netmask"},
+  {"peer",      'p', "ADDRESS",  OPTION_ARG_OPTIONAL, "Set the peer address"},
+  {"gateway",   'g', "ADDRESS",  OPTION_ARG_OPTIONAL, "Set the default gateway"},
+  {"ipv4",      '4', "NAME",     0, "Put active IPv4 translator on NAME"},
 #ifdef CONFIG_IPV6  
-  {"ipv6",      '6', "NAME",    0, "Put active IPv6 translator on NAME"},
-  {"address6",  'A', "ADDR/LEN",0, "Set the global IPv6 address"},
-  {"gateway6",  'G', "ADDRESS", 0, "Set the IPv6 default gateway"},
+  {"ipv6",      '6', "NAME",     0, "Put active IPv6 translator on NAME"},
+  {"address6",  'A', "ADDR/LEN", OPTION_ARG_OPTIONAL, "Set the global IPv6 \
address"}, +  {"gateway6",  'G', "ADDRESS",  OPTION_ARG_OPTIONAL, "Set the IPv6 \
default gateway"},  #endif
-  {"shutdown",  's', 0,         0, "Shut it down"},
   {0}
 };
 
@@ -112,6 +115,50 @@ struct parse_hook
   struct parse_interface *curint;
 };
 
+static void
+parse_interface_copy_device(struct device *src,
+                            struct parse_interface *dst)
+{
+  uint32_t broad;
+  struct rt_key key = { 0 };
+  struct inet6_dev *idev = NULL;
+  struct fib_result res;
+
+  inquire_device (src, &dst->address, &dst->netmask, 
+                  &dst->peer, &broad);
+  /* Get gateway */
+  dst->gateway = INADDR_NONE;
+  key.oif = src->ifindex;
+  if (! main_table->tb_lookup (main_table, &key, &res)
+      && FIB_RES_GW(res) != INADDR_ANY)
+    dst->gateway = FIB_RES_GW (res);
+#ifdef CONFIG_IPV6
+  if (trivfs_protid_portclasses[PORTCLASS_INET6] != MACH_PORT_NULL)
+    idev = ipv6_find_idev(src);
+
+  if (idev)
+  {
+    struct inet6_ifaddr *ifa = idev->addr_list;
+    
+    /* Look for IPv6 default router and add it to the interface,
+     * if it belongs to it.
+     */
+    struct rt6_info *rt6i = ipv6_get_dflt_router();
+    if (rt6i->rt6i_dev == src) 
+      memcpy (&dst->gateway6, &rt6i->rt6i_gateway, sizeof (struct in6_addr));
+    /* Search for global address and set it in dst */
+    do 
+    {
+      if (!IN6_IS_ADDR_LINKLOCAL (&ifa->addr)) {
+        memcpy (&dst->address6, ifa, sizeof (struct inet6_ifaddr));
+        break;
+      }
+    }
+    while ((ifa = ifa->if_next));
+  }
+#endif
+}
+
 /* Adds an empty interface slot to H, and sets H's current interface to it, or
    returns an error. */
 static error_t
@@ -122,6 +169,7 @@ parse_hook_add_interface (struct parse_hook *h)
 	     (h->num_interfaces + 1) * sizeof (struct parse_interface));
   if (! new)
     return ENOMEM;
+
   h->interfaces = new;
   h->num_interfaces++;
   h->curint = new + h->num_interfaces - 1;
@@ -183,10 +231,16 @@ parse_opt (int opt, char *arg, struct argp_state *state)
      if (addr == INADDR_NONE) PERR (EINVAL, "Malformed %s", type);	      \
      addr; })
 
+  if (!arg && state->next < state->argc
+      && (*state->argv[state->next] != '-'))
+    {
+      arg = state->argv[state->next];
+      state->next ++;
+    }
+
   switch (opt)
     {
-      struct parse_interface *in;
-      uint32_t gateway;
+      struct parse_interface *in, *gw4_in;
 #ifdef CONFIG_IPV6
       struct parse_interface *gw6_in;
       char *ptr;
@@ -217,29 +271,59 @@ parse_opt (int opt, char *arg, struct argp_state *state)
       if (err)
 	FAIL (err, 10, err, "%s", arg);
 
+      /* Set old interface values */
+      parse_interface_copy_device (in->device, in);
       break;
 
     case 'a':
-      h->curint->address = ADDR (arg, "address");
-      if (!IN_CLASSA (ntohl (h->curint->address))
-	  && !IN_CLASSB (ntohl (h->curint->address))
-	  && !IN_CLASSC (ntohl (h->curint->address)))
-	{
-	  if (IN_MULTICAST (ntohl (h->curint->address)))
-	    FAIL (EINVAL, 1, 0,
-		  "%s: Cannot set interface address to multicast address",
-		  arg);
-	  else
-	    FAIL (EINVAL, 1, 0,
-		  "%s: Illegal or undefined network address", arg);
-	}
+      if (arg)
+      {
+        h->curint->address = ADDR (arg, "address");
+        if (!IN_CLASSA (ntohl (h->curint->address))
+            && !IN_CLASSB (ntohl (h->curint->address))
+            && !IN_CLASSC (ntohl (h->curint->address)))
+          {
+            if (IN_MULTICAST (ntohl (h->curint->address)))
+              FAIL (EINVAL, 1, 0,
+                    "%s: Cannot set interface address to multicast address",
+                    arg);
+            else
+              FAIL (EINVAL, 1, 0,
+                    "%s: Illegal or undefined network address", arg);
+          }
+      } else { 
+        h->curint->address = ADDR ("0.0.0.0", "address");
+        h->curint->netmask = ADDR ("255.0.0.0", "netmask");
+        h->curint->gateway = INADDR_NONE;
+      }
       break;
+
     case 'm':
-      h->curint->netmask = ADDR (arg, "netmask"); break;
+      if (arg)
+        h->curint->netmask = ADDR (arg, "netmask"); 
+      else 
+        h->curint->netmask = INADDR_NONE;
+      break;
+
     case 'p':
-      h->curint->peer = ADDR (arg, "peer"); break;
+      if (arg)
+        h->curint->peer = ADDR (arg, "peer"); 
+      else 
+        h->curint->peer = INADDR_NONE;
+      break;
+
     case 'g':
-      h->curint->gateway = ADDR (arg, "gateway"); break;
+      if (arg)
+	{
+	  /* Remove an possible other default gateway */ 
+	  for (in = h->interfaces; in < h->interfaces + h->num_interfaces; 
+	       in++)
+	    in->gateway = INADDR_NONE;
+	  h->curint->gateway = ADDR (arg, "gateway");
+	}
+      else 
+        h->curint->gateway = INADDR_NONE;
+      break;
 
     case '4':
       pfinet_bind (PORTCLASS_INET, arg);
@@ -254,36 +338,46 @@ parse_opt (int opt, char *arg, struct argp_state *state)
       break;
 
     case 'A':
-      if ((ptr = strchr (arg, '/'))) 
+      if (arg)
 	{
-	  h->curint->address6.prefix_len = atoi (ptr + 1);
-	  if (h->curint->address6.prefix_len > 128) 
-	    FAIL (EINVAL, 1, 0, "%s: The prefix-length is invalid", arg);
+	  if ((ptr = strchr (arg, '/'))) 
+	    {
+	      h->curint->address6.prefix_len = atoi (ptr + 1);
+	      if (h->curint->address6.prefix_len > 128) 
+		FAIL (EINVAL, 1, 0, "%s: The prefix-length is invalid", arg);
+	      
+	      *ptr = 0;
+	    }
+	  else
+	    {
+	      h->curint->address6.prefix_len = 64;
+	      fprintf (stderr, "No prefix-length given, "
+		       "defaulting to %s/64.\n", arg);
+	    }
+
+	  if (inet_pton (AF_INET6, arg, &h->curint->address6.addr) <= 0)
+	    PERR (EINVAL, "Malformed address");
 
-	  *ptr = 0;
+	  if (IN6_IS_ADDR_MULTICAST (&h->curint->address6.addr))
+	    FAIL (EINVAL, 1, 0, "%s: Cannot set interface address to "
+		  "multicast address", arg);
 	}
       else
-	{
-	  h->curint->address6.prefix_len = 64;
-	  fprintf (stderr, "No prefix-length given, defaulting to %s/64.\n",
-		   arg);
-	}
-
-      if (inet_pton (AF_INET6, arg, &h->curint->address6.addr) <= 0)
-	PERR (EINVAL, "Malformed address");
-
-      if (IN6_IS_ADDR_MULTICAST (&h->curint->address6.addr))
-	FAIL (EINVAL, 1, 0, "%s: Cannot set interface address to "
-	      "multicast address", arg);
+        memset (&h->curint->address6, 0, sizeof (struct inet6_ifaddr));
       break;
 
     case 'G':
-      if (inet_pton (AF_INET6, arg, &h->curint->gateway6) <= 0)
-	PERR (EINVAL, "Malformed gateway");
+      if (arg)
+	{
+	  if (inet_pton (AF_INET6, arg, &h->curint->gateway6) <= 0)
+	    PERR (EINVAL, "Malformed gateway");
 
-      if (IN6_IS_ADDR_MULTICAST (&h->curint->gateway6))
-	FAIL (EINVAL, 1, 0, "%s: Cannot set gateway to "
-	      "multicast address", arg);
+	  if (IN6_IS_ADDR_MULTICAST (&h->curint->gateway6))
+	    FAIL (EINVAL, 1, 0, "%s: Cannot set gateway to "
+		  "multicast address", arg);
+	}
+      else
+        memset (&h->curint->gateway6, 0, sizeof (struct in6_addr));
       break;
 #endif /* CONFIG_IPV6 */
 
@@ -323,20 +417,19 @@ parse_opt (int opt, char *arg, struct argp_state *state)
 	  /* Specifying a netmask for an address-less interface is a no-no.  */
 	  FAIL (EDESTADDRREQ, 14, 0, "Cannot set netmask");
 #endif
-
-      gateway = INADDR_NONE;
 #ifdef CONFIG_IPV6
       gw6_in = NULL;
 #endif
+      gw4_in = NULL;
       for (in = h->interfaces; in < h->interfaces + h->num_interfaces; in++)
 	{
+          /* delete interface if it doesn't match the actual netmask */
+          if (! ( (h->curint->address & h->curint->netmask) 
+                  == (h->curint->gateway & h->curint->netmask))) 
+            h->curint->gateway = INADDR_NONE;
+
 	  if (in->gateway != INADDR_NONE)
-	    {
-	      if (gateway != INADDR_NONE)
-		FAIL (err, 15, 0, "Cannot have multiple default gateways");
-	      gateway = in->gateway;
-	      in->gateway = INADDR_NONE;
-	    }
+              gw4_in = in;
 
 #ifdef CONFIG_IPV6
 	  if (!IN6_IS_ADDR_UNSPECIFIED (&in->gateway6))
@@ -361,15 +454,20 @@ parse_opt (int opt, char *arg, struct argp_state *state)
 	    idev = ipv6_find_idev(in->device);
 #endif
 
-	  if (in->address != INADDR_NONE || in->netmask != INADDR_NONE)
+	  if (in->address == INADDR_NONE && in->netmask == INADDR_NONE)
 	    {
-	      err = configure_device (in->device, in->address, in->netmask,
-				      in->peer, INADDR_NONE);
-	      if (err)
-		{
-		  pthread_mutex_unlock (&global_lock);
-		  FAIL (err, 16, 0, "cannot configure interface");
-		}
+	      h->curint->address = ADDR ("0.0.0.0", "address");
+	      h->curint->netmask = ADDR ("255.0.0.0", "netmask");
+	    }
+
+	  if (in->device)
+	    err = configure_device (in->device, in->address, in->netmask,
+				    in->peer, INADDR_NONE);
+
+	  if (err)
+	    {
+	      pthread_mutex_unlock (&global_lock);
+	      FAIL (err, 16, 0, "cannot configure interface");
 	    }
 
 #ifdef CONFIG_IPV6
@@ -377,24 +475,25 @@ parse_opt (int opt, char *arg, struct argp_state *state)
 	    continue;
 
 	  /* First let's remove all non-local addresses. */
-	  struct inet6_ifaddr *ifa = idev->addr_list;
-
-	  while (ifa)
-	    {
-	      struct inet6_ifaddr *c_ifa = ifa;
-	      ifa = ifa->if_next;
-
-	      if (IN6_ARE_ADDR_EQUAL (&c_ifa->addr, &in->address6.addr))
-		memset (&in->address6, 0, sizeof (struct inet6_ifaddr));
-
-	      else if (!IN6_IS_ADDR_LINKLOCAL (&c_ifa->addr)
-		       && !IN6_IS_ADDR_SITELOCAL (&c_ifa->addr))
-		inet6_addr_del (in->device->ifindex, &c_ifa->addr,
-				c_ifa->prefix_len);
-	    }
-
-	  if (!IN6_IS_ADDR_UNSPECIFIED (&in->address6.addr))
-	    {
+ 	  struct inet6_ifaddr *ifa = idev->addr_list;
+ 
+ 	  while (ifa)
+  	    {
+ 	      struct inet6_ifaddr *c_ifa = ifa;
+ 	      ifa = ifa->if_next;
+ 
+ 	      if (!IN6_IS_ADDR_UNSPECIFIED (&in->address6.addr)
+		  && IN6_ARE_ADDR_EQUAL (&c_ifa->addr, &in->address6.addr))
+ 		memset (&in->address6, 0, sizeof (struct inet6_ifaddr));
+  
+ 	      else if (!IN6_IS_ADDR_LINKLOCAL (&c_ifa->addr)
+ 		       && !IN6_IS_ADDR_SITELOCAL (&c_ifa->addr))
+ 		inet6_addr_del (in->device->ifindex, &c_ifa->addr,
+ 				c_ifa->prefix_len);
+ 	    }
+ 
+ 	  if (!IN6_IS_ADDR_UNSPECIFIED (&in->address6.addr))
+ 	    {
 	      /* Now assign the new address */
 	      inet6_addr_add (in->device->ifindex, &in->address6.addr,
 			      in->address6.prefix_len);
@@ -418,33 +517,40 @@ parse_opt (int opt, char *arg, struct argp_state *state)
 	req.nlh.nlmsg_seq = 0;
 	req.nlh.nlmsg_len = NLMSG_LENGTH (sizeof req.rtm);
 
-	bzero (&req.rtm, sizeof req.rtm);
-	bzero (&rta, sizeof rta);
+	memset (&req.rtm, 0, sizeof req.rtm);
+	memset (&rta, 0, sizeof rta);
 	req.rtm.rtm_scope = RT_SCOPE_UNIVERSE;
 	req.rtm.rtm_type = RTN_UNICAST;
 	req.rtm.rtm_protocol = RTPROT_STATIC;
-	rta.rta_gw = &gateway;
 
-	if (gateway == INADDR_NONE)
+	if (!gw4_in)
 	  {
-	    /* Delete any existing default route.  */
-	    req.nlh.nlmsg_type = RTM_DELROUTE;
-	    req.nlh.nlmsg_flags = 0;
-	    tb = fib_get_table (req.rtm.rtm_table);
-	    if (tb)
-	      {
-		err = - (*tb->tb_delete) (tb, &req.rtm, &rta, &req.nlh, 0);
-		if (err && err != ESRCH)
-		  {
-		    pthread_mutex_unlock (&global_lock);
-		    FAIL (err, 17, 0, "cannot remove old default gateway");
-		  }
-		err = 0;
-	      }
+	    /* Delete any existing default route on configured devices  */
+            for (in = h->interfaces; in < h->interfaces + h->num_interfaces;
+                 in++) {
+              req.nlh.nlmsg_type = RTM_DELROUTE;
+              req.nlh.nlmsg_flags = 0;
+              rta.rta_oif = &in->device->ifindex;
+              tb = fib_get_table (req.rtm.rtm_table);
+              if (tb)
+                {
+                  err = - (*tb->tb_delete) 
+                    (tb, &req.rtm, &rta, &req.nlh, 0);
+                  if (err && err != ESRCH)
+                    {
+                      pthread_mutex_unlock (&global_lock);
+                      FAIL (err, 17, 0, 
+                            "cannot remove old default gateway");
+                    }
+                  err = 0;
+                }
+            }
 	  }
 	else
 	  {
 	    /* Add a default route, replacing any existing one.  */
+            rta.rta_oif = &gw4_in->device->ifindex;
+            rta.rta_gw = &gw4_in->gateway;
 	    req.nlh.nlmsg_type = RTM_NEWROUTE;
 	    req.nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_REPLACE;
 	    tb = fib_new_table (req.rtm.rtm_table);
@@ -467,13 +573,77 @@ parse_opt (int opt, char *arg, struct argp_state *state)
 	  if (!gw6_in || rt6i->rt6i_dev != gw6_in->device
 	      || !IN6_ARE_ADDR_EQUAL (&rt6i->rt6i_gateway, &gw6_in->gateway6))
 	    {
-	      rt6_purge_dflt_routers (0);
+              /* Delete any existing default route on configured devices  */
+              for (in = h->interfaces; in < h->interfaces 
+                   + h->num_interfaces; in++) 
+                if (rt6i->rt6i_dev == in->device || gw6_in )
+                  rt6_purge_dflt_routers (0);
+
 	      if (gw6_in)
 		rt6_add_dflt_router (&gw6_in->gateway6, gw6_in->device);
 	    }
 	}
 #endif       
 
+      /*  Setup the routing required for DHCP. */
+      for (in = h->interfaces; in < h->interfaces + h->num_interfaces; in++)
+	{
+	  struct kern_rta rta;
+	  struct
+	  {
+	    struct nlmsghdr nlh;
+	    struct rtmsg rtm;
+	  } req;
+	  struct fib_table *tb;
+	  struct rtentry route;
+	  struct sockaddr_in *dst;
+	  struct device *dev;
+
+	  if (!in->device)
+	    continue;
+
+	  dst = (struct sockaddr_in *) &route.rt_dst;
+	  if (!in->device->name) 
+	    {
+	      pthread_mutex_unlock (&global_lock);
+	      FAIL (ENODEV, 17, 0, "unknown device");
+	    }
+	  dev = dev_get (in->device->name);
+	  if (!dev)
+	    {
+	      pthread_mutex_unlock (&global_lock);
+	      FAIL (ENODEV, 17, 0, "unknown device");
+	    }
+
+	  /* Simulate the SIOCADDRT behavior.  */
+	  memset (&route, 0, sizeof (struct rtentry));
+	  memset (&req.rtm, 0, sizeof req.rtm);
+	  memset (&rta, 0, sizeof rta);
+	  req.nlh.nlmsg_type = RTM_NEWROUTE;
+
+	  /* Append this routing for 0.0.0.0.  By this way we can send always
+	     dhcp messages (e.g dhcp renew). */
+	  req.nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE
+	    | NLM_F_APPEND;
+	  req.rtm.rtm_protocol = RTPROT_BOOT;
+	  req.rtm.rtm_scope = RT_SCOPE_LINK;
+	  req.rtm.rtm_type = RTN_UNICAST;
+	  rta.rta_dst = &dst->sin_addr.s_addr;
+	  rta.rta_oif = &dev->ifindex;
+
+	  tb = fib_new_table (req.rtm.rtm_table);
+	  if (tb)
+	    err = tb->tb_insert (tb, &req.rtm, &rta, &req.nlh, NULL);
+	  else
+	    err = ENOBUFS;
+
+	  if (err)
+	    {
+	      pthread_mutex_unlock (&global_lock);
+	      FAIL (err, 17, 0, "cannot add route");
+	    }
+	}
+
       pthread_mutex_unlock (&global_lock);
 
       /* Fall through to free hook.  */
@@ -526,8 +696,9 @@ trivfs_append_args (struct trivfs_control *fsys, char **argz, \
size_t *argz_len)  ADD_ADDR_OPT ("netmask", mask);
       if (peer != addr)
 	ADD_ADDR_OPT ("peer", peer);
-      key.iif = dev->ifindex;
-      if (! main_table->tb_lookup (main_table, &key, &res)) 
+      key.oif = dev->ifindex;
+      if (! main_table->tb_lookup (main_table, &key, &res)
+          && FIB_RES_GW(res) != INADDR_ANY)
 	ADD_ADDR_OPT ("gateway", FIB_RES_GW (res));
 
 #undef ADD_ADDR_OPT
diff --git a/proc/Makefile b/proc/Makefile
index 2eed13c..dc768d3 100644
--- a/proc/Makefile
+++ b/proc/Makefile
@@ -29,7 +29,7 @@ MIGSFLAGS="-DPROCESS_INTRAN=pstruct_t reqport_find (process_t)" \
 	"-DPROCESS_IMPORTS=import \"proc.h\";"
 
 MIGSTUBS = processServer.o notifyServer.o \
-	ourmsgUser.o proc_excUser.o proc_excServer.o
+	ourmsgUser.o proc_excUser.o proc_excServer.o processUser.o
 OBJS = $(SRCS:.c=.o) $(MIGSTUBS)
 HURDLIBS = ihash ports shouldbeinlibc
 OTHERLIBS = -lpthread
diff --git a/proc/main.c b/proc/main.c
index 5d6dc21..32da1e3 100644
--- a/proc/main.c
+++ b/proc/main.c
@@ -1,5 +1,5 @@
 /* Initialization of the proc server
-   Copyright (C) 1993,94,95,96,97,99,2000,01 Free Software Foundation, Inc.
+   Copyright (C) 1993,94,95,96,97,99,2000,01,13 Free Software Foundation, Inc.
 
 This file is part of the GNU Hurd.
 
@@ -88,7 +88,12 @@ main (int argc, char **argv, char **envp)
   generic_port = ports_get_right (genport);
 
   /* Create the initial proc object for init (PID 1).  */
-  startup_proc = create_startup_proc ();
+  init_proc = create_init_proc ();
+
+  /* Create the startup proc object for /hurd/init (PID 2).  */
+  startup_proc = allocate_proc (MACH_PORT_NULL);
+  startup_proc->p_deadmsg = 1;
+  complete_proc (startup_proc, HURD_PID_STARTUP);
 
   /* Create our own proc object.  */
   self_proc = allocate_proc (mach_task_self ());
diff --git a/proc/mgt.c b/proc/mgt.c
index 602ba84..00296fe 100644
--- a/proc/mgt.c
+++ b/proc/mgt.c
@@ -1,5 +1,6 @@
 /* Process management
-   Copyright (C) 1992,93,94,95,96,99,2000,01,02 Free Software Foundation, Inc.
+   Copyright (C) 1992,93,94,95,96,99,2000,01,02,13
+     Free Software Foundation, Inc.
 
 This file is part of the GNU Hurd.
 
@@ -184,7 +185,7 @@ S_proc_child (struct proc *parentp,
   /* Process hierarchy.  Remove from our current location
      and place us under our new parent.  Sanity check to make sure
      parent is currently init. */
-  assert (childp->p_parent == startup_proc);
+  assert (childp->p_parent == init_proc);
   if (childp->p_sib)
     childp->p_sib->p_prevsib = childp->p_prevsib;
   *childp->p_prevsib = childp->p_sib;
@@ -590,7 +591,7 @@ allocate_proc (task_t task)
 /* Allocate and initialize the proc structure for init (PID 1),
    the original parent of all other procs.  */
 struct proc *
-create_startup_proc (void)
+create_init_proc (void)
 {
   static const uid_t zero;
   struct proc *p;
@@ -599,7 +600,7 @@ create_startup_proc (void)
   p = allocate_proc (MACH_PORT_NULL);
   assert (p);
 
-  p->p_pid = HURD_PID_STARTUP;
+  p->p_pid = HURD_PID_INIT;
 
   p->p_parent = p;
   p->p_sib = 0;
@@ -647,7 +648,7 @@ proc_death_notify (struct proc *p)
 }
 
 /* Complete a new process that has been allocated but not entirely initialized.
-   This gets called for every process except startup_proc (PID 1).  */
+   This gets called for every process except init_proc (PID 1).  */
 void
 complete_proc (struct proc *p, pid_t pid)
 {
@@ -666,30 +667,47 @@ complete_proc (struct proc *p, pid_t pid)
 
   p->p_pid = pid;
 
-  ids_ref (&nullids);
-  p->p_id = &nullids;
+  if (pid == HURD_PID_STARTUP)
+    {
+      /* Equip HURD_PID_STARTUP with the same credentials as
+         HURD_PID_INIT.  */
+      static const uid_t zero;
+      p->p_id = make_ids (&zero, 1);
+      assert (p->p_id);
+    }
+  else
+    {
+      ids_ref (&nullids);
+      p->p_id = &nullids;
+    }
 
   p->p_login = nulllogin;
   p->p_login->l_refcnt++;
 
   /* Our parent is init for now.  */
-  p->p_parent = startup_proc;
+  p->p_parent = init_proc;
 
-  p->p_sib = startup_proc->p_ochild;
-  p->p_prevsib = &startup_proc->p_ochild;
+  p->p_sib = init_proc->p_ochild;
+  p->p_prevsib = &init_proc->p_ochild;
   if (p->p_sib)
     p->p_sib->p_prevsib = &p->p_sib;
-  startup_proc->p_ochild = p;
+  init_proc->p_ochild = p;
   p->p_loginleader = 0;
   p->p_ochild = 0;
   p->p_parentset = 0;
 
   p->p_noowner = 1;
 
-  p->p_pgrp = startup_proc->p_pgrp;
+  p->p_pgrp = init_proc->p_pgrp;
 
-  proc_death_notify (p);
-  add_proc_to_hash (p);
+  /* At this point, we do not know the task of the startup process,
+     defer registering death notifications and adding it to the hash
+     tables.  */
+  if (pid != HURD_PID_STARTUP)
+    {
+      proc_death_notify (p);
+      add_proc_to_hash (p);
+    }
   join_pgrp (p);
 }
 
@@ -751,7 +769,7 @@ process_has_exited (struct proc *p)
 	    nowait_msg_proc_newids (tp->p_msgport, tp->p_task,
 				    1, tp->p_pgrp->pg_pgid,
 				    !tp->p_pgrp->pg_orphcnt);
-	  tp->p_parent = startup_proc;
+	  tp->p_parent = init_proc;
 	  if (tp->p_dead)
 	    isdead = 1;
 	}
@@ -759,17 +777,17 @@ process_has_exited (struct proc *p)
 	nowait_msg_proc_newids (tp->p_msgport, tp->p_task,
 				1, tp->p_pgrp->pg_pgid,
 				!tp->p_pgrp->pg_orphcnt);
-      tp->p_parent = startup_proc;
+      tp->p_parent = init_proc;
 
       /* And now append the lists. */
-      tp->p_sib = startup_proc->p_ochild;
+      tp->p_sib = init_proc->p_ochild;
       if (tp->p_sib)
 	tp->p_sib->p_prevsib = &tp->p_sib;
-      startup_proc->p_ochild = p->p_ochild;
-      p->p_ochild->p_prevsib = &startup_proc->p_ochild;
+      init_proc->p_ochild = p->p_ochild;
+      p->p_ochild->p_prevsib = &init_proc->p_ochild;
 
       if (isdead)
-	alert_parent (startup_proc);
+	alert_parent (init_proc);
     }
 
   /* If an operation is in progress for this process, cause it
@@ -949,3 +967,21 @@ S_proc_get_code (struct proc *callerp,
 
   return 0;
 }
+
+/* Implement proc_set_init_task as described in <hurd/process.defs>.  */
+error_t
+S_proc_set_init_task(struct proc *callerp,
+		     task_t task)
+{
+  if (! callerp)
+    return EOPNOTSUPP;
+
+  if (callerp != startup_proc)
+    return EPERM;
+
+  init_proc->p_task = task;
+  proc_death_notify (init_proc);
+  add_proc_to_hash (init_proc);
+
+  return 0;
+}
diff --git a/proc/pgrp.c b/proc/pgrp.c
index a828e17..853925f 100644
--- a/proc/pgrp.c
+++ b/proc/pgrp.c
@@ -423,8 +423,8 @@ leave_pgrp (struct proc *p)
       if (dosignal)
 	for (ip = pg->pg_plist; ip; ip = ip->p_gnext)
 	  {
-	    send_signal (ip->p_msgport, SIGHUP, ip->p_task);
-	    send_signal (ip->p_msgport, SIGCONT, ip->p_task);
+	    send_signal (ip->p_msgport, SIGHUP, 0, ip->p_task);
+	    send_signal (ip->p_msgport, SIGCONT, 0, ip->p_task);
 	  }
     }
 }
diff --git a/proc/proc.h b/proc/proc.h
index 12f56da..a070559 100644
--- a/proc/proc.h
+++ b/proc/proc.h
@@ -1,5 +1,6 @@
 /* Process server definitions
-   Copyright (C) 1992,93,94,95,96,99,2000,01 Free Software Foundation, Inc.
+   Copyright (C) 1992,93,94,95,96,99,2000,01,13
+     Free Software Foundation, Inc.
 
 This file is part of the GNU Hurd.
 
@@ -134,7 +135,8 @@ struct exc
 
 mach_port_t authserver;
 struct proc *self_proc;		/* process HURD_PID_PROC (us) */
-struct proc *startup_proc;	/* process 1 (init) */
+struct proc *init_proc;		/* process 1 (sysvinit) */
+struct proc *startup_proc;	/* process 2 (hurd/init) */
 
 struct port_bucket *proc_bucket;
 struct port_class *proc_class;
@@ -190,7 +192,7 @@ void exc_clean (void *);
 struct proc *add_tasks (task_t);
 int pidfree (pid_t);
 
-struct proc *create_startup_proc (void);
+struct proc *create_init_proc (void);
 struct proc *allocate_proc (task_t);
 void proc_death_notify (struct proc *);
 void complete_proc (struct proc *, pid_t);
@@ -206,7 +208,7 @@ void complete_exit (struct proc *);
 
 void initialize_version_info (void);
 
-void send_signal (mach_port_t, int, mach_port_t);
+void send_signal (mach_port_t, int, int, mach_port_t);
 
 
 #endif
diff --git a/proc/stubs.c b/proc/stubs.c
index 096e55e..df99f26 100644
--- a/proc/stubs.c
+++ b/proc/stubs.c
@@ -77,6 +77,7 @@ blocking_message_send (void *arg)
 void
 send_signal (mach_port_t msgport,
 	     int signal,
+	     int sigcode,
 	     mach_port_t refport)
 {
   error_t err;
@@ -119,7 +120,7 @@ send_signal (mach_port_t msgport,
       0,			/* msgt_unused */
     },
     /* Sigcode */
-    0,
+    sigcode,
     {
       /* Type descriptor for refport */
       MACH_MSG_TYPE_COPY_SEND, /* msgt_name */
diff --git a/proc/wait.c b/proc/wait.c
index 824e667..a99f5f8 100644
--- a/proc/wait.c
+++ b/proc/wait.c
@@ -144,7 +144,7 @@ alert_parent (struct proc *p)
   /* We accumulate the aggregate usage stats of all our dead children.  */
   rusage_add (&p->p_parent->p_child_rusage, &p->p_rusage);
 
-  send_signal (p->p_parent->p_msgport, SIGCHLD, p->p_parent->p_task);
+  send_signal (p->p_parent->p_msgport, SIGCHLD, CLD_EXITED, p->p_parent->p_task);
 
   if (!p->p_exiting)
     {
@@ -257,7 +257,7 @@ S_proc_mark_stop (struct proc *p,
     }
 
   if (!p->p_parent->p_nostopcld)
-    send_signal (p->p_parent->p_msgport, SIGCHLD, p->p_parent->p_task);
+    send_signal (p->p_parent->p_msgport, SIGCHLD, CLD_STOPPED, p->p_parent->p_task);
 
   return 0;
 }
diff --git a/procfs/Makefile b/procfs/Makefile
index 5c51c1d..ca93a41 100644
--- a/procfs/Makefile
+++ b/procfs/Makefile
@@ -1,26 +1,31 @@
-TARGET = procfs
-OBJS = procfs.o netfs.o procfs_dir.o \
-       process.o proclist.o rootdir.o dircat.o main.o
-LIBS = -lnetfs -lps -lfshelp -lpthread
+#   Makefile - for procfs
+# 
+#   Copyright (C) 2008 Free Software Foundation, Inc.
+#
+#   This program is free software; you can redistribute it and/or
+#   modify it under the terms of the GNU General Public License as
+#   published by the Free Software Foundation; either version 2, or (at
+#   your option) any later version.
+#
+#   This program 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
+#   General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program; if not, write to the Free Software
+#   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-CC = gcc
-CFLAGS = -Wall -g
-CPPFLAGS =
-LDFLAGS =
+dir := procfs
+makemode := server
 
-ifdef PROFILE
-CFLAGS= -g -pg
-CPPFLAGS= -DPROFILE
-LDFLAGS= -static
-LIBS= -lnetfs -lfshelp -liohelp -lps -lports -lpthread -lihash -lshouldbeinlibc
-endif
+target = procfs
 
-CPPFLAGS += -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64
+SRCS = procfs.c netfs.c procfs_dir.c process.c proclist.c rootdir.c dircat.c main.c
+LCLHDRS = dircat.h main.h process.h procfs.h procfs_dir.h proclist.h rootdir.h
 
-all: $(TARGET)
+OBJS = $(SRCS:.c=.o)
+HURDLIBS = netfs fshelp iohelp ps ports ihash shouldbeinlibc
+OTHERLIBS = -lpthread
 
-$(TARGET): $(OBJS)
-	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
-
-clean:
-	$(RM) $(TARGET) $(OBJS)
+include ../Makeconf
diff --git a/procfs/main.c b/procfs/main.c
index 54e9682..8727f86 100644
--- a/procfs/main.c
+++ b/procfs/main.c
@@ -42,7 +42,7 @@ uid_t opt_anon_owner;
 #define OPT_CLK_TCK    sysconf(_SC_CLK_TCK)
 #define OPT_STAT_MODE  0400
 #define OPT_FAKE_SELF  -1
-#define OPT_KERNEL_PID 2
+#define OPT_KERNEL_PID 3
 #define OPT_ANON_OWNER 0
 
 #define NODEV_KEY  -1 /* <= 0, so no short option. */
@@ -153,7 +153,7 @@ struct argp_option common_options[] = {
   { "kernel-process", 'k', "PID", 0,
       "Process identifier for the kernel, used to retreive its command "
       "line, as well as the global up and idle times. "
-      "(default: 2)" },
+      "(default: 3)" },
   { "compatible", 'c', NULL, 0,
       "Try to be compatible with the Linux procps utilities.  "
       "Currently equivalent to -h 100 -s 0444 -S 1." },
diff --git a/random/random.c b/random/random.c
index 5ef814f..8b0367b 100644
--- a/random/random.c
+++ b/random/random.c
@@ -50,7 +50,7 @@ pthread_cond_t select_alert;	/* For read and select.  */
    numbers.
    2: Strong random numbers with a somewhat guaranteed entropy.
 */
-#define DEFAULT_LEVEL 2
+#define DEFAULT_LEVEL 1
 static int level = DEFAULT_LEVEL;
 
 /* Name of file to use as seed.  */
diff --git a/sutils/MAKEDEV.sh b/sutils/MAKEDEV.sh
index 0a8f514..772d78f 100644
--- a/sutils/MAKEDEV.sh
+++ b/sutils/MAKEDEV.sh
@@ -100,7 +100,7 @@ mkdev() {
 	;;
 
       std)
-	mkdev console tty null zero full fd time mem klog shm
+	mkdev console tty null zero full fd time mem klog
 	;;
       console|com[0-9])
 	st $I root 600 /hurd/term ${DEVDIR}/$I device $I;;
diff --git a/trans/Makefile b/trans/Makefile
index 291df2f..fa28e46 100644
--- a/trans/Makefile
+++ b/trans/Makefile
@@ -27,7 +27,7 @@ SRCS = ifsock.c symlink.c magic.c null.c fifo.c new-fifo.c fwd.c \
 	fakeroot.c proxy-defpager.c remap.c mtab.c
 OBJS = $(SRCS:.c=.o) fsysServer.o ifsockServer.o passwordServer.o \
 	crashServer.o crash_replyUser.o msgServer.o \
-	default_pagerServer.o default_pagerUser.o \
+	ourdefault_pagerServer.o ourdefault_pagerUser.o \
 	device_replyServer.o elfcore.o
 HURDLIBS = ports netfs trivfs iohelp fshelp pipe ihash shouldbeinlibc
 LDLIBS += -lpthread
@@ -35,6 +35,9 @@ password-LDLIBS = $(LIBCRYPT)
 
 include ../Makeconf
 
+ourdefault_pager.defs: default_pager.defs
+	$(CPP) $(CPPFLAGS) -x c $< | sed -e '/MACH_MSG_TYPE_MAKE_SEND;/s/MAKE/COPY/' | sed \
-e '/subsystem/iserverprefix S_;' > $@ +
 vpath elfcore.c $(top_srcdir)/exec
 
 symlink: fsysServer.o
@@ -42,7 +45,7 @@ ifsock: ifsockServer.o
 crash: crashServer.o crash_replyUser.o msgServer.o elfcore.o
 password: passwordServer.o
 streamio: device_replyServer.o
-proxy-defpager: default_pagerServer.o default_pagerUser.o
+proxy-defpager: ourdefault_pagerServer.o ourdefault_pagerUser.o
 
 proxy-defpager crash password streamio: ../libports/libports.a \
../libtrivfs/libtrivfs.a ../libfshelp/libfshelp.a  fifo new-fifo: \
                ../libpipe/libpipe.a
diff --git a/trans/fakeroot.c b/trans/fakeroot.c
index 0e0b618..11ed6b3 100644
--- a/trans/fakeroot.c
+++ b/trans/fakeroot.c
@@ -28,6 +28,9 @@
 #include <pthread.h>
 #include <hurd/ihash.h>
 #include <hurd/paths.h>
+#ifdef HAVE_FILE_EXEC_FILE_NAME
+#include <hurd/fs_experimental.h>
+#endif
 
 #include <version.h>
 
@@ -778,6 +781,39 @@ netfs_S_file_exec (struct protid *user,
                    mach_port_t *destroynames,
                    size_t destroynameslen)
 {
+  return netfs_S_file_exec_file_name (user,
+				      task,
+				      flags,
+				      "",
+				      argv, argvlen,
+				      envp, envplen,
+				      fds, fdslen,
+				      portarray, portarraylen,
+				      intarray, intarraylen,
+				      deallocnames, deallocnameslen,
+				      destroynames, destroynameslen);
+}
+
+kern_return_t
+netfs_S_file_exec_file_name (struct protid *user,
+			     task_t task,
+			     int flags,
+			     char *filename,
+			     char *argv,
+			     size_t argvlen,
+			     char *envp,
+			     size_t envplen,
+			     mach_port_t *fds,
+			     size_t fdslen,
+			     mach_port_t *portarray,
+			     size_t portarraylen,
+			     int *intarray,
+			     size_t intarraylen,
+			     mach_port_t *deallocnames,
+			     size_t deallocnameslen,
+			     mach_port_t *destroynames,
+			     size_t destroynameslen)
+{
   error_t err;
   file_t file;
 
@@ -794,13 +830,29 @@ netfs_S_file_exec (struct protid *user,
 
   if (!err)
     {
+#ifdef HAVE_FILE_EXEC_FILE_NAME
       /* We cannot use MACH_MSG_TYPE_MOVE_SEND because we might need to
 	 retry an interrupted call that would have consumed the rights.  */
-      err = file_exec (user->po->np->nn->file, task, flags, argv, argvlen,
-		       envp, envplen, fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
-		       portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen,
-		       intarray, intarraylen, deallocnames, deallocnameslen,
-		       destroynames, destroynameslen);
+      err = file_exec_file_name (user->po->np->nn->file, task, flags,
+				 filename,
+				 argv, argvlen,
+				 envp, envplen,
+				 fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
+				 portarray, MACH_MSG_TYPE_COPY_SEND,
+				 portarraylen,
+				 intarray, intarraylen,
+				 deallocnames, deallocnameslen,
+				 destroynames, destroynameslen);
+      /* For backwards compatibility.  Just drop it when we kill
+	 file_exec.  */
+      if (err == MIG_BAD_ID)
+#endif
+	err = file_exec (user->po->np->nn->file, task, flags, argv, argvlen,
+			 envp, envplen, fds, MACH_MSG_TYPE_COPY_SEND, fdslen,
+			 portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen,
+			 intarray, intarraylen, deallocnames, deallocnameslen,
+			 destroynames, destroynameslen);
+
       mach_port_deallocate (mach_task_self (), file);
     }
 
@@ -930,6 +982,7 @@ netfs_demuxer (mach_msg_header_t *inp,
 {
   mig_routine_t netfs_io_server_routine (mach_msg_header_t *);
   mig_routine_t netfs_fs_server_routine (mach_msg_header_t *);
+  mig_routine_t netfs_fs_experimental_server_routine (mach_msg_header_t *);
   mig_routine_t ports_notify_server_routine (mach_msg_header_t *);
   mig_routine_t netfs_fsys_server_routine (mach_msg_header_t *);
   mig_routine_t ports_interrupt_server_routine (mach_msg_header_t *);
@@ -937,6 +990,7 @@ netfs_demuxer (mach_msg_header_t *inp,
   mig_routine_t routine;
   if ((routine = netfs_io_server_routine (inp)) ||
       (routine = netfs_fs_server_routine (inp)) ||
+      (routine = netfs_fs_experimental_server_routine (inp)) ||
       (routine = ports_notify_server_routine (inp)) ||
       (routine = netfs_fsys_server_routine (inp)) ||
       /* XXX we should intercept interrupt_operation and do
diff --git a/trans/proxy-defpager.c b/trans/proxy-defpager.c
index 0a5ab65..453130e 100644
--- a/trans/proxy-defpager.c
+++ b/trans/proxy-defpager.c
@@ -23,9 +23,10 @@
 #include <error.h>
 #include <version.h>
 #include <hurd/paths.h>
+#include <string.h>
 
-#include "default_pager_S.h"
-#include "default_pager_U.h"
+#include "ourdefault_pager_S.h"
+#include "ourdefault_pager_U.h"
 
 static mach_port_t real_defpager, dev_master;
 
diff --git a/utils/fakeauth.c b/utils/fakeauth.c
index 2c72c89..2cd8357 100644
--- a/utils/fakeauth.c
+++ b/utils/fakeauth.c
@@ -1,5 +1,5 @@
 /* fakeauth -- proxy auth server to lie to users about what their IDs are
-   Copyright (C) 2002 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2010 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -405,7 +405,7 @@ believe it has restricted them to different identities or no \
identity at all.\  /* We cannot use fork because it doesn't do the right thing with \
our send  rights that point to our own receive rights, i.e. the new auth port.
      Since posix_spawn might be implemented with fork (prior to glibc 2.3),
-     we cannot use that simple interface either.  We use _hurd_exec
+     we cannot use that simple interface either.  We use _hurd_exec_file_name
      directly to effect what posix_spawn does in the simple case.  */
   {
     task_t newtask;
@@ -430,7 +430,12 @@ believe it has restricted them to different identities or no \
identity at all.\  if (err)
       error (3, err, "proc_child");
 
+#ifdef HAVE__HURD_EXEC_FILE_NAME
+    err = _hurd_exec_file_name (newtask, execfile, argv[argi],
+				&argv[argi], environ);
+#else
     err = _hurd_exec (newtask, execfile, &argv[argi], environ);
+#endif
     mach_port_deallocate (mach_task_self (), newtask);
     mach_port_deallocate (mach_task_self (), execfile);
     if (err)
diff --git a/utils/login.c b/utils/login.c
index cad3b1e..808a244 100644
--- a/utils/login.c
+++ b/utils/login.c
@@ -1,6 +1,7 @@
 /* Hurdish login
 
-   Copyright (C) 1995,96,97,98,99,2002 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2002, 2010
+   Free Software Foundation, Inc.
 
    Written by Miles Bader <miles@gnu.org>
 
@@ -46,6 +47,9 @@
 #include <error.h>
 #include <timefmt.h>
 #include <hurd/lookup.h>
+#ifdef HAVE_FILE_EXEC_FILE_NAME
+#include <hurd/fs_experimental.h>
+#endif
 #include <ugids.h>
 
 const char *argp_program_version = STANDARD_HURD_VERSION (login);
@@ -882,12 +886,22 @@ main(int argc, char *argv[])
 	}
     }
 
-  err = file_exec (exec, mach_task_self (), EXEC_DEFAULTS,
-		   sh_args, sh_args_len, env, env_len,
-		   fds, MACH_MSG_TYPE_COPY_SEND, 3,
-		   ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX,
-		   ints, INIT_INT_MAX,
-		   0, 0, 0, 0);
+#ifdef HAVE_FILE_EXEC_FILE_NAME
+  err = file_exec_file_name (exec, mach_task_self (), EXEC_DEFAULTS, shell,
+			     sh_args, sh_args_len, env, env_len,
+			     fds, MACH_MSG_TYPE_COPY_SEND, 3,
+			     ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX,
+			     ints, INIT_INT_MAX,
+			     0, 0, 0, 0);
+  /* Fallback in case the file server hasn't been restarted.  */
+  if (err == MIG_BAD_ID)
+#endif
+    err = file_exec (exec, mach_task_self (), EXEC_DEFAULTS,
+		     sh_args, sh_args_len, env, env_len,
+		     fds, MACH_MSG_TYPE_COPY_SEND, 3,
+		     ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX,
+		     ints, INIT_INT_MAX,
+		     0, 0, 0, 0);
   if (err)
     error(5, err, "%s", shell);
 
diff --git a/utils/mount.c b/utils/mount.c
index df77c66..734023f 100644
--- a/utils/mount.c
+++ b/utils/mount.c
@@ -273,7 +273,8 @@ do_mount (struct fs *fs, int remount)
       {
 	ARGZ (add (&fsopts, &fsopts_len, o));
       }
-    else if (strcmp (o, "defaults") != 0)
+    else if (strcmp (o, "defaults") != 0 &&
+	     strcmp (o, "loop") != 0)
       {
 	/* Prepend `--' to the option to make a long option switch,
 	   e.g. `--ro' or `--rsize=1024'.  */
diff --git a/utils/rpctrace.c b/utils/rpctrace.c
index d7ee203..e9b634a 100644
--- a/utils/rpctrace.c
+++ b/utils/rpctrace.c
@@ -1734,7 +1734,11 @@ traced_spawn (char **argv, char **envp)
   /* Now actually run the command they told us to trace.  We do the exec on
      the actual task, so the RPCs to map in the program itself do not get
      traced.  Could have an option to use TASK_WRAPPER here instead.  */
+#ifdef HAVE__HURD_EXEC_FILE_NAME
+  err = _hurd_exec_file_name (traced_task, file, *argv, argv, envp);
+#else
   err = _hurd_exec (traced_task, file, argv, envp);
+#endif
   if (err)
     error (2, err, "cannot exec `%s'", argv[0]);
 
diff --git a/utils/shd.c b/utils/shd.c
index a1a4b26..855284f 100644
--- a/utils/shd.c
+++ b/utils/shd.c
@@ -1,5 +1,5 @@
 /*
-   Copyright (C) 1994,95,99,2002 Free Software Foundation
+   Copyright (C) 1994, 1995, 1999, 2002, 2010 Free Software Foundation
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -159,15 +159,18 @@ run (char **argv, int fd0, int fd1)
 	      movefd (fd1, 1, &save1))
 	    return -1;
 
+#ifdef HAVE__HURD_EXEC_FILE_NAME
+	  err = _hurd_exec_file_name (task, file, program, argv, environ);
+#else
 	  err = _hurd_exec (task, file, argv, environ);
-
+#endif
 	  if (restorefd (fd0, 0, &save0) ||
 	      restorefd (fd1, 1, &save1))
 	    return -1;
 
 	  if (err)
 	    {
-	      error (0, err, "_hurd_exec");
+	      error (0, err, "_hurd_exec_file_name");
 	      err = task_terminate (task);
 	      if (err)
 		error (0, err, "task_terminate");
diff --git a/utils/uptime.sh b/utils/uptime.sh
index 8e52c81..b37f869 100644
--- a/utils/uptime.sh
+++ b/utils/uptime.sh
@@ -25,7 +25,7 @@
 USAGE="Usage: $0 [OPTION...]"
 DOC="Show system uptime, number of users, and load"
 
-W=${W-/bin/w}
+W=${W-/usr/bin/w-hurd}
 
 while :; do
   case "$1" in

-- 
Alioth's /usr/local/bin/git-commit-notice on \
/srv/git.debian.org/git/pkg-hurd/hurd.git


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic