1 /* 2 * ISO 9660 filesystem backend for GRUB (GRand Unified Bootloader) 3 * including Rock Ridge Extensions support 4 * 5 * Copyright (C) 1998, 1999 Kousuke Takai <tak@kmc.kyoto-u.ac.jp> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 */ 21 /* 22 * References: 23 * linux/fs/isofs/rock.[ch] 24 * mkisofs-1.11.1/diag/isoinfo.c 25 * mkisofs-1.11.1/iso9660.h 26 * (all are written by Eric Youngdale) 27 */ 28 29 #ifndef _ISO9660_H_ 30 #define _ISO9660_H_ 31 32 #define ISO_SECTOR_BITS (11) 33 #define ISO_SECTOR_SIZE (1<<ISO_SECTOR_BITS) 34 35 #define ISO_REGULAR 1 /* regular file */ 36 #define ISO_DIRECTORY 2 /* directory */ 37 #define ISO_OTHER 0 /* other file (with Rock Ridge) */ 38 39 #define RR_FLAG_PX 0x01 /* have POSIX file attributes */ 40 #define RR_FLAG_PN 0x02 /* POSIX devices */ 41 #define RR_FLAG_SL 0x04 /* Symbolic link */ 42 #define RR_FLAG_NM 0x08 /* have alternate file name */ 43 #define RR_FLAG_CL 0x10 /* Child link */ 44 #define RR_FLAG_PL 0x20 /* Parent link */ 45 #define RR_FLAG_RE 0x40 /* Relocation directory */ 46 #define RR_FLAG_TF 0x80 /* Timestamps */ 47 48 /* POSIX file attributes for Rock Ridge extensions */ 49 #define POSIX_S_IFMT 0xF000 50 #define POSIX_S_IFREG 0x8000 51 #define POSIX_S_IFDIR 0x4000 52 53 /* volume descriptor types */ 54 #define ISO_VD_PRIMARY 1 55 #define ISO_VD_END 255 56 57 #define ISO_STANDARD_ID "CD001" 58 59 #ifndef ASM_FILE 60 61 #ifndef __sun 62 #ifndef __BIT_TYPES_DEFINED__ 63 typedef int int8_t __attribute__((mode(QI))); 64 typedef unsigned int u_int8_t __attribute__((mode(QI))); 65 typedef int int16_t __attribute__((mode(HI))); 66 typedef unsigned int u_int16_t __attribute__((mode(HI))); 67 typedef int int32_t __attribute__((mode(SI))); 68 typedef unsigned int u_int32_t __attribute__((mode(SI))); 69 #endif 70 #else 71 #ifndef GRUB_UTIL 72 typedef char int8_t; 73 typedef short int16_t; 74 typedef int int32_t; 75 #endif /* ! GRUB_UTIL */ 76 typedef unsigned char u_int8_t; 77 typedef unsigned short u_int16_t; 78 typedef unsigned int u_int32_t; 79 #endif /* __sun */ 80 81 typedef union { 82 u_int8_t l,b; 83 } iso_8bit_t; 84 85 struct __iso_16bit { 86 u_int16_t l, b; 87 } __attribute__ ((packed)); 88 typedef struct __iso_16bit iso_16bit_t; 89 90 struct __iso_32bit { 91 u_int32_t l, b; 92 } __attribute__ ((packed)); 93 typedef struct __iso_32bit iso_32bit_t; 94 95 typedef u_int8_t iso_date_t[7]; 96 97 struct iso_directory_record { 98 iso_8bit_t length; 99 iso_8bit_t ext_attr_length; 100 iso_32bit_t extent; 101 iso_32bit_t size; 102 iso_date_t date; 103 iso_8bit_t flags; 104 iso_8bit_t file_unit_size; 105 iso_8bit_t interleave; 106 iso_16bit_t volume_seq_number; 107 iso_8bit_t name_len; 108 u_int8_t name[1]; 109 } __attribute__ ((packed)); 110 111 struct iso_primary_descriptor { 112 iso_8bit_t type; 113 u_int8_t id[5]; 114 iso_8bit_t version; 115 u_int8_t _unused1[1]; 116 u_int8_t system_id[32]; 117 u_int8_t volume_id[32]; 118 u_int8_t _unused2[8]; 119 iso_32bit_t volume_space_size; 120 u_int8_t _unused3[32]; 121 iso_16bit_t volume_set_size; 122 iso_16bit_t volume_seq_number; 123 iso_16bit_t logical_block_size; 124 iso_32bit_t path_table_size; 125 u_int8_t type_l_path_table[4]; 126 u_int8_t opt_type_l_path_table[4]; 127 u_int8_t type_m_path_table[4]; 128 u_int8_t opt_type_m_path_table[4]; 129 struct iso_directory_record root_directory_record; 130 u_int8_t volume_set_id[128]; 131 u_int8_t publisher_id[128]; 132 u_int8_t preparer_id[128]; 133 u_int8_t application_id[128]; 134 u_int8_t copyright_file_id[37]; 135 u_int8_t abstract_file_id[37]; 136 u_int8_t bibliographic_file_id[37]; 137 u_int8_t creation_date[17]; 138 u_int8_t modification_date[17]; 139 u_int8_t expiration_date[17]; 140 u_int8_t effective_date[17]; 141 iso_8bit_t file_structure_version; 142 u_int8_t _unused4[1]; 143 u_int8_t application_data[512]; 144 u_int8_t _unused5[653]; 145 } __attribute__ ((packed)); 146 147 struct rock_ridge { 148 u_int16_t signature; 149 u_int8_t len; 150 u_int8_t version; 151 union { 152 struct SP { 153 u_int16_t magic; 154 u_int8_t skip; 155 } sp; 156 struct CE { 157 iso_32bit_t extent; 158 iso_32bit_t offset; 159 iso_32bit_t size; 160 } ce; 161 struct ER { 162 u_int8_t len_id; 163 u_int8_t len_des; 164 u_int8_t len_src; 165 u_int8_t ext_ver; 166 u_int8_t data[0]; 167 } er; 168 struct RR { 169 iso_8bit_t flags; 170 } rr; 171 struct PX { 172 iso_32bit_t mode; 173 iso_32bit_t nlink; 174 iso_32bit_t uid; 175 iso_32bit_t gid; 176 } px; 177 struct PN { 178 iso_32bit_t dev_high; 179 iso_32bit_t dev_low; 180 } pn; 181 struct SL { 182 iso_8bit_t flags; 183 struct SL_component { 184 iso_8bit_t flags; 185 u_int8_t len; 186 u_int8_t text[0]; 187 } link; 188 } sl; 189 struct NM { 190 iso_8bit_t flags; 191 u_int8_t name[0]; 192 } nm; 193 struct CL { 194 iso_32bit_t location; 195 } cl; 196 struct PL { 197 iso_32bit_t location; 198 } pl; 199 struct TF { 200 iso_8bit_t flags; 201 iso_date_t times[0]; 202 } tf; 203 } u; 204 } __attribute__ ((packed)); 205 206 typedef union RR_ptr { 207 struct rock_ridge *rr; 208 char *ptr; 209 int i; 210 } RR_ptr_t; 211 212 #define RRMAGIC(c1, c2) ((c1)|(c2) << 8) 213 214 #define CHECK2(ptr, c1, c2) \ 215 (*(unsigned short *)(ptr) == (((c1) | (c2) << 8) & 0xFFFF)) 216 217 #endif /* !ASM_FILE */ 218 219 #endif /* _ISO9660_H_ */ 220