]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/fs/udf/ecma167-udf.h
Merge llvm trunk r338150, and resolve conflicts.
[FreeBSD/FreeBSD.git] / sys / fs / udf / ecma167-udf.h
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2001, 2002 Scott Long <scottl@freebsd.org>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30
31 /* ecma167-udf.h */
32 /* Structure/definitions/constants a la ECMA 167 rev. 3 */
33
34 /* Tag identifiers */
35 enum {
36         TAGID_PRI_VOL =         1,
37         TAGID_ANCHOR =          2,
38         TAGID_VOL =             3,
39         TAGID_IMP_VOL =         4,
40         TAGID_PARTITION =       5,
41         TAGID_LOGVOL =          6,
42         TAGID_UNALLOC_SPACE =   7,
43         TAGID_TERM =            8,
44         TAGID_LOGVOL_INTEGRITY = 9,
45         TAGID_FSD =             256,
46         TAGID_FID =             257,
47         TAGID_FENTRY =          261
48 };
49
50 /* Descriptor tag [3/7.2] */
51 struct desc_tag {
52         uint16_t        id;
53         uint16_t        descriptor_ver;
54         uint8_t         cksum;
55         uint8_t         reserved;
56         uint16_t        serial_num;
57         uint16_t        desc_crc;
58         uint16_t        desc_crc_len;
59         uint32_t        tag_loc;
60 } __packed;
61
62 /* Recorded Address [4/7.1] */
63 struct lb_addr {
64         uint32_t        lb_num;
65         uint16_t        part_num;
66 } __packed;
67
68 /* Extent Descriptor [3/7.1] */
69 struct extent_ad {
70         uint32_t        len;
71         uint32_t        loc;
72 } __packed;
73
74 /* Short Allocation Descriptor [4/14.14.1] */
75 struct short_ad {
76         uint32_t        len;
77         uint32_t        pos;
78 } __packed;
79
80 /* Long Allocation Descriptor [4/14.14.2] */
81 struct long_ad {
82         uint32_t        len;
83         struct lb_addr  loc;
84         uint16_t        ad_flags;
85         uint32_t        ad_id;
86 } __packed;
87
88 /* Extended Allocation Descriptor [4/14.14.3] */
89 struct ext_ad {
90         uint32_t        ex_len;
91         uint32_t        rec_len;
92         uint32_t        inf_len;
93         struct lb_addr  ex_loc;
94         uint8_t         reserved[2];
95 } __packed;
96
97 union icb {
98         struct short_ad s_ad;
99         struct long_ad  l_ad;
100         struct ext_ad   e_ad;
101 };
102
103 /* Character set spec [1/7.2.1] */
104 struct charspec {
105         uint8_t         type;
106         uint8_t         inf[63];
107 } __packed;
108
109 /* Timestamp [1/7.3] */
110 struct timestamp {
111         uint16_t        type_tz;
112         uint16_t        year;
113         uint8_t         month;
114         uint8_t         day;
115         uint8_t         hour;
116         uint8_t         minute;
117         uint8_t         second;
118         uint8_t         centisec;
119         uint8_t         hund_usec;
120         uint8_t         usec;
121 } __packed;
122
123 /* Entity Identifier [1/7.4] */
124 #define UDF_REGID_ID_SIZE       23
125 struct regid {
126         uint8_t         flags;
127         uint8_t         id[UDF_REGID_ID_SIZE];
128         uint8_t         id_suffix[8];
129 } __packed;
130
131 /* ICB Tag [4/14.6] */
132 struct icb_tag {
133         uint32_t        prev_num_dirs;
134         uint16_t        strat_type;
135         uint8_t         strat_param[2];
136         uint16_t        max_num_entries;
137         uint8_t         reserved;
138         uint8_t         file_type;
139         struct lb_addr  parent_icb;
140         uint16_t        flags;
141 } __packed;
142 #define UDF_ICB_TAG_FLAGS_SETUID        0x40
143 #define UDF_ICB_TAG_FLAGS_SETGID        0x80
144 #define UDF_ICB_TAG_FLAGS_STICKY        0x100
145
146 /* Anchor Volume Descriptor Pointer [3/10.2] */
147 struct anchor_vdp {
148         struct desc_tag         tag;
149         struct extent_ad        main_vds_ex;
150         struct extent_ad        reserve_vds_ex;
151 } __packed;
152
153 /* Volume Descriptor Pointer [3/10.3] */
154 struct vol_desc_ptr {
155         struct desc_tag         tag;
156         uint32_t                vds_number;
157         struct extent_ad        next_vds_ex;
158 } __packed;
159
160 /* Primary Volume Descriptor [3/10.1] */
161 struct pri_vol_desc {
162         struct desc_tag         tag;
163         uint32_t                seq_num;
164         uint32_t                pdv_num;
165         char                    vol_id[32];
166         uint16_t                vds_num;
167         uint16_t                max_vol_seq;
168         uint16_t                ichg_lvl;
169         uint16_t                max_ichg_lvl;
170         uint32_t                charset_list;
171         uint32_t                max_charset_list;
172         char                    volset_id[128];
173         struct charspec         desc_charset;
174         struct charspec         explanatory_charset;
175         struct extent_ad        vol_abstract;
176         struct extent_ad        vol_copyright;
177         struct regid            app_id;
178         struct timestamp        time;
179         struct regid            imp_id;
180         uint8_t                 imp_use[64];
181         uint32_t                prev_vds_lov;
182         uint16_t                flags;
183         uint8_t                 reserved[22];
184 } __packed;
185
186 /* Logical Volume Descriptor [3/10.6] */
187 struct logvol_desc {
188         struct desc_tag         tag;
189         uint32_t                seq_num;
190         struct charspec         desc_charset;
191         char                    logvol_id[128];
192         uint32_t                lb_size;
193         struct regid            domain_id;
194         union {
195                 struct long_ad  fsd_loc;
196                 uint8_t         logvol_content_use[16];
197         } _lvd_use;
198         uint32_t                mt_l; /* Partition map length */
199         uint32_t                n_pm; /* Number of partition maps */
200         struct regid            imp_id;
201         uint8_t                 imp_use[128];
202         struct extent_ad        integrity_seq_id;
203         uint8_t                 maps[1];
204 } __packed;
205
206 /* Type 1 Partition Map [3/10.7.2] */
207 struct part_map_1 {
208         uint8_t                 type;
209         uint8_t                 len;
210         uint16_t                vol_seq_num;
211         uint16_t                part_num;
212 } __packed;
213
214 #define UDF_PMAP_TYPE1_SIZE     6
215
216 /* Type 2 Partition Map [3/10.7.3] */
217 struct part_map_2 {
218         uint8_t                 type;
219         uint8_t                 len;
220         uint8_t                 part_id[62];
221 } __packed;
222
223 #define UDF_PMAP_TYPE2_SIZE     64
224
225 /* Virtual Partition Map [UDF 2.01/2.2.8] */
226 struct part_map_virt {
227         uint8_t                 type;
228         uint8_t                 len;
229         uint8_t                 reserved[2];
230         struct regid            id;
231         uint16_t                vol_seq_num;
232         uint16_t                part_num;
233         uint8_t                 reserved1[24];
234 } __packed;
235
236 /* Sparable Partition Map [UDF 2.01/2.2.9] */
237 struct part_map_spare {
238         uint8_t                 type;
239         uint8_t                 len;
240         uint8_t                 reserved[2];
241         struct regid            id;
242         uint16_t                vol_seq_num;
243         uint16_t                part_num;
244         uint16_t                packet_len;
245         uint8_t                 n_st;   /* Number of Sparing Tables */
246         uint8_t                 reserved1;
247         uint32_t                st_size;
248         uint32_t                st_loc[1];
249 } __packed;
250
251 union udf_pmap {
252         struct part_map_1       pm1;
253         struct part_map_2       pm2;
254         struct part_map_virt    pmv;
255         struct part_map_spare   pms;
256 };
257
258 /* Sparing Map Entry [UDF 2.01/2.2.11] */
259 struct spare_map_entry {
260         uint32_t                org;
261         uint32_t                map;
262 } __packed;
263
264 /* Sparing Table [UDF 2.01/2.2.11] */
265 struct udf_sparing_table {
266         struct desc_tag         tag;
267         struct regid            id;
268         uint16_t                rt_l;   /* Relocation Table len */
269         uint8_t                 reserved[2];
270         uint32_t                seq_num;
271         struct spare_map_entry  entries[1];
272 } __packed;
273
274 /* Partition Descriptor [3/10.5] */
275 struct part_desc {
276         struct desc_tag tag;
277         uint32_t        seq_num;
278         uint16_t        flags;
279         uint16_t        part_num;
280         struct regid    contents;
281         uint8_t         contents_use[128];
282         uint32_t        access_type;
283         uint32_t        start_loc;
284         uint32_t        part_len;
285         struct regid    imp_id;
286         uint8_t         imp_use[128];
287         uint8_t         reserved[156];
288 } __packed;
289
290 /* File Set Descriptor [4/14.1] */
291 struct fileset_desc {
292         struct desc_tag         tag;
293         struct timestamp        time;
294         uint16_t                ichg_lvl;
295         uint16_t                max_ichg_lvl;
296         uint32_t                charset_list;
297         uint32_t                max_charset_list;
298         uint32_t                fileset_num;
299         uint32_t                fileset_desc_num;
300         struct charspec         logvol_id_charset;
301         char                    logvol_id[128];
302         struct charspec         fileset_charset;
303         char                    fileset_id[32];
304         char                    copyright_file_id[32];
305         char                    abstract_file_id[32];
306         struct long_ad          rootdir_icb;
307         struct regid            domain_id;
308         struct long_ad          next_ex;
309         struct long_ad          streamdir_icb;
310         uint8_t                 reserved[32];
311 } __packed;
312
313 /* File Identifier Descriptor [4/14.4] */
314 struct fileid_desc {
315         struct desc_tag tag;
316         uint16_t        file_num;
317         uint8_t         file_char;
318         uint8_t         l_fi;   /* Length of file identifier area */
319         struct long_ad  icb;
320         uint16_t        l_iu;   /* Length of implementation use area */
321         uint8_t         data[1];
322 } __packed;
323 #define UDF_FID_SIZE    38
324 #define UDF_FILE_CHAR_VIS       (1 << 0) /* Visible */
325 #define UDF_FILE_CHAR_DIR       (1 << 1) /* Directory */
326 #define UDF_FILE_CHAR_DEL       (1 << 2) /* Deleted */
327 #define UDF_FILE_CHAR_PAR       (1 << 3) /* Parent Directory */
328 #define UDF_FILE_CHAR_META      (1 << 4) /* Stream metadata */
329
330 /* File Entry [4/14.9] */
331 struct file_entry {
332         struct desc_tag         tag;
333         struct icb_tag          icbtag;
334         uint32_t                uid;
335         uint32_t                gid;
336         uint32_t                perm;
337         uint16_t                link_cnt;
338         uint8_t                 rec_format;
339         uint8_t                 rec_disp_attr;
340         uint32_t                rec_len;
341         uint64_t                inf_len;
342         uint64_t                logblks_rec;
343         struct timestamp        atime;
344         struct timestamp        mtime;
345         struct timestamp        attrtime;
346         uint32_t                ckpoint;
347         struct long_ad          ex_attr_icb;
348         struct regid            imp_id;
349         uint64_t                unique_id;
350         uint32_t                l_ea;   /* Length of extended attribute area */
351         uint32_t                l_ad;   /* Length of allocation descriptors */
352         uint8_t                 data[1];
353 } __packed;
354 #define UDF_FENTRY_SIZE 176
355 #define UDF_FENTRY_PERM_USER_MASK       0x07
356 #define UDF_FENTRY_PERM_GRP_MASK        0xE0
357 #define UDF_FENTRY_PERM_OWNER_MASK      0x1C00
358
359 /* Path Component [4/14.16.1] */
360 struct path_component {
361         uint8_t                 type;
362         uint8_t                 length;
363         uint16_t                version;
364         uint8_t                 identifier[1];
365 } __packed;
366 #define UDF_PATH_ROOT           2
367 #define UDF_PATH_DOTDOT         3
368 #define UDF_PATH_DOT            4
369 #define UDF_PATH_PATH           5
370
371 union dscrptr {
372         struct desc_tag         tag;
373         struct anchor_vdp       avdp;
374         struct vol_desc_ptr     vdp;
375         struct pri_vol_desc     pvd;
376         struct logvol_desc      lvd;
377         struct part_desc        pd;
378         struct fileset_desc     fsd;
379         struct fileid_desc      fid;
380         struct file_entry       fe;
381 };
382
383 /* Useful defines */
384
385 #define GETICB(ad_type, fentry, offset) \
386         (struct ad_type *)&fentry->data[offset]
387
388 #define GETICBLEN(ad_type, icb) le32toh(((struct ad_type *)(icb))->len)