1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _SYS_FS_HSFS_ISOSPEC_H 27 #define _SYS_FS_HSFS_ISOSPEC_H 28 29 #pragma ident "%Z%%M% %I% %E% SMI" 30 31 /* 32 * ISO 9660 filesystem specification 33 */ 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 /* macros to parse binary integers */ 40 #define ZERO(x) (uint_t)(((uchar_t *)(x))[0]) 41 #define ONE(x) (uint_t)(((uchar_t *)(x))[1]) 42 #define TWO(x) (uint_t)(((uchar_t *)(x))[2]) 43 #define THREE(x) (uint_t)(((uchar_t *)(x))[3]) 44 45 #define MSB_INT(x) \ 46 ((((((ZERO(x) << 8) | ONE(x)) << 8) | TWO(x)) << 8) | THREE(x)) 47 #define LSB_INT(x) \ 48 ((((((THREE(x) << 8) | TWO(x)) << 8) | ONE(x)) << 8) | ZERO(x)) 49 #define MSB_SHORT(x) ((ZERO(x) << 8) | ONE(x)) 50 #define LSB_SHORT(x) ((ONE(x) << 8) | ZERO(x)) 51 52 #if defined(__i386) || defined(__amd64) 53 #define BOTH_SHORT(x) (short)*((short *)x) 54 #define BOTH_INT(x) (int)*((int *)x) 55 #elif defined(__sparc) 56 /* 57 * SPARC machines require that integers must 58 * be aligned on a full word boundary. CD-ROM data aligns 59 * to even word boundary only. Because of this mismatch, 60 * we have to move integer data from CD-ROM to memory one 61 * byte at a time. LSB data starts first. We therefore 62 * use this to do byte by byte copying. 63 */ 64 #define BOTH_SHORT(x) LSB_SHORT(x) 65 #define BOTH_INT(x) LSB_INT(x) 66 #endif 67 68 /* 69 * The following describes actual on-disk structures. 70 * To achieve portability, all structures are #defines 71 * rather than a structure definition. Macros are provided 72 * to get either the data or address of individual fields. 73 */ 74 75 /* Overall High Sierra disk structure */ 76 #define ISO_SECTOR_SIZE 2048 /* bytes per logical sector */ 77 #define ISO_SECTOR_SHIFT 11 /* sector<->byte shift count */ 78 #define ISO_SEC_PER_PAGE (PAGESIZE/HS_SECTOR_SIZE) 79 /* sectors per page */ 80 #define ISO_SYSAREA_SEC 0 /* 1st sector of system area */ 81 #define ISO_VOLDESC_SEC 16 /* 1st sector of volume descriptors */ 82 #define MAXISOOFFSET (ISO_SECTOR_SIZE - 1) 83 #define MAXISOMASK (~MAXISOOFFSET) 84 85 86 /* Standard File Structure Volume Descriptor */ 87 88 enum iso_voldesc_type { 89 ISO_VD_BOOT = 0, ISO_VD_PVD = 1, ISO_VD_SVD = 2, ISO_VD_VPD = 3, 90 ISO_VD_EOV = 255 91 }; 92 #define ISO_ID_STRING "CD001" /* ISO_std_id field */ 93 #define ISO_ID_STRLEN 5 /* ISO_std_id field length */ 94 #define ISO_ID_VER 1 /* ISO_std_ver field ISO-9660:1988 */ 95 #define ISO_ID_VER2 2 /* ISO_std_ver field ISO-9660:1999 */ 96 #define ISO_FILE_STRUCT_ID_VER 1 /* ISO_file structure version field */ 97 #define ISO_SYS_ID_STRLEN 32 98 #define ISO_VOL_ID_STRLEN 32 99 #define ISO_VOL_SET_ID_STRLEN 128 100 #define ISO_PUB_ID_STRLEN 128 101 #define ISO_PREP_ID_STRLEN 128 102 #define ISO_APPL_ID_STRLEN 128 103 #define ISO_COPYR_ID_STRLEN 37 104 #define ISO_ABSTR_ID_STRLEN 37 105 #define ISO_SHORT_DATE_LEN 7 106 #define ISO_DATE_LEN 17 107 108 109 110 /* macros to get the address of each field */ 111 #define ISO_desc_type(x) (&((uchar_t *)x)[0]) 112 #define ISO_std_id(x) (&((uchar_t *)x)[1]) 113 #define ISO_std_ver(x) (&((uchar_t *)x)[6]) 114 #define ISO_sys_id(x) (&((uchar_t *)x)[8]) 115 #define ISO_vol_id(x) (&((uchar_t *)x)[40]) 116 #define ISO_vol_size(x) (&((uchar_t *)x)[80]) 117 #define ISO_svd_esc(x) (&((uchar_t *)x)[88]) /* Supplemental VD */ 118 #define ISO_set_size(x) (&((uchar_t *)x)[120]) 119 #define ISO_set_seq(x) (&((uchar_t *)x)[124]) 120 #define ISO_blk_size(x) (&((uchar_t *)x)[128]) 121 #define ISO_ptbl_size(x) (&((uchar_t *)x)[132]) 122 #define ISO_ptbl_man_ls(x) (&((uchar_t *)x)[140]) 123 #define ISO_ptbl_opt_ls1(x) (&((uchar_t *)x)[144]) 124 #define ISO_ptbl_man_ms(x) (&((uchar_t *)x)[148]) 125 #define ISO_ptbl_opt_ms1(x) (&((uchar_t *)x)[152]) 126 #define ISO_root_dir(x) (&((uchar_t *)x)[156]) 127 #define ISO_vol_set_id(x) (&((uchar_t *)x)[190]) 128 #define ISO_pub_id(x) (&((uchar_t *)x)[318]) 129 #define ISO_prep_id(x) (&((uchar_t *)x)[446]) 130 #define ISO_appl_id(x) (&((uchar_t *)x)[574]) 131 #define ISO_copyr_id(x) (&((uchar_t *)x)[702]) 132 #define ISO_abstr_id(x) (&((uchar_t *)x)[739]) 133 #define ISO_bibli_id(x) (&((uchar_t *)x)[776]) 134 #define ISO_cre_date(x) (&((uchar_t *)x)[813]) 135 #define ISO_mod_date(x) (&((uchar_t *)x)[830]) 136 #define ISO_exp_date(x) (&((uchar_t *)x)[847]) 137 #define ISO_eff_date(x) (&((uchar_t *)x)[864]) 138 #define ISO_file_struct_ver(x) (&((uchar_t *)x)[881]) 139 140 /* macros to get the values of each field (strings are returned as ptrs) */ 141 #define ISO_DESC_TYPE(x) ((enum hs_voldesc_type)*(ISO_desc_type(x))) 142 #define ISO_STD_ID(x) ISO_std_id(x) 143 #define ISO_STD_VER(x) *(ISO_std_ver(x)) 144 #define ISO_SYS_ID(x) ISO_sys_id(x) 145 #define ISO_VOL_ID(x) ISO_vol_id(x) 146 #define ISO_VOL_SIZE(x) BOTH_INT(ISO_vol_size(x)) 147 #define ISO_SET_SIZE(x) BOTH_SHORT(ISO_set_size(x)) 148 #define ISO_SET_SEQ(x) BOTH_SHORT(ISO_set_seq(x)) 149 #define ISO_BLK_SIZE(x) BOTH_SHORT(ISO_blk_size(x)) 150 #define ISO_PTBL_SIZE(x) BOTH_INT(ISO_ptbl_size(x)) 151 #define ISO_PTBL_MAN_LS(x) LSB_INT(ISO_ptbl_man_ls(x)) 152 #define ISO_PTBL_OPT_LS1(x) LSB_INT(ISO_ptbl_opt_ls1(x)) 153 #define ISO_PTBL_MAN_MS(x) MSB_INT(ISO_ptbl_man_ms(x)) 154 #define ISO_PTBL_OPT_MS1(x) MSB_INT(ISO_ptbl_opt_ms1(x)) 155 #define ISO_ROOT_DIR(x) ISO_root_dir(x) 156 #define ISO_VOL_SET_ID(x) ISO_vol_set_id(x) 157 #define ISO_PUB_ID(x) ISO_pub_id(x) 158 #define ISO_PREP_ID(x) ISO_prep_id(x) 159 #define ISO_APPL_ID(x) ISO_appl_id(x) 160 #define ISO_COPYR_ID(x) ISO_copyr_id(x) 161 #define ISO_ABSTR_ID(x) ISO_abstr_id(x) 162 #define ISO_BIBLI_ID(x) ISO_bibli_id(x) 163 #define ISO_CRE_DATE(x) HSV_cre_date(x) 164 #define ISO_MOD_DATE(x) HSV_mod_date(x) 165 #define ISO_EXP_DATE(x) HSV_exp_date(x) 166 #define ISO_EFF_DATE(x) HSV_eff_date(x) 167 #define ISO_FILE_STRUCT_VER(x) *(ISO_file_struct_ver(x)) 168 169 /* Standard File Structure Volume Descriptor date fields */ 170 #define ISO_DATE_2DIG(x) ((((x)[0] - '0') * 10) + \ 171 ((x)[1] - '0')) 172 #define ISO_DATE_4DIG(x) ((((x)[0] - '0') * 1000) + \ 173 (((x)[1] - '0') * 100) + \ 174 (((x)[2] - '0') * 10) + \ 175 ((x)[3] - '0')) 176 #define ISO_DATE_YEAR(x) ISO_DATE_4DIG(&((uchar_t *)x)[0]) 177 #define ISO_DATE_MONTH(x) ISO_DATE_2DIG(&((uchar_t *)x)[4]) 178 #define ISO_DATE_DAY(x) ISO_DATE_2DIG(&((uchar_t *)x)[6]) 179 #define ISO_DATE_HOUR(x) ISO_DATE_2DIG(&((uchar_t *)x)[8]) 180 #define ISO_DATE_MIN(x) ISO_DATE_2DIG(&((uchar_t *)x)[10]) 181 #define ISO_DATE_SEC(x) ISO_DATE_2DIG(&((uchar_t *)x)[12]) 182 #define ISO_DATE_HSEC(x) ISO_DATE_2DIG(&((uchar_t *)x)[14]) 183 #define ISO_DATE_GMTOFF(x) (((char *)x)[16]) 184 185 186 187 /* Directory Entry (Directory Record) */ 188 #define IDE_ROOT_DIR_REC_SIZE 34 /* size of root directory record */ 189 #define IDE_FDESIZE 33 /* fixed size for hsfs directory area */ 190 /* max size of a name */ 191 #define IDE_MAX_NAME_LEN (255 - IDE_FDESIZE) 192 193 194 /* macros to get the address of each field */ 195 #define IDE_dir_len(x) (&((uchar_t *)x)[0]) 196 #define IDE_xar_len(x) (&((uchar_t *)x)[1]) 197 #define IDE_ext_lbn(x) (&((uchar_t *)x)[2]) 198 #define IDE_ext_size(x) (&((uchar_t *)x)[10]) 199 #define IDE_cdate(x) (&((uchar_t *)x)[18]) 200 #define IDE_flags(x) (&((uchar_t *)x)[25]) 201 #define IDE_intrlv_size(x) (&((uchar_t *)x)[26]) 202 #define IDE_intrlv_skip(x) (&((uchar_t *)x)[27]) 203 #define IDE_vol_set(x) (&((uchar_t *)x)[28]) 204 #define IDE_name_len(x) (&((uchar_t *)x)[32]) 205 #define IDE_name(x) (&((uchar_t *)x)[33]) 206 #define IDE_sys_use_area(x) (&((uchar_t *)x)[IDE_NAME_LEN(x) + \ 207 IDE_PAD_LEN(x)] + IDE_FDESIZE) 208 209 /* macros to get the values of each field (strings are returned as ptrs) */ 210 #define IDE_DIR_LEN(x) *(IDE_dir_len(x)) 211 #define IDE_XAR_LEN(x) *(IDE_xar_len(x)) 212 #define IDE_EXT_LBN(x) BOTH_INT(IDE_ext_lbn(x)) 213 #define IDE_EXT_SIZE(x) BOTH_INT(IDE_ext_size(x)) 214 #define IDE_CDATE(x) IDE_cdate(x) 215 #define IDE_FLAGS(x) *(IDE_flags(x)) 216 #define IDE_INTRLV_SIZE(x) *(IDE_intrlv_size(x)) 217 #define IDE_INTRLV_SKIP(x) *(IDE_intrlv_skip(x)) 218 #define IDE_VOL_SET(x) BOTH_SHORT(IDE_vol_set(x)) 219 #define IDE_NAME_LEN(x) *(IDE_name_len(x)) 220 #define IDE_NAME(x) IDE_name(x) 221 #define IDE_PAD_LEN(x) ((IDE_NAME_LEN(x) % 2) ? 0 : 1) 222 #define IDE_SUA_LEN(x) ((int)(IDE_DIR_LEN(x)) - (int)(IDE_FDESIZE) - \ 223 (int)(IDE_NAME_LEN(x)) - (int)(IDE_PAD_LEN(x))) 224 225 /* mask bits for IDE_FLAGS */ 226 #define IDE_EXISTENCE 0x01 /* zero if file exists */ 227 #define IDE_DIRECTORY 0x02 /* zero if file is not a directory */ 228 #define IDE_ASSOCIATED 0x04 /* zero if file is not Associated */ 229 #define IDE_RECORD 0x08 /* zero if no record attributes */ 230 #define IDE_PROTECTION 0x10 /* zero if no protection attributes */ 231 #define IDE_UNUSED_FLAGS 0x60 232 #define IDE_LAST_EXTENT 0x80 /* zero if last extent in file */ 233 #define IDE_PROHIBITED (IDE_DIRECTORY | IDE_RECORD | \ 234 IDE_LAST_EXTENT | IDE_UNUSED_FLAGS) 235 236 /* Directory Record date fields */ 237 #define IDE_DATE_YEAR(x) (((uchar_t *)x)[0] + 1900) 238 #define IDE_DATE_MONTH(x) (((uchar_t *)x)[1]) 239 #define IDE_DATE_DAY(x) (((uchar_t *)x)[2]) 240 #define IDE_DATE_HOUR(x) (((uchar_t *)x)[3]) 241 #define IDE_DATE_MIN(x) (((uchar_t *)x)[4]) 242 #define IDE_DATE_SEC(x) (((uchar_t *)x)[5]) 243 #define IDE_DATE_GMTOFF(x) (((char *)x)[6]) 244 245 /* tests for Interchange Levels 1 & 2 file types */ 246 #define IDE_REGULAR_FILE(x) (((x) & IDE_PROHIBITED) == 0) 247 #define IDE_REGULAR_DIR(x) (((x) & IDE_PROHIBITED) == IDE_DIRECTORY) 248 249 /* 250 * A ISO filename is: "ABCDE.EEE;1" -> <filename> '.' <ext> ';' <version #> 251 * 252 * The ISO-9660:1988 (Version 1) maximum needed string length is: 253 * 30 chars (filename + ext) 254 * + 2 chars ('.' + ';') 255 * + strlen("32767") 256 * + null byte 257 * ================================ 258 * = 38 chars 259 * 260 * ISO_DIR_NAMELEN counts 30 chars + '.' 261 */ 262 #define ISO_DIR_NAMELEN 31 /* max length of a directory name */ 263 #define ISO_FILE_NAMELEN 31 /* max length of a filename, */ 264 /* excluding ";" and version num */ 265 #define ISO_NAMELEN_V2 207 /* ISOv2: 254 - 33 - 14 (XA Record) */ 266 #define ISO_NAMELEN_V2_MAX 221 /* max length, ignorig ISOv2 */ 267 #define JOLIET_NAMELEN 64 /* Joliet file name length (spec) */ 268 #define JOLIET_NAMELEN_MAX 110 /* max Joliet file name length */ 269 270 /* Path table enry */ 271 /* fix size of path table entry */ 272 #define IPE_FPESIZE 8 273 /* macros to get the address of each field */ 274 #define IPE_name_len(x) (&((uchar_t *)x)[0]) 275 #define IPE_xar_len(x) (&((uchar_t *)x)[1]) 276 #define IPE_ext_lbn(x) (&((uchar_t *)x)[2]) 277 #define IPE_parent_no(x) (&((uchar_t *)x)[6]) 278 #define IPE_name(x) (&((uchar_t *)x)[8]) 279 280 /* macros to get the values of each field */ 281 #define IPE_EXT_LBN(x) (MSB_INT(IPE_ext_lbn(x))) 282 #define IPE_XAR_LEN(x) *(IPE_xar_len(x)) 283 #define IPE_NAME_LEN(x) *(IPE_name_len(x)) 284 #define IPE_PARENT_NO(x) *(short *)(IPE_parent_no(x)) 285 #define IPE_NAME(x) IPE_name(x) 286 287 #ifdef __cplusplus 288 } 289 #endif 290 291 #endif /* _SYS_FS_HSFS_ISOSPEC_H */ 292