1 /* $NetBSD: udf_create.h,v 1.7 2013/08/09 15:11:08 reinoud Exp $ */
4 * Copyright (c) 2006, 2008 Reinoud Zandijk
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
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.
29 #ifndef _FS_UDF_UDF_CREATE_H_
30 #define _FS_UDF_UDF_CREATE_H_
32 #include <sys/types.h>
34 #if !HAVE_NBTOOL_CONFIG_H
35 #include <fs/udf/ecma167-udf.h>
37 #include "../../sys/fs/udf/ecma167-udf.h"
39 #include "udf_bswap.h"
43 /* format flags indicating properties of disc to create */
44 #define FORMAT_WRITEONCE 0x00001
45 #define FORMAT_SEQUENTIAL 0x00002
46 #define FORMAT_REWRITABLE 0x00004
47 #define FORMAT_SPARABLE 0x00008
48 #define FORMAT_META 0x00010
49 #define FORMAT_LOW 0x00020
50 #define FORMAT_VAT 0x00040
51 #define FORMAT_WORM 0x00080
52 #define FORMAT_TRACK512 0x00100
53 #define FORMAT_INVALID 0x00200
54 #define FORMAT_READONLY 0x00400
55 #define FORMAT_FLAGBITS \
56 "\10\1WRITEONCE\2SEQUENTIAL\3REWRITABLE\4SPARABLE\5META\6LOW" \
57 "\7VAT\10WORM\11TRACK512\12INVALID\13READONLY"
61 #define UDF_ANCHORS 4 /* 256, 512, N-256, N */
62 #define UDF_PARTITIONS 4 /* overkill */
63 #define UDF_PMAPS 4 /* overkill */
66 #define UDF_MAX_NAMELEN 255 /* as per SPEC */
68 /* translation constants */
69 #define UDF_VTOP_RAWPART UDF_PMAPS /* [0..UDF_PMAPS> are normal */
71 /* virtual to physical mapping types */
72 #define UDF_VTOP_TYPE_RAW 0
73 #define UDF_VTOP_TYPE_UNKNOWN 0
74 #define UDF_VTOP_TYPE_PHYS 1
75 #define UDF_VTOP_TYPE_VIRT 2
76 #define UDF_VTOP_TYPE_SPARABLE 3
77 #define UDF_VTOP_TYPE_META 4
79 #define UDF_TRANS_ZERO ((uint64_t) -1)
80 #define UDF_TRANS_UNMAPPED ((uint64_t) -2)
81 #define UDF_TRANS_INTERN ((uint64_t) -3)
82 #define UDF_MAX_SECTOR ((uint64_t) -10) /* high water mark */
85 #define UDF_ROUNDUP(val, gran) \
86 ((uint64_t) (gran) * (((uint64_t)(val) + (gran)-1) / (gran)))
88 #define UDF_ROUNDDOWN(val, gran) \
89 ((uint64_t) (gran) * (((uint64_t)(val)) / (gran)))
92 /* disc offsets for various structures and their sizes */
93 struct udf_disclayout
{
94 uint32_t wrtrack_skew
;
97 uint32_t anchors
[UDF_ANCHORS
];
98 uint32_t vds_size
, vds1
, vds2
;
99 uint32_t lvis_size
, lvis
;
101 uint32_t first_lba
, last_lba
;
102 uint32_t sector_size
;
103 uint32_t blockingnr
, align_blockingnr
, sparable_blockingnr
;
104 uint32_t meta_blockingnr
, meta_alignment
;
107 uint32_t sparable_blocks
;
108 uint32_t sparable_area
, sparable_area_size
;
109 uint32_t sparing_table_dscr_lbas
;
110 uint32_t spt_1
, spt_2
;
113 uint32_t alloc_bitmap_dscr_size
;
114 uint32_t unalloc_space
, freed_space
;
116 uint32_t meta_bitmap_dscr_size
;
117 uint32_t meta_bitmap_space
;
119 /* metadata partition */
120 uint32_t meta_file
, meta_mirror
, meta_bitmap
;
121 uint32_t meta_part_start_lba
, meta_part_size_lba
;
124 uint32_t part_start_lba
, part_size_lba
;
126 uint32_t fsd
, rootdir
, vat
;
131 /* all info about discs and descriptors building */
132 struct udf_create_context
{
134 int dscrver
; /* 2 or 3 */
135 int min_udf
; /* hex */
136 int max_udf
; /* hex */
137 int serialnum
; /* format serialno */
139 int gmtoff
; /* in minutes */
142 uint32_t sector_size
;
150 char const *app_name
;
151 char const *impl_name
;
152 int app_version_main
;
156 int vds_seq
; /* for building functions */
157 int unique_id
; /* only first few are used */
159 /* constructed structures */
160 struct anchor_vdp
*anchors
[UDF_ANCHORS
]; /* anchors to VDS */
161 struct pri_vol_desc
*primary_vol
; /* identification */
162 struct logvol_desc
*logical_vol
; /* main mapping v->p */
163 struct unalloc_sp_desc
*unallocated
; /* free UDF space */
164 struct impvol_desc
*implementation
; /* likely reduntant */
165 struct logvol_int_desc
*logvol_integrity
; /* current integrity */
166 struct part_desc
*partitions
[UDF_PARTITIONS
]; /* partitions */
172 /* block numbers as offset in partition */
173 uint32_t metadata_alloc_pos
;
174 uint32_t data_alloc_pos
;
176 /* derived; points *into* other structures */
177 struct udf_logvol_info
*logvol_info
; /* inside integrity */
179 /* fileset and root directories */
180 struct fileset_desc
*fileset_desc
; /* normally one */
182 /* logical to physical translations */
183 int vtop
[UDF_PMAPS
+1]; /* vpartnr trans */
184 int vtop_tp
[UDF_PMAPS
+1]; /* type of trans */
185 uint64_t vtop_offset
[UDF_PMAPS
+1]; /* offset in lb */
188 struct udf_sparing_table
*sparing_table
; /* replacements */
191 uint32_t vat_size
; /* length */
192 uint32_t vat_allocated
; /* allocated length */
193 uint32_t vat_start
; /* offset 1st entry */
194 uint8_t *vat_contents
; /* the VAT */
196 /* meta data partition */
197 struct extfile_entry
*meta_file
;
198 struct extfile_entry
*meta_mirror
;
199 struct extfile_entry
*meta_bitmap
;
204 uint32_t part_size
[UDF_PARTITIONS
];
205 uint32_t part_free
[UDF_PARTITIONS
];
207 struct space_bitmap_desc
*part_unalloc_bits
[UDF_PARTITIONS
];
208 struct space_bitmap_desc
*part_freed_bits
[UDF_PARTITIONS
];
214 extern struct udf_create_context context
;
215 extern struct udf_disclayout layout
;
218 void udf_init_create_context(void);
219 int a_udf_version(const char *s
, const char *id_type
);
221 int udf_calculate_disc_layout(int format_flags
, int min_udf
,
222 uint32_t wrtrack_skew
,
223 uint32_t first_lba
, uint32_t last_lba
,
224 uint32_t sector_size
, uint32_t blockingnr
,
225 uint32_t sparable_blocks
,
228 void udf_osta_charset(struct charspec
*charspec
);
229 void udf_encode_osta_id(char *osta_id
, uint16_t len
, char *text
);
231 void udf_set_regid(struct regid
*regid
, char const *name
);
232 void udf_add_domain_regid(struct regid
*regid
);
233 void udf_add_udf_regid(struct regid
*regid
);
234 void udf_add_impl_regid(struct regid
*regid
);
235 void udf_add_app_regid(struct regid
*regid
);
237 int udf_validate_tag_sum(union dscrptr
*dscr
);
238 int udf_validate_tag_and_crc_sums(union dscrptr
*dscr
);
240 void udf_set_timestamp_now(struct timestamp
*timestamp
);
242 void udf_inittag(struct desc_tag
*tag
, int tagid
, uint32_t loc
);
243 int udf_create_anchor(int num
);
245 void udf_create_terminator(union dscrptr
*dscr
, uint32_t loc
);
246 int udf_create_primaryd(void);
247 int udf_create_partitiond(int part_num
, int part_accesstype
);
248 int udf_create_unalloc_spaced(void);
249 int udf_create_sparing_tabled(void);
250 int udf_create_space_bitmap(uint32_t dscr_size
, uint32_t part_size_lba
,
251 struct space_bitmap_desc
**sbdp
);
252 int udf_create_logical_dscr(int format_flags
);
253 int udf_create_impvold(char *field1
, char *field2
, char *field3
);
254 int udf_create_fsd(void);
255 int udf_create_lvintd(int type
);
256 void udf_update_lvintd(int type
);
258 int udf_register_bad_block(uint32_t location
);
259 void udf_mark_allocated(uint32_t start_lb
, int partnr
, uint32_t blocks
);
261 int udf_create_new_fe(struct file_entry
**fep
, int file_type
,
263 int udf_create_new_efe(struct extfile_entry
**efep
, int file_type
,
266 int udf_encode_symlink(uint8_t **pathbufp
, uint32_t *pathlenp
, char *target
);
268 void udf_advance_uniqueid(void);
269 int udf_fidsize(struct fileid_desc
*fid
);
270 void udf_create_fid(uint32_t diroff
, struct fileid_desc
*fid
,
271 char *name
, int namelen
, struct long_ad
*ref
);
272 int udf_create_parentfid(struct fileid_desc
*fid
, struct long_ad
*parent
);
274 int udf_create_meta_files(void);
275 int udf_create_new_rootdir(union dscrptr
**dscr
);
277 int udf_create_VAT(union dscrptr
**vat_dscr
);
278 void udf_prepend_VAT_file(void);
279 void udf_vat_update(uint32_t virt
, uint32_t phys
);
280 int udf_append_VAT_file(void);
282 #endif /* _FS_UDF_UDF_CREATE_H_ */