diff -Nur tx.28589/util-linux-2.10m/mount/Makefile util-linux-2.10m/mount/Makefile
--- tx.28589/util-linux-2.10m/mount/Makefile	Wed Apr 19 10:51:27 2000
+++ util-linux-2.10m/mount/Makefile	Fri Jun  2 12:43:49 2000
@@ -15,7 +15,7 @@
 SUID_PROGS = mount umount
 NOSUID_PROGS = swapon losetup
 MAN5 = fstab.5 nfs.5
-MAN8 = mount.8 swapoff.8 swapon.8 umount.8 losetup.8
+MAN8 = bind.8 mount.8 swapoff.8 swapon.8 umount.8 losetup.8
 
 ifeq "$(HAVE_PIVOT_ROOT)" "yes"
 NOSUID_PROGS := $(NOSUID_PROGS) pivot_root
@@ -37,6 +37,7 @@
 install: $(PROGS)
 	$(INSTALLDIR) $(BINDIR) $(SBINDIR)
 	$(INSTALLSUID) $(SUID_PROGS) $(BINDIR)
+	(cd $(SBINDIR); ln -sf mount bind)
 	$(INSTALLBIN) $(NOSUID_PROGS) $(SBINDIR)
 	(cd $(SBINDIR); ln -sf swapon swapoff)
 	$(INSTALLDIR) $(MAN5DIR) $(MAN8DIR)
@@ -51,6 +52,9 @@
        $(LIB)/setproctitle.o $(NFS_OBJS) $(LO_OBJS)
 	$(LINK) $^ -o $@
 
+bind: mount
+	ln -f mount bind
+  
 umount: umount.o fstab.o sundries.o realpath.o mntent.o getusername.o \
 	version.o $(LO_OBJS)
 	$(LINK) $^ -o $@
diff -Nur tx.28589/util-linux-2.10m/mount/bind.8 util-linux-2.10m/mount/bind.8
--- tx.28589/util-linux-2.10m/mount/bind.8	Thu Jan  1 13:00:00 1970
+++ util-linux-2.10m/mount/bind.8	Fri Jun  2 13:03:30 2000
@@ -0,0 +1,45 @@
+.TH BIND 8 "1 June 2000" "Linux 2.4" "Linux Administrators Guide"
+.SH NAME
+bind \- bind an existing part of the filesystem to another
+.SH SYNOPSIS
+.BI "bind /existing/path /new/path"
+.SH DESCRIPTION
+bind allows you to mount an existing filesystem (or part of) 
+somewhere else.
+
+"bind old new" is merely a convenient shortcut for
+.RS
+.br
+.BI "mount -t bind old new"
+.RE
+and allows you to alias part of your directory structure 
+elsewhere.
+
+To release this simply
+.B umount
+the destination (new) path.
+
+.SH BUGS
+
+Newer kernel mount semantics allow you to bind/mount over the same mount
+point many times -- requiring and equal number of
+.B umount
+calls to release all of these.
+
+.B umounts
+present accounting with
+.BI /etc/mtab
+means the first call will clear all apparent mounts in the same place.
+
+.SH "SEE ALSO"
+.BR mount (8),
+.BR umount (8)
+
+.SH HISTORY
+
+.B bind
+first appeared in
+.IR plan9 .
+This version was hacked into 
+.B mount
+by Chris Wedgwood and is Linux specific.
diff -Nur tx.28589/util-linux-2.10m/mount/mount.c util-linux-2.10m/mount/mount.c
--- tx.28589/util-linux-2.10m/mount/mount.c	Mon May 15 10:56:37 2000
+++ util-linux-2.10m/mount/mount.c	Fri Jun  2 13:06:24 2000
@@ -36,6 +36,8 @@
  * - added `owner' mount option
  * 2000-05-11 Mark A. Peloquin <peloquin@us.ibm.com>
  * - check_special_mountprog now returns correct status
+ * 2000-060-1 Chris Wedgwood <cw@f00f.org>
+ * - hack in bind(8) support
  */
 
 #include <unistd.h>
@@ -1198,7 +1200,7 @@
 }
 
 extern char version[];
-static struct option longopts[] =
+static struct option mount_longopts[] =
 {
   { "all", 0, 0, 'a' },
   { "fake", 0, 0, 'f' },
@@ -1217,7 +1219,7 @@
 };
 
 static void
-usage (FILE *fp, int n)
+mount_usage (FILE *fp, int n)
 {
   fprintf (fp, _("Usage: mount [-lhV]\n"
 	       "       mount -a [-nfFrsvw] [-t vfstypes]\n"
@@ -1228,6 +1230,52 @@
   exit (n);
 }
 
+static void
+bind_usage(FILE *fp,int n)
+{
+  fprintf(fp,_("Usage:  bind --help\n"
+               "        bind /existing/path /alias/path\n"));
+  exit(n);
+}
+
+/*
+ * return 'basename' of argument 
+ */
+static char*
+basename(char *s)
+{
+	char	*t,*l;
+	
+	if(!(t = l = s))
+		return	s;
+	
+	while(*t){
+		if(*t++ == '/')
+			l = t;
+	}
+
+	return	l;
+}
+
+/*
+ * bind(8) -- if program was called as 'bind' then implicitly to a:
+ *	mount -t bind argv[1] argv[2] sort of thing
+ */
+
+static int
+bind_main(int argc,char *argv[])
+{
+	if((argc >= 2) && !strcmp(argv[1],"--help"))
+		bind_usage(stdout,0);
+
+	if(argc != 3)
+		bind_usage(stderr,EX_USAGE);
+
+	mount_one(argv[1],argv[2],"bind",NULL,NULL,0,0);
+
+	return	0;
+}
+
 int
 main (int argc, char *argv[]) {
   int c, result = 0, specseen;
@@ -1253,7 +1301,12 @@
   initproctitle(argc, argv);
 #endif
 
-  while ((c = getopt_long (argc, argv, "afFhlL:no:rsU:vVwt:", longopts, NULL))
+  /* perhaps we were called as bind? If so, let deal with that another way */
+  if(!strcmp(basename(argv[0]),"bind")){
+  	return	bind_main(argc,argv);
+  }
+  
+  while ((c = getopt_long (argc, argv, "afFhlL:no:rsU:vVwt:", mount_longopts, NULL))
 	 != EOF)
     switch (c) {
       case 'a':			/* mount everything in fstab */
@@ -1266,7 +1319,7 @@
 	++optfork;
 	break;
       case 'h':			/* help */
-	usage (stdout, 0);
+	mount_usage (stdout, 0);
 	break;
       case 'l':
 	list_with_volumelabel = 1;
@@ -1310,7 +1363,7 @@
 	break;
       case '?':
       default:
-	usage (stderr, EX_USAGE);
+	mount_usage (stderr, EX_USAGE);
     }
 
   argc -= optind;
@@ -1320,7 +1373,7 @@
 
   if (argc+specseen == 0 && !all) {
       if (options)
-	usage (stderr, EX_USAGE);
+	mount_usage (stderr, EX_USAGE);
       return print_all (types);
   }
 
@@ -1360,7 +1413,7 @@
     case 1:
       /* mount [-nfrvw] [-o options] special | node */
       if (types != NULL)
-	usage (stderr, EX_USAGE);
+	mount_usage (stderr, EX_USAGE);
       if (specseen) {
 	      /* We know the device. Where shall we mount it? */
 	      mc = (uuid ? getfsuuidspec (uuid) : getfsvolspec (volumelabel));
@@ -1406,11 +1459,11 @@
       else if (cdr (types) == NULL)
 	result = mount_one (spec, node, car (types), NULL, options, 0, 0);
       else
-	usage (stderr, EX_USAGE);
+	mount_usage (stderr, EX_USAGE);
       break;
       
     default:
-      usage (stderr, EX_USAGE);
+      mount_usage (stderr, EX_USAGE);
   }
 
   if (result == EX_SOMEOK)

