1/* $NetBSD: udf_create.h,v 1.2 2008/07/26 20:20:56 reinoud Exp $ */ 2 3/* 4 * Copyright (c) 2006, 2008 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_UDF_CREATE_H_ 30#define _FS_UDF_UDF_CREATE_H_ 31 32#include <sys/types.h> 33#include <fs/udf/ecma167-udf.h> 34#include "udf_bswap.h" 35#include "udf_osta.h" 36 37 38/* format flags indicating properties of disc to create */ 39#define FORMAT_WRITEONCE 0x00001 40#define FORMAT_SEQUENTIAL 0x00002 41#define FORMAT_REWRITABLE 0x00004 42#define FORMAT_SPARABLE 0x00008 43#define FORMAT_META 0x00010 44#define FORMAT_LOW 0x00020 45#define FORMAT_VAT 0x00040 46#define FORMAT_WORM 0x00080 47#define FORMAT_TRACK512 0x00100 48#define FORMAT_INVALID 0x00200 49#define FORMAT_FLAGBITS \ 50 "\10\1WRITEONCE\2SEQUENTIAL\3REWRITABLE\4SPARABLE\5META\6LOW" \ 51 "\7VAT\10WORM\11TRACK512\12INVALID" 52 53 54/* structure space */ 55#define UDF_ANCHORS 4 /* 256, 512, N-256, N */ 56#define UDF_PARTITIONS 4 /* overkill */ 57#define UDF_PMAPS 4 /* overkill */ 58 59/* misc constants */ 60#define UDF_MAX_NAMELEN 255 /* as per SPEC */ 61 62/* translation constants */ 63#define UDF_VTOP_RAWPART UDF_PMAPS /* [0..UDF_PMAPS> are normal */ 64 65/* virtual to physical mapping types */ 66#define UDF_VTOP_TYPE_RAW 0 67#define UDF_VTOP_TYPE_UNKNOWN 0 68#define UDF_VTOP_TYPE_PHYS 1 69#define UDF_VTOP_TYPE_VIRT 2 70#define UDF_VTOP_TYPE_SPARABLE 3 71#define UDF_VTOP_TYPE_META 4 72 73#define UDF_TRANS_ZERO ((uint64_t) -1) 74#define UDF_TRANS_UNMAPPED ((uint64_t) -2) 75#define UDF_TRANS_INTERN ((uint64_t) -3) 76#define UDF_MAX_SECTOR ((uint64_t) -10) /* high water mark */ 77 78/* handys */ 79#define UDF_ROUNDUP(val, gran) \ 80 ((gran) * (((val) + (gran)-1) / (gran))) 81 82#define UDF_ROUNDDOWN(val, gran) \ 83 ((gran) * (((val)) / (gran))) 84 85 86/* disc offsets for various structures and their sizes */ 87struct udf_disclayout { 88 uint32_t wrtrack_skew; 89 90 uint32_t iso9660_vrs; 91 uint32_t anchors[UDF_ANCHORS]; 92 uint32_t vds_size, vds1, vds2; 93 uint32_t lvis_size, lvis; 94 95 uint32_t first_lba, last_lba; 96 uint32_t sector_size; 97 uint32_t blockingnr, align_blockingnr, sparable_blockingnr; 98 uint32_t meta_blockingnr, meta_alignment; 99 100 /* sparables */ 101 uint32_t sparable_blocks; 102 uint32_t sparable_area, sparable_area_size; 103 uint32_t sparing_table_dscr_lbas; 104 uint32_t spt_1, spt_2; 105 106 /* bitmaps */ 107 uint32_t alloc_bitmap_dscr_size; 108 uint32_t unalloc_space, freed_space; 109 110 uint32_t meta_bitmap_dscr_size; 111 uint32_t meta_bitmap_space; 112 113 /* metadata partition */ 114 uint32_t meta_file, meta_mirror, meta_bitmap; 115 uint32_t meta_part_start_lba, meta_part_size_lba; 116 117 /* main partition */ 118 uint32_t part_start_lba, part_size_lba; 119 120 uint32_t fsd, rootdir, vat; 121 122}; 123 124 125/* all info about discs and descriptors building */ 126struct udf_create_context { 127 /* descriptors */ 128 int dscrver; /* 2 or 3 */ 129 int min_udf; /* hex */ 130 int max_udf; /* hex */ 131 int serialnum; /* format serialno */ 132 133 int gmtoff; /* in minutes */ 134 135 /* XXX to layout? */ 136 uint32_t sector_size; 137 138 /* identification */ 139 char *logvol_name; 140 char *primary_name; 141 char *volset_name; 142 char *fileset_name; 143 144 char const *app_name; 145 char const *impl_name; 146 int app_version_main; 147 int app_version_sub; 148 149 /* building */ 150 int vds_seq; /* for building functions */ 151 int unique_id; /* only first few are used */ 152 153 /* constructed structures */ 154 struct anchor_vdp *anchors[UDF_ANCHORS]; /* anchors to VDS */ 155 struct pri_vol_desc *primary_vol; /* identification */ 156 struct logvol_desc *logical_vol; /* main mapping v->p */ 157 struct unalloc_sp_desc *unallocated; /* free UDF space */ 158 struct impvol_desc *implementation; /* likely reduntant */ 159 struct logvol_int_desc *logvol_integrity; /* current integrity */ 160 struct part_desc *partitions[UDF_PARTITIONS]; /* partitions */ 161 162 /* XXX to layout? */ 163 int data_part; 164 int metadata_part; 165 166 /* derived; points *into* other structures */ 167 struct udf_logvol_info *logvol_info; /* inside integrity */ 168 169 /* fileset and root directories */ 170 struct fileset_desc *fileset_desc; /* normally one */ 171 172 /* logical to physical translations */ 173 int vtop[UDF_PMAPS+1]; /* vpartnr trans */ 174 int vtop_tp[UDF_PMAPS+1]; /* type of trans */ 175 int vtop_offset[UDF_PMAPS+1]; /* offset in lb */ 176 177 /* sparable */ 178 struct udf_sparing_table*sparing_table; /* replacements */ 179 180 /* meta data partition */ 181 struct extfile_entry *meta_file; 182 struct extfile_entry *meta_mirror; 183 struct extfile_entry *meta_bitmap; 184 185 /* lvint */ 186 int num_files; 187 int num_directories; 188 uint32_t part_size[UDF_PARTITIONS]; 189 uint32_t part_free[UDF_PARTITIONS]; 190 191 struct space_bitmap_desc*part_unalloc_bits[UDF_PARTITIONS]; 192 struct space_bitmap_desc*part_freed_bits [UDF_PARTITIONS]; 193}; 194 195 196/* globals */ 197 198extern struct udf_create_context context; 199extern struct udf_disclayout layout; 200 201/* prototypes */ 202void udf_init_create_context(void); 203int udf_calculate_disc_layout(int format_flags, int min_udf, 204 uint32_t wrtrack_skew, 205 uint32_t first_lba, uint32_t last_lba, 206 uint32_t sector_size, uint32_t blockingnr, 207 uint32_t sparable_blocks, 208 float meta_fract); 209 210void udf_osta_charset(struct charspec *charspec); 211void udf_encode_osta_id(char *osta_id, uint16_t len, char *text); 212 213void udf_set_regid(struct regid *regid, char const *name); 214void udf_add_domain_regid(struct regid *regid); 215void udf_add_udf_regid(struct regid *regid); 216void udf_add_impl_regid(struct regid *regid); 217void udf_add_app_regid(struct regid *regid); 218 219int udf_validate_tag_sum(union dscrptr *dscr); 220int udf_validate_tag_and_crc_sums(union dscrptr *dscr); 221 222void udf_set_timestamp_now(struct timestamp *timestamp); 223 224 225void udf_inittag(struct desc_tag *tag, int tagid, uint32_t loc); 226int udf_create_anchor(int num); 227 228void udf_create_terminator(union dscrptr *dscr, uint32_t loc); 229int udf_create_primaryd(void); 230int udf_create_partitiond(int part_num, int part_accesstype); 231int udf_create_unalloc_spaced(void); 232int udf_create_sparing_tabled(void); 233int udf_create_space_bitmap(uint32_t dscr_size, uint32_t part_size_lba, 234 struct space_bitmap_desc **sbdp); 235int udf_create_logical_dscr(int format_flags); 236int udf_create_impvold(char *field1, char *field2, char *field3); 237int udf_create_fsd(void); 238int udf_create_lvintd(int type); 239void udf_update_lvintd(int type); 240 241int udf_register_bad_block(uint32_t location); 242void udf_mark_allocated(uint32_t start_lb, int partnr, uint32_t blocks); 243 244int udf_create_new_fe(struct file_entry **fep, int file_type, 245 struct long_ad *parent_icb); 246int udf_create_new_efe(struct extfile_entry **efep, int file_type, 247 struct long_ad *parent_icb); 248 249int udf_create_meta_files(void); 250int udf_create_new_rootdir(union dscrptr **dscr); 251int udf_create_new_VAT(union dscrptr **vat_dscr); 252 253#endif /* _FS_UDF_UDF_CREATE_H_ */ 254 255