lib/libvboxfs/vboxfs.h
/* Part of libvboxfs - (c) 2012, D.C. van Moolenbroek */

#ifndef _VBOXFS_VBOXFS_H
#define _VBOXFS_VBOXFS_H

#define VBOXFS_CALL_CREATE		 3	/* create, open, lookup */
#define VBOXFS_CALL_CLOSE		 4	/* close handle */
#define VBOXFS_CALL_READ		 5	/* read from file */
#define VBOXFS_CALL_WRITE		 6	/* write to file */
#define VBOXFS_CALL_LIST		 8	/* list directory contents */
#define VBOXFS_CALL_INFO		 9	/* get/set file information */
#define VBOXFS_CALL_REMOVE		11	/* remove file or directory */
#define VBOXFS_CALL_UNMAP_FOLDER	13	/* unmap folder */
#define VBOXFS_CALL_RENAME		14	/* rename file or directory */
#define VBOXFS_CALL_SET_UTF8		16	/* switch to UTF8 */
#define VBOXFS_CALL_MAP_FOLDER		17	/* map folder */

#define VBOXFS_INVALID_HANDLE	((vboxfs_handle_t) ~0LL)

typedef u32_t vboxfs_root_t;
typedef u64_t vboxfs_handle_t;

typedef struct {
	u16_t size;
	u16_t len;
	char data[PATH_MAX];
} vboxfs_path_t;

#define VBOXFS_NO_RESULT		0
#define VBOXFS_PATH_NOT_FOUND		1
#define VBOXFS_FILE_NOT_FOUND		2
#define VBOXFS_FILE_EXISTS		3
#define VBOXFS_FILE_CREATED		4
#define VBOXFS_FILE_REPLACED		5

#define VBOXFS_OBJATTR_ADD_NONE		1	/* no other attributes */
#define VBOXFS_OBJATTR_ADD_UNIX		2	/* POSIX attributes */
#define VBOXFS_OBJATTR_ADD_EATTR	3	/* extended attributes */

typedef struct {
	u32_t mode;
	u32_t add;
	union {
		struct {
			u32_t uid;
			u32_t gid;
			u32_t nlinks;
			u32_t dev;
			u64_t inode;
			u32_t flags;
			u32_t gen;
			u32_t rdev;
		};
		struct {
			u64_t easize;
		};
	};
} vboxfs_objattr_t;

/* Thankfully, MINIX uses the universal UNIX mode values. */
#define VBOXFS_GET_MODE(mode)		((mode) & 0xffff)
#define VBOXFS_SET_MODE(type, perm)	((type) | ((perm) & ALLPERMS))

typedef struct {
	u64_t size;
	u64_t disksize;
	u64_t atime;
	u64_t mtime;
	u64_t ctime;
	u64_t crtime;
	vboxfs_objattr_t attr;
} vboxfs_objinfo_t;

#define VBOXFS_CRFLAG_LOOKUP		0x00000001
#define VBOXFS_CRFLAG_DIRECTORY		0x00000004
#define VBOXFS_CRFLAG_OPEN_IF_EXISTS	0x00000000
#define VBOXFS_CRFLAG_FAIL_IF_EXISTS	0x00000010
#define VBOXFS_CRFLAG_REPLACE_IF_EXISTS	0x00000020
#define VBOXFS_CRFLAG_TRUNC_IF_EXISTS	0x00000030
#define VBOXFS_CRFLAG_CREATE_IF_NEW	0x00000000
#define VBOXFS_CRFLAG_FAIL_IF_NEW	0x00000100
#define VBOXFS_CRFLAG_READ		0x00001000
#define VBOXFS_CRFLAG_WRITE		0x00002000
#define VBOXFS_CRFLAG_APPEND		0x00004000
#define VBOXFS_CRFLAG_READ_ATTR		0x00010000
#define VBOXFS_CRFLAG_WRITE_ATTR	0x00020000

typedef struct {
	vboxfs_handle_t handle;
	u32_t result;
	u32_t flags;
	vboxfs_objinfo_t info;
} vboxfs_crinfo_t;

typedef struct {
	vboxfs_objinfo_t info;
	u16_t shortlen;
	u16_t shortname[14];
	vboxfs_path_t name;	/* WARNING: name data size is dynamic! */
} vboxfs_dirinfo_t;

#define VBOXFS_INFO_GET		0x00	/* get file information */
#define VBOXFS_INFO_SET		0x01	/* set file information */

#define VBOXFS_INFO_SIZE	0x04	/* get/set file size */
#define VBOXFS_INFO_FILE	0x08	/* get/set file attributes */
#define VBOXFS_INFO_VOLUME	0x10	/* get volume information */

#define VBOXFS_REMOVE_FILE	0x01	/* remove file */
#define VBOXFS_REMOVE_DIR	0x02	/* remove directory */
#define VBOXFS_REMOVE_SYMLINK	0x04	/* remove symbolic link */

#define VBOXFS_RENAME_FILE	0x01	/* rename file */
#define VBOXFS_RENAME_DIR	0x02	/* rename directory */
#define VBOXFS_RENAME_REPLACE	0x04	/* replace target if it exists */

typedef struct {
	u32_t namemax;
	u8_t remote;
	u8_t casesens;
	u8_t readonly;
	u8_t unicode;
	u8_t fscomp;
	u8_t filecomp;
	u16_t reserved;
} vboxfs_fsprops_t;

typedef struct {
	u64_t total;
	u64_t free;
	u32_t blocksize;
	u32_t sectorsize;
	u32_t serial;
	vboxfs_fsprops_t props;
} vboxfs_volinfo_t;

#endif /* !_VBOXFS_VBOXFS_H */
