xref: /minix/minix/lib/libvboxfs/vboxfs.c (revision 7f5f010b)
1 /* Part of libvboxfs - (c) 2012, D.C. van Moolenbroek */
2 
3 #include "inc.h"
4 
5 vbox_conn_t vboxfs_conn;
6 vboxfs_root_t vboxfs_root;
7 
8 static struct sffs_table vboxfs_table = {
9 	.t_open		= vboxfs_open,
10 	.t_read		= vboxfs_read,
11 	.t_write	= vboxfs_write,
12 	.t_close	= vboxfs_close,
13 
14 	.t_readbuf	= vboxfs_buffer,
15 	.t_writebuf	= vboxfs_buffer,
16 
17 	.t_opendir	= vboxfs_opendir,
18 	.t_readdir	= vboxfs_readdir,
19 	.t_closedir	= vboxfs_closedir,
20 
21 	.t_getattr	= vboxfs_getattr,
22 	.t_setattr	= vboxfs_setattr,
23 
24 	.t_mkdir	= vboxfs_mkdir,
25 	.t_unlink	= vboxfs_unlink,
26 	.t_rmdir	= vboxfs_rmdir,
27 	.t_rename	= vboxfs_rename,
28 
29 	.t_queryvol	= vboxfs_queryvol
30 };
31 
32 /*
33  * Initialize communication with the VBOX driver, and map the given share.
34  */
35 int
36 vboxfs_init(char *share, const struct sffs_table **tablep, int *case_insens,
37 	int *read_only)
38 {
39 	vbox_param_t param[4];
40 	vboxfs_path_t path;
41 	vboxfs_volinfo_t volinfo;
42 	int r;
43 
44 	if ((r = vboxfs_set_path(&path, share)) != OK)
45 		return r;
46 
47 	if ((r = vbox_init()) != OK)
48 		return r;
49 
50 	if ((vboxfs_conn = r = vbox_open("VBoxSharedFolders")) < 0)
51 		return r;
52 
53 	r = vbox_call(vboxfs_conn, VBOXFS_CALL_SET_UTF8, NULL, 0, NULL);
54 	if (r != OK) {
55 		vbox_close(vboxfs_conn);
56 
57 		return r;
58 	}
59 
60 	vbox_set_ptr(&param[0], &path, vboxfs_get_path_size(&path),
61 	    VBOX_DIR_OUT);
62 	vbox_set_u32(&param[1], 0);
63 	vbox_set_u32(&param[2], '/');	/* path separator */
64 	vbox_set_u32(&param[3], TRUE);	/* case sensitivity - no effect? */
65 
66 	r = vbox_call(vboxfs_conn, VBOXFS_CALL_MAP_FOLDER, param, 4, NULL);
67 	if (r != OK) {
68 		vbox_close(vboxfs_conn);
69 
70 		return r;
71 	}
72 
73 	vboxfs_root = vbox_get_u32(&param[1]);
74 
75 	/* Gather extra information about the mapped shared. */
76 	if (vboxfs_query_vol("", &volinfo) == OK) {
77 		*case_insens = !volinfo.props.casesens;
78 		*read_only = !!volinfo.props.readonly;
79 	}
80 
81 	*tablep = &vboxfs_table;
82 	return OK;
83 }
84 
85 /*
86  * Unmap the share, and disconnect from the VBOX driver.
87  */
88 void
89 vboxfs_cleanup(void)
90 {
91 	vbox_param_t param[1];
92 
93 	vbox_set_u32(&param[0], vboxfs_root);
94 
95 	vbox_call(vboxfs_conn, VBOXFS_CALL_UNMAP_FOLDER, param, 1, NULL);
96 
97 	vbox_close(vboxfs_conn);
98 }
99