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., 51 Franklin Street - Fifth Floor, Boston,
20  *  MA 02110-1301, USA.
21  */
22 /*
23  *  References:
24  *	linux/fs/isofs/rock.[ch]
25  *	mkisofs-1.11.1/diag/isoinfo.c
26  *	mkisofs-1.11.1/iso9660.h
27  *		(all are written by Eric Youngdale)
28  */
29 
30 /*
31  * Modified by SONE Takeshi to work with FILO
32  */
33 
34 #ifndef _ISO9660_H_
35 #define _ISO9660_H_
36 
37 #define ISO_SECTOR_BITS              (11)
38 #define ISO_SECTOR_SIZE              (1<<ISO_SECTOR_BITS)
39 
40 #define	ISO_REGULAR	1	/* regular file	*/
41 #define	ISO_DIRECTORY	2	/* directory	*/
42 #define	ISO_OTHER	0	/* other file (with Rock Ridge) */
43 
44 #define	RR_FLAG_PX	0x01	/* have POSIX file attributes */
45 #define	RR_FLAG_NM	0x08	/* have alternate file name   */
46 
47 /* POSIX file attributes for Rock Ridge extensions */
48 #define	POSIX_S_IFMT	0xF000
49 #define	POSIX_S_IFREG	0x8000
50 #define	POSIX_S_IFDIR	0x4000
51 
52 /* volume descriptor types */
53 #define ISO_VD_PRIMARY 1
54 #define ISO_VD_END 255
55 
56 #define ISO_STANDARD_ID "CD001"
57 
58 #ifndef ASM_FILE
59 
60 typedef	union {
61 	uint8_t l,b;
62 }	iso_8bit_t;
63 
64 typedef	struct __iso_16bit {
65 	uint16_t l, b;
66 } iso_16bit_t;
67 
68 typedef	struct __iso_32bit {
69 	uint32_t l, b;
70 } iso_32bit_t;
71 
72 typedef uint8_t		iso_date_t[7];
73 
74 struct iso_directory_record {
75 	iso_8bit_t	length;
76 	iso_8bit_t	ext_attr_length;
77 	iso_32bit_t	extent;
78 	iso_32bit_t	size;
79 	iso_date_t	date;
80 	iso_8bit_t	flags;
81 	iso_8bit_t	file_unit_size;
82 	iso_8bit_t	interleave;
83 	iso_16bit_t	volume_seq_number;
84 	iso_8bit_t	name_len;
85 	uint8_t	name[1];
86 } __attribute__ ((packed));
87 
88 struct iso_primary_descriptor {
89 	iso_8bit_t	type;
90 	uint8_t		id[5];
91 	iso_8bit_t	version;
92 	uint8_t		_unused1[1];
93 	uint8_t		system_id[32];
94 	uint8_t		volume_id[32];
95 	uint8_t		_unused2[8];
96 	iso_32bit_t	volume_space_size;
97 	uint8_t		_unused3[32];
98 	iso_16bit_t	volume_set_size;
99 	iso_16bit_t	volume_seq_number;
100 	iso_16bit_t	logical_block_size;
101 	iso_32bit_t	path_table_size;
102 	uint8_t		type_l_path_table[4];
103 	uint8_t		opt_type_l_path_table[4];
104 	uint8_t		type_m_path_table[4];
105 	uint8_t		opt_type_m_path_table[4];
106 	struct iso_directory_record root_directory_record;
107 	uint8_t		volume_set_id[128];
108 	uint8_t		publisher_id[128];
109 	uint8_t		preparer_id[128];
110 	uint8_t		application_id[128];
111 	uint8_t		copyright_file_id[37];
112 	uint8_t		abstract_file_id[37];
113 	uint8_t		bibliographic_file_id[37];
114 	uint8_t		creation_date[17];
115 	uint8_t		modification_date[17];
116 	uint8_t		expiration_date[17];
117 	uint8_t		effective_date[17];
118 	iso_8bit_t	file_structure_version;
119 	uint8_t		_unused4[1];
120 	uint8_t		application_data[512];
121 	uint8_t		_unused5[653];
122 } __attribute__ ((packed));
123 
124 struct rock_ridge {
125 	uint16_t	signature;
126 	uint8_t		len;
127 	uint8_t		version;
128 	union {
129 	  struct CE {
130 	    iso_32bit_t	extent;
131 	    iso_32bit_t	offset;
132 	    iso_32bit_t	size;
133 	  } ce;
134 	  struct NM {
135 	    iso_8bit_t	flags;
136 	    uint8_t	name[0];
137 	  } nm;
138 	  struct PX {
139 	    iso_32bit_t	mode;
140 	    iso_32bit_t	nlink;
141 	    iso_32bit_t	uid;
142 	    iso_32bit_t	gid;
143 	  } px;
144 	  struct RR {
145 	    iso_8bit_t	flags;
146 	  } rr;
147 	} u;
148 } __attribute__ ((packed));
149 
150 typedef	union RR_ptr {
151 	struct rock_ridge *rr;
152 	char		  *ptr;
153 	int		   i;
154 } RR_ptr_t;
155 
156 #define CHECK2(ptr, c1, c2)                                             \
157     (*(unsigned char *)(ptr) == (c1) &&                                 \
158      *((unsigned char *)(ptr) + 1) == (c2))
159 #define	CHECK4(ptr, c1, c2, c3, c4)                                     \
160     (*(unsigned char *)(ptr) == (c1) &&                                 \
161      *((unsigned char *)(ptr) + 1) == (c2) &&                           \
162      *((unsigned char *)(ptr) + 2) == (c3) &&                           \
163      *((unsigned char *)(ptr) + 3) == (c4))
164 
165 #endif /* !ASM_FILE */
166 
167 #endif /* _ISO9660_H_ */
168