1*5978408cSSascha Wildner /* $NetBSD: iso9660_rrip.h,v 1.5 2009/01/10 22:06:29 bjh21 Exp $ */ 2*5978408cSSascha Wildner 3*5978408cSSascha Wildner /*- 4*5978408cSSascha Wildner * SPDX-License-Identifier: BSD-2-Clause-NetBSD 5*5978408cSSascha Wildner * 6*5978408cSSascha Wildner * Copyright (c) 2005 Daniel Watt, Walter Deignan, Ryan Gabrys, Alan 7*5978408cSSascha Wildner * Perez-Rathke and Ram Vedam. All rights reserved. 8*5978408cSSascha Wildner * 9*5978408cSSascha Wildner * This code was written by Daniel Watt, Walter Deignan, Ryan Gabrys, 10*5978408cSSascha Wildner * Alan Perez-Rathke and Ram Vedam. 11*5978408cSSascha Wildner * 12*5978408cSSascha Wildner * Redistribution and use in source and binary forms, with or 13*5978408cSSascha Wildner * without modification, are permitted provided that the following 14*5978408cSSascha Wildner * conditions are met: 15*5978408cSSascha Wildner * 1. Redistributions of source code must retain the above copyright 16*5978408cSSascha Wildner * notice, this list of conditions and the following disclaimer. 17*5978408cSSascha Wildner * 2. Redistributions in binary form must reproduce the above 18*5978408cSSascha Wildner * copyright notice, this list of conditions and the following 19*5978408cSSascha Wildner * disclaimer in the documentation and/or other materials provided 20*5978408cSSascha Wildner * with the distribution. 21*5978408cSSascha Wildner * 22*5978408cSSascha Wildner * THIS SOFTWARE IS PROVIDED BY DANIEL WATT, WALTER DEIGNAN, RYAN 23*5978408cSSascha Wildner * GABRYS, ALAN PEREZ-RATHKE AND RAM VEDAM ``AS IS'' AND ANY EXPRESS OR 24*5978408cSSascha Wildner * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25*5978408cSSascha Wildner * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 26*5978408cSSascha Wildner * DISCLAIMED. IN NO EVENT SHALL DANIEL WATT, WALTER DEIGNAN, RYAN 27*5978408cSSascha Wildner * GABRYS, ALAN PEREZ-RATHKE AND RAM VEDAM BE LIABLE FOR ANY DIRECT, INDIRECT, 28*5978408cSSascha Wildner * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 29*5978408cSSascha Wildner * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 30*5978408cSSascha Wildner * USE,DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 31*5978408cSSascha Wildner * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 32*5978408cSSascha Wildner * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33*5978408cSSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 34*5978408cSSascha Wildner * OF SUCH DAMAGE. 35*5978408cSSascha Wildner * 36*5978408cSSascha Wildner * $FreeBSD: head/usr.sbin/makefs/cd9660/iso9660_rrip.h 326276 2017-11-27 15:37:16Z pfg $ 37*5978408cSSascha Wildner */ 38*5978408cSSascha Wildner #ifndef __ISO9660_RRIP_H__ 39*5978408cSSascha Wildner #define __ISO9660_RRIP_H__ 40*5978408cSSascha Wildner 41*5978408cSSascha Wildner /* 42*5978408cSSascha Wildner * This will hold all the functions needed to 43*5978408cSSascha Wildner * write an ISO 9660 image with Rock Ridge Extensions 44*5978408cSSascha Wildner */ 45*5978408cSSascha Wildner 46*5978408cSSascha Wildner /* For writing must use ISO_RRIP_EXTREF structure */ 47*5978408cSSascha Wildner 48*5978408cSSascha Wildner #include "makefs.h" 49*5978408cSSascha Wildner #include <cd9660_rrip.h> 50*5978408cSSascha Wildner #include "cd9660.h" 51*5978408cSSascha Wildner #include <sys/queue.h> 52*5978408cSSascha Wildner 53*5978408cSSascha Wildner #define PX_LENGTH 0x2C 54*5978408cSSascha Wildner #define PN_LENGTH 0x14 55*5978408cSSascha Wildner #define TF_CREATION 0x00 56*5978408cSSascha Wildner #define TF_MODIFY 0x01 57*5978408cSSascha Wildner #define TF_ACCESS 0x02 58*5978408cSSascha Wildner #define TF_ATTRIBUTES 0x04 59*5978408cSSascha Wildner #define TF_BACKUP 0x08 60*5978408cSSascha Wildner #define TF_EXPIRATION 0x10 61*5978408cSSascha Wildner #define TF_EFFECTIVE 0x20 62*5978408cSSascha Wildner #define TF_LONGFORM 0x40 63*5978408cSSascha Wildner #define NM_CONTINUE 0x80 64*5978408cSSascha Wildner #define NM_CURRENT 0x100 65*5978408cSSascha Wildner #define NM_PARENT 0x200 66*5978408cSSascha Wildner 67*5978408cSSascha Wildner 68*5978408cSSascha Wildner #define SUSP_LOC_ENTRY 0x01 69*5978408cSSascha Wildner #define SUSP_LOC_DOT 0x02 70*5978408cSSascha Wildner #define SUSP_LOC_DOTDOT 0x04 71*5978408cSSascha Wildner 72*5978408cSSascha Wildner #define SUSP_TYPE_SUSP 1 73*5978408cSSascha Wildner #define SUSP_TYPE_RRIP 2 74*5978408cSSascha Wildner 75*5978408cSSascha Wildner #define SUSP_ENTRY_SUSP_CE 1 76*5978408cSSascha Wildner #define SUSP_ENTRY_SUSP_PD 2 77*5978408cSSascha Wildner #define SUSP_ENTRY_SUSP_SP 3 78*5978408cSSascha Wildner #define SUSP_ENTRY_SUSP_ST 4 79*5978408cSSascha Wildner #define SUSP_ENTRY_SUSP_ER 5 80*5978408cSSascha Wildner #define SUSP_ENTRY_SUSP_ES 6 81*5978408cSSascha Wildner 82*5978408cSSascha Wildner #define SUSP_ENTRY_RRIP_PX 1 83*5978408cSSascha Wildner #define SUSP_ENTRY_RRIP_PN 2 84*5978408cSSascha Wildner #define SUSP_ENTRY_RRIP_SL 3 85*5978408cSSascha Wildner #define SUSP_ENTRY_RRIP_NM 4 86*5978408cSSascha Wildner #define SUSP_ENTRY_RRIP_CL 5 87*5978408cSSascha Wildner #define SUSP_ENTRY_RRIP_PL 6 88*5978408cSSascha Wildner #define SUSP_ENTRY_RRIP_RE 7 89*5978408cSSascha Wildner #define SUSP_ENTRY_RRIP_TF 8 90*5978408cSSascha Wildner #define SUSP_ENTRY_RRIP_SF 9 91*5978408cSSascha Wildner 92*5978408cSSascha Wildner #define SUSP_RRIP_ER_EXT_ID "IEEE_P1282" 93*5978408cSSascha Wildner #define SUSP_RRIP_ER_EXT_DES "THE IEEE P1282 PROTOCOL PROVIDES SUPPORT FOR POSIX FILE SYSTEM SEMANTICS." 94*5978408cSSascha Wildner #define SUSP_RRIP_ER_EXT_SRC "PLEASE CONTACT THE IEEE STANDARDS DEPARTMENT, PISCATAWAY, NJ, USA FOR THE P1282 SPECIFICATION." 95*5978408cSSascha Wildner 96*5978408cSSascha Wildner #define SL_FLAGS_NONE 0 97*5978408cSSascha Wildner #define SL_FLAGS_CONTINUE 1 98*5978408cSSascha Wildner #define SL_FLAGS_CURRENT 2 99*5978408cSSascha Wildner #define SL_FLAGS_PARENT 4 100*5978408cSSascha Wildner #define SL_FLAGS_ROOT 8 101*5978408cSSascha Wildner 102*5978408cSSascha Wildner typedef struct { 103*5978408cSSascha Wildner ISO_SUSP_HEADER h; 104*5978408cSSascha Wildner u_char mode [ISODCL(5,12)]; 105*5978408cSSascha Wildner u_char links [ISODCL(13,20)]; 106*5978408cSSascha Wildner u_char uid [ISODCL(21,28)]; 107*5978408cSSascha Wildner u_char gid [ISODCL(29,36)]; 108*5978408cSSascha Wildner u_char serial [ISODCL(37,44)]; 109*5978408cSSascha Wildner } ISO_RRIP_PX; 110*5978408cSSascha Wildner 111*5978408cSSascha Wildner typedef struct { 112*5978408cSSascha Wildner ISO_SUSP_HEADER h; 113*5978408cSSascha Wildner u_char high [ISODCL(5,12)]; 114*5978408cSSascha Wildner u_char low [ISODCL(13,20)]; 115*5978408cSSascha Wildner } ISO_RRIP_PN; 116*5978408cSSascha Wildner 117*5978408cSSascha Wildner typedef struct { 118*5978408cSSascha Wildner ISO_SUSP_HEADER h; 119*5978408cSSascha Wildner u_char flags [ISODCL ( 4, 4)]; 120*5978408cSSascha Wildner u_char component [ISODCL ( 4, 256)]; 121*5978408cSSascha Wildner u_int nBytes; 122*5978408cSSascha Wildner } ISO_RRIP_SL; 123*5978408cSSascha Wildner 124*5978408cSSascha Wildner typedef struct { 125*5978408cSSascha Wildner ISO_SUSP_HEADER h; 126*5978408cSSascha Wildner u_char flags [ISODCL ( 4, 4)]; 127*5978408cSSascha Wildner u_char timestamp [ISODCL ( 5, 256)]; 128*5978408cSSascha Wildner } ISO_RRIP_TF; 129*5978408cSSascha Wildner 130*5978408cSSascha Wildner #define RRIP_NM_FLAGS_NONE 0x00 131*5978408cSSascha Wildner #define RRIP_NM_FLAGS_CONTINUE 0x01 132*5978408cSSascha Wildner #define RRIP_NM_FLAGS_CURRENT 0x02 133*5978408cSSascha Wildner #define RRIP_NM_FLAGS_PARENT 0x04 134*5978408cSSascha Wildner 135*5978408cSSascha Wildner typedef struct { 136*5978408cSSascha Wildner ISO_SUSP_HEADER h; 137*5978408cSSascha Wildner u_char flags [ISODCL ( 4, 4)]; 138*5978408cSSascha Wildner u_char altname [ISODCL ( 4, 256)]; 139*5978408cSSascha Wildner } ISO_RRIP_NM; 140*5978408cSSascha Wildner 141*5978408cSSascha Wildner /* Note that this is the same structure as cd9660_rrip.h : ISO_RRIP_CONT */ 142*5978408cSSascha Wildner typedef struct { 143*5978408cSSascha Wildner ISO_SUSP_HEADER h; 144*5978408cSSascha Wildner u_char ca_sector [ISODCL ( 5, 12)]; 145*5978408cSSascha Wildner u_char offset [ISODCL ( 13, 20)]; 146*5978408cSSascha Wildner u_char length [ISODCL ( 21, 28)]; 147*5978408cSSascha Wildner } ISO_SUSP_CE; 148*5978408cSSascha Wildner 149*5978408cSSascha Wildner typedef struct { 150*5978408cSSascha Wildner ISO_SUSP_HEADER h; 151*5978408cSSascha Wildner u_char padding_area [ISODCL ( 4, 256)]; 152*5978408cSSascha Wildner } ISO_SUSP_PD; 153*5978408cSSascha Wildner 154*5978408cSSascha Wildner typedef struct { 155*5978408cSSascha Wildner ISO_SUSP_HEADER h; 156*5978408cSSascha Wildner u_char check [ISODCL ( 4, 5)]; 157*5978408cSSascha Wildner u_char len_skp [ISODCL ( 6, 6)]; 158*5978408cSSascha Wildner } ISO_SUSP_SP; 159*5978408cSSascha Wildner 160*5978408cSSascha Wildner typedef struct { 161*5978408cSSascha Wildner ISO_SUSP_HEADER h; 162*5978408cSSascha Wildner } ISO_SUSP_ST; 163*5978408cSSascha Wildner 164*5978408cSSascha Wildner typedef struct { 165*5978408cSSascha Wildner ISO_SUSP_HEADER h; 166*5978408cSSascha Wildner u_char len_id [ISODCL ( 4, 4)]; 167*5978408cSSascha Wildner u_char len_des [ISODCL ( 5, 5)]; 168*5978408cSSascha Wildner u_char len_src [ISODCL ( 6, 6)]; 169*5978408cSSascha Wildner u_char ext_ver [ISODCL ( 7, 7)]; 170*5978408cSSascha Wildner u_char ext_data [ISODCL (8,256)]; 171*5978408cSSascha Wildner /* u_char ext_id [ISODCL ( 8, 256)]; 172*5978408cSSascha Wildner u_char ext_des [ISODCL ( 257, 513)]; 173*5978408cSSascha Wildner u_char ext_src [ISODCL ( 514, 770)];*/ 174*5978408cSSascha Wildner } ISO_SUSP_ER; 175*5978408cSSascha Wildner 176*5978408cSSascha Wildner typedef struct { 177*5978408cSSascha Wildner ISO_SUSP_HEADER h; 178*5978408cSSascha Wildner u_char ext_seq [ISODCL ( 4, 4)]; 179*5978408cSSascha Wildner } ISO_SUSP_ES; 180*5978408cSSascha Wildner 181*5978408cSSascha Wildner typedef union { 182*5978408cSSascha Wildner ISO_RRIP_PX PX; 183*5978408cSSascha Wildner ISO_RRIP_PN PN; 184*5978408cSSascha Wildner ISO_RRIP_SL SL; 185*5978408cSSascha Wildner ISO_RRIP_NM NM; 186*5978408cSSascha Wildner ISO_RRIP_CLINK CL; 187*5978408cSSascha Wildner ISO_RRIP_PLINK PL; 188*5978408cSSascha Wildner ISO_RRIP_RELDIR RE; 189*5978408cSSascha Wildner ISO_RRIP_TF TF; 190*5978408cSSascha Wildner } rrip_entry; 191*5978408cSSascha Wildner 192*5978408cSSascha Wildner typedef union { 193*5978408cSSascha Wildner ISO_SUSP_CE CE; 194*5978408cSSascha Wildner ISO_SUSP_PD PD; 195*5978408cSSascha Wildner ISO_SUSP_SP SP; 196*5978408cSSascha Wildner ISO_SUSP_ST ST; 197*5978408cSSascha Wildner ISO_SUSP_ER ER; 198*5978408cSSascha Wildner ISO_SUSP_ES ES; 199*5978408cSSascha Wildner } susp_entry; 200*5978408cSSascha Wildner 201*5978408cSSascha Wildner typedef union { 202*5978408cSSascha Wildner susp_entry su_entry; 203*5978408cSSascha Wildner rrip_entry rr_entry; 204*5978408cSSascha Wildner } SUSP_ENTRIES; 205*5978408cSSascha Wildner 206*5978408cSSascha Wildner struct ISO_SUSP_ATTRIBUTES { 207*5978408cSSascha Wildner SUSP_ENTRIES attr; 208*5978408cSSascha Wildner int type; 209*5978408cSSascha Wildner char type_of[2]; 210*5978408cSSascha Wildner char last_in_suf; /* last entry in the System Use Field? */ 211*5978408cSSascha Wildner /* Dan's addons - will merge later. This allows use of a switch */ 212*5978408cSSascha Wildner char susp_type; /* SUSP or RRIP */ 213*5978408cSSascha Wildner char entry_type; /* Record type */ 214*5978408cSSascha Wildner char write_location; 215*5978408cSSascha Wildner TAILQ_ENTRY(ISO_SUSP_ATTRIBUTES) rr_ll; 216*5978408cSSascha Wildner }; 217*5978408cSSascha Wildner 218*5978408cSSascha Wildner #define CD9660_SUSP_ENTRY_SIZE(entry)\ 219*5978408cSSascha Wildner ((int) ((entry)->attr.su_entry.SP.h.length[0])) 220*5978408cSSascha Wildner 221*5978408cSSascha Wildner /* Recursive function - move later to func pointer code*/ 222*5978408cSSascha Wildner int cd9660_susp_finalize(iso9660_disk *, cd9660node *); 223*5978408cSSascha Wildner 224*5978408cSSascha Wildner /* These two operate on single nodes */ 225*5978408cSSascha Wildner int cd9660_susp_finalize_node(iso9660_disk *, cd9660node *); 226*5978408cSSascha Wildner int cd9660_rrip_finalize_node(cd9660node *); 227*5978408cSSascha Wildner 228*5978408cSSascha Wildner /* POSIX File attribute */ 229*5978408cSSascha Wildner int cd9660node_rrip_px(struct ISO_SUSP_ATTRIBUTES *, fsnode *); 230*5978408cSSascha Wildner 231*5978408cSSascha Wildner /* Device number */ 232*5978408cSSascha Wildner int cd9660node_rrip_pn(struct ISO_SUSP_ATTRIBUTES *, fsnode *); 233*5978408cSSascha Wildner 234*5978408cSSascha Wildner /* Symbolic link */ 235*5978408cSSascha Wildner int cd9660node_rrip_SL(struct ISO_SUSP_ATTRIBUTES *, fsnode *); 236*5978408cSSascha Wildner 237*5978408cSSascha Wildner /* Alternate Name function */ 238*5978408cSSascha Wildner void cd9660_rrip_NM(cd9660node *); 239*5978408cSSascha Wildner void cd9660_rrip_add_NM(cd9660node *,const char *); 240*5978408cSSascha Wildner 241*5978408cSSascha Wildner /* Parent and child link function */ 242*5978408cSSascha Wildner int cd9660_rrip_PL(struct ISO_SUSP_ATTRIBUTES *, cd9660node *); 243*5978408cSSascha Wildner int cd9660_rrip_CL(struct ISO_SUSP_ATTRIBUTES *, cd9660node *); 244*5978408cSSascha Wildner int cd9660_rrip_RE(struct ISO_SUSP_ATTRIBUTES *, cd9660node *); 245*5978408cSSascha Wildner 246*5978408cSSascha Wildner int cd9660node_rrip_tf(struct ISO_SUSP_ATTRIBUTES *, fsnode *); 247*5978408cSSascha Wildner 248*5978408cSSascha Wildner 249*5978408cSSascha Wildner 250*5978408cSSascha Wildner /* 251*5978408cSSascha Wildner * Relocation directory function. I'm not quite sure what 252*5978408cSSascha Wildner * sort of parameters are needed, but personally I don't think 253*5978408cSSascha Wildner * any parameters are needed except for the memory address where 254*5978408cSSascha Wildner * the information needs to be put in 255*5978408cSSascha Wildner */ 256*5978408cSSascha Wildner int cd9660node_rrip_re(void *, fsnode *); 257*5978408cSSascha Wildner 258*5978408cSSascha Wildner /* 259*5978408cSSascha Wildner * Don't know if this function is needed because it apparently is an 260*5978408cSSascha Wildner * optional feature that does not really need to be implemented but I 261*5978408cSSascha Wildner * thought I should add it anyway. 262*5978408cSSascha Wildner */ 263*5978408cSSascha Wildner int cd9660_susp_ce (struct ISO_SUSP_ATTRIBUTES *, cd9660node *); 264*5978408cSSascha Wildner int cd9660_susp_pd (struct ISO_SUSP_ATTRIBUTES *, int); 265*5978408cSSascha Wildner int cd9660_susp_sp (struct ISO_SUSP_ATTRIBUTES *, cd9660node *); 266*5978408cSSascha Wildner int cd9660_susp_st (struct ISO_SUSP_ATTRIBUTES *, cd9660node *); 267*5978408cSSascha Wildner 268*5978408cSSascha Wildner struct ISO_SUSP_ATTRIBUTES *cd9660_susp_ER(cd9660node *, u_char, const char *, 269*5978408cSSascha Wildner const char *, const char *); 270*5978408cSSascha Wildner struct ISO_SUSP_ATTRIBUTES *cd9660_susp_ES(struct ISO_SUSP_ATTRIBUTES*, 271*5978408cSSascha Wildner cd9660node *); 272*5978408cSSascha Wildner 273*5978408cSSascha Wildner 274*5978408cSSascha Wildner /* Helper functions */ 275*5978408cSSascha Wildner 276*5978408cSSascha Wildner /* Common SUSP/RRIP functions */ 277*5978408cSSascha Wildner int cd9660_susp_initialize(iso9660_disk *, cd9660node *, cd9660node *, 278*5978408cSSascha Wildner cd9660node *); 279*5978408cSSascha Wildner int cd9660_susp_initialize_node(iso9660_disk *, cd9660node *); 280*5978408cSSascha Wildner struct ISO_SUSP_ATTRIBUTES *cd9660node_susp_create_node(int, int, const char *, 281*5978408cSSascha Wildner int); 282*5978408cSSascha Wildner struct ISO_SUSP_ATTRIBUTES *cd9660node_susp_add_entry(cd9660node *, 283*5978408cSSascha Wildner struct ISO_SUSP_ATTRIBUTES *, struct ISO_SUSP_ATTRIBUTES *, int); 284*5978408cSSascha Wildner 285*5978408cSSascha Wildner /* RRIP specific functions */ 286*5978408cSSascha Wildner int cd9660_rrip_initialize_node(iso9660_disk *, cd9660node *, cd9660node *, 287*5978408cSSascha Wildner cd9660node *); 288*5978408cSSascha Wildner void cd9660_createSL(cd9660node *); 289*5978408cSSascha Wildner 290*5978408cSSascha Wildner /* Functions that probably can be removed */ 291*5978408cSSascha Wildner /* int cd9660node_initialize_node(int, char *); */ 292*5978408cSSascha Wildner 293*5978408cSSascha Wildner 294*5978408cSSascha Wildner #endif 295