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))