1 /* $NetBSD: udf_core.h,v 1.3 2022/08/07 11:06:18 andvar Exp $ */
2 
3 /*
4  * Copyright (c) 2006, 2008, 2021, 2022 Reinoud Zandijk
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 ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  *
27  */
28 
29 #ifndef _FS_UDF_CORE_H_
30 #define _FS_UDF_CORE_H_
31 
32 
33 #if 0
34 # ifndef DEBUG
35 #   define DEBUG
36 #  endif
37 #endif
38 
39 
40 #include <sys/types.h>
41 #include <sys/stat.h>
42 #include "udf_bswap.h"
43 #include "udf_osta.h"
44 
45 #if !HAVE_NBTOOL_CONFIG_H
46 #define _EXPOSE_MMC
47 #include <sys/cdio.h>
48 #include <fs/udf/ecma167-udf.h>
49 #else
50 #include "udf/cdio_mmc_structs.h"
51 #include "../../sys/fs/udf/ecma167-udf.h"
52 #endif
53 
54 
55 /* format flags indicating properties of disc to create */
56 #define FORMAT_WRITEONCE      0x00001
57 #define FORMAT_SEQUENTIAL     0x00002
58 #define FORMAT_REWRITABLE     0x00004
59 #define FORMAT_SPAREABLE      0x00008
60 #define FORMAT_META           0x00010
61 #define FORMAT_LOW            0x00020
62 #define FORMAT_VAT            0x00040
63 #define FORMAT_WORM           0x00080
64 #define FORMAT_TRACK512                 0x00100
65 #define FORMAT_INVALID                  0x00200
66 #define FORMAT_READONLY                 0x00400
67 #define FORMAT_FLAGBITS \
68     "\10\1WRITEONCE\2SEQUENTIAL\3REWRITABLE\4SPAREABLE\5META\6LOW" \
69     "\7VAT\10WORM\11TRACK512\12INVALID\13READONLY"
70 
71 /* writing strategy */
72 #define UDF_WRITE_SEQUENTIAL  1
73 #define UDF_WRITE_PACKET      2         /* with fill-in if needed */
74 #define UDF_MAX_QUEUELEN      400       /* must hold all pre-partition space */
75 
76 /* structure space */
77 #define UDF_ANCHORS           4         /* 256, 512, N-256, N */
78 #define UDF_PARTITIONS                  4         /* overkill */
79 #define UDF_PMAPS             4         /* overkill */
80 
81 /* misc constants */
82 #define UDF_MAX_NAMELEN                 255       /* as per SPEC */
83 #define UDF_LVDINT_SEGMENTS   10        /* big overkill */
84 #define UDF_LVINT_LOSSAGE     4         /* lose 2 openings */
85 #define UDF_MAX_ALLOC_EXTENTS 5         /* overkill */
86 
87 /* translation constants */
88 #define UDF_VTOP_RAWPART UDF_PMAPS      /* [0..UDF_PMAPS> are normal     */
89 
90 /* virtual to physical mapping types */
91 #define UDF_VTOP_TYPE_RAW            0
92 #define UDF_VTOP_TYPE_UNKNOWN        0
93 #define UDF_VTOP_TYPE_PHYS           1
94 #define UDF_VTOP_TYPE_VIRT           2
95 #define UDF_VTOP_TYPE_SPAREABLE      3
96 #define UDF_VTOP_TYPE_META           4
97 
98 #define UDF_TRANS_ZERO                  ((uint64_t) -1)
99 #define UDF_TRANS_UNMAPPED    ((uint64_t) -2)
100 #define UDF_TRANS_INTERN      ((uint64_t) -3)
101 #define UDF_MAX_SECTOR                  ((uint64_t) -10)    /* high water mark */
102 
103 /* handys */
104 #define UDF_ROUNDUP(val, gran) \
105           ((uint64_t) (gran) * (((uint64_t)(val) + (gran)-1) / (gran)))
106 
107 #define UDF_ROUNDDOWN(val, gran) \
108           ((uint64_t) (gran) * (((uint64_t)(val)) / (gran)))
109 
110 /* default */
111 #define UDF_META_PERC  20     /* picked */
112 
113 
114 /* disc offsets for various structures and their sizes */
115 struct udf_disclayout {
116           uint32_t wrtrack_skew;
117 
118           uint32_t iso9660_vrs;
119           uint32_t anchors[UDF_ANCHORS];
120           uint32_t vds1_size, vds2_size, vds1, vds2;
121           uint32_t lvis_size, lvis;
122 
123           uint32_t first_lba, last_lba;
124           uint32_t blockingnr, align_blockingnr, spareable_blockingnr;
125           uint32_t meta_blockingnr, meta_alignment;
126 
127           /* spareables */
128           uint32_t spareable_blocks;
129           uint32_t spareable_area, spareable_area_size;
130           uint32_t sparing_table_dscr_lbas;
131           uint32_t spt_1, spt_2;
132 
133           /* metadata partition */
134           uint32_t meta_file, meta_mirror, meta_bitmap;
135           uint32_t meta_part_start_lba, meta_part_size_lba;
136           uint32_t meta_bitmap_dscr_size;
137           uint32_t meta_bitmap_space;
138 
139           /* main partition */
140           uint32_t part_start_lba, part_size_lba;
141           uint32_t alloc_bitmap_dscr_size;
142           uint32_t unalloc_space, freed_space;
143 
144           /* main structures */
145           uint32_t fsd, rootdir, vat;
146 
147 };
148 
149 
150 struct udf_lvintq {
151           uint32_t            start;
152           uint32_t            end;
153           uint32_t            pos;
154           uint32_t            wpos;
155 };
156 
157 
158 /* all info about discs and descriptors building */
159 struct udf_create_context {
160           /* descriptors */
161           int        dscrver;           /* 2 or 3          */
162           int        min_udf;           /* hex             */
163           int        max_udf;           /* hex             */
164           int        serialnum;                   /* format serialno */
165 
166           int        gmtoff;            /* in minutes                    */
167           int        meta_perc;                   /* format parameter          */
168           int        check_surface;               /* for spareables            */
169           int        create_new_session;          /* for non empty recordables */
170 
171           uint32_t sector_size;
172           int        media_accesstype;
173           int        format_flags;
174           int        write_strategy;
175 
176           /* identification */
177           char      *logvol_name;
178           char      *primary_name;
179           char      *volset_name;
180           char      *fileset_name;
181 
182           char const *app_name;
183           char const *impl_name;
184           int        app_version_main;
185           int        app_version_sub;
186 
187           /* building */
188           int        vds_seq; /* for building functions  */
189 
190           /* constructed structures */
191           struct anchor_vdp   *anchors[UDF_ANCHORS];        /* anchors to VDS    */
192           struct pri_vol_desc *primary_vol;                 /* identification    */
193           struct logvol_desc  *logical_vol;                 /* main mapping v->p */
194           struct unalloc_sp_desc        *unallocated;                 /* free UDF space    */
195           struct impvol_desc  *implementation;    /* likely redundant  */
196           struct logvol_int_desc        *logvol_integrity;  /* current integrity */
197           struct part_desc    *partitions[UDF_PARTITIONS]; /* partitions   */
198 
199           struct space_bitmap_desc*part_unalloc_bits[UDF_PARTITIONS];
200           struct space_bitmap_desc*part_freed_bits  [UDF_PARTITIONS];
201 
202           /* track information */
203           struct mmc_trackinfo           first_ti_partition;
204           struct mmc_trackinfo           first_ti;
205           struct mmc_trackinfo           last_ti;
206 
207           /* current partitions for allocation */
208           int       data_part;
209           int       metadata_part;
210           int       fids_part;
211 
212           /* current highest file unique_id */
213           uint64_t unique_id;
214 
215           /* block numbers as offset in partition, building ONLY! */
216           uint32_t alloc_pos[UDF_PARTITIONS];
217 
218           /* derived; points *into* other structures */
219           struct udf_logvol_info        *logvol_info;                 /* inside integrity  */
220 
221           /* fileset and root directories */
222           struct fileset_desc *fileset_desc;                /* normally one      */
223 
224           /* logical to physical translations */
225           int                            vtop[UDF_PMAPS+1]; /* vpartnr trans     */
226           int                            vtop_tp[UDF_PMAPS+1];        /* type of trans     */
227 
228           /* spareable */
229           struct udf_sparing_table*sparing_table;           /* replacements      */
230 
231           /* VAT file */
232           uint32_t             vat_size;                    /* length */
233           uint32_t             vat_allocated;               /* allocated length */
234           uint32_t             vat_start;                   /* offset 1st entry */
235           uint8_t                       *vat_contents;                /* the VAT */
236 
237           /* meta data partition */
238           struct extfile_entry          *meta_file;
239           struct extfile_entry          *meta_mirror;
240           struct extfile_entry          *meta_bitmap;
241 
242           /* lvint */
243           uint32_t             num_files;
244           uint32_t             num_directories;
245           uint32_t             part_size[UDF_PARTITIONS];
246           uint32_t             part_free[UDF_PARTITIONS];
247 
248           /* fsck */
249           union dscrptr                 *vds_buf;
250           int                            vds_size;
251           struct udf_lvintq    lvint_trace[UDF_LVDINT_SEGMENTS]; /* fsck   */
252           uint8_t                       *lvint_history;                            /* fsck   */
253           int                            lvint_history_len;              /* fsck   */
254           int                            lvint_history_wpos;                       /* fsck   */
255           int                            lvint_history_ondisc_len;       /* fsck   */
256 };
257 
258 
259 /* global variables describing disc and format */
260 extern struct udf_create_context context;
261 extern struct udf_disclayout     layout;
262 extern struct mmc_discinfo mmc_discinfo;  /* device: disc info                     */
263 
264 extern int                    dev_fd_rdonly;        /* device: open readonly!      */
265 extern int                    dev_fd;               /* device: file descriptor     */
266 extern struct stat  dev_fd_stat;          /* device: last stat info      */
267 extern char                *dev_name;     /* device: name                */
268 extern int                    emul_mmc_profile; /* for files                                 */
269 extern int                    emul_packetsize;  /* for discs and files             */
270 extern int                    emul_sectorsize;  /* for files                                 */
271 extern off_t                  emul_size;            /* for files                             */
272 extern uint32_t               wrtrack_skew;         /* offset for write sector0    */
273 
274 
275 /* prototypes */
276 extern void udf_init_create_context(void);
277 extern int a_udf_version(const char *s, const char *id_type);
278 extern int is_zero(void *blob, int size);
279 extern uint32_t udf_bytes_to_sectors(uint64_t bytes);
280 
281 extern int udf_calculate_disc_layout(int min_udf,
282           uint32_t first_lba, uint32_t last_lba,
283           uint32_t sector_size, uint32_t blockingnr);
284 extern void udf_dump_layout(void);
285 extern int udf_spareable_blocks(void);
286 extern int udf_spareable_blockingnr(void);
287 
288 extern void udf_osta_charset(struct charspec *charspec);
289 extern void udf_encode_osta_id(char *osta_id, uint16_t len, char *text);
290 extern void udf_to_unix_name(char *result, int result_len, char *id, int len,
291           struct charspec *chsp);
292 extern void unix_to_udf_name(char *result, uint8_t *result_len,
293           char const *name, int name_len, struct charspec *chsp);
294 
295 extern void udf_set_regid(struct regid *regid, char const *name);
296 extern void udf_add_domain_regid(struct regid *regid);
297 extern void udf_add_udf_regid(struct regid *regid);
298 extern void udf_add_impl_regid(struct regid *regid);
299 extern void udf_add_app_regid(struct regid *regid);
300 
301 extern int udf_check_tag(void *blob);
302 extern int udf_check_tag_payload(void *blob, uint32_t max_length);
303 extern int udf_check_tag_and_location(void *blob, uint32_t location);
304 extern int udf_validate_tag_sum(union dscrptr *dscr);
305 extern int udf_validate_tag_and_crc_sums(union dscrptr *dscr);
306 
307 extern void udf_set_timestamp_now(struct timestamp *timestamp);
308 extern void udf_timestamp_to_timespec(struct timestamp *timestamp,
309           struct timespec *timespec);
310 extern void udf_timespec_to_timestamp(struct timespec *timespec,
311           struct timestamp *timestamp);
312 
313 extern void udf_inittag(struct desc_tag *tag, int tagid, uint32_t loc);
314 extern int udf_create_anchor(int num);
315 
316 extern void udf_create_terminator(union dscrptr *dscr, uint32_t loc);
317 extern int udf_create_primaryd(void);
318 extern int udf_create_partitiond(int part_num);
319 extern int udf_create_unalloc_spaced(void);
320 extern int udf_create_sparing_tabled(void);
321 extern int udf_create_space_bitmap(uint32_t dscr_size, uint32_t part_size_lba,
322           struct space_bitmap_desc **sbdp);
323 extern int udf_create_logical_dscr(void);
324 extern int udf_create_impvold(char *field1, char *field2, char *field3);
325 extern int udf_create_fsd(void);
326 extern int udf_create_lvintd(int type);
327 extern void udf_update_lvintd(int type);
328 extern uint16_t udf_find_raw_phys(uint16_t raw_phys_part);
329 
330 extern int udf_register_bad_block(uint32_t location);
331 extern void udf_mark_allocated(uint32_t start_lb, int partnr, uint32_t blocks);
332 
333 extern int udf_impl_extattr_check(struct impl_extattr_entry *implext);
334 extern void udf_calc_impl_extattr_checksum(struct impl_extattr_entry *implext);
335 extern int udf_extattr_search_intern(union dscrptr *dscr,
336           uint32_t sattr, char const *sattrname,
337           uint32_t *offsetp, uint32_t *lengthp);
338 
339 extern int udf_create_new_fe(struct file_entry **fep, int file_type,
340           struct stat *st);
341 extern int udf_create_new_efe(struct extfile_entry **efep, int file_type,
342           struct stat *st);
343 
344 extern int udf_encode_symlink(uint8_t **pathbufp, uint32_t *pathlenp, char *target);
345 
346 extern void udf_advance_uniqueid(void);
347 extern uint32_t udf_tagsize(union dscrptr *dscr, uint32_t lb_size);
348 extern int udf_fidsize(struct fileid_desc *fid);
349 extern void udf_create_fid(uint32_t diroff, struct fileid_desc *fid,
350           char *name, int namelen, struct long_ad *ref);
351 extern int udf_create_parentfid(struct fileid_desc *fid, struct long_ad *parent);
352 
353 extern int udf_create_meta_files(void);
354 extern int udf_create_new_rootdir(union dscrptr **dscr);
355 
356 extern int udf_create_VAT(union dscrptr **vat_dscr, struct long_ad *vatdata_loc);
357 extern void udf_prepend_VAT_file(void);
358 extern void udf_vat_update(uint32_t virt, uint32_t phys);
359 extern int udf_append_VAT_file(void);
360 extern int udf_writeout_VAT(void);
361 
362 extern int udf_opendisc(const char *device, int open_flags);
363 extern void udf_closedisc(void);
364 extern int udf_prepare_disc(void);
365 extern int udf_update_discinfo(void);
366 extern int udf_update_trackinfo(struct mmc_trackinfo *ti);
367 extern int udf_get_blockingnr(struct mmc_trackinfo *ti);
368 extern void udf_synchronise_caches(void);
369 extern void udf_suspend_writing(void);
370 extern void udf_allow_writing(void);
371 
372 extern int udf_write_iso9660_vrs(void);
373 
374 /* address translation */
375 extern int udf_translate_vtop(uint32_t lb_num, uint16_t vpart,
376           uint32_t *lb_numres, uint32_t *extres);
377 
378 /* basic sector read/write with caching */
379 extern int udf_read_sector(void *sector, uint64_t location);
380 extern int udf_write_sector(void *sector, uint64_t location);
381 
382 /* extent reading and writing */
383 extern int udf_read_phys(void *blob, uint32_t location, uint32_t sects);
384 extern int udf_write_phys(void *blob, uint32_t location, uint32_t sects);
385 
386 extern int udf_read_virt(void *blob, uint32_t location, uint16_t vpart,
387           uint32_t sectors);
388 extern int udf_write_virt(void *blob, uint32_t location, uint16_t vpart,
389           uint32_t sectors);
390 
391 extern int udf_read_dscr_phys(uint32_t sector, union dscrptr **dstp);
392 extern int udf_write_dscr_phys(union dscrptr *dscr, uint32_t location,
393           uint32_t sects);
394 
395 extern int udf_read_dscr_virt(uint32_t sector, uint16_t vpart,
396           union dscrptr **dstp);
397 extern int udf_write_dscr_virt(union dscrptr *dscr,
398           uint32_t location, uint16_t vpart, uint32_t sects);
399 
400 extern void udf_metadata_alloc(int nblk, struct long_ad *pos);
401 extern void udf_data_alloc(int nblk, struct long_ad *pos);
402 extern void udf_fids_alloc(int nblk, struct long_ad *pos);
403 
404 extern int udf_derive_format(int req_enable, int req_disable);
405 extern int udf_proces_names(void);
406 extern int udf_surface_check(void);
407 
408 extern int udf_do_newfs_prefix(void);
409 extern int udf_do_rootdir(void);
410 extern int udf_do_newfs_postfix(void);
411 
412 extern void udf_dump_discinfo(struct mmc_discinfo *di);
413 
414 #endif /* _UDF_CORE_H_ */
415