1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
|
/*
* ISO 9660 filesystem backend for GRUB (GRand Unified Bootloader)
* including Rock Ridge Extensions support
*
* Copyright (C) 1998, 1999 Kousuke Takai <tak@kmc.kyoto-u.ac.jp>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
/*
* References:
* linux/fs/isofs/rock.[ch]
* mkisofs-1.11.1/diag/isoinfo.c
* mkisofs-1.11.1/iso9660.h
* (all are written by Eric Youngdale)
*/
/*
* Modified by SONE Takeshi to work with FILO
*/
#ifndef _ISO9660_H_
#define _ISO9660_H_
#define ISO_SECTOR_BITS (11)
#define ISO_SECTOR_SIZE (1<<ISO_SECTOR_BITS)
#define ISO_REGULAR 1 /* regular file */
#define ISO_DIRECTORY 2 /* directory */
#define ISO_OTHER 0 /* other file (with Rock Ridge) */
#define RR_FLAG_PX 0x01 /* have POSIX file attributes */
#define RR_FLAG_NM 0x08 /* have alternate file name */
/* POSIX file attributes for Rock Ridge extensions */
#define POSIX_S_IFMT 0xF000
#define POSIX_S_IFREG 0x8000
#define POSIX_S_IFDIR 0x4000
/* volume descriptor types */
#define ISO_VD_PRIMARY 1
#define ISO_VD_END 255
#define ISO_STANDARD_ID "CD001"
#ifndef ASM_FILE
typedef union {
uint8_t l,b;
} iso_8bit_t;
typedef struct __iso_16bit {
uint16_t l, b;
} iso_16bit_t;
typedef struct __iso_32bit {
uint32_t l, b;
} iso_32bit_t;
typedef uint8_t iso_date_t[7];
struct iso_directory_record {
iso_8bit_t length;
iso_8bit_t ext_attr_length;
iso_32bit_t extent;
iso_32bit_t size;
iso_date_t date;
iso_8bit_t flags;
iso_8bit_t file_unit_size;
iso_8bit_t interleave;
iso_16bit_t volume_seq_number;
iso_8bit_t name_len;
uint8_t name[1];
} __attribute__ ((packed));
struct iso_primary_descriptor {
iso_8bit_t type;
uint8_t id[5];
iso_8bit_t version;
uint8_t _unused1[1];
uint8_t system_id[32];
uint8_t volume_id[32];
uint8_t _unused2[8];
iso_32bit_t volume_space_size;
uint8_t _unused3[32];
iso_16bit_t volume_set_size;
iso_16bit_t volume_seq_number;
iso_16bit_t logical_block_size;
iso_32bit_t path_table_size;
uint8_t type_l_path_table[4];
uint8_t opt_type_l_path_table[4];
uint8_t type_m_path_table[4];
uint8_t opt_type_m_path_table[4];
struct iso_directory_record root_directory_record;
uint8_t volume_set_id[128];
uint8_t publisher_id[128];
uint8_t preparer_id[128];
uint8_t application_id[128];
uint8_t copyright_file_id[37];
uint8_t abstract_file_id[37];
uint8_t bibliographic_file_id[37];
uint8_t creation_date[17];
uint8_t modification_date[17];
uint8_t expiration_date[17];
uint8_t effective_date[17];
iso_8bit_t file_structure_version;
uint8_t _unused4[1];
uint8_t application_data[512];
uint8_t _unused5[653];
} __attribute__ ((packed));
struct rock_ridge {
uint16_t signature;
uint8_t len;
uint8_t version;
union {
struct CE {
iso_32bit_t extent;
iso_32bit_t offset;
iso_32bit_t size;
} ce;
struct NM {
iso_8bit_t flags;
uint8_t name[0];
} nm;
struct PX {
iso_32bit_t mode;
iso_32bit_t nlink;
iso_32bit_t uid;
iso_32bit_t gid;
} px;
struct RR {
iso_8bit_t flags;
} rr;
} u;
} __attribute__ ((packed));
typedef union RR_ptr {
struct rock_ridge *rr;
char *ptr;
int i;
} RR_ptr_t;
#define CHECK2(ptr, c1, c2) \
(*(unsigned char *)(ptr) == (c1) && \
*((unsigned char *)(ptr) + 1) == (c2))
#define CHECK4(ptr, c1, c2, c3, c4) \
(*(unsigned char *)(ptr) == (c1) && \
*((unsigned char *)(ptr) + 1) == (c2) && \
*((unsigned char *)(ptr) + 2) == (c3) && \
*((unsigned char *)(ptr) + 3) == (c4))
#endif /* !ASM_FILE */
#endif /* _ISO9660_H_ */
|