socsvn commit: r257602 - soc2013/oleksandr/ports/emulators/virtualbox-ose-additions/files

oleksandr at FreeBSD.org oleksandr at FreeBSD.org
Sun Sep 22 10:41:09 UTC 2013


Author: oleksandr
Date: Sun Sep 22 10:41:09 2013
New Revision: 257602
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=257602

Log:
  update mount root vfs section

Modified:
  soc2013/oleksandr/ports/emulators/virtualbox-ose-additions/files/patch-src-VBox-Additions-freebsd.kmk

Modified: soc2013/oleksandr/ports/emulators/virtualbox-ose-additions/files/patch-src-VBox-Additions-freebsd.kmk
==============================================================================
--- soc2013/oleksandr/ports/emulators/virtualbox-ose-additions/files/patch-src-VBox-Additions-freebsd.kmk	Sun Sep 22 09:17:40 2013	(r257601)
+++ soc2013/oleksandr/ports/emulators/virtualbox-ose-additions/files/patch-src-VBox-Additions-freebsd.kmk	Sun Sep 22 10:41:09 2013	(r257602)
@@ -2,15 +2,13 @@
 ===================================================================
 --- src/VBox/Additions/freebsd/vboxvfs/Makefile.kmk	(revision 4)
 +++ src/VBox/Additions/freebsd/vboxvfs/Makefile.kmk	(working copy)
-@@ -32,13 +32,14 @@
-         . \
+@@ -33,12 +33,13 @@
         $(vboxvfs_0_OUTDIR)
  vboxvfs_SOURCES       = \
--	vboxvfs_vfsops.c \
+ 	vboxvfs_vfsops.c \
 -	vboxvfs_vnops.c
-+	vboxfs_vfsops.c \
-+	vboxfs_vnops.c \
-+	vboxfs_prov.c 
++	vboxvfs_vnops.c \
++	vboxvfs_prov.c 
  vboxvfs_LIBS          = \
  	$(VBOX_LIB_VBGL_R0) \
  	$(VBOX_LIB_IPRT_GUEST_R0)
@@ -20,397 +18,65 @@
         $$(vboxvfs_0_OUTDIR)/vnode_if_newproto.h \
         $$(vboxvfs_0_OUTDIR)/vnode_if_typedef.h
  vboxvfs_CLEAN        += $(vboxvfs_DEPS)
-Index: src/VBox/Additions/freebsd/vboxvfs/vboxvfs_vnops.c
-===================================================================
---- src/VBox/Additions/freebsd/vboxvfs/vboxvfs_vnops.c	(revision 4)
-+++ src/VBox/Additions/freebsd/vboxvfs/vboxvfs_vnops.c	(working copy)
-@@ -1,241 +0,0 @@
--/* $Id: vboxvfs_vnops.c $ */
--/** @file
-- * Description.
-- */
--
--/*
-- * Copyright (C) 2008-2010 Oracle Corporation
-- *
-- * This file is part of VirtualBox Open Source Edition (OSE), as
-- * available from http://www.virtualbox.org. This file is free software;
-- * you can redistribute it and/or modify it under the terms of the GNU
-- * General Public License (GPL) as published by the Free Software
-- * Foundation, in version 2 as it comes in the "COPYING" file of the
-- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
-- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
-- */
--
--#include "vboxvfs.h"
--#include <sys/param.h>
--#include <sys/systm.h>
--#include <sys/namei.h>
--#include <sys/kernel.h>
--#include <sys/proc.h>
--#include <sys/bio.h>
--#include <sys/buf.h>
--#include <sys/fcntl.h>
--#include <sys/mount.h>
--#include <sys/unistd.h>
--#include <sys/vnode.h>
--#include <sys/limits.h>
--#include <sys/lockf.h>
--#include <sys/stat.h>
--
--#include <vm/vm.h>
--#include <vm/vm_extern.h>
--
--/*
-- * Prototypes for VBOXVFS vnode operations
-- */
--static vop_create_t     vboxvfs_create;
--static vop_mknod_t      vboxvfs_mknod;
--static vop_open_t       vboxvfs_open;
--static vop_close_t      vboxvfs_close;
--static vop_access_t     vboxvfs_access;
--static vop_getattr_t    vboxvfs_getattr;
--static vop_setattr_t    vboxvfs_setattr;
--static vop_read_t       vboxvfs_read;
--static vop_write_t      vboxvfs_write;
--static vop_fsync_t      vboxvfs_fsync;
--static vop_remove_t     vboxvfs_remove;
--static vop_link_t       vboxvfs_link;
--static vop_lookup_t     vboxvfs_lookup;
--static vop_rename_t     vboxvfs_rename;
--static vop_mkdir_t      vboxvfs_mkdir;
--static vop_rmdir_t      vboxvfs_rmdir;
--static vop_symlink_t    vboxvfs_symlink;
--static vop_readdir_t    vboxvfs_readdir;
--static vop_strategy_t   vboxvfs_strategy;
--static vop_print_t      vboxvfs_print;
--static vop_pathconf_t   vboxvfs_pathconf;
--static vop_advlock_t    vboxvfs_advlock;
--static vop_getextattr_t vboxvfs_getextattr;
--static vop_ioctl_t      vboxvfs_ioctl;
--static vop_getpages_t   vboxvfs_getpages;
--static vop_inactive_t   vboxvfs_inactive;
--static vop_putpages_t   vboxvfs_putpages;
--static vop_reclaim_t    vboxvfs_reclaim;
--
--struct vop_vector vboxvfs_vnodeops = {
--    .vop_default    =   &default_vnodeops,
--
--    .vop_access     =   vboxvfs_access,
--    .vop_advlock    =   vboxvfs_advlock,
--    .vop_close      =   vboxvfs_close,
--    .vop_create     =   vboxvfs_create,
--    .vop_fsync      =   vboxvfs_fsync,
--    .vop_getattr    =   vboxvfs_getattr,
--    .vop_getextattr =   vboxvfs_getextattr,
--    .vop_getpages   =   vboxvfs_getpages,
--    .vop_inactive   =   vboxvfs_inactive,
--    .vop_ioctl      =   vboxvfs_ioctl,
--    .vop_link       =   vboxvfs_link,
--    .vop_lookup     =   vboxvfs_lookup,
--    .vop_mkdir      =   vboxvfs_mkdir,
--    .vop_mknod      =   vboxvfs_mknod,
--    .vop_open       =   vboxvfs_open,
--    .vop_pathconf   =   vboxvfs_pathconf,
--    .vop_print      =   vboxvfs_print,
--    .vop_putpages   =   vboxvfs_putpages,
--    .vop_read       =   vboxvfs_read,
--    .vop_readdir    =   vboxvfs_readdir,
--    .vop_reclaim    =   vboxvfs_reclaim,
--    .vop_remove     =   vboxvfs_remove,
--    .vop_rename     =   vboxvfs_rename,
--    .vop_rmdir      =   vboxvfs_rmdir,
--    .vop_setattr    =   vboxvfs_setattr,
--    .vop_strategy   =   vboxvfs_strategy,
--    .vop_symlink    =   vboxvfs_symlink,
--    .vop_write      =   vboxvfs_write,
--};
--
--static int vboxvfs_access(struct vop_access_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_open(struct vop_open_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_close(struct vop_close_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_getattr(struct vop_getattr_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_setattr(struct vop_setattr_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_read(struct vop_read_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_write(struct vop_write_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_create(struct vop_create_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_remove(struct vop_remove_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_rename(struct vop_rename_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_link(struct vop_link_args *ap)
--{
--    return EOPNOTSUPP;
--}
--
--static int vboxvfs_symlink(struct vop_symlink_args *ap)
--{
--    return EOPNOTSUPP;
--}
--
--static int vboxvfs_mknod(struct vop_mknod_args *ap)
--{
--    return EOPNOTSUPP;
--}
--
--static int vboxvfs_mkdir(struct vop_mkdir_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_rmdir(struct vop_rmdir_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_readdir(struct vop_readdir_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_fsync(struct vop_fsync_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_print (struct vop_print_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_pathconf (struct vop_pathconf_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_strategy (struct vop_strategy_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_ioctl(struct vop_ioctl_args *ap)
--{
--    return ENOTTY;
--}
--
--static int vboxvfs_getextattr(struct vop_getextattr_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_advlock(struct vop_advlock_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_lookup(struct vop_lookup_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_inactive(struct vop_inactive_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_reclaim(struct vop_reclaim_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_getpages(struct vop_getpages_args *ap)
--{
--    return 0;
--}
--
--static int vboxvfs_putpages(struct vop_putpages_args *ap)
--{
--    return 0;
--}
--
-Index: src/VBox/Additions/freebsd/vboxvfs/vboxvfs.h
-===================================================================
---- src/VBox/Additions/freebsd/vboxvfs/vboxvfs.h	(revision 4)
-+++ src/VBox/Additions/freebsd/vboxvfs/vboxvfs.h	(working copy)
-@@ -1,92 +0,0 @@
--/* $Id: vboxvfs.h $ */
--/** @file
-- * Description.
-- */
--
--/*
-- * Copyright (C) 2010 Oracle Corporation
-- *
-- * This file is part of VirtualBox Open Source Edition (OSE), as
-- * available from http://www.virtualbox.org. This file is free software;
-- * you can redistribute it and/or modify it under the terms of the GNU
-- * General Public License (GPL) as published by the Free Software
-- * Foundation, in version 2 as it comes in the "COPYING" file of the
-- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
-- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
-- */
--
--#ifndef ___VBOXVFS_H___
--#define ___VBOXVFS_H___
--
--#define VBOXVFS_VFSNAME "vboxvfs"
--#define VBOXVFS_VERSION 1
--
--#define MAX_HOST_NAME 256
--#define MAX_NLS_NAME 32
--
--struct vboxvfs_mount_info {
--    char name[MAX_HOST_NAME];
--    char nls_name[MAX_NLS_NAME];
--    int uid;
--    int gid;
--    int ttl;
--};
--
--#ifdef _KERNEL
--
--#include "../../common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.h"
--#include <sys/mount.h>
--#include <sys/vnode.h>
--
--struct vboxvfsmount {
--    uid_t           uid;
--    gid_t           gid;
--    mode_t          file_mode;
--    mode_t          dir_mode;
--    struct mount   *mp;
--    struct ucred   *owner;
--    u_int           flags;
--    long            nextino;
--    int             caseopt;
--    int             didrele;
--};
--
--/* structs - stolen from the linux shared module code */
--struct sf_glob_info {
--    VBSFMAP map;
--/*    struct nls_table *nls;*/
--    int ttl;
--    int uid;
--    int gid;
--    struct vnode *vnode_root;
--};
--
--struct sf_inode_info {
--    SHFLSTRING *path;
--    int force_restat;
--};
--
--#if 0
--struct sf_dir_info {
--    struct list_head info_list;
--};
--#endif
--
--struct sf_dir_buf {
--    size_t nb_entries;
--    size_t free_bytes;
--    size_t used_bytes;
--    void *buf;
--#if 0
--   struct list_head head;
--#endif
--};
--
--struct sf_reg_info {
--    SHFLHANDLE handle;
--};
--
--#endif  /* KERNEL */
--
--#endif /* !___VBOXVFS_H___ */
--
 Index: src/VBox/Additions/freebsd/vboxvfs/vboxvfs_vfsops.c
 ===================================================================
 --- src/VBox/Additions/freebsd/vboxvfs/vboxvfs_vfsops.c	(revision 4)
 +++ src/VBox/Additions/freebsd/vboxvfs/vboxvfs_vfsops.c	(working copy)
-@@ -1,258 +0,0 @@
+@@ -1,4 +1,4 @@
 -/* $Id: vboxvfs_vfsops.c $ */
--/** @file
-- * Description.
-- */
--
--/*
-- * Copyright (C) 2008-2010 Oracle Corporation
-- *
-- * This file is part of VirtualBox Open Source Edition (OSE), as
-- * available from http://www.virtualbox.org. This file is free software;
-- * you can redistribute it and/or modify it under the terms of the GNU
-- * General Public License (GPL) as published by the Free Software
-- * Foundation, in version 2 as it comes in the "COPYING" file of the
-- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
-- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
-- */
++/* $Id: vboxfs_vfsops.c $ */
+ /** @file
+  * Description.
+  */
+@@ -14,245 +14,525 @@
+  * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+  * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+  */
 -
 -#include "vboxvfs.h"
--#include <sys/param.h>
--#include <sys/systm.h>
--#include <sys/proc.h>
--#include <sys/bio.h>
--#include <sys/buf.h>
--#include <sys/kernel.h>
--#include <sys/sysctl.h>
--#include <sys/vnode.h>
--#include <sys/mount.h>
--#include <sys/stat.h>
--#include <sys/malloc.h>
--#include <sys/module.h>
--
--#include <iprt/mem.h>
--
--#define VFSMP2SFGLOBINFO(mp) ((struct sf_glob_info *)mp->mnt_data)
--
++#include <sys/types.h>
+ #include <sys/param.h>
+ #include <sys/systm.h>
+ #include <sys/proc.h>
+ #include <sys/bio.h>
+ #include <sys/buf.h>
++#include <sys/conf.h>
++#include <sys/dirent.h>
+ #include <sys/kernel.h>
+ #include <sys/sysctl.h>
+ #include <sys/vnode.h>
+ #include <sys/mount.h>
++#include <sys/namei.h>
++#include <sys/fcntl.h>
++#include <sys/priv.h>
+ #include <sys/stat.h>
+ #include <sys/malloc.h>
+ #include <sys/module.h>
+ 
+-#include <iprt/mem.h>
++#include <geom/geom.h>
++#include <geom/geom_vfs.h>
+ 
++#include "vboxvfs.h"
++
+ #define VFSMP2SFGLOBINFO(mp) ((struct sf_glob_info *)mp->mnt_data)
+ 
 -static int vboxvfs_version = VBOXVFS_VERSION;
--
++#ifdef MALLOC_DECLARE
++MALLOC_DEFINE(M_VBOXVFS, "vboxvfs", "VBOX VFS");
++#endif
+ 
 -SYSCTL_NODE(_vfs, OID_AUTO, vboxvfs, CTLFLAG_RW, 0, "VirtualBox shared filesystem");
 -SYSCTL_INT(_vfs_vboxvfs, OID_AUTO, version, CTLFLAG_RD, &vboxvfs_version, 0, "");
--
--/* global connection to the host service. */
--static VBSFCLIENT g_vboxSFClient;
--
++static int vboxfs_version = VBOXVFS_VERSION;
+ 
++SYSCTL_NODE(_vfs, OID_AUTO, vboxfs, CTLFLAG_RW, 0, "VirtualBox shared filesystem");
++SYSCTL_INT(_vfs_vboxfs, OID_AUTO, version, CTLFLAG_RD, &vboxfs_version, 0, "");
++
+ /* global connection to the host service. */
+ static VBSFCLIENT g_vboxSFClient;
++static sfp_connection_t *sfprov = NULL;
+ 
 -static vfs_init_t       vboxvfs_init;
 -static vfs_uninit_t     vboxvfs_uninit;
 -static vfs_cmount_t     vboxvfs_cmount;
@@ -419,7 +85,15 @@
 -static vfs_quotactl_t   vboxvfs_quotactl;
 -static vfs_statfs_t     vboxvfs_statfs;
 -static vfs_unmount_t    vboxvfs_unmount;
--
++static vfs_init_t       vboxfs_init;
++static vfs_uninit_t     vboxfs_uninit;
++static vfs_cmount_t     vboxfs_cmount;
++static vfs_mount_t      vboxfs_mount;
++static vfs_root_t       vboxfs_root;
++static vfs_quotactl_t   vboxfs_quotactl;
++static vfs_statfs_t     vboxfs_statfs;
++static vfs_unmount_t    vboxfs_unmount;
+ 
 -static struct vfsops vboxvfs_vfsops = {
 -    .vfs_init     =    vboxvfs_init,
 -    .vfs_cmount   =    vboxvfs_cmount,
@@ -430,40 +104,74 @@
 -    .vfs_sync     =    vfs_stdsync,
 -    .vfs_uninit   =    vboxvfs_uninit,
 -    .vfs_unmount  =    vboxvfs_unmount,
--};
--
--
++static struct vfsops vboxfs_vfsops = {
++    	.vfs_init     =		vboxfs_init,
++    	.vfs_cmount   =    	vboxfs_cmount,
++    	.vfs_mount    =    	vboxfs_mount,
++    	.vfs_quotactl =    	vboxfs_quotactl,
++    	.vfs_root     =    	vboxfs_root,
++    	.vfs_statfs   =    	vboxfs_statfs,
++    	.vfs_sync     =    	vfs_stdsync,
++    	.vfs_uninit   =		vboxfs_uninit,
++    	.vfs_unmount  =   	vboxfs_unmount,
++	.vfs_vget     =		vboxfs_vget,
+ };
+ 
+ 
 -VFS_SET(vboxvfs_vfsops, vboxvfs, VFCF_NETWORK);
--MODULE_DEPEND(vboxvfs, vboxguest, 1, 1, 1);
--
++VFS_SET(vboxfs_vfsops, vboxvfs, VFCF_NETWORK);
+ MODULE_DEPEND(vboxvfs, vboxguest, 1, 1, 1);
+ 
 -static int vboxvfs_cmount(struct mntarg *ma, void * data, int flags, struct thread *td)
--{
++static int vboxfs_cmount(struct mntarg *ma, void *data, uint64_t flags)
+ {
 -    struct vboxvfs_mount_info args;
 -    int rc = 0;
--
++    	struct vboxfs_mount_info args;
++    	int error = 0;
+ 
 -    printf("%s: Enter\n", __FUNCTION__);
--
++    	printf("%s: Enter\n", __FUNCTION__);
++	
++	if (data == NULL)
++		     return (EINVAL);
++    	error = copyin(data, &args, sizeof(struct vboxfs_mount_info));
++    	if (error)
++        	return (error);
+ 
 -    rc = copyin(data, &args, sizeof(struct vboxvfs_mount_info));
 -    if (rc)
 -        return rc;
--
++  	ma = mount_argf(ma, "uid", "%d", args.uid);
++    	ma = mount_argf(ma, "gid", "%d", args.gid);
++    	ma = mount_argf(ma, "file_mode", "%d", args.fmode);
++    	ma = mount_argf(ma, "dir_mode", "%d", args.dmode);
++    	ma = mount_arg(ma, "from", args.name, -1);
+ 
 -    ma = mount_argf(ma, "uid", "%d", args.uid);
 -    ma = mount_argf(ma, "gid", "%d", args.gid);
 -    ma = mount_arg(ma, "from", args.name, -1);
--
++    	error = kernel_mount(ma, flags);
+ 
 -    rc = kernel_mount(ma, flags);
--
++    	printf("%s: Leave error=%d\n", __FUNCTION__, error);
+ 
 -    printf("%s: Leave rc=%d\n", __FUNCTION__, rc);
--
++    	return (error);
++};
+ 
 -    return rc;
 -}
 -
 -static const char *vboxvfs_opts[] = {
 -    "uid", "gid", "from", "fstype", "fspath", "errmsg", NULL
--};
--
++static const char *vboxfs_opts[] = {
++    	"fstype", "fspath", "from", "uid", "gid", "file_mode", "dir_mode", "errmsg", NULL
+ };
+ 
 -static int vboxvfs_mount(struct mount *mp, struct thread *td)
--{
++static int vboxfs_mount(struct mount *mp)
+ {
 -    int rc;
 -    char *pszShare;
 -    int  cbShare, cbOption;
@@ -471,2976 +179,3172 @@
 -    struct sf_glob_info *pShFlGlobalInfo;
 -    SHFLSTRING *pShFlShareName = NULL;
 -    int cbShFlShareName;
--
++	struct vboxfs_mnt *vboxfsmp = NULL; 
++	struct vboxfs_node *unode; 
++	struct buf *bp = NULL;
++	struct cdev *dev;
++	struct g_consumer *cp;
++	struct bufobj *bo;
++	struct vnode *devvp;	/* vnode of the mount device */
++	struct thread *td = curthread;
++	struct vfsoptlist *opts = mp->mnt_optnew;
++	struct nameidata nd, *ndp = &nd;
++	sfp_mount_t *handle;
++    	int error, share_len;
++    	char *share_name;
++   	mode_t file_mode, dir_mode;
++	char *tmp, *ep;
++	uid_t uid = 0;
++	gid_t gid = 0;
+ 
 -    printf("%s: Enter\n", __FUNCTION__);
--
++    	printf("%s: Enter \n", __FUNCTION__);
+ 
 -    if (mp->mnt_flag & (MNT_UPDATE | MNT_ROOTFS))
 -        return EOPNOTSUPP;
--
++    	if (mp->mnt_flag & (MNT_UPDATE | MNT_ROOTFS))
++        	return (EOPNOTSUPP);
+ 
 -    if (vfs_filteropt(mp->mnt_optnew, vboxvfs_opts))
 -    {
 -        vfs_mount_error(mp, "%s", "Invalid option");
 -        return EINVAL;
 -    }
--
++    	if (vfs_filteropt(opts, vboxfs_opts))
++    	{
++        	vfs_mount_error(mp, "%s", "Invalid option");
++        	return (EINVAL);
++    	}
+ 
 -    rc = vfs_getopt(mp->mnt_optnew, "from", (void **)&pszShare, &cbShare);
 -    if (rc || pszShare[cbShare-1] != '\0' || cbShare > 0xfffe)
 -        return EINVAL;
--
++	if (vfs_getopt(opts, "uid", (void **)&tmp, NULL) == 0) {
++        	if (tmp != NULL)
++        		uid = (uid_t)strtol(tmp, &ep, 10);
++       		if (tmp == NULL || *ep) {
++       			vfs_mount_error(mp, "Invalid uid");
++       			return (EINVAL);
++       		}
++        }
++		
++	if (vfs_getopt(opts, "gid", (void **)&tmp, NULL) == 0) {
++        	if (tmp != NULL)
++        		gid = (gid_t)strtol(tmp, &ep, 10);
++       		if (tmp == NULL || *ep) {
++       			vfs_mount_error(mp, "Invalid gid");
++       			return (EINVAL);
++       		}
++        }
+ 
 -    rc = vfs_getopt(mp->mnt_optnew, "gid", (void **)&gid, &cbOption);
 -    if ((rc != ENOENT) && (rc || cbOption != sizeof(gid)))
 -        return EINVAL;
--
++	if (vfs_getopt(opts, "file_mode", (void **)&tmp, NULL) == 0) {
++        	if (tmp != NULL)
++        		file_mode = (mode_t)strtol(tmp, &ep, 8);
++#if 0
++      		if (tmp == NULL || *ep) {
++     			vfs_mount_error(mp, "Invalid file_mode");
++    			return (EINVAL);
++		}
++#endif
++		file_mode &= S_IRWXU | S_IRWXG | S_IRWXO;
++        }
+ 
 -    rc = vfs_getopt(mp->mnt_optnew, "uid", (void **)&uid, &cbOption);
 -    if ((rc != ENOENT) && (rc || cbOption != sizeof(uid)))
 -        return EINVAL;
--
++	if (vfs_getopt(opts, "dir_mode", (void **)&tmp, NULL) == 0) {
++        	if (tmp != NULL)
++        		dir_mode = (mode_t)strtol(tmp, &ep, 8);
++#if 0
++       		if (tmp == NULL || *ep) {
++      			vfs_mount_error(mp, "Invalid dir_mode");
++       			return (EINVAL);
++       		}
++#endif
++		dir_mode &= S_IRWXU | S_IRWXG | S_IRWXO;
++        }
+ 
 -    pShFlGlobalInfo = RTMemAllocZ(sizeof(struct sf_glob_info));
 -    if (!pShFlGlobalInfo)
 -        return ENOMEM;
--
++	vboxfsmp = malloc(sizeof(struct vboxfs_mnt), M_VBOXVFS, M_WAITOK | M_ZERO);
++        vboxfsmp->sf_uid = uid;
++        vboxfsmp->sf_gid = gid;
++        vboxfsmp->sf_fmode = file_mode;
++        vboxfsmp->sf_dmode = dir_mode;
+ 
 -    cbShFlShareName = offsetof (SHFLSTRING, String.utf8) + cbShare + 1;
 -    pShFlShareName  = RTMemAllocZ(cbShFlShareName);
 -    if (!pShFlShareName)
 -        return VERR_NO_MEMORY;
--
++	/*
++         * Invoke Hypervisor mount interface before proceeding
++         */
++        //error = sfprov_mount(share_name, &handle);
++      // if (error) {
++          //      return (error);
++	//}
+ 
 -    pShFlShareName->u16Length = cbShFlShareName;
 -    pShFlShareName->u16Size   = cbShFlShareName + 1;
 -    memcpy (pShFlShareName->String.utf8, pszShare, cbShare + 1);
--
++    	mp->mnt_data = handle;
+ 
 -    rc = vboxCallMapFolder (&g_vboxSFClient, pShFlShareName, &pShFlGlobalInfo->map);
 -    RTMemFree(pShFlShareName);
--
++    	error = vfs_getopt(opts, "from", (void **)&share_name, &share_len);
+ 
 -    if (RT_FAILURE (rc))
 -    {
 -        RTMemFree(pShFlGlobalInfo);
 -        printf("vboxCallMapFolder failed rc=%d\n", rc);
 -        return EPROTO;
 -    }
--
++    	if (error || share_name[share_len - 1] != '\0' || share_len > 0xfffe)
++    	{
++        	vfs_mount_error(mp, "Invalid from");
++        	return (EINVAL);
++	}
+ 
 -    pShFlGlobalInfo->uid = uid;
 -    pShFlGlobalInfo->gid = gid;
--
++	/* Check that the mount device exists */
++	if (share_name == NULL)
++		return (EINVAL);
+ 
 -    mp->mnt_data = pShFlGlobalInfo;
--
++	NDINIT(ndp, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, share_name, td);
++	printf("Device exist_0 %d", namei(ndp));
++	if ((error = namei(ndp)))
++		return (error);
++	printf("Device exist");
++	NDFREE(ndp, NDF_ONLY_PNBUF);
++	devvp = ndp->ni_vp;
+ 
 -    /* @todo root vnode. */
--
++	printf("Device exist_2");
++	if (vn_isdisk(devvp, &error) == 0) {
++		vput(devvp);
++		return (error);
++	}
+ 
 -    vfs_getnewfsid(mp);
 -    vfs_mountedfrom(mp, pszShare);
--
++	printf("Device exist_3");
++	/* Check the access rights on the mount device */
++	error = VOP_ACCESS(devvp, VREAD, td->td_ucred, td);
++	if (error)
++		error = priv_check(td, PRIV_VFS_MOUNT_PERM);
++	if (error) {
++		vput(devvp);
++		return (error);
++	}
+ 
 -    printf("%s: Leave rc=0\n", __FUNCTION__);
--
--    return 0;
--}
--
--static int vboxvfs_unmount(struct mount *mp, int mntflags, struct thread *td)
--{
--    struct sf_glob_info *pShFlGlobalInfo = VFSMP2SFGLOBINFO(mp);
--    int rc;
--    int flags = 0;
--
--    rc = vboxCallUnmapFolder(&g_vboxSFClient, &pShFlGlobalInfo->map);
--    if (RT_FAILURE(rc))
--        printf("Failed to unmap shared folder\n");
--
--    if (mntflags & MNT_FORCE)
--        flags |= FORCECLOSE;
--
--    /* There is 1 extra root vnode reference (vnode_root). */
--    rc = vflush(mp, 1, flags, td);
--    if (rc)
--        return rc;
--
--
--    RTMemFree(pShFlGlobalInfo);
--    mp->mnt_data = NULL;
--
--    return 0;
--}
--
--static int vboxvfs_root(struct mount *mp, int flags, struct vnode **vpp, struct thread *td)
--{
--    int rc = 0;
--    struct sf_glob_info *pShFlGlobalInfo = VFSMP2SFGLOBINFO(mp);
--    struct vnode *vp;
--
--    printf("%s: Enter\n", __FUNCTION__);
--
--    vp = pShFlGlobalInfo->vnode_root;
--    VREF(vp);
--
--    vn_lock(vp, flags | LK_RETRY, td);
--    *vpp = vp;
--
--    printf("%s: Leave\n", __FUNCTION__);
--
--    return rc;
--}
--
--static int vboxvfs_quotactl(struct mount *mp, int cmd, uid_t uid, void *arg, struct thread *td)
--{
--    return EOPNOTSUPP;
--}
--
--int vboxvfs_init(struct vfsconf *vfsp)
--{
--    int rc;
--
--    /* Initialize the R0 guest library. */
--    rc = vboxInit();
--    if (RT_FAILURE(rc))
--        return ENXIO;
--
--    /* Connect to the host service. */
--    rc = vboxConnect(&g_vboxSFClient);
--    if (RT_FAILURE(rc))
--    {
--        printf("Failed to get connection to host! rc=%d\n", rc);
--        vboxUninit();
--        return ENXIO;
--    }
--
--    rc = vboxCallSetUtf8 (&g_vboxSFClient);
--    if (RT_FAILURE (rc))
--    {
--        printf("vboxCallSetUtf8 failed, rc=%d\n", rc);
--        vboxDisconnect(&g_vboxSFClient);
--        vboxUninit();
--        return EPROTO;
--    }
--
--    printf("Successfully loaded shared folder module\n");
--
--    return 0;
--}
--
--int vboxvfs_uninit(struct vfsconf *vfsp)
--{
--    vboxDisconnect(&g_vboxSFClient);
--    vboxUninit();
--
--    return 0;
--}
--
--int vboxvfs_statfs(struct mount *mp, struct statfs *sbp, struct thread *td)
--{
++	printf("Device exist_4");
++	dev = devvp->v_rdev;
++	dev_ref(dev);
++	DROP_GIANT();
++	g_topology_lock();
++	error = g_vfs_open(devvp, &cp, "vboxvfs", 0);
++	g_topology_unlock();
++	PICKUP_GIANT();
++	VOP_UNLOCK(devvp, 0);
++	if (error)
++		goto bail;
+ 
 -    return 0;
--}
-Index: src/VBox/Additions/freebsd/vboxvfs/vboxfs.h
-===================================================================
---- src/VBox/Additions/freebsd/vboxvfs/vboxfs.h	(revision 0)
-+++ src/VBox/Additions/freebsd/vboxvfs/vboxfs.h	(working copy)
-@@ -0,0 +1,326 @@
-+/* $Id: vboxfs.h $ */
-+/** @file
-+ * Description.
-+ */
-+
-+/*
-+ * Copyright (C) 2010 Oracle Corporation
-+ *
-+ * This file is part of VirtualBox Open Source Edition (OSE), as
-+ * available from http://www.virtualbox.org. This file is free software;
-+ * you can redistribute it and/or modify it under the terms of the GNU
-+ * General Public License (GPL) as published by the Free Software
-+ * Foundation, in version 2 as it comes in the "COPYING" file of the
-+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
-+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
-+ */
-+
-+#ifndef ___VBOXVFS_H___
-+#define ___VBOXVFS_H___
-+
-+#define VBOXVFS_VFSNAME "vboxfs"
-+#define VBOXVFS_VERSION 1
-+
-+#define MAX_HOST_NAME 	256
-+#define MAX_NLS_NAME 	32
-+//#define MODEMASK        07777           /* mode bits plus permission bits */
-+/** Helper macros */
-+#define VFSTOVBOXFS(mp)		((struct vboxfs_mnt *)((mp)->mnt_data))
-+#define VTOVBOXFS(vp) 		((struct vboxfs_node *)(vp)->v_data)
-+
-+MALLOC_DECLARE(M_VBOXVFS);
-+
-+#ifdef _KERNEL
-+#include "../../../../../include/iprt/nocrt/limits.h"
-+#include "../../../../../include/iprt/alloc.h"
-+#include "../../../../../include/iprt/asm.h"
-+#include "../../../../../include/iprt/asm-amd64-x86.h"
-+#include "../../../../../include/iprt/asm-math.h"
-+#include "../../../../../include/iprt/assert.h"
-+#include "../../../../../include/iprt/cdefs.h"
-+#include "../../../../../include/iprt/err.h"
-+#include "../../../../../include/iprt/fs.h"
-+#include "../../../../../include/iprt/log.h"
-+#include "../../../../../include/iprt/mangling.h"
-+#include "../../../../../include/iprt/mem.h"
-+#include "../../../../../include/iprt/param.h"
-+#include "../../../../../include/iprt/path.h"
-+#include "../../../../../include/iprt/semaphore.h"
-+#include "../../../../../include/iprt/stdarg.h"
-+#include "../../../../../include/iprt/stdint.h"
-+#include "../../../../../include/iprt/string.h"
-+#include "../../../../../include/iprt/time.h"
-+#include "../../../../../include/iprt/types.h"
-+#include "../../../../../include/iprt/uni.h"
-+#include "../../../../../include/iprt/nocrt/limits.h"
-+#include "../../../../../include/iprt/alloc.h"
-+#include "../../../../../include/iprt/asm.h"
-+#include "../../../../../include/iprt/asm-amd64-x86.h"
-+#include "../../../../../include/iprt/asm-math.h"
-+#include "../../../../../include/iprt/assert.h"
-+#include "../../../../../include/iprt/cdefs.h"
-+#include "../../../../../include/iprt/err.h"
-+#include "../../../../../include/iprt/fs.h"
-+#include "../../../../../include/iprt/log.h"
-+#include "../../../../../include/iprt/mangling.h"
-+#include "../../../../../include/iprt/mem.h"
-+#include "../../../../../include/iprt/param.h"
-+#include "../../../../../include/iprt/path.h"
-+#include "../../../../../include/iprt/semaphore.h"
-+#include "../../../../../include/iprt/stdarg.h"
-+#include "../../../../../include/iprt/stdint.h"
-+#include "../../../../../include/iprt/string.h"
-+#include "../../../../../include/iprt/time.h"
-+#include "../../../../../include/iprt/types.h"
-+#include "../../../../../include/iprt/uni.h"
-+
-+#include "../../common/VBoxGuestLib/SysHlp.h"
-+#include "../../common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.h"
-+#include <sys/mount.h>
-+#include <sys/vnode.h> 
-+#include <sys/_timespec.h>
-+
-+/*
-+ * representation of an active mount point
-+ */
-+struct sfp_mount {
-+        VBSFMAP map;
-+};
-+
-+/*
-+ * Mount / Unmount a shared folder.
-+ *
-+ * sfprov_mount() takes as input the connection pointer and the name of
-+ * the shared folder. On success, it returns zero and supplies an
-+ * sfp_mount_t handle. On failure it returns any relevant errno value.
-+ *
-+ * sfprov_unmount() unmounts the mounted file system. It returns 0 on
-+ * success and any relevant errno on failure.
-+ */
-+typedef struct sfp_mount sfp_mount_t;
-+
-+struct sfp_file {
-+        SHFLHANDLE handle;
-+        VBSFMAP map;    /* need this again for the close operation */
-+};
-+
-+typedef struct sfp_file sfp_file_t;
-+
-+/*
-+ * File operations: open/close/read/write/etc.
-+ *
-+ * open/create can return any relevant errno, however ENOENT
-+ * generally means that the host file didn't exist.
-+ */
-+typedef struct sffs_stat {
-+        mode_t                  sf_mode;
-+        off_t                   sf_size;
-+        off_t                   sf_alloc;
-+        struct timespec         sf_atime;
-+        struct timespec         sf_mtime;
-+        struct timespec         sf_ctime;
-+} sffs_stat_t;
-+
-+/*
-+ * Read directory entries.

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-soc-all mailing list