summaryrefslogtreecommitdiff
path: root/minix/lib/libvboxfs/info.c
blob: 87fa5a9ab8dceb89927166f2dcf3d97f5b9ebca2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/* Part of libvboxfs - (c) 2012, D.C. van Moolenbroek */

#include "inc.h"

/*
 * Get or set file information.
 */
int
vboxfs_getset_info(vboxfs_handle_t handle, u32_t flags, void *data,
	size_t size)
{
	vbox_param_t param[5];

	vbox_set_u32(&param[0], vboxfs_root);
	vbox_set_u64(&param[1], handle);
	vbox_set_u32(&param[2], flags);
	vbox_set_u32(&param[3], size);
	vbox_set_ptr(&param[4], data, size, VBOX_DIR_INOUT);

	return vbox_call(vboxfs_conn, VBOXFS_CALL_INFO, param, 5, NULL);
}

/*
 * Query volume information.
 */
int
vboxfs_query_vol(const char *path, vboxfs_volinfo_t *volinfo)
{
	vboxfs_handle_t h;
	int r;

	if ((r = vboxfs_open_file(path, O_RDONLY, 0, &h, NULL)) != OK)
		return r;

	r = vboxfs_getset_info(h, VBOXFS_INFO_GET | VBOXFS_INFO_VOLUME,
	    volinfo, sizeof(*volinfo));

	vboxfs_close_file(h);

	return r;
}

/*
 * Query volume information.
 */
int
vboxfs_queryvol(const char *path, u64_t *free, u64_t *total)
{
	vboxfs_volinfo_t volinfo;
	int r;

	if ((r = vboxfs_query_vol(path, &volinfo)) != OK)
		return r;

	*free = volinfo.free;
	*total = volinfo.total;
	return OK;
}