#ifndef _SYS_FS_HSFS_SUSP_H
#define _SYS_FS_HSFS_SUSP_H
#ifdef __cplusplus
extern "C" {
#endif
#define DEBUGGING_ALL 0
#define DEBUGGING 0
#define DPRINTF if (DEBUGGING) printf
#define DPRINTF_ALL if (DEBUGGING_ALL) printf
#define SUA_NULL_POINTER -1
#define END_OF_SUA_PARSING -2
#define END_OF_SUA -3
#define GET_CONTINUATION -4
#define SUA_ENOMEM -5
#define SUA_EINVAL -6
#define RELOC_DIR -7
#define SET_IMPL_BIT(fsp, y) ((fsp->hsfs_ext_impl) |= (0x01L) << (y))
#define UNSET_IMPL_BIT(fsp, y) ((fsp->hsfs_ext_impl) &= ~((0x01L) << (y)))
#define IS_IMPL_BIT_SET(fsp, y) ((fsp->hsfs_ext_impl) & ((0x01L) << (y)))
#define HAVE_SUSP 0
#define HAVE_PROHIBITED 1
#define SET_SUSP_BIT(fsp) (SET_IMPL_BIT((fsp), HAVE_SUSP))
#define UNSET_SUSP_BIT(fsp) (UNSET_IMPL_BIT((fsp), HAVE_SUSP))
#define IS_SUSP_IMPLEMENTED(fsp) (IS_IMPL_BIT_SET(fsp, 0) ? 1 : 0)
#define SUSP_VERSION 1
#define SUSP_SP "SP"
#define SUSP_CE "CE"
#define SUSP_PD "PD"
#define SUSP_ER "ER"
#define SUSP_ST "ST"
#define SUF_SIG_LEN 2
#define SUF_MIN_LEN 4
#define SUF_LEN(x) *(SUF_len(x))
#define SUF_len(x) (&((uchar_t *)x)[2])
#define SUF_VER(x) *(SUF_ver(x))
#define SUF_ver(x) (&((uchar_t *)x)[3])
#define ER_ID_LEN(x) *(ER_id_len(x))
#define ER_id_len(x) (&((uchar_t *)x)[4])
#define ER_DES_LEN(x) *(ER_des_len(x))
#define ER_des_len(x) (&((uchar_t *)x)[5])
#define ER_SRC_LEN(x) *(ER_src_len(x))
#define ER_src_len(x) (&((uchar_t *)x)[6])
#define ER_EXT_VER(x) *(ER_ext_ver(x))
#define ER_ext_ver(x) (&((uchar_t *)x)[7])
#define ER_EXT_ID_LOC 8
#define ER_ext_id(x) (&((uchar_t *)x)[ER_EXT_ID_LOC])
#define ER_ext_des(x) (&((uchar_t *)x)[ER_EXT_ID_LOC + ER_ID_LEN(x)])
#define ER_ext_src(x) (&((uchar_t *)x)[ER_EXT_ID_LOC + ER_ID_LEN(x) + \
ER_DES_LEN(x)])
#define CE_BLK_LOC(x) BOTH_INT(CE_blk_loc(x))
#define CE_blk_loc(x) (&((uchar_t *)x)[4])
#define CE_OFFSET(x) BOTH_INT(CE_offset(x))
#define CE_offset(x) (&((uchar_t *)x)[12])
#define CE_CONT_LEN(x) BOTH_INT(CE_cont_len(x))
#define CE_cont_len(x) (&((uchar_t *)x)[20])
#define SP_CHK_BYTE_1(x) *(SP_chk_byte_1(x))
#define SP_chk_byte_1(x) (&((uchar_t *)x)[4])
#define SP_CHK_BYTE_2(x) *(SP_chk_byte_2(x))
#define SP_chk_byte_2(x) (&((uchar_t *)x)[5])
#define SUSP_CHECK_BYTE_1 (uchar_t)0xBE
#define SUSP_CHECK_BYTE_2 (uchar_t)0xEF
#define CHECK_BYTES_OK(x) ((SP_CHK_BYTE_1(x) == SUSP_CHECK_BYTE_1) && \
(SP_CHK_BYTE_2(x) == SUSP_CHECK_BYTE_2))
#define SP_SUA_OFFSET(x) *(SP_sua_offset(x))
#define SP_sua_offset(x) (&((uchar_t *)x)[6])
#ifdef _KERNEL
extern uchar_t *share_protocol();
extern uchar_t *share_ext_ref();
extern uchar_t *share_continue();
extern uchar_t *share_padding();
extern uchar_t *share_stop();
#endif
struct extension_signature_struct {
char *ext_signature;
uchar_t *(*sig_handler)();
};
typedef struct extension_signature_struct ext_signature_t;
struct extension_name_struct {
char *extension_name;
ushort_t ext_version;
ext_signature_t *signature_table;
};
typedef struct extension_name_struct extension_name_t;
struct cont_info_struct {
uint_t cont_lbn;
uint_t cont_offset;
uint_t cont_len;
};
typedef struct cont_info_struct cont_info_t;
struct sig_args_struct {
uchar_t *dirp;
uchar_t *name_p;
int *name_len_p;
short flags;
ulong_t name_flags;
uchar_t *SUF_ptr;
struct hs_direntry *hdp;
struct hsfs *fsp;
cont_info_t *cont_info_p;
};
typedef struct sig_args_struct sig_args_t;
#ifdef _KERNEL
extern ext_signature_t rrip_signature_table[];
extern ext_signature_t susp_signature_table[];
extern extension_name_t extension_name_table[];
extern ext_signature_t *susp_sp;
extern int parse_sua(uchar_t *, int *name_len_p, int *, uchar_t *, uint_t,
struct hs_direntry *, struct hsfs *, uchar_t *, int search_num);
#endif
#ifdef __cplusplus
}
#endif
#endif