1*9f988b79SJean-Baptiste Boric /* $NetBSD: udf_create.h,v 1.7 2013/08/09 15:11:08 reinoud Exp $ */ 2*9f988b79SJean-Baptiste Boric 3*9f988b79SJean-Baptiste Boric /* 4*9f988b79SJean-Baptiste Boric * Copyright (c) 2006, 2008 Reinoud Zandijk 5*9f988b79SJean-Baptiste Boric * All rights reserved. 6*9f988b79SJean-Baptiste Boric * 7*9f988b79SJean-Baptiste Boric * Redistribution and use in source and binary forms, with or without 8*9f988b79SJean-Baptiste Boric * modification, are permitted provided that the following conditions 9*9f988b79SJean-Baptiste Boric * are met: 10*9f988b79SJean-Baptiste Boric * 1. Redistributions of source code must retain the above copyright 11*9f988b79SJean-Baptiste Boric * notice, this list of conditions and the following disclaimer. 12*9f988b79SJean-Baptiste Boric * 2. Redistributions in binary form must reproduce the above copyright 13*9f988b79SJean-Baptiste Boric * notice, this list of conditions and the following disclaimer in the 14*9f988b79SJean-Baptiste Boric * documentation and/or other materials provided with the distribution. 15*9f988b79SJean-Baptiste Boric * 16*9f988b79SJean-Baptiste Boric * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17*9f988b79SJean-Baptiste Boric * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18*9f988b79SJean-Baptiste Boric * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19*9f988b79SJean-Baptiste Boric * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20*9f988b79SJean-Baptiste Boric * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21*9f988b79SJean-Baptiste Boric * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22*9f988b79SJean-Baptiste Boric * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23*9f988b79SJean-Baptiste Boric * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24*9f988b79SJean-Baptiste Boric * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25*9f988b79SJean-Baptiste Boric * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*9f988b79SJean-Baptiste Boric * 27*9f988b79SJean-Baptiste Boric */ 28*9f988b79SJean-Baptiste Boric 29*9f988b79SJean-Baptiste Boric #ifndef _FS_UDF_UDF_CREATE_H_ 30*9f988b79SJean-Baptiste Boric #define _FS_UDF_UDF_CREATE_H_ 31*9f988b79SJean-Baptiste Boric 32*9f988b79SJean-Baptiste Boric #include <sys/types.h> 33*9f988b79SJean-Baptiste Boric #include <sys/stat.h> 34*9f988b79SJean-Baptiste Boric #if !HAVE_NBTOOL_CONFIG_H 35*9f988b79SJean-Baptiste Boric #include <fs/udf/ecma167-udf.h> 36*9f988b79SJean-Baptiste Boric #else 37*9f988b79SJean-Baptiste Boric #include "../../sys/fs/udf/ecma167-udf.h" 38*9f988b79SJean-Baptiste Boric #endif 39*9f988b79SJean-Baptiste Boric #include "udf_bswap.h" 40*9f988b79SJean-Baptiste Boric #include "udf_osta.h" 41*9f988b79SJean-Baptiste Boric 42*9f988b79SJean-Baptiste Boric 43*9f988b79SJean-Baptiste Boric /* format flags indicating properties of disc to create */ 44*9f988b79SJean-Baptiste Boric #define FORMAT_WRITEONCE 0x00001 45*9f988b79SJean-Baptiste Boric #define FORMAT_SEQUENTIAL 0x00002 46*9f988b79SJean-Baptiste Boric #define FORMAT_REWRITABLE 0x00004 47*9f988b79SJean-Baptiste Boric #define FORMAT_SPARABLE 0x00008 48*9f988b79SJean-Baptiste Boric #define FORMAT_META 0x00010 49*9f988b79SJean-Baptiste Boric #define FORMAT_LOW 0x00020 50*9f988b79SJean-Baptiste Boric #define FORMAT_VAT 0x00040 51*9f988b79SJean-Baptiste Boric #define FORMAT_WORM 0x00080 52*9f988b79SJean-Baptiste Boric #define FORMAT_TRACK512 0x00100 53*9f988b79SJean-Baptiste Boric #define FORMAT_INVALID 0x00200 54*9f988b79SJean-Baptiste Boric #define FORMAT_READONLY 0x00400 55*9f988b79SJean-Baptiste Boric #define FORMAT_FLAGBITS \ 56*9f988b79SJean-Baptiste Boric "\10\1WRITEONCE\2SEQUENTIAL\3REWRITABLE\4SPARABLE\5META\6LOW" \ 57*9f988b79SJean-Baptiste Boric "\7VAT\10WORM\11TRACK512\12INVALID\13READONLY" 58*9f988b79SJean-Baptiste Boric 59*9f988b79SJean-Baptiste Boric 60*9f988b79SJean-Baptiste Boric /* structure space */ 61*9f988b79SJean-Baptiste Boric #define UDF_ANCHORS 4 /* 256, 512, N-256, N */ 62*9f988b79SJean-Baptiste Boric #define UDF_PARTITIONS 4 /* overkill */ 63*9f988b79SJean-Baptiste Boric #define UDF_PMAPS 4 /* overkill */ 64*9f988b79SJean-Baptiste Boric 65*9f988b79SJean-Baptiste Boric /* misc constants */ 66*9f988b79SJean-Baptiste Boric #define UDF_MAX_NAMELEN 255 /* as per SPEC */ 67*9f988b79SJean-Baptiste Boric 68*9f988b79SJean-Baptiste Boric /* translation constants */ 69*9f988b79SJean-Baptiste Boric #define UDF_VTOP_RAWPART UDF_PMAPS /* [0..UDF_PMAPS> are normal */ 70*9f988b79SJean-Baptiste Boric 71*9f988b79SJean-Baptiste Boric /* virtual to physical mapping types */ 72*9f988b79SJean-Baptiste Boric #define UDF_VTOP_TYPE_RAW 0 73*9f988b79SJean-Baptiste Boric #define UDF_VTOP_TYPE_UNKNOWN 0 74*9f988b79SJean-Baptiste Boric #define UDF_VTOP_TYPE_PHYS 1 75*9f988b79SJean-Baptiste Boric #define UDF_VTOP_TYPE_VIRT 2 76*9f988b79SJean-Baptiste Boric #define UDF_VTOP_TYPE_SPARABLE 3 77*9f988b79SJean-Baptiste Boric #define UDF_VTOP_TYPE_META 4 78*9f988b79SJean-Baptiste Boric 79*9f988b79SJean-Baptiste Boric #define UDF_TRANS_ZERO ((uint64_t) -1) 80*9f988b79SJean-Baptiste Boric #define UDF_TRANS_UNMAPPED ((uint64_t) -2) 81*9f988b79SJean-Baptiste Boric #define UDF_TRANS_INTERN ((uint64_t) -3) 82*9f988b79SJean-Baptiste Boric #define UDF_MAX_SECTOR ((uint64_t) -10) /* high water mark */ 83*9f988b79SJean-Baptiste Boric 84*9f988b79SJean-Baptiste Boric /* handys */ 85*9f988b79SJean-Baptiste Boric #define UDF_ROUNDUP(val, gran) \ 86*9f988b79SJean-Baptiste Boric ((uint64_t) (gran) * (((uint64_t)(val) + (gran)-1) / (gran))) 87*9f988b79SJean-Baptiste Boric 88*9f988b79SJean-Baptiste Boric #define UDF_ROUNDDOWN(val, gran) \ 89*9f988b79SJean-Baptiste Boric ((uint64_t) (gran) * (((uint64_t)(val)) / (gran))) 90*9f988b79SJean-Baptiste Boric 91*9f988b79SJean-Baptiste Boric 92*9f988b79SJean-Baptiste Boric /* disc offsets for various structures and their sizes */ 93*9f988b79SJean-Baptiste Boric struct udf_disclayout { 94*9f988b79SJean-Baptiste Boric uint32_t wrtrack_skew; 95*9f988b79SJean-Baptiste Boric 96*9f988b79SJean-Baptiste Boric uint32_t iso9660_vrs; 97*9f988b79SJean-Baptiste Boric uint32_t anchors[UDF_ANCHORS]; 98*9f988b79SJean-Baptiste Boric uint32_t vds_size, vds1, vds2; 99*9f988b79SJean-Baptiste Boric uint32_t lvis_size, lvis; 100*9f988b79SJean-Baptiste Boric 101*9f988b79SJean-Baptiste Boric uint32_t first_lba, last_lba; 102*9f988b79SJean-Baptiste Boric uint32_t sector_size; 103*9f988b79SJean-Baptiste Boric uint32_t blockingnr, align_blockingnr, sparable_blockingnr; 104*9f988b79SJean-Baptiste Boric uint32_t meta_blockingnr, meta_alignment; 105*9f988b79SJean-Baptiste Boric 106*9f988b79SJean-Baptiste Boric /* sparables */ 107*9f988b79SJean-Baptiste Boric uint32_t sparable_blocks; 108*9f988b79SJean-Baptiste Boric uint32_t sparable_area, sparable_area_size; 109*9f988b79SJean-Baptiste Boric uint32_t sparing_table_dscr_lbas; 110*9f988b79SJean-Baptiste Boric uint32_t spt_1, spt_2; 111*9f988b79SJean-Baptiste Boric 112*9f988b79SJean-Baptiste Boric /* bitmaps */ 113*9f988b79SJean-Baptiste Boric uint32_t alloc_bitmap_dscr_size; 114*9f988b79SJean-Baptiste Boric uint32_t unalloc_space, freed_space; 115*9f988b79SJean-Baptiste Boric 116*9f988b79SJean-Baptiste Boric uint32_t meta_bitmap_dscr_size; 117*9f988b79SJean-Baptiste Boric uint32_t meta_bitmap_space; 118*9f988b79SJean-Baptiste Boric 119*9f988b79SJean-Baptiste Boric /* metadata partition */ 120*9f988b79SJean-Baptiste Boric uint32_t meta_file, meta_mirror, meta_bitmap; 121*9f988b79SJean-Baptiste Boric uint32_t meta_part_start_lba, meta_part_size_lba; 122*9f988b79SJean-Baptiste Boric 123*9f988b79SJean-Baptiste Boric /* main partition */ 124*9f988b79SJean-Baptiste Boric uint32_t part_start_lba, part_size_lba; 125*9f988b79SJean-Baptiste Boric 126*9f988b79SJean-Baptiste Boric uint32_t fsd, rootdir, vat; 127*9f988b79SJean-Baptiste Boric 128*9f988b79SJean-Baptiste Boric }; 129*9f988b79SJean-Baptiste Boric 130*9f988b79SJean-Baptiste Boric 131*9f988b79SJean-Baptiste Boric /* all info about discs and descriptors building */ 132*9f988b79SJean-Baptiste Boric struct udf_create_context { 133*9f988b79SJean-Baptiste Boric /* descriptors */ 134*9f988b79SJean-Baptiste Boric int dscrver; /* 2 or 3 */ 135*9f988b79SJean-Baptiste Boric int min_udf; /* hex */ 136*9f988b79SJean-Baptiste Boric int max_udf; /* hex */ 137*9f988b79SJean-Baptiste Boric int serialnum; /* format serialno */ 138*9f988b79SJean-Baptiste Boric 139*9f988b79SJean-Baptiste Boric int gmtoff; /* in minutes */ 140*9f988b79SJean-Baptiste Boric 141*9f988b79SJean-Baptiste Boric /* XXX to layout? */ 142*9f988b79SJean-Baptiste Boric uint32_t sector_size; 143*9f988b79SJean-Baptiste Boric 144*9f988b79SJean-Baptiste Boric /* identification */ 145*9f988b79SJean-Baptiste Boric char *logvol_name; 146*9f988b79SJean-Baptiste Boric char *primary_name; 147*9f988b79SJean-Baptiste Boric char *volset_name; 148*9f988b79SJean-Baptiste Boric char *fileset_name; 149*9f988b79SJean-Baptiste Boric 150*9f988b79SJean-Baptiste Boric char const *app_name; 151*9f988b79SJean-Baptiste Boric char const *impl_name; 152*9f988b79SJean-Baptiste Boric int app_version_main; 153*9f988b79SJean-Baptiste Boric int app_version_sub; 154*9f988b79SJean-Baptiste Boric 155*9f988b79SJean-Baptiste Boric /* building */ 156*9f988b79SJean-Baptiste Boric int vds_seq; /* for building functions */ 157*9f988b79SJean-Baptiste Boric int unique_id; /* only first few are used */ 158*9f988b79SJean-Baptiste Boric 159*9f988b79SJean-Baptiste Boric /* constructed structures */ 160*9f988b79SJean-Baptiste Boric struct anchor_vdp *anchors[UDF_ANCHORS]; /* anchors to VDS */ 161*9f988b79SJean-Baptiste Boric struct pri_vol_desc *primary_vol; /* identification */ 162*9f988b79SJean-Baptiste Boric struct logvol_desc *logical_vol; /* main mapping v->p */ 163*9f988b79SJean-Baptiste Boric struct unalloc_sp_desc *unallocated; /* free UDF space */ 164*9f988b79SJean-Baptiste Boric struct impvol_desc *implementation; /* likely reduntant */ 165*9f988b79SJean-Baptiste Boric struct logvol_int_desc *logvol_integrity; /* current integrity */ 166*9f988b79SJean-Baptiste Boric struct part_desc *partitions[UDF_PARTITIONS]; /* partitions */ 167*9f988b79SJean-Baptiste Boric 168*9f988b79SJean-Baptiste Boric /* XXX to layout? */ 169*9f988b79SJean-Baptiste Boric int data_part; 170*9f988b79SJean-Baptiste Boric int metadata_part; 171*9f988b79SJean-Baptiste Boric 172*9f988b79SJean-Baptiste Boric /* block numbers as offset in partition */ 173*9f988b79SJean-Baptiste Boric uint32_t metadata_alloc_pos; 174*9f988b79SJean-Baptiste Boric uint32_t data_alloc_pos; 175*9f988b79SJean-Baptiste Boric 176*9f988b79SJean-Baptiste Boric /* derived; points *into* other structures */ 177*9f988b79SJean-Baptiste Boric struct udf_logvol_info *logvol_info; /* inside integrity */ 178*9f988b79SJean-Baptiste Boric 179*9f988b79SJean-Baptiste Boric /* fileset and root directories */ 180*9f988b79SJean-Baptiste Boric struct fileset_desc *fileset_desc; /* normally one */ 181*9f988b79SJean-Baptiste Boric 182*9f988b79SJean-Baptiste Boric /* logical to physical translations */ 183*9f988b79SJean-Baptiste Boric int vtop[UDF_PMAPS+1]; /* vpartnr trans */ 184*9f988b79SJean-Baptiste Boric int vtop_tp[UDF_PMAPS+1]; /* type of trans */ 185*9f988b79SJean-Baptiste Boric uint64_t vtop_offset[UDF_PMAPS+1]; /* offset in lb */ 186*9f988b79SJean-Baptiste Boric 187*9f988b79SJean-Baptiste Boric /* sparable */ 188*9f988b79SJean-Baptiste Boric struct udf_sparing_table*sparing_table; /* replacements */ 189*9f988b79SJean-Baptiste Boric 190*9f988b79SJean-Baptiste Boric /* VAT file */ 191*9f988b79SJean-Baptiste Boric uint32_t vat_size; /* length */ 192*9f988b79SJean-Baptiste Boric uint32_t vat_allocated; /* allocated length */ 193*9f988b79SJean-Baptiste Boric uint32_t vat_start; /* offset 1st entry */ 194*9f988b79SJean-Baptiste Boric uint8_t *vat_contents; /* the VAT */ 195*9f988b79SJean-Baptiste Boric 196*9f988b79SJean-Baptiste Boric /* meta data partition */ 197*9f988b79SJean-Baptiste Boric struct extfile_entry *meta_file; 198*9f988b79SJean-Baptiste Boric struct extfile_entry *meta_mirror; 199*9f988b79SJean-Baptiste Boric struct extfile_entry *meta_bitmap; 200*9f988b79SJean-Baptiste Boric 201*9f988b79SJean-Baptiste Boric /* lvint */ 202*9f988b79SJean-Baptiste Boric int num_files; 203*9f988b79SJean-Baptiste Boric int num_directories; 204*9f988b79SJean-Baptiste Boric uint32_t part_size[UDF_PARTITIONS]; 205*9f988b79SJean-Baptiste Boric uint32_t part_free[UDF_PARTITIONS]; 206*9f988b79SJean-Baptiste Boric 207*9f988b79SJean-Baptiste Boric struct space_bitmap_desc*part_unalloc_bits[UDF_PARTITIONS]; 208*9f988b79SJean-Baptiste Boric struct space_bitmap_desc*part_freed_bits [UDF_PARTITIONS]; 209*9f988b79SJean-Baptiste Boric }; 210*9f988b79SJean-Baptiste Boric 211*9f988b79SJean-Baptiste Boric 212*9f988b79SJean-Baptiste Boric /* globals */ 213*9f988b79SJean-Baptiste Boric 214*9f988b79SJean-Baptiste Boric extern struct udf_create_context context; 215*9f988b79SJean-Baptiste Boric extern struct udf_disclayout layout; 216*9f988b79SJean-Baptiste Boric 217*9f988b79SJean-Baptiste Boric /* prototypes */ 218*9f988b79SJean-Baptiste Boric void udf_init_create_context(void); 219*9f988b79SJean-Baptiste Boric int a_udf_version(const char *s, const char *id_type); 220*9f988b79SJean-Baptiste Boric 221*9f988b79SJean-Baptiste Boric int udf_calculate_disc_layout(int format_flags, int min_udf, 222*9f988b79SJean-Baptiste Boric uint32_t wrtrack_skew, 223*9f988b79SJean-Baptiste Boric uint32_t first_lba, uint32_t last_lba, 224*9f988b79SJean-Baptiste Boric uint32_t sector_size, uint32_t blockingnr, 225*9f988b79SJean-Baptiste Boric uint32_t sparable_blocks, 226*9f988b79SJean-Baptiste Boric float meta_fract); 227*9f988b79SJean-Baptiste Boric 228*9f988b79SJean-Baptiste Boric void udf_osta_charset(struct charspec *charspec); 229*9f988b79SJean-Baptiste Boric void udf_encode_osta_id(char *osta_id, uint16_t len, char *text); 230*9f988b79SJean-Baptiste Boric 231*9f988b79SJean-Baptiste Boric void udf_set_regid(struct regid *regid, char const *name); 232*9f988b79SJean-Baptiste Boric void udf_add_domain_regid(struct regid *regid); 233*9f988b79SJean-Baptiste Boric void udf_add_udf_regid(struct regid *regid); 234*9f988b79SJean-Baptiste Boric void udf_add_impl_regid(struct regid *regid); 235*9f988b79SJean-Baptiste Boric void udf_add_app_regid(struct regid *regid); 236*9f988b79SJean-Baptiste Boric 237*9f988b79SJean-Baptiste Boric int udf_validate_tag_sum(union dscrptr *dscr); 238*9f988b79SJean-Baptiste Boric int udf_validate_tag_and_crc_sums(union dscrptr *dscr); 239*9f988b79SJean-Baptiste Boric 240*9f988b79SJean-Baptiste Boric void udf_set_timestamp_now(struct timestamp *timestamp); 241*9f988b79SJean-Baptiste Boric 242*9f988b79SJean-Baptiste Boric void udf_inittag(struct desc_tag *tag, int tagid, uint32_t loc); 243*9f988b79SJean-Baptiste Boric int udf_create_anchor(int num); 244*9f988b79SJean-Baptiste Boric 245*9f988b79SJean-Baptiste Boric void udf_create_terminator(union dscrptr *dscr, uint32_t loc); 246*9f988b79SJean-Baptiste Boric int udf_create_primaryd(void); 247*9f988b79SJean-Baptiste Boric int udf_create_partitiond(int part_num, int part_accesstype); 248*9f988b79SJean-Baptiste Boric int udf_create_unalloc_spaced(void); 249*9f988b79SJean-Baptiste Boric int udf_create_sparing_tabled(void); 250*9f988b79SJean-Baptiste Boric int udf_create_space_bitmap(uint32_t dscr_size, uint32_t part_size_lba, 251*9f988b79SJean-Baptiste Boric struct space_bitmap_desc **sbdp); 252*9f988b79SJean-Baptiste Boric int udf_create_logical_dscr(int format_flags); 253*9f988b79SJean-Baptiste Boric int udf_create_impvold(char *field1, char *field2, char *field3); 254*9f988b79SJean-Baptiste Boric int udf_create_fsd(void); 255*9f988b79SJean-Baptiste Boric int udf_create_lvintd(int type); 256*9f988b79SJean-Baptiste Boric void udf_update_lvintd(int type); 257*9f988b79SJean-Baptiste Boric 258*9f988b79SJean-Baptiste Boric int udf_register_bad_block(uint32_t location); 259*9f988b79SJean-Baptiste Boric void udf_mark_allocated(uint32_t start_lb, int partnr, uint32_t blocks); 260*9f988b79SJean-Baptiste Boric 261*9f988b79SJean-Baptiste Boric int udf_create_new_fe(struct file_entry **fep, int file_type, 262*9f988b79SJean-Baptiste Boric struct stat *st); 263*9f988b79SJean-Baptiste Boric int udf_create_new_efe(struct extfile_entry **efep, int file_type, 264*9f988b79SJean-Baptiste Boric struct stat *st); 265*9f988b79SJean-Baptiste Boric 266*9f988b79SJean-Baptiste Boric int udf_encode_symlink(uint8_t **pathbufp, uint32_t *pathlenp, char *target); 267*9f988b79SJean-Baptiste Boric 268*9f988b79SJean-Baptiste Boric void udf_advance_uniqueid(void); 269*9f988b79SJean-Baptiste Boric int udf_fidsize(struct fileid_desc *fid); 270*9f988b79SJean-Baptiste Boric void udf_create_fid(uint32_t diroff, struct fileid_desc *fid, 271*9f988b79SJean-Baptiste Boric char *name, int namelen, struct long_ad *ref); 272*9f988b79SJean-Baptiste Boric int udf_create_parentfid(struct fileid_desc *fid, struct long_ad *parent); 273*9f988b79SJean-Baptiste Boric 274*9f988b79SJean-Baptiste Boric int udf_create_meta_files(void); 275*9f988b79SJean-Baptiste Boric int udf_create_new_rootdir(union dscrptr **dscr); 276*9f988b79SJean-Baptiste Boric 277*9f988b79SJean-Baptiste Boric int udf_create_VAT(union dscrptr **vat_dscr); 278*9f988b79SJean-Baptiste Boric void udf_prepend_VAT_file(void); 279*9f988b79SJean-Baptiste Boric void udf_vat_update(uint32_t virt, uint32_t phys); 280*9f988b79SJean-Baptiste Boric int udf_append_VAT_file(void); 281*9f988b79SJean-Baptiste Boric 282*9f988b79SJean-Baptiste Boric #endif /* _FS_UDF_UDF_CREATE_H_ */ 283*9f988b79SJean-Baptiste Boric 284