xref: /openbsd-src/usr.sbin/makefs/cd9660/iso9660_rrip.h (revision 841a57a218f5ee41539343ce9ac032daacdd0b16)
1*841a57a2Skrw /*	$OpenBSD: iso9660_rrip.h,v 1.4 2016/12/17 16:22:04 krw Exp $	*/
26163fc9cSnatano /*	$NetBSD: iso9660_rrip.h,v 1.6 2013/01/28 21:03:28 christos Exp $	*/
36163fc9cSnatano 
46163fc9cSnatano /*
56163fc9cSnatano  * Copyright (c) 2005 Daniel Watt, Walter Deignan, Ryan Gabrys, Alan
66163fc9cSnatano  * Perez-Rathke and Ram Vedam.  All rights reserved.
76163fc9cSnatano  *
86163fc9cSnatano  * This code was written by Daniel Watt, Walter Deignan, Ryan Gabrys,
96163fc9cSnatano  * Alan Perez-Rathke and Ram Vedam.
106163fc9cSnatano  *
116163fc9cSnatano  * Redistribution and use in source and binary forms, with or
126163fc9cSnatano  * without modification, are permitted provided that the following
136163fc9cSnatano  * conditions are met:
146163fc9cSnatano  * 1. Redistributions of source code must retain the above copyright
156163fc9cSnatano  *    notice, this list of conditions and the following disclaimer.
166163fc9cSnatano  * 2. Redistributions in binary form must reproduce the above
176163fc9cSnatano  *    copyright notice, this list of conditions and the following
186163fc9cSnatano  *    disclaimer in the documentation and/or other materials provided
196163fc9cSnatano  *    with the distribution.
206163fc9cSnatano  *
216163fc9cSnatano  * THIS SOFTWARE IS PROVIDED BY DANIEL WATT, WALTER DEIGNAN, RYAN
226163fc9cSnatano  * GABRYS, ALAN PEREZ-RATHKE AND RAM VEDAM ``AS IS'' AND ANY EXPRESS OR
236163fc9cSnatano  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
246163fc9cSnatano  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
256163fc9cSnatano  * DISCLAIMED.  IN NO EVENT SHALL DANIEL WATT, WALTER DEIGNAN, RYAN
266163fc9cSnatano  * GABRYS, ALAN PEREZ-RATHKE AND RAM VEDAM BE LIABLE FOR ANY DIRECT, INDIRECT,
276163fc9cSnatano  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
286163fc9cSnatano  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
296163fc9cSnatano  * USE,DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
306163fc9cSnatano  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
316163fc9cSnatano  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
326163fc9cSnatano  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
336163fc9cSnatano  * OF SUCH DAMAGE.
346163fc9cSnatano  */
356163fc9cSnatano #ifndef __ISO9660_RRIP_H__
366163fc9cSnatano #define __ISO9660_RRIP_H__
376163fc9cSnatano 
386163fc9cSnatano /*
396163fc9cSnatano  * This will hold all the functions needed to
406163fc9cSnatano  * write an ISO 9660 image with Rock Ridge Extensions
416163fc9cSnatano  */
426163fc9cSnatano 
436163fc9cSnatano /* For writing must use ISO_RRIP_EXTREF structure */
446163fc9cSnatano 
456163fc9cSnatano #include "makefs.h"
468a44b1e0Snatano #include "cd9660/cd9660_rrip.h"
476163fc9cSnatano #include "cd9660.h"
486163fc9cSnatano #include <sys/queue.h>
496163fc9cSnatano 
506163fc9cSnatano #define	 PX_LENGTH	   0x2C
516163fc9cSnatano #define	 PN_LENGTH	   0x14
526163fc9cSnatano #define	 TF_CREATION	   0x00
536163fc9cSnatano #define	 TF_MODIFY	   0x01
546163fc9cSnatano #define	 TF_ACCESS	   0x02
556163fc9cSnatano #define	 TF_ATTRIBUTES	   0x04
566163fc9cSnatano #define	 TF_BACKUP	   0x08
576163fc9cSnatano #define	 TF_EXPIRATION	   0x10
586163fc9cSnatano #define	 TF_EFFECTIVE	   0x20
596163fc9cSnatano #define	 TF_LONGFORM	   0x40
606163fc9cSnatano #define  NM_CONTINUE	   0x80
616163fc9cSnatano #define	 NM_CURRENT	   0x100
626163fc9cSnatano #define	 NM_PARENT	   0x200
636163fc9cSnatano 
646163fc9cSnatano 
656163fc9cSnatano #define	 SUSP_LOC_ENTRY	   0x01
666163fc9cSnatano #define	 SUSP_LOC_DOT	   0x02
676163fc9cSnatano #define	 SUSP_LOC_DOTDOT   0x04
686163fc9cSnatano 
696163fc9cSnatano #define SUSP_TYPE_SUSP		1
706163fc9cSnatano #define SUSP_TYPE_RRIP		2
716163fc9cSnatano 
726163fc9cSnatano #define SUSP_ENTRY_SUSP_CE	1
736163fc9cSnatano #define SUSP_ENTRY_SUSP_PD	2
746163fc9cSnatano #define SUSP_ENTRY_SUSP_SP	3
756163fc9cSnatano #define SUSP_ENTRY_SUSP_ST	4
766163fc9cSnatano #define SUSP_ENTRY_SUSP_ER	5
776163fc9cSnatano #define SUSP_ENTRY_SUSP_ES	6
786163fc9cSnatano 
796163fc9cSnatano #define SUSP_ENTRY_RRIP_PX	1
806163fc9cSnatano #define SUSP_ENTRY_RRIP_PN	2
816163fc9cSnatano #define SUSP_ENTRY_RRIP_SL	3
826163fc9cSnatano #define SUSP_ENTRY_RRIP_NM	4
836163fc9cSnatano #define SUSP_ENTRY_RRIP_CL	5
846163fc9cSnatano #define SUSP_ENTRY_RRIP_PL	6
856163fc9cSnatano #define SUSP_ENTRY_RRIP_RE	7
866163fc9cSnatano #define SUSP_ENTRY_RRIP_TF	8
876163fc9cSnatano #define SUSP_ENTRY_RRIP_SF	9
886163fc9cSnatano 
896163fc9cSnatano #define SUSP_RRIP_ER_EXT_ID "IEEE_P1282"
906163fc9cSnatano #define SUSP_RRIP_ER_EXT_DES "THE IEEE P1282 PROTOCOL PROVIDES SUPPORT FOR POSIX FILE SYSTEM SEMANTICS."
916163fc9cSnatano #define SUSP_RRIP_ER_EXT_SRC "PLEASE CONTACT THE IEEE STANDARDS DEPARTMENT, PISCATAWAY, NJ, USA FOR THE P1282 SPECIFICATION."
926163fc9cSnatano 
936163fc9cSnatano #define SL_FLAGS_NONE	        0
946163fc9cSnatano #define SL_FLAGS_CONTINUE       1
956163fc9cSnatano #define SL_FLAGS_CURRENT        2
966163fc9cSnatano #define SL_FLAGS_PARENT	        4
976163fc9cSnatano #define SL_FLAGS_ROOT	        8
986163fc9cSnatano 
996163fc9cSnatano typedef struct {
1006163fc9cSnatano 	ISO_SUSP_HEADER		 h;
1016163fc9cSnatano 	u_char mode		[ISODCL(5,12)];
1026163fc9cSnatano 	u_char links		[ISODCL(13,20)];
1036163fc9cSnatano 	u_char uid		[ISODCL(21,28)];
1046163fc9cSnatano 	u_char gid		[ISODCL(29,36)];
1056163fc9cSnatano 	u_char serial		[ISODCL(37,44)];/* Not used */
1066163fc9cSnatano } ISO_RRIP_PX;
1076163fc9cSnatano 
1086163fc9cSnatano typedef struct {
1096163fc9cSnatano 	ISO_SUSP_HEADER		 h;
1106163fc9cSnatano 	u_char high		[ISODCL(5,12)];
1116163fc9cSnatano 	u_char low		[ISODCL(13,20)];
1126163fc9cSnatano } ISO_RRIP_PN;
1136163fc9cSnatano 
1146163fc9cSnatano typedef struct {
1156163fc9cSnatano 	ISO_SUSP_HEADER		 h;
1166163fc9cSnatano 	u_char flags		 [ISODCL ( 4, 4)];
1176163fc9cSnatano 	u_char component	 [ISODCL ( 4, 256)];
1186163fc9cSnatano 	u_int  nBytes;
1196163fc9cSnatano } ISO_RRIP_SL;
1206163fc9cSnatano 
1216163fc9cSnatano typedef struct {
1226163fc9cSnatano 	ISO_SUSP_HEADER		 h;
1236163fc9cSnatano 	u_char flags		 [ISODCL ( 4, 4)];
1246163fc9cSnatano 	u_char timestamp	 [ISODCL ( 5, 256)];
1256163fc9cSnatano } ISO_RRIP_TF;
1266163fc9cSnatano 
1276163fc9cSnatano #define RRIP_NM_FLAGS_NONE 0x00
1286163fc9cSnatano #define RRIP_NM_FLAGS_CONTINUE 0x01
1296163fc9cSnatano #define RRIP_NM_FLAGS_CURRENT 0x02
1306163fc9cSnatano #define RRIP_NM_FLAGS_PARENT 0x04
1316163fc9cSnatano 
1326163fc9cSnatano typedef struct {
1336163fc9cSnatano 	ISO_SUSP_HEADER		 h;
1346163fc9cSnatano 	u_char flags		 [ISODCL ( 4, 4)];
1356163fc9cSnatano 	u_char altname		 [ISODCL ( 4, 256)];
1366163fc9cSnatano } ISO_RRIP_NM;
1376163fc9cSnatano 
1386163fc9cSnatano /* Note that this is the same structure as cd9660_rrip.h : ISO_RRIP_CONT */
1396163fc9cSnatano typedef struct {
1406163fc9cSnatano 	ISO_SUSP_HEADER		 h;
1416163fc9cSnatano 	u_char ca_sector	 [ISODCL ( 5, 12)];
1426163fc9cSnatano 	u_char offset		 [ISODCL ( 13, 20)];
1436163fc9cSnatano 	u_char length		 [ISODCL ( 21, 28)];
1446163fc9cSnatano } ISO_SUSP_CE;
1456163fc9cSnatano 
1466163fc9cSnatano typedef struct {
1476163fc9cSnatano 	ISO_SUSP_HEADER		 h;
1486163fc9cSnatano 	u_char padding_area	 [ISODCL ( 4, 256)];
1496163fc9cSnatano } ISO_SUSP_PD;
1506163fc9cSnatano 
1516163fc9cSnatano typedef struct {
1526163fc9cSnatano 	ISO_SUSP_HEADER		 h;
1536163fc9cSnatano 	u_char check		 [ISODCL ( 4, 5)];
1546163fc9cSnatano 	u_char len_skp		 [ISODCL ( 6, 6)];
1556163fc9cSnatano } ISO_SUSP_SP;
1566163fc9cSnatano 
1576163fc9cSnatano typedef struct {
1586163fc9cSnatano 	ISO_SUSP_HEADER		 h;
1596163fc9cSnatano } ISO_SUSP_ST;
1606163fc9cSnatano 
1616163fc9cSnatano typedef struct {
1626163fc9cSnatano 	ISO_SUSP_HEADER		 h;
1636163fc9cSnatano 	u_char len_id		 [ISODCL ( 4, 4)];
1646163fc9cSnatano 	u_char len_des		 [ISODCL ( 5, 5)];
1656163fc9cSnatano 	u_char len_src		 [ISODCL ( 6, 6)];
1666163fc9cSnatano 	u_char ext_ver		 [ISODCL ( 7, 7)];
1676163fc9cSnatano 	u_char ext_data		 [ISODCL (8,256)];
1686163fc9cSnatano /*	u_char ext_id		 [ISODCL ( 8, 256)];
1696163fc9cSnatano 	u_char ext_des		 [ISODCL ( 257, 513)];
1706163fc9cSnatano 	u_char ext_src		 [ISODCL ( 514, 770)];*/
1716163fc9cSnatano } ISO_SUSP_ER;
1726163fc9cSnatano 
1736163fc9cSnatano typedef struct {
1746163fc9cSnatano 	ISO_SUSP_HEADER		 h;
1756163fc9cSnatano 	u_char ext_seq		 [ISODCL ( 4, 4)];
1766163fc9cSnatano } ISO_SUSP_ES;
1776163fc9cSnatano 
1786163fc9cSnatano typedef union {
1796163fc9cSnatano 	ISO_RRIP_PX			PX;
1806163fc9cSnatano 	ISO_RRIP_PN			PN;
1816163fc9cSnatano 	ISO_RRIP_SL			SL;
1826163fc9cSnatano 	ISO_RRIP_NM			NM;
1836163fc9cSnatano 	ISO_RRIP_CLINK			CL;
1846163fc9cSnatano 	ISO_RRIP_PLINK			PL;
1856163fc9cSnatano 	ISO_RRIP_RELDIR			RE;
1866163fc9cSnatano 	ISO_RRIP_TF			TF;
1876163fc9cSnatano } rrip_entry;
1886163fc9cSnatano 
1896163fc9cSnatano typedef union {
1906163fc9cSnatano 	ISO_SUSP_CE			CE;
1916163fc9cSnatano 	ISO_SUSP_PD			PD;
1926163fc9cSnatano 	ISO_SUSP_SP			SP;
1936163fc9cSnatano 	ISO_SUSP_ST			ST;
1946163fc9cSnatano 	ISO_SUSP_ER			ER;
1956163fc9cSnatano 	ISO_SUSP_ES			ES;
1966163fc9cSnatano } susp_entry;
1976163fc9cSnatano 
1986163fc9cSnatano typedef union {
1996163fc9cSnatano 	susp_entry		  su_entry;
2006163fc9cSnatano 	rrip_entry		  rr_entry;
2016163fc9cSnatano } SUSP_ENTRIES;
2026163fc9cSnatano 
2036163fc9cSnatano struct ISO_SUSP_ATTRIBUTES {
2046163fc9cSnatano 	SUSP_ENTRIES attr;
2056163fc9cSnatano 	int type;
2066163fc9cSnatano 	char type_of[2];
2076163fc9cSnatano 	char last_in_suf;	/* last entry in the System Use Field? */
2086163fc9cSnatano 	/* Dan's addons - will merge later. This allows use of a switch */
2096163fc9cSnatano 	char susp_type;		/* SUSP or RRIP */
2106163fc9cSnatano 	char entry_type;	/* Record type */
2116163fc9cSnatano 	char write_location;
2126163fc9cSnatano 	TAILQ_ENTRY(ISO_SUSP_ATTRIBUTES) rr_ll;
2136163fc9cSnatano };
2146163fc9cSnatano 
2156163fc9cSnatano #define CD9660_SUSP_ENTRY_SIZE(entry)\
2166163fc9cSnatano 	((int) ((entry)->attr.su_entry.SP.h.length[0]))
2176163fc9cSnatano 
2186163fc9cSnatano /* Recursive function - move later to func pointer code*/
2196163fc9cSnatano int cd9660_susp_finalize(iso9660_disk *, cd9660node *);
2206163fc9cSnatano 
2216163fc9cSnatano /* These two operate on single nodes */
2226163fc9cSnatano int cd9660_susp_finalize_node(iso9660_disk *, cd9660node *);
2236163fc9cSnatano int cd9660_rrip_finalize_node(iso9660_disk *, cd9660node *);
2246163fc9cSnatano 
2256163fc9cSnatano /* POSIX File attribute */
2266163fc9cSnatano int cd9660node_rrip_px(struct ISO_SUSP_ATTRIBUTES *, fsnode *);
2276163fc9cSnatano 
2286163fc9cSnatano /* Device number */
2296163fc9cSnatano int cd9660node_rrip_pn(struct ISO_SUSP_ATTRIBUTES *, fsnode *);
2306163fc9cSnatano 
2316163fc9cSnatano /* Symbolic link */
2326163fc9cSnatano int cd9660node_rrip_SL(struct ISO_SUSP_ATTRIBUTES *, fsnode *);
2336163fc9cSnatano 
2346163fc9cSnatano /* Alternate Name function */
2356163fc9cSnatano void cd9660_rrip_NM(cd9660node *);
2366163fc9cSnatano void cd9660_rrip_add_NM(cd9660node *,const char *);
2376163fc9cSnatano 
2386163fc9cSnatano /* Parent and child link function */
2396163fc9cSnatano int cd9660_rrip_PL(struct ISO_SUSP_ATTRIBUTES *, cd9660node *);
2406163fc9cSnatano int cd9660_rrip_CL(struct ISO_SUSP_ATTRIBUTES *, cd9660node *);
2416163fc9cSnatano int cd9660_rrip_RE(struct ISO_SUSP_ATTRIBUTES *, cd9660node *);
2426163fc9cSnatano 
2436163fc9cSnatano int cd9660node_rrip_tf(struct ISO_SUSP_ATTRIBUTES *, fsnode *);
2446163fc9cSnatano 
2456163fc9cSnatano 
2466163fc9cSnatano 
2476163fc9cSnatano /*
2486163fc9cSnatano  * Relocation directory function. I'm not quite sure what
2496163fc9cSnatano  * sort of parameters are needed, but personally I don't think
2506163fc9cSnatano  * any parameters are needed except for the memory address where
2516163fc9cSnatano  * the information needs to be put in
2526163fc9cSnatano  */
2536163fc9cSnatano int cd9660node_rrip_re(void *, fsnode *);
2546163fc9cSnatano 
2556163fc9cSnatano /*
2566163fc9cSnatano  * Don't know if this function is needed because it apparently is an
2576163fc9cSnatano  * optional feature that does not really need to be implemented but I
2586163fc9cSnatano  * thought I should add it anyway.
2596163fc9cSnatano  */
2606163fc9cSnatano int cd9660_susp_ce (struct ISO_SUSP_ATTRIBUTES *, cd9660node *);
2616163fc9cSnatano int cd9660_susp_pd (struct ISO_SUSP_ATTRIBUTES *, int);
2626163fc9cSnatano int cd9660_susp_sp (struct ISO_SUSP_ATTRIBUTES *, cd9660node *);
2636163fc9cSnatano int cd9660_susp_st (struct ISO_SUSP_ATTRIBUTES *, cd9660node *);
2646163fc9cSnatano 
2656163fc9cSnatano struct ISO_SUSP_ATTRIBUTES *cd9660_susp_ER(cd9660node *, u_char, const char *,
2666163fc9cSnatano     const char *, const char *);
2676163fc9cSnatano struct ISO_SUSP_ATTRIBUTES *cd9660_susp_ES(struct ISO_SUSP_ATTRIBUTES*,
2686163fc9cSnatano     cd9660node *);
2696163fc9cSnatano 
2706163fc9cSnatano 
2716163fc9cSnatano /* Helper functions */
2726163fc9cSnatano 
2736163fc9cSnatano /* Common SUSP/RRIP functions */
2746163fc9cSnatano int cd9660_susp_initialize(iso9660_disk *, cd9660node *, cd9660node *,
2756163fc9cSnatano     cd9660node *);
2766163fc9cSnatano int cd9660_susp_initialize_node(iso9660_disk *, cd9660node *);
2776163fc9cSnatano struct ISO_SUSP_ATTRIBUTES *cd9660node_susp_create_node(int, int, const char *,
2786163fc9cSnatano     int);
2796163fc9cSnatano struct ISO_SUSP_ATTRIBUTES *cd9660node_susp_add_entry(cd9660node *,
2806163fc9cSnatano     struct ISO_SUSP_ATTRIBUTES *, struct ISO_SUSP_ATTRIBUTES *, int);
2816163fc9cSnatano 
2826163fc9cSnatano /* RRIP specific functions */
2836163fc9cSnatano int cd9660_rrip_initialize_node(iso9660_disk *, cd9660node *, cd9660node *,
2846163fc9cSnatano     cd9660node *);
2856163fc9cSnatano void cd9660_createSL(cd9660node *);
2866163fc9cSnatano 
2876163fc9cSnatano /* Functions that probably can be removed */
2886163fc9cSnatano /* int cd9660node_initialize_node(int, char *); */
2896163fc9cSnatano 
2906163fc9cSnatano 
2916163fc9cSnatano #endif
292