1214921Scognet/* $NetBSD: iso9660_rrip.h,v 1.5 2009/01/10 22:06:29 bjh21 Exp $ */ 2214921Scognet 3214921Scognet/* 4214921Scognet * Copyright (c) 2005 Daniel Watt, Walter Deignan, Ryan Gabrys, Alan 5214921Scognet * Perez-Rathke and Ram Vedam. All rights reserved. 6214921Scognet * 7214921Scognet * This code was written by Daniel Watt, Walter Deignan, Ryan Gabrys, 8214921Scognet * Alan Perez-Rathke and Ram Vedam. 9214921Scognet * 10214921Scognet * Redistribution and use in source and binary forms, with or 11214921Scognet * without modification, are permitted provided that the following 12214921Scognet * conditions are met: 13214921Scognet * 1. Redistributions of source code must retain the above copyright 14214921Scognet * notice, this list of conditions and the following disclaimer. 15214921Scognet * 2. Redistributions in binary form must reproduce the above 16214921Scognet * copyright notice, this list of conditions and the following 17214921Scognet * disclaimer in the documentation and/or other materials provided 18214921Scognet * with the distribution. 19214921Scognet * 20214921Scognet * THIS SOFTWARE IS PROVIDED BY DANIEL WATT, WALTER DEIGNAN, RYAN 21214921Scognet * GABRYS, ALAN PEREZ-RATHKE AND RAM VEDAM ``AS IS'' AND ANY EXPRESS OR 22214921Scognet * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23214921Scognet * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 24214921Scognet * DISCLAIMED. IN NO EVENT SHALL DANIEL WATT, WALTER DEIGNAN, RYAN 25214921Scognet * GABRYS, ALAN PEREZ-RATHKE AND RAM VEDAM BE LIABLE FOR ANY DIRECT, INDIRECT, 26214921Scognet * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27214921Scognet * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 28214921Scognet * USE,DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 29214921Scognet * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30214921Scognet * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31214921Scognet * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 32214921Scognet * OF SUCH DAMAGE. 33214921Scognet * 34214921Scognet * $FreeBSD$ 35214921Scognet */ 36214921Scognet#ifndef __ISO9660_RRIP_H__ 37214921Scognet#define __ISO9660_RRIP_H__ 38214921Scognet 39214921Scognet/* 40214921Scognet * This will hold all the functions needed to 41214921Scognet * write an ISO 9660 image with Rock Ridge Extensions 42214921Scognet */ 43214921Scognet 44214921Scognet/* For writing must use ISO_RRIP_EXTREF structure */ 45214921Scognet 46214921Scognet#include "makefs.h" 47214921Scognet#include <cd9660_rrip.h> 48214921Scognet#include "cd9660.h" 49214921Scognet#include <sys/queue.h> 50214921Scognet 51214921Scognet#define PX_LENGTH 0x2C 52214921Scognet#define PN_LENGTH 0x14 53214921Scognet#define TF_CREATION 0x00 54214921Scognet#define TF_MODIFY 0x01 55214921Scognet#define TF_ACCESS 0x02 56214921Scognet#define TF_ATTRIBUTES 0x04 57214921Scognet#define TF_BACKUP 0x08 58214921Scognet#define TF_EXPIRATION 0x10 59214921Scognet#define TF_EFFECTIVE 0x20 60214921Scognet#define TF_LONGFORM 0x40 61214921Scognet#define NM_CONTINUE 0x80 62214921Scognet#define NM_CURRENT 0x100 63214921Scognet#define NM_PARENT 0x200 64214921Scognet 65214921Scognet 66214921Scognet#define SUSP_LOC_ENTRY 0x01 67214921Scognet#define SUSP_LOC_DOT 0x02 68214921Scognet#define SUSP_LOC_DOTDOT 0x04 69214921Scognet 70214921Scognet#define SUSP_TYPE_SUSP 1 71214921Scognet#define SUSP_TYPE_RRIP 2 72214921Scognet 73214921Scognet#define SUSP_ENTRY_SUSP_CE 1 74214921Scognet#define SUSP_ENTRY_SUSP_PD 2 75214921Scognet#define SUSP_ENTRY_SUSP_SP 3 76214921Scognet#define SUSP_ENTRY_SUSP_ST 4 77214921Scognet#define SUSP_ENTRY_SUSP_ER 5 78214921Scognet#define SUSP_ENTRY_SUSP_ES 6 79214921Scognet 80214921Scognet#define SUSP_ENTRY_RRIP_PX 1 81214921Scognet#define SUSP_ENTRY_RRIP_PN 2 82214921Scognet#define SUSP_ENTRY_RRIP_SL 3 83214921Scognet#define SUSP_ENTRY_RRIP_NM 4 84214921Scognet#define SUSP_ENTRY_RRIP_CL 5 85214921Scognet#define SUSP_ENTRY_RRIP_PL 6 86214921Scognet#define SUSP_ENTRY_RRIP_RE 7 87214921Scognet#define SUSP_ENTRY_RRIP_TF 8 88214921Scognet#define SUSP_ENTRY_RRIP_SF 9 89214921Scognet 90214921Scognet#define SUSP_RRIP_ER_EXT_ID "IEEE_P1282" 91214921Scognet#define SUSP_RRIP_ER_EXT_DES "THE IEEE P1282 PROTOCOL PROVIDES SUPPORT FOR POSIX FILE SYSTEM SEMANTICS." 92214921Scognet#define SUSP_RRIP_ER_EXT_SRC "PLEASE CONTACT THE IEEE STANDARDS DEPARTMENT, PISCATAWAY, NJ, USA FOR THE P1282 SPECIFICATION." 93214921Scognet 94214921Scognet#define SL_FLAGS_NONE 0 95214921Scognet#define SL_FLAGS_CONTINUE 1 96214921Scognet#define SL_FLAGS_CURRENT 2 97214921Scognet#define SL_FLAGS_PARENT 4 98214921Scognet#define SL_FLAGS_ROOT 8 99214921Scognet 100214921Scognettypedef struct { 101214921Scognet ISO_SUSP_HEADER h; 102214921Scognet u_char mode [ISODCL(5,12)]; 103214921Scognet u_char links [ISODCL(13,20)]; 104214921Scognet u_char uid [ISODCL(21,28)]; 105214921Scognet u_char gid [ISODCL(29,36)]; 106264936Smarius u_char serial [ISODCL(37,44)]; 107214921Scognet} ISO_RRIP_PX; 108214921Scognet 109214921Scognettypedef struct { 110214921Scognet ISO_SUSP_HEADER h; 111214921Scognet u_char high [ISODCL(5,12)]; 112214921Scognet u_char low [ISODCL(13,20)]; 113214921Scognet} ISO_RRIP_PN; 114214921Scognet 115214921Scognettypedef struct { 116214921Scognet ISO_SUSP_HEADER h; 117214921Scognet u_char flags [ISODCL ( 4, 4)]; 118214921Scognet u_char component [ISODCL ( 4, 256)]; 119214921Scognet u_int nBytes; 120214921Scognet} ISO_RRIP_SL; 121214921Scognet 122214921Scognettypedef struct { 123214921Scognet ISO_SUSP_HEADER h; 124214921Scognet u_char flags [ISODCL ( 4, 4)]; 125214921Scognet u_char timestamp [ISODCL ( 5, 256)]; 126214921Scognet} ISO_RRIP_TF; 127214921Scognet 128214921Scognet#define RRIP_NM_FLAGS_NONE 0x00 129214921Scognet#define RRIP_NM_FLAGS_CONTINUE 0x01 130214921Scognet#define RRIP_NM_FLAGS_CURRENT 0x02 131214921Scognet#define RRIP_NM_FLAGS_PARENT 0x04 132214921Scognet 133214921Scognettypedef struct { 134214921Scognet ISO_SUSP_HEADER h; 135214921Scognet u_char flags [ISODCL ( 4, 4)]; 136214921Scognet u_char altname [ISODCL ( 4, 256)]; 137214921Scognet} ISO_RRIP_NM; 138214921Scognet 139214921Scognet/* Note that this is the same structure as cd9660_rrip.h : ISO_RRIP_CONT */ 140214921Scognettypedef struct { 141214921Scognet ISO_SUSP_HEADER h; 142214921Scognet u_char ca_sector [ISODCL ( 5, 12)]; 143214921Scognet u_char offset [ISODCL ( 13, 20)]; 144214921Scognet u_char length [ISODCL ( 21, 28)]; 145214921Scognet} ISO_SUSP_CE; 146214921Scognet 147214921Scognettypedef struct { 148214921Scognet ISO_SUSP_HEADER h; 149214921Scognet u_char padding_area [ISODCL ( 4, 256)]; 150214921Scognet} ISO_SUSP_PD; 151214921Scognet 152214921Scognettypedef struct { 153214921Scognet ISO_SUSP_HEADER h; 154214921Scognet u_char check [ISODCL ( 4, 5)]; 155214921Scognet u_char len_skp [ISODCL ( 6, 6)]; 156214921Scognet} ISO_SUSP_SP; 157214921Scognet 158214921Scognettypedef struct { 159214921Scognet ISO_SUSP_HEADER h; 160214921Scognet} ISO_SUSP_ST; 161214921Scognet 162214921Scognettypedef struct { 163214921Scognet ISO_SUSP_HEADER h; 164214921Scognet u_char len_id [ISODCL ( 4, 4)]; 165214921Scognet u_char len_des [ISODCL ( 5, 5)]; 166214921Scognet u_char len_src [ISODCL ( 6, 6)]; 167214921Scognet u_char ext_ver [ISODCL ( 7, 7)]; 168214921Scognet u_char ext_data [ISODCL (8,256)]; 169214921Scognet/* u_char ext_id [ISODCL ( 8, 256)]; 170214921Scognet u_char ext_des [ISODCL ( 257, 513)]; 171214921Scognet u_char ext_src [ISODCL ( 514, 770)];*/ 172214921Scognet} ISO_SUSP_ER; 173214921Scognet 174214921Scognettypedef struct { 175214921Scognet ISO_SUSP_HEADER h; 176214921Scognet u_char ext_seq [ISODCL ( 4, 4)]; 177214921Scognet} ISO_SUSP_ES; 178214921Scognet 179214921Scognettypedef union { 180214921Scognet ISO_RRIP_PX PX; 181214921Scognet ISO_RRIP_PN PN; 182214921Scognet ISO_RRIP_SL SL; 183214921Scognet ISO_RRIP_NM NM; 184214921Scognet ISO_RRIP_CLINK CL; 185214921Scognet ISO_RRIP_PLINK PL; 186214921Scognet ISO_RRIP_RELDIR RE; 187214921Scognet ISO_RRIP_TF TF; 188214921Scognet} rrip_entry; 189214921Scognet 190214921Scognettypedef union { 191214921Scognet ISO_SUSP_CE CE; 192214921Scognet ISO_SUSP_PD PD; 193214921Scognet ISO_SUSP_SP SP; 194214921Scognet ISO_SUSP_ST ST; 195214921Scognet ISO_SUSP_ER ER; 196214921Scognet ISO_SUSP_ES ES; 197214921Scognet} susp_entry; 198214921Scognet 199214921Scognettypedef union { 200214921Scognet susp_entry su_entry; 201214921Scognet rrip_entry rr_entry; 202214921Scognet} SUSP_ENTRIES; 203214921Scognet 204214921Scognetstruct ISO_SUSP_ATTRIBUTES { 205214921Scognet SUSP_ENTRIES attr; 206214921Scognet int type; 207214921Scognet char type_of[2]; 208214921Scognet char last_in_suf; /* last entry in the System Use Field? */ 209214921Scognet /* Dan's addons - will merge later. This allows use of a switch */ 210214921Scognet char susp_type; /* SUSP or RRIP */ 211214921Scognet char entry_type; /* Record type */ 212214921Scognet char write_location; 213214921Scognet TAILQ_ENTRY(ISO_SUSP_ATTRIBUTES) rr_ll; 214214921Scognet}; 215214921Scognet 216214921Scognet#define CD9660_SUSP_ENTRY_SIZE(entry)\ 217214921Scognet ((int) ((entry)->attr.su_entry.SP.h.length[0])) 218214921Scognet 219214921Scognet/* Recursive function - move later to func pointer code*/ 220214921Scognetint cd9660_susp_finalize(cd9660node *); 221214921Scognet 222214921Scognet/* These two operate on single nodes */ 223214921Scognetint cd9660_susp_finalize_node(cd9660node *); 224214921Scognetint cd9660_rrip_finalize_node(cd9660node *); 225214921Scognet 226214921Scognet/* POSIX File attribute */ 227214921Scognetint cd9660node_rrip_px(struct ISO_SUSP_ATTRIBUTES *, fsnode *); 228214921Scognet 229214921Scognet/* Device number */ 230214921Scognetint cd9660node_rrip_pn(struct ISO_SUSP_ATTRIBUTES *, fsnode *); 231214921Scognet 232214921Scognet/* Symbolic link */ 233214921Scognetint cd9660node_rrip_SL(struct ISO_SUSP_ATTRIBUTES *, fsnode *); 234214921Scognet 235214921Scognet/* Alternate Name function */ 236214921Scognetvoid cd9660_rrip_NM(cd9660node *); 237214921Scognetvoid cd9660_rrip_add_NM(cd9660node *,const char *); 238214921Scognet 239214921Scognet/* Parent and child link function */ 240214921Scognetint cd9660_rrip_PL(struct ISO_SUSP_ATTRIBUTES *, cd9660node *); 241214921Scognetint cd9660_rrip_CL(struct ISO_SUSP_ATTRIBUTES *, cd9660node *); 242214921Scognetint cd9660_rrip_RE(struct ISO_SUSP_ATTRIBUTES *, cd9660node *); 243214921Scognet 244214921Scognetint cd9660node_rrip_tf(struct ISO_SUSP_ATTRIBUTES *, fsnode *); 245214921Scognet 246214921Scognet 247214921Scognet 248214921Scognet/* 249214921Scognet * Relocation directory function. I'm not quite sure what 250214921Scognet * sort of parameters are needed, but personally I don't think 251214921Scognet * any parameters are needed except for the memory address where 252214921Scognet * the information needs to be put in 253214921Scognet */ 254214921Scognetint cd9660node_rrip_re(void *, fsnode *); 255214921Scognet 256214921Scognet/* 257214921Scognet * Don't know if this function is needed because it apparently is an 258214921Scognet * optional feature that does not really need to be implemented but I 259214921Scognet * thought I should add it anyway. 260214921Scognet */ 261214921Scognetint cd9660_susp_ce (struct ISO_SUSP_ATTRIBUTES *, cd9660node *); 262214921Scognetint cd9660_susp_pd (struct ISO_SUSP_ATTRIBUTES *, int); 263214921Scognetint cd9660_susp_sp (struct ISO_SUSP_ATTRIBUTES *, cd9660node *); 264214921Scognetint cd9660_susp_st (struct ISO_SUSP_ATTRIBUTES *, cd9660node *); 265214921Scognet 266214921Scognetstruct ISO_SUSP_ATTRIBUTES *cd9660_susp_ER(cd9660node *, u_char, const char *, 267214921Scognet const char *, const char *); 268214921Scognetstruct ISO_SUSP_ATTRIBUTES *cd9660_susp_ES(struct ISO_SUSP_ATTRIBUTES*, 269214921Scognet cd9660node *); 270214921Scognet 271214921Scognet 272214921Scognet/* Helper functions */ 273214921Scognet 274214921Scognet/* Common SUSP/RRIP functions */ 275214921Scognetint cd9660_susp_initialize(cd9660node *, cd9660node *, cd9660node *); 276214921Scognetint cd9660_susp_initialize_node(cd9660node *); 277214921Scognetstruct ISO_SUSP_ATTRIBUTES *cd9660node_susp_create_node(int, int, const char *, 278214921Scognet int); 279214921Scognetstruct ISO_SUSP_ATTRIBUTES *cd9660node_susp_add_entry(cd9660node *, 280214921Scognet struct ISO_SUSP_ATTRIBUTES *, struct ISO_SUSP_ATTRIBUTES *, int); 281214921Scognet 282214921Scognet/* RRIP specific functions */ 283214921Scognetint cd9660_rrip_initialize_node(cd9660node *, cd9660node *, cd9660node *); 284214921Scognetvoid cd9660_createSL(cd9660node *); 285214921Scognet 286214921Scognet/* Functions that probably can be removed */ 287214921Scognet/* int cd9660node_initialize_node(int, char *); */ 288214921Scognet 289214921Scognet 290214921Scognet#endif 291