Module Name:    src
Committed By:   pooka
Date:           Thu Feb 17 17:18:08 UTC 2011

Modified Files:
        src/lib/librumphijack: hijack.c

Log Message:
Support mount/unmount too.  So, things are now generally at a stage
where you can mount a file system with a userspace server *without*
it having to go through puffs.

Say, you first start a server with ffs capability and map a host
ffs image into it:

        rump_server -lrumpvfs -lrumpfs_ffs \
            -d key=/ffsimg,hostpath=ffs2.img,size=e unix:///tmp/ffsserv

Then, configure your shell to talk to the rump server:

        setenv RUMP_SERVER unix:///tmp/ffsserv
        setenv LD_PRELOAD /usr/lib/librumphijack.so

Create a mountpoint and mount the file system:

        pain-rustique:60:~> sh
        $ cd /rump
        $ ls
        dev
        $ ls -l
        total 1
        drwxr-xr-x  2 root  wheel  512 Feb 17 18:00 dev
        $ mkdir mnt
        $ mount_ffs /ffsimg /rump/mnt
        mount_ffs: Warning: realpath /ffsimg: No such file or directory
        $ df -h mnt
        Filesystem        Size       Used      Avail %Cap Mounted on
        /ffsimg           496M       380M        91M  80% /mnt
        $ du -sckh *
        192K    dev
        380M    mnt
        381M    total
        $ umount -R mnt
        $ df -h mnt
        Filesystem        Size       Used      Avail %Cap Mounted on
        rumpfs            1.0K       1.0K         0B 100% /
        $

(note, you need -R to umount due to various degrees of unsuccesful
magic it attempts to perform without it)


To generate a diff of this commit:
cvs rdiff -u -r1.47 -r1.48 src/lib/librumphijack/hijack.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/librumphijack/hijack.c
diff -u src/lib/librumphijack/hijack.c:1.47 src/lib/librumphijack/hijack.c:1.48
--- src/lib/librumphijack/hijack.c:1.47	Thu Feb 17 15:20:10 2011
+++ src/lib/librumphijack/hijack.c	Thu Feb 17 17:18:08 2011
@@ -1,4 +1,4 @@
-/*      $NetBSD: hijack.c,v 1.47 2011/02/17 15:20:10 pooka Exp $	*/
+/*      $NetBSD: hijack.c,v 1.48 2011/02/17 17:18:08 pooka Exp $	*/
 
 /*-
  * Copyright (c) 2011 Antti Kantee.  All Rights Reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: hijack.c,v 1.47 2011/02/17 15:20:10 pooka Exp $");
+__RCSID("$NetBSD: hijack.c,v 1.48 2011/02/17 17:18:08 pooka Exp $");
 
 #define __ssp_weak_name(fun) _hijack_ ## fun
 
@@ -34,8 +34,9 @@
 #include <sys/types.h>
 #include <sys/event.h>
 #include <sys/ioctl.h>
-#include <sys/socket.h>
+#include <sys/mount.h>
 #include <sys/poll.h>
+#include <sys/socket.h>
 #include <sys/statvfs.h>
 
 #include <rump/rumpclient.h>
@@ -85,6 +86,7 @@
 	DUALCALL_UTIMES, DUALCALL_LUTIMES, DUALCALL_FUTIMES,
 	DUALCALL_TRUNCATE, DUALCALL_FTRUNCATE,
 	DUALCALL_FSYNC, DUALCALL_FSYNC_RANGE,
+	DUALCALL_MOUNT, DUALCALL_UNMOUNT,
 	DUALCALL__NUM
 };
 
@@ -118,6 +120,7 @@
 #endif
 #define REALREAD _sys_read
 #define REALGETDENTS __getdents30
+#define REALMOUNT __mount50
 
 int REALSELECT(int, fd_set *, fd_set *, fd_set *, struct timeval *);
 int REALPOLLTS(struct pollfd *, nfds_t,
@@ -132,6 +135,7 @@
 int REALUTIMES(const char *, const struct timeval [2]);
 int REALLUTIMES(const char *, const struct timeval [2]);
 int REALFUTIMES(int, const struct timeval [2]);
+int REALMOUNT(const char *, const char *, int, void *, size_t);
 
 #define S(a) __STRING(a)
 struct sysnames {
@@ -192,6 +196,8 @@
 	{ DUALCALL_FTRUNCATE,	"ftruncate",	RSYS_NAME(FTRUNCATE)	},
 	{ DUALCALL_FSYNC,	"fsync",	RSYS_NAME(FSYNC)	},
 	{ DUALCALL_FSYNC_RANGE,	"fsync_range",	RSYS_NAME(FSYNC_RANGE)	},
+	{ DUALCALL_MOUNT,	S(REALMOUNT),	RSYS_NAME(MOUNT)	},
+	{ DUALCALL_UNMOUNT,	"unmount",	RSYS_NAME(UNMOUNT)	},
 };
 #undef S
 
@@ -1532,3 +1538,20 @@
 	(const char *path, off_t length),				\
 	(const char *, off_t),						\
 	(path, length))
+
+/*
+ * Note: with mount the decisive parameter is the mount
+ * destination directory.  This is because we don't really know
+ * about the "source" directory in a generic call (and besides,
+ * it might not even exist, cf. nfs).
+ */
+PATHCALL(int, REALMOUNT, DUALCALL_MOUNT,				\
+	(const char *type, const char *path, int flags,			\
+	    void *data, size_t dlen),					\
+	(const char *, const char *, int, void *, size_t),		\
+	(type, path, flags, data, dlen))
+
+PATHCALL(int, unmount, DUALCALL_UNMOUNT,				\
+	(const char *path, int flags),					\
+	(const char *, int),						\
+	(path, flags))

Reply via email to