99 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Part of libvboxfs - (c) 2012, D.C. van Moolenbroek */
 | |
| 
 | |
| #include "inc.h"
 | |
| 
 | |
| vbox_conn_t vboxfs_conn;
 | |
| vboxfs_root_t vboxfs_root;
 | |
| 
 | |
| static struct sffs_table vboxfs_table = {
 | |
| 	.t_open		= vboxfs_open,
 | |
| 	.t_read		= vboxfs_read,
 | |
| 	.t_write	= vboxfs_write,
 | |
| 	.t_close	= vboxfs_close,
 | |
| 
 | |
| 	.t_readbuf	= vboxfs_buffer,
 | |
| 	.t_writebuf	= vboxfs_buffer,
 | |
| 
 | |
| 	.t_opendir	= vboxfs_opendir,
 | |
| 	.t_readdir	= vboxfs_readdir,
 | |
| 	.t_closedir	= vboxfs_closedir,
 | |
| 
 | |
| 	.t_getattr	= vboxfs_getattr,
 | |
| 	.t_setattr	= vboxfs_setattr,
 | |
| 
 | |
| 	.t_mkdir	= vboxfs_mkdir,
 | |
| 	.t_unlink	= vboxfs_unlink,
 | |
| 	.t_rmdir	= vboxfs_rmdir,
 | |
| 	.t_rename	= vboxfs_rename,
 | |
| 
 | |
| 	.t_queryvol	= vboxfs_queryvol
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * Initialize communication with the VBOX driver, and map the given share.
 | |
|  */
 | |
| int
 | |
| vboxfs_init(char *share, const struct sffs_table **tablep, int *case_insens,
 | |
| 	int *read_only)
 | |
| {
 | |
| 	vbox_param_t param[4];
 | |
| 	vboxfs_path_t path;
 | |
| 	vboxfs_volinfo_t volinfo;
 | |
| 	int r;
 | |
| 
 | |
| 	if ((r = vboxfs_set_path(&path, share)) != OK)
 | |
| 		return r;
 | |
| 
 | |
| 	if ((r = vbox_init()) != OK)
 | |
| 		return r;
 | |
| 
 | |
| 	if ((vboxfs_conn = r = vbox_open("VBoxSharedFolders")) < 0)
 | |
| 		return r;
 | |
| 
 | |
| 	r = vbox_call(vboxfs_conn, VBOXFS_CALL_SET_UTF8, NULL, 0, NULL);
 | |
| 	if (r != OK) {
 | |
| 		vbox_close(vboxfs_conn);
 | |
| 
 | |
| 		return r;
 | |
| 	}
 | |
| 
 | |
| 	vbox_set_ptr(¶m[0], &path, vboxfs_get_path_size(&path),
 | |
| 	    VBOX_DIR_OUT);
 | |
| 	vbox_set_u32(¶m[1], 0);
 | |
| 	vbox_set_u32(¶m[2], '/');	/* path separator */
 | |
| 	vbox_set_u32(¶m[3], TRUE);	/* case sensitivity - no effect? */
 | |
| 
 | |
| 	r = vbox_call(vboxfs_conn, VBOXFS_CALL_MAP_FOLDER, param, 4, NULL);
 | |
| 	if (r != OK) {
 | |
| 		vbox_close(vboxfs_conn);
 | |
| 
 | |
| 		return r;
 | |
| 	}
 | |
| 
 | |
| 	vboxfs_root = vbox_get_u32(¶m[1]);
 | |
| 
 | |
| 	/* Gather extra information about the mapped shared. */
 | |
| 	if (vboxfs_query_vol("", &volinfo) == OK) {
 | |
| 		*case_insens = !volinfo.props.casesens;
 | |
| 		*read_only = !!volinfo.props.readonly;
 | |
| 	}
 | |
| 
 | |
| 	*tablep = &vboxfs_table;
 | |
| 	return OK;
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * Unmap the share, and disconnect from the VBOX driver.
 | |
|  */
 | |
| void
 | |
| vboxfs_cleanup(void)
 | |
| {
 | |
| 	vbox_param_t param[1];
 | |
| 
 | |
| 	vbox_set_u32(¶m[0], vboxfs_root);
 | |
| 
 | |
| 	vbox_call(vboxfs_conn, VBOXFS_CALL_UNMAP_FOLDER, param, 1, NULL);
 | |
| 
 | |
| 	vbox_close(vboxfs_conn);
 | |
| }
 | 
