Current File : //usr/include/lofi.h
/*
 * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
 */

/*
 * This header file defines a private interface provided by liblofi.
 */

#ifndef	_LOFI_H
#define	_LOFI_H

#include <sys/types.h>
#include <sys/param.h>
#include <sys/lofi_common.h>

#ifdef	__cplusplus
extern "C" {
#endif

#ifndef _KERNEL

typedef	struct  lofi_usergroup {
	uid_t		lug_uid;			/* out */
	gid_t		lug_gid;			/* out */
} lofi_usergroup_t;

/* Parameters passed into liblofi for device creation. */
typedef struct lofi_setup_arg {
	char			ls_filepath[MAXPATHLEN];
	char			ls_devpath[MAXPATHLEN];
	boolean_t		ls_removable;
	boolean_t		ls_labeled;
	uint32_t		ls_blocksize;
	char			ls_key_filepath[MAXPATHLEN];
	boolean_t		ls_ephemeral_key;
	char			*ls_cipher;
	char			*ls_token;
	boolean_t		ls_usergroup_set;
	lofi_usergroup_t	ls_usergroup;
	boolean_t		ls_iocopy;
	int			ls_attach_delay_secs;
	int			ls_attach_delay_index;
	uint32_t		ls_io_mtbf;
	boolean_t		ls_nowc;
} lofi_setup_t;

/* Lofi device information reported back from liblofi. */
typedef struct lofi_info {
	uint32_t	li_id;
	char		li_filepath[MAXPATHLEN];
	char		li_devpath[MAXPATHLEN];
	uint32_t	li_ctrl;
	boolean_t	li_file_inaccessible;
	boolean_t	li_removable;
	boolean_t	li_labeled;
	boolean_t	li_encrypted;
	boolean_t	li_iocopy;
	boolean_t	li_indestructible;
	lofi_io_state_t	li_io_state;
	uid_t		li_uid;
	char		*li_user;
	gid_t		li_gid;
	char		*li_group;
	char		li_comp_algorithm[LOFI_MAXALGLEN];
	uint32_t	li_io_mtbf;
	boolean_t	li_nowc;
} lofi_info_t;

typedef enum lofi_update_cmd {
	LOFI_UPDATE_INVALID = -1,
	LOFI_UPDATE_USESEGMAP = 0,
	LOFI_UPDATE_LBLKSZ,
	LOFI_UPDATE_PBLKSZ,
	LOFI_UPDATE_DDI_NO_AUTODETACH,
	LOFI_UPDATE_INDESTRUCTIBLE,
	LOFI_UPDATE_IOSTATE,
	LOFI_UPDATE_IOMTBF,
	LOFI_UPDATE_NOWC
} lofi_update_cmd_t;

/*
 * Public opague handle returned from liblofi APIs.
 */
typedef struct __lofi_result *lofi_result_t;

/*
 * Interfaces for major lofi operations.
 */

/* Create lofi device. Will return lofi dev info in result. */
extern lofi_result_t lofi_setup(lofi_setup_t *req, lofi_info_t *info);
/* Destroy lofi device. */
extern lofi_result_t lofi_destroy(const char *path, boolean_t force,
    boolean_t cleanup);
/* Query lofi device. Will return lofi dev info in result. */
extern lofi_result_t lofi_query(const char *path, lofi_info_t *info);
/*
 * Query lofi device with the next bigger ID.
 * If filepath is provided, device queried must be mapped to that file.
 * Will return lofi dev info in result.
 */
extern lofi_result_t lofi_query_next(uint32_t id, const char *filepath,
    lofi_info_t *info);
/* Change lofi device parameters. */
extern lofi_result_t lofi_update(const char *devpath,
    lofi_update_cmd_t cmd, intptr_t val);
/* Compress a file. */
extern lofi_result_t lofi_compress(const char *filepath, const char *algname,
    uint32_t segsize);
/* Uncompress a file. */
extern lofi_result_t lofi_uncompress(const char *filepath);

/*
 * Helper interfaces.
 */
extern lofi_result_t lofi_valid_devpath(const char *devpath);
extern lofi_result_t lofi_devpath_to_id(const char *devpath,
    uint32_t *idp, boolean_t *labeledp);
extern void lofi_result_free(lofi_result_t result);
extern int lofi_result_err(lofi_result_t result);
extern const char *lofi_result_action_str(lofi_result_t result);
extern const char *lofi_result_error_str(lofi_result_t result);
extern char *lofi_property_to_str(lofi_info_t *dev);
extern lofi_result_t lofi_parse_usergroup(char *usergroup,
    lofi_usergroup_t *lu);

#endif /* !_KERNEL */

#ifdef	__cplusplus
}
#endif

#endif	/* _LOFI_H */