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