#ifndef _SYS_FS_UDF_VOLUME_H
#define _SYS_FS_UDF_VOLUME_H
#include <sys/isa_defs.h>
#ifdef __cplusplus
extern "C" {
#endif
#define UDF_102 0x66
#define UDF_150 0x96
#define UDF_200 0xC8
#define FID_LEN(fid) (((sizeof (struct file_id) + \
SWAP_16((fid)->fid_iulen) + (fid)->fid_idlen - 2) + 3) & ~3)
#define F_LEN (sizeof (struct file_id) - 2)
#define UDF_DOMAIN_NAME "*OSTA UDF Compliant\0\0\0\0"
#define UDF_LV_INFO "*UDF LV Info\0\0\0\0\0\0\0\0\0\0\0\0"
#define UDF_FREEEASPACE "*UDF FreeEASpace\0\0\0\0\0\0\0\0"
#define UDF_FREEAEASPACE "*UDF FreeAppEASpace\0\0\0\0"
#define UDF_CGMS_INFO "*UDF DVD CGMS Info\0\0\0\0"
#define UDF_OS2_EA "*UDF OS/2 EA\0\0\0\0\0\0\0\0\0\0\0"
#define UDF_OS2_EA_LEN "*UDF OS/2 EALength\0\0\0\0\0\0"
#define UDF_MAC_VOLINFO "*UDF Mac VolumeInfo\0\0\0\0"
#define UDF_MAC_UNIQID "*UDF Mac UniqueIDTable\0"
#define UDF_MAC_RESFRK "*UDF Mac ResourceFork\0\0"
#define UDF_VIRT_PART "*UDF Virtual Partition\0"
#define UDF_SPAR_PART "*UDF Sparable Partition"
#define UDF_VAT "*UDF Virtual Alloc Tbl\0"
#define UDF_SPAR_TBL "*UDF Sparing Table\0\0\0\0\0"
#if defined(_BIG_ENDIAN)
#define SWAP_16(a) (((ushort_t)((a) & 0xff) << 8) | \
((ushort_t)((a) & 0xff00) >> 8))
#define SWAP_32(a) ((((a) & 0xff) << 24) | \
(((a) & 0xff00) << 8) | \
(((a) & 0xff0000) >> 8) | \
(((a) & 0xff000000) >> 24))
#define SWAP_64(a) ((((a) & 0xffULL) << 56) | \
(((a) & 0xff00ULL) << 40) | \
(((a) & 0xff0000ULL) << 24) | \
(((a) & 0xff000000ULL) << 8) | \
(((a) & 0xff00000000ULL) >> 8) | \
(((a) & 0xff0000000000ULL) >> 24) | \
(((a) & 0xff000000000000ULL) >> 40) | \
(((a) & 0xff00000000000000ULL) >> 56))
#define GET_32(a) ((uint32_t)(*((uint8_t *)a)) | \
(((uint32_t)(*(((uint8_t *)a) + 1))) << 8) | \
(((uint32_t)(*(((uint8_t *)a) + 2))) << 16) | \
(((uint32_t)(*(((uint8_t *)a) + 3))) << 24))
#else
#define SWAP_16(a) (a)
#define SWAP_32(a) (a)
#define SWAP_64(a) (a)
#define GET_32(a) (*((uint32_t *)a))
#endif
#define BCD2HEX_16(a) (((a) & 0xf) + \
(((ushort_t)((a) & 0xf0) >> 4) * 10) + \
(((ushort_t)((a) & 0xf00) >> 8) * 100) + \
(((ushort_t)((a) & 0xf000) >> 12) * 1000))
#define HEX2BCD_16(a) ((((ushort_t)a) % 10) | \
(((ushort_t)((ushort_t)(a) / 10) % 10) << 4) | \
(((ushort_t)((ushort_t)(a) / 100) % 10) << 8) | \
(((ushort_t)((ushort_t)(a) / 1000) % 10) << 12))
#define ANCHOR_VOL_DESC_LOC (256)
#define ANCHOR_VOL_DESC_LEN 0x200
typedef char dstring_t;
struct tag {
uint16_t tag_id;
uint16_t tag_desc_ver;
uint8_t tag_cksum;
uint8_t tag_res;
uint16_t tag_sno;
uint16_t tag_crc;
uint16_t tag_crc_len;
uint32_t tag_loc;
};
typedef struct tag tag_t;
#define UD_PRI_VOL_DESC 0x0001
#define UD_ANCH_VOL_DESC 0x0002
#define UD_VOL_DESC_PTR 0x0003
#define UD_IMPL_USE_DESC 0x0004
#define UD_PART_DESC 0x0005
#define UD_LOG_VOL_DESC 0x0006
#define UD_UNALL_SPA_DESC 0x0007
#define UD_TERM_DESC 0x0008
#define UD_LOG_VOL_INT 0x0009
#define UD_FILE_SET_DESC 0x0100
#define UD_FILE_ID_DESC 0x0101
#define UD_ALLOC_EXT_DESC 0x0102
#define UD_INDIRECT_ENT 0x0103
#define UD_TERMINAL_ENT 0x0104
#define UD_FILE_ENTRY 0x0105
#define UD_EXT_ATTR_HDR 0x0106
#define UD_UNALL_SPA_ENT 0x0107
#define UD_SPA_BMAP_DESC 0x0108
#define UD_PART_INT_DESC 0x0109
#define UD_EXT_FILE_ENT 0x010A
struct charspec {
uint8_t cs_type;
char cs_info[63];
};
typedef struct charspec charspec_t;
#define CS_TYPE0 0x00
#define CS_TYPE1 0x01
#define CS_TYPE2 0x02
#define CS_TYPE3 0x03
#define CS_TYPE4 0x04
#define CS_TYPE5 0x05
#define CS_TYPE6 0x06
#define CS_TYPE7 0x07
#define CS_TYPE8 0x08
struct regid {
uint8_t reg_flags;
char reg_id[23];
char reg_ids[8];
};
typedef struct regid regid_t;
#define EI_FLAG_DIRTY 0x00
#define EI_FLAG_PROT 0x01
struct lb_addr {
char lba_aaa[6];
};
typedef struct lb_addr lb_addr_t;
#define lba_number(x)(((x)->lba_aaa[0]) | \
((x)->lba_aaa[1] << 8) | \
((x)->lba_aaa[2] << 16) | \
((x)->lba_aaa[3] << 24))
#define lba_prn(x) ((x)->lba_aaa[4] | ((x)->lba_aaa[5] << 8))
struct extent_ad {
uint32_t ext_len;
uint32_t ext_loc;
};
typedef struct extent_ad extent_ad_t;
struct short_ad {
uint32_t sad_ext_len;
uint32_t sad_ext_loc;
};
typedef struct short_ad short_ad_t;
struct long_ad {
uint32_t lad_ext_len;
uint32_t lad_ext_loc;
uint16_t lad_ext_prn;
char lad_iu[6];
};
typedef struct long_ad long_ad_t;
struct tstamp {
uint16_t ts_tzone;
uint16_t ts_year;
uint8_t ts_month;
uint8_t ts_day;
uint8_t ts_hour;
uint8_t ts_min;
uint8_t ts_sec;
uint8_t ts_csec;
uint8_t ts_husec;
uint8_t ts_usec;
};
typedef struct tstamp tstamp_t;
#define TMODE 0xF000
#define TSIGN 0x0800
#define TOFFSET 0x07FF
#define TINVALID (TSIGN|TOFFSET)
struct icb_tag {
uint32_t itag_prnde;
uint16_t itag_strategy;
uint16_t itag_param;
uint16_t itag_max_ent;
uint8_t itag_rsvd;
uint8_t itag_ftype;
uint32_t itag_lb_loc;
uint16_t itag_lb_prn;
uint16_t itag_flags;
};
typedef struct icb_tag icb_tag_t;
#define STRAT_TYPE1 0x0001
#define STRAT_TYPE2 0x0002
#define STRAT_TYPE3 0x0003
#define STRAT_TYPE4 0x0004
#define STRAT_TYPE4096 0x1000
#define FTYPE_UNALL_SPACE 0x01
#define FTYPE_PART_INTEG 0x02
#define FTYPE_INDIRECT 0x03
#define FTYPE_DIRECTORY 0x04
#define FTYPE_FILE 0x05
#define FTYPE_BLOCK_DEV 0x06
#define FTYPE_CHAR_DEV 0x07
#define FTYPE_EAR 0x08
#define FTYPE_FIFO 0x09
#define FTYPE_C_ISSOCK 0x0A
#define FTYPE_T_ENTRY 0x0B
#define FTYPE_SYMLINK 0x0C
#define ICB_FLAG_SHORT_AD 0x0000
#define ICB_FLAG_LONG_AD 0x0001
#define ICB_FLAG_EXT_AD 0x0002
#define ICB_FLAG_ONE_AD 0x0003
#define ICB_FLAG_SORTED 0x0008
#define ICB_FLAG_NON_RELOC 0x0010
#define ICB_FLAG_ARCHIVE 0x0020
#define ICB_FLAG_SETUID 0x0040
#define ICB_FLAG_SETGID 0x0080
#define ICB_FLAG_STICKY 0x0100
#define ICB_FLAG_CONTIG 0x0200
#define ICB_FLAG_SYSTEM 0x0400
#define ICB_FLAG_TRNSFRMED 0x0800
#define ICB_FLAG_MVERS 0x1000
struct pri_vol_desc {
tag_t pvd_tag;
uint32_t pvd_vdsn;
uint32_t pvd_pvdn;
dstring_t pvd_vol_id[32];
uint16_t pvd_vsn;
uint16_t pvd_mvsn;
uint16_t pvd_il;
uint16_t pvd_mil;
uint32_t pvd_csl;
uint32_t pvd_mcsl;
dstring_t pvd_vsi[128];
charspec_t pvd_desc_cs;
charspec_t pvd_exp_cs;
extent_ad_t pvd_vol_abs;
extent_ad_t pvd_vcn;
regid_t pvd_appl_id;
tstamp_t pvd_time;
regid_t pvd_ii;
char pvd_iu[64];
uint32_t pvd_pvdsl;
uint16_t pvd_flags;
uint8_t pvd_res[22];
};
struct anch_vol_desc_ptr {
tag_t avd_tag;
extent_ad_t avd_main_vdse;
extent_ad_t avd_res_vdse;
char avd_res[480];
};
typedef struct anch_vol_desc_ptr anch_vol_desc_ptr_t;
struct vol_desc_ptr {
tag_t vdp_tag;
uint32_t vdp_vdsn;
extent_ad_t vdp_nvdse;
uint8_t vdp_res[484];
};
typedef struct vol_desc_ptr vol_desc_ptr_t;
struct iuvd_desc {
tag_t iuvd_tag;
uint32_t iuvd_vdsn;
regid_t iuvd_ii;
charspec_t iuvd_cset;
dstring_t iuvd_lvi[128];
dstring_t iuvd_ifo1[36];
dstring_t iuvd_ifo2[36];
dstring_t iuvd_ifo3[36];
regid_t iuvd_iid;
uint8_t iuvd_iu[128];
};
typedef struct iuvd_desc iuvd_desc_t;
struct part_desc {
tag_t pd_tag;
uint32_t pd_vdsn;
uint16_t pd_pflags;
uint16_t pd_pnum;
regid_t pd_pcontents;
uint8_t pd_pc_use[128];
uint32_t pd_acc_type;
uint32_t pd_part_start;
uint32_t pd_part_length;
regid_t pd_ii;
uint8_t pd_iu[128];
uint8_t pd_res[156];
};
typedef struct part_desc part_desc_t;
#define PART_ACC_RO 0x01
#define PART_ACC_WO 0x02
#define PART_ACC_RW 0x03
#define PART_ACC_OW 0x04
struct phdr_desc {
struct short_ad phdr_ust;
struct short_ad phdr_usb;
struct short_ad phdr_it;
struct short_ad phdr_fst;
struct short_ad phdr_fsb;
};
typedef struct phdr_desc phdr_desc_t;
struct log_vol_desc {
tag_t lvd_tag;
uint32_t lvd_vdsn;
charspec_t lvd_desc_cs;
dstring_t lvd_lvid[128];
uint32_t lvd_log_bsize;
regid_t lvd_dom_id;
long_ad_t lvd_lvcu;
uint32_t lvd_mtbl_len;
uint32_t lvd_num_pmaps;
regid_t lvd_ii;
uint8_t lvd_iu[128];
extent_ad_t lvd_int_seq_ext;
uint8_t lvd_pmaps[72];
};
typedef struct log_vol_desc log_vol_desc_t;
struct unall_spc_desc {
tag_t ua_tag;
uint32_t ua_vdsn;
uint32_t ua_nad;
uint8_t ua_al_dsc[488];
};
typedef struct unall_spc_desc unall_spc_desc_t;
struct term_desc {
tag_t td_tag;
uint8_t td_res[496];
};
typedef struct term_desc term_desc_t;
struct log_vol_hdr_desc {
uint64_t lvhd_uniqid;
uint8_t lvhd_pad[24];
};
typedef struct log_vol_hdr_desc log_vol_hdr_desc_t;
struct log_vol_int_desc {
tag_t lvid_tag;
tstamp_t lvid_tstamp;
uint32_t lvid_int_type;
extent_ad_t lvid_nie;
log_vol_hdr_desc_t lvid_lvcu;
uint32_t lvid_npart;
uint32_t lvid_liu;
uint32_t lvid_fst[2];
};
typedef struct log_vol_int_desc log_vol_int_desc_t;
#define lvid_uniqid lvid_lvcu.lvhd_uniqid
#define LOG_VOL_OPEN_INT 0x00
#define LOG_VOL_CLOSE_INT 0x01
struct lvid_iu {
regid_t lvidiu_regid;
uint32_t lvidiu_nfiles;
uint32_t lvidiu_ndirs;
uint16_t lvidiu_mread;
uint16_t lvidiu_mwrite;
uint16_t lvidiu_maxwr;
};
struct file_set_desc {
tag_t fsd_tag;
tstamp_t fsd_time;
uint16_t fsd_ilevel;
uint16_t fsd_mi_level;
uint32_t fsd_cs_list;
uint32_t fsd_mcs_list;
uint32_t fsd_fs_no;
uint32_t fsd_fsd_no;
charspec_t fsd_lvidcs;
char fsd_lvid[128];
charspec_t fsd_fscs;
char fsd_fsi[32];
char fsd_cfi[32];
char fsd_afi[32];
long_ad_t fsd_root_icb;
regid_t fsd_did;
long_ad_t fsd_next;
uint8_t fsd_res[48];
};
typedef struct file_set_desc file_set_desc_t;
struct file_id {
tag_t fid_tag;
uint16_t fid_ver;
uint8_t fid_flags;
uint8_t fid_idlen;
long_ad_t fid_icb;
uint16_t fid_iulen;
uint8_t fid_spec[2];
};
typedef struct file_id file_id_t;
#define FID_EXIST 0x01
#define FID_DIR 0x02
#define FID_DELETED 0x04
#define FID_PARENT 0x08
struct alloc_ext_desc {
tag_t aed_tag;
uint32_t aed_rev_ael;
uint32_t aed_len_aed;
};
typedef struct alloc_ext_desc alloc_ext_desc_t;
struct indirect_entry {
tag_t ie_tag;
icb_tag_t ie_icb_tag;
long_ad_t ie_indirecticb;
};
typedef struct indirect_entry indirect_entry_t;
struct term_entry {
tag_t te_tag;
icb_tag_t te_icb_tag;
};
typedef struct term_entry term_entry_t;
struct file_entry {
tag_t fe_tag;
icb_tag_t fe_icb_tag;
uint32_t fe_uid;
uint32_t fe_gid;
uint32_t fe_perms;
uint16_t fe_lcount;
uint8_t fe_rec_for;
uint8_t fe_rec_dis;
uint32_t fe_rec_len;
uint64_t fe_info_len;
uint64_t fe_lbr;
tstamp_t fe_acc_time;
tstamp_t fe_mod_time;
tstamp_t fe_attr_time;
uint32_t fe_ckpoint;
long_ad_t fe_ea_icb;
regid_t fe_impl_id;
uint64_t fe_uniq_id;
uint32_t fe_len_ear;
uint32_t fe_len_adesc;
char fe_spec[336];
};
typedef struct file_entry file_entry_t;
struct ext_attr_hdr {
tag_t eah_tag;
uint32_t eah_ial;
uint32_t eah_aal;
};
typedef struct ext_attr_hdr ext_attr_hdr_t;
struct unall_space_ent {
tag_t use_tag;
icb_tag_t use_icb_tag;
uint32_t use_len_ad;
uint8_t use_ad[484];
};
typedef struct unall_space_ent unall_space_ent_t;
struct space_bmap_desc {
tag_t sbd_tag;
uint32_t sbd_nbits;
uint32_t sbd_nbytes;
uint8_t sbd_bmap[500];
};
typedef struct space_bmap_desc space_bmap_desc_t;
struct part_int_desc {
tag_t pid_tag;
icb_tag_t pid_idb_tag;
tstamp_t pid_rtime;
uint8_t pid_integ;
uint8_t pid_res[175];
regid_t pid_ii;
uint8_t pid_iu[256];
};
typedef struct part_int_desc part_int_desc_t;
#define PART_OPEN_INT 0x00
#define PART_CLOSE_INT 0x01
#define PART_STABLE_INT 0x02
struct attr_hdr {
uint32_t ahdr_atype;
uint8_t ahdr_astype;
uint8_t ahdr_res[3];
uint32_t ahdr_length;
uint8_t ahdr_data[4];
};
struct dev_spec_ear {
uint32_t ds_atype;
uint8_t ds_astype;
uint8_t ds_res[3];
uint32_t ds_attr_len;
uint32_t ds_iu_len;
uint32_t ds_major_id;
uint32_t ds_minor_id;
uint8_t ds_iu[4];
};
struct ftimes_ear {
uint32_t ft_atype;
uint8_t ft_astype;
uint8_t ft_res[3];
uint32_t ft_attr_len;
uint32_t ft_data_len;
uint32_t ft_exist;
uint8_t ft_ft[4];
};
#define FT_EXIST 0x0
#define FT_DELETE 0x2
#define FT_FEDT 0x3
#define FT_BACKUP 0x5
struct iu_ea {
uint32_t iuea_atype;
uint8_t iuea_astype;
uint8_t iuea_res[3];
uint32_t iuea_attr_len;
uint32_t iuea_iu_len;
regid_t iuea_ii;
uint8_t iuea_iu[4];
};
struct copy_mgt_info {
uint16_t cgms_cksum;
uint8_t cgms_info;
uint8_t cgms_dstype;
uint32_t cgms_psi;
};
#define COPY_PROTECTED 0x80
struct FREE_SPACE {
uint16_t fs_cksum;
uint8_t fs_freesp[2];
};
struct nsr_desc {
uint8_t nsr_str_type;
uint8_t nsr_id[5];
uint8_t nsr_ver;
uint8_t nsr_res;
uint8_t nsr_data[2040];
};
struct pmap_hdr {
uint8_t maph_type;
uint8_t maph_length;
};
#define MAP_TYPE1 1
#define MAP_TYPE2 2
#define MAP_TYPE1_LEN 6
#define MAP_TYPE2_LEN 64
struct pmap_typ1 {
uint8_t map1_type;
uint8_t map1_length;
uint16_t map1_vsn;
uint16_t map1_pn;
};
struct pmap_typ2 {
uint8_t map2_type;
uint8_t map2_length;
uint16_t map2_pad1;
regid_t map2_pti;
uint16_t map2_vsn;
uint16_t map2_pn;
uint16_t map2_pl;
uint8_t map2_nst;
uint8_t map2_pad2;
uint32_t map2_sest;
uint32_t map2_st[4];
};
struct stbl_entry {
uint32_t sent_ol;
uint32_t sent_ml;
};
typedef struct stbl_entry stbl_entry_t;
struct stbl {
tag_t stbl_tag;
regid_t stbl_si;
uint16_t stbl_len;
uint16_t stbl_res1;
uint32_t stbl_seqno;
stbl_entry_t stbl_entry;
};
struct path_comp {
uint8_t pc_type;
uint8_t pc_len;
uint16_t pc_ver;
uint8_t pc_id[4];
};
#ifdef __cplusplus
}
#endif
#endif