xref: /dflybsd-src/usr.sbin/makefs/cd9660.h (revision 87cbf4db3663aa41c7caab8148ab954135c553d5)
1*5978408cSSascha Wildner /*	$NetBSD: cd9660.h,v 1.17 2011/06/23 02:35:56 enami 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.h 326276 2017-11-27 15:37:16Z pfg $
37*5978408cSSascha Wildner  */
38*5978408cSSascha Wildner 
39*5978408cSSascha Wildner #ifndef _MAKEFS_CD9660_H
40*5978408cSSascha Wildner #define _MAKEFS_CD9660_H
41*5978408cSSascha Wildner 
42*5978408cSSascha Wildner #include <inttypes.h>
43*5978408cSSascha Wildner #include <assert.h>
44*5978408cSSascha Wildner #include <errno.h>
45*5978408cSSascha Wildner #include <fcntl.h>
46*5978408cSSascha Wildner #include <stdarg.h>
47*5978408cSSascha Wildner #include <stdio.h>
48*5978408cSSascha Wildner #include <stdlib.h>
49*5978408cSSascha Wildner #include <string.h>
50*5978408cSSascha Wildner #include <unistd.h>
51*5978408cSSascha Wildner #include <time.h>
52*5978408cSSascha Wildner #include <limits.h>
53*5978408cSSascha Wildner #include <sys/queue.h>
54*5978408cSSascha Wildner #include <sys/param.h>
55*5978408cSSascha Wildner #include <sys/endian.h>
56*5978408cSSascha Wildner 
57*5978408cSSascha Wildner #include "makefs.h"
58*5978408cSSascha Wildner #include "iso.h"
59*5978408cSSascha Wildner #include "iso_rrip.h"
60*5978408cSSascha Wildner #include "cd9660/cd9660_eltorito.h"
61*5978408cSSascha Wildner 
62*5978408cSSascha Wildner #ifdef DEBUG
63*5978408cSSascha Wildner #define	INODE_WARNX(__x)	warnx __x
64*5978408cSSascha Wildner #else /* DEBUG */
65*5978408cSSascha Wildner #define	INODE_WARNX(__x)
66*5978408cSSascha Wildner #endif /* DEBUG */
67*5978408cSSascha Wildner 
68*5978408cSSascha Wildner #define CD9660MAXPATH 4096
69*5978408cSSascha Wildner 
70*5978408cSSascha Wildner #define ISO_STRING_FILTER_NONE = 0x00
71*5978408cSSascha Wildner #define ISO_STRING_FILTER_DCHARS = 0x01
72*5978408cSSascha Wildner #define ISO_STRING_FILTER_ACHARS = 0x02
73*5978408cSSascha Wildner 
74*5978408cSSascha Wildner /*
75*5978408cSSascha Wildner Extended preferences type, in the spirit of what makefs gives us (only ints)
76*5978408cSSascha Wildner */
77*5978408cSSascha Wildner typedef struct {
78*5978408cSSascha Wildner 	const char  *shortName;		/* Short option */
79*5978408cSSascha Wildner 	const char	*name;		/* option name */
80*5978408cSSascha Wildner 	char		*value;		/* where to stuff the value */
81*5978408cSSascha Wildner 	int		minLength;	/* minimum for value */
82*5978408cSSascha Wildner 	int		maxLength;	/* maximum for value */
83*5978408cSSascha Wildner 	const char	*desc;		/* option description */
84*5978408cSSascha Wildner 	int		filterFlags;
85*5978408cSSascha Wildner } string_option_t;
86*5978408cSSascha Wildner 
87*5978408cSSascha Wildner /******** STRUCTURES **********/
88*5978408cSSascha Wildner 
89*5978408cSSascha Wildner /*Defaults*/
90*5978408cSSascha Wildner #define ISO_DEFAULT_VOLUMEID "MAKEFS_CD9660_IMAGE"
91*5978408cSSascha Wildner #define ISO_DEFAULT_APPID "MAKEFS"
92*5978408cSSascha Wildner #define ISO_DEFAULT_PUBLISHER "MAKEFS"
93*5978408cSSascha Wildner #define ISO_DEFAULT_PREPARER "MAKEFS"
94*5978408cSSascha Wildner 
95*5978408cSSascha Wildner #define ISO_VOLUME_DESCRIPTOR_STANDARD_ID "CD001"
96*5978408cSSascha Wildner #define ISO_VOLUME_DESCRIPTOR_BOOT 0
97*5978408cSSascha Wildner #define ISO_VOLUME_DESCRIPTOR_PVD 1
98*5978408cSSascha Wildner #define ISO_VOLUME_DESCRIPTOR_TERMINATOR 255
99*5978408cSSascha Wildner 
100*5978408cSSascha Wildner /*30 for name and extension, as well as version number and padding bit*/
101*5978408cSSascha Wildner #define ISO_FILENAME_MAXLENGTH_BEFORE_VERSION 30
102*5978408cSSascha Wildner #define ISO_FILENAME_MAXLENGTH	36
103*5978408cSSascha Wildner #define ISO_FILENAME_MAXLENGTH_WITH_PADDING 37
104*5978408cSSascha Wildner 
105*5978408cSSascha Wildner #define ISO_FLAG_CLEAR 0x00
106*5978408cSSascha Wildner #define ISO_FLAG_HIDDEN 0x01
107*5978408cSSascha Wildner #define ISO_FLAG_DIRECTORY 0x02
108*5978408cSSascha Wildner #define ISO_FLAG_ASSOCIATED 0x04
109*5978408cSSascha Wildner #define ISO_FLAG_PERMISSIONS 0x08
110*5978408cSSascha Wildner #define ISO_FLAG_RESERVED5 0x10
111*5978408cSSascha Wildner #define ISO_FLAG_RESERVED6 0x20
112*5978408cSSascha Wildner #define ISO_FLAG_FINAL_RECORD 0x40
113*5978408cSSascha Wildner 
114*5978408cSSascha Wildner #define ISO_PATHTABLE_ENTRY_BASESIZE 8
115*5978408cSSascha Wildner 
116*5978408cSSascha Wildner #define ISO_RRIP_DEFAULT_MOVE_DIR_NAME "RR_MOVED"
117*5978408cSSascha Wildner #define RRIP_DEFAULT_MOVE_DIR_NAME ".rr_moved"
118*5978408cSSascha Wildner 
119*5978408cSSascha Wildner #define	CD9660_BLOCKS(__sector_size, __bytes)	\
120*5978408cSSascha Wildner 	howmany((__bytes), (__sector_size))
121*5978408cSSascha Wildner 
122*5978408cSSascha Wildner #define CD9660_MEM_ALLOC_ERROR(_F)	\
123*5978408cSSascha Wildner     err(EXIT_FAILURE, "%s, %s l. %d", _F, __FILE__, __LINE__)
124*5978408cSSascha Wildner 
125*5978408cSSascha Wildner #define CD9660_TYPE_FILE	0x01
126*5978408cSSascha Wildner #define CD9660_TYPE_DIR		0x02
127*5978408cSSascha Wildner #define CD9660_TYPE_DOT		0x04
128*5978408cSSascha Wildner #define CD9660_TYPE_DOTDOT	0x08
129*5978408cSSascha Wildner #define CD9660_TYPE_VIRTUAL	0x80
130*5978408cSSascha Wildner 
131*5978408cSSascha Wildner #define CD9660_INODE_HASH_SIZE	1024
132*5978408cSSascha Wildner #define CD9660_SECTOR_SIZE	2048
133*5978408cSSascha Wildner 
134*5978408cSSascha Wildner #define CD9660_END_PADDING	150
135*5978408cSSascha Wildner 
136*5978408cSSascha Wildner /* Slight modification of the ISO structure in iso.h */
137*5978408cSSascha Wildner typedef struct _iso_directory_record_cd9660 {
138*5978408cSSascha Wildner 	u_char length			[ISODCL (1, 1)];	/* 711 */
139*5978408cSSascha Wildner 	u_char ext_attr_length		[ISODCL (2, 2)];	/* 711 */
140*5978408cSSascha Wildner 	u_char extent			[ISODCL (3, 10)];	/* 733 */
141*5978408cSSascha Wildner 	u_char size			[ISODCL (11, 18)];	/* 733 */
142*5978408cSSascha Wildner 	u_char date			[ISODCL (19, 25)];	/* 7 by 711 */
143*5978408cSSascha Wildner 	u_char flags			[ISODCL (26, 26)];
144*5978408cSSascha Wildner 	u_char file_unit_size		[ISODCL (27, 27)];	/* 711 */
145*5978408cSSascha Wildner 	u_char interleave		[ISODCL (28, 28)];	/* 711 */
146*5978408cSSascha Wildner 	u_char volume_sequence_number	[ISODCL (29, 32)];	/* 723 */
147*5978408cSSascha Wildner 	u_char name_len			[ISODCL (33, 33)];	/* 711 */
148*5978408cSSascha Wildner 	char name			[ISO_FILENAME_MAXLENGTH_WITH_PADDING];
149*5978408cSSascha Wildner } iso_directory_record_cd9660;
150*5978408cSSascha Wildner 
151*5978408cSSascha Wildner /* TODO: Lots of optimization of this structure */
152*5978408cSSascha Wildner typedef struct _cd9660node {
153*5978408cSSascha Wildner 	u_char	type;/* Used internally */
154*5978408cSSascha Wildner 	/* Tree structure */
155*5978408cSSascha Wildner 	struct _cd9660node	*parent;	/* parent (NULL if root) */
156*5978408cSSascha Wildner 	TAILQ_HEAD(cd9660_children_head, _cd9660node)	cn_children;
157*5978408cSSascha Wildner 	TAILQ_ENTRY(_cd9660node)		cn_next_child;
158*5978408cSSascha Wildner 
159*5978408cSSascha Wildner 	struct _cd9660node *dot_record; /* For directories, used mainly in RRIP */
160*5978408cSSascha Wildner 	struct _cd9660node *dot_dot_record;
161*5978408cSSascha Wildner 
162*5978408cSSascha Wildner 	fsnode		*node;		/* pointer to fsnode */
163*5978408cSSascha Wildner 	struct _iso_directory_record_cd9660	*isoDirRecord;
164*5978408cSSascha Wildner 	struct iso_extended_attributes	*isoExtAttributes;
165*5978408cSSascha Wildner 
166*5978408cSSascha Wildner 	/***** SIZE CALCULATION *****/
167*5978408cSSascha Wildner 	/*already stored in isoDirRecord, but this is an int version, and will be
168*5978408cSSascha Wildner 		copied to isoDirRecord on writing*/
169*5978408cSSascha Wildner 	uint32_t fileDataSector;
170*5978408cSSascha Wildner 
171*5978408cSSascha Wildner 	/*
172*5978408cSSascha Wildner 	 * same thing, though some notes:
173*5978408cSSascha Wildner 	 * If a file, this is the file size
174*5978408cSSascha Wildner 	 * If a directory, this is the size of all its children's
175*5978408cSSascha Wildner 	 *	directory records
176*5978408cSSascha Wildner 	 * plus necessary padding
177*5978408cSSascha Wildner 	 */
178*5978408cSSascha Wildner 	int64_t fileDataLength;
179*5978408cSSascha Wildner 
180*5978408cSSascha Wildner 	int64_t fileSectorsUsed;
181*5978408cSSascha Wildner 	int fileRecordSize;/*copy of a variable, int for quicker calculations*/
182*5978408cSSascha Wildner 
183*5978408cSSascha Wildner 	/* Old name, used for renaming - needs to be optimized but low priority */
184*5978408cSSascha Wildner 	char o_name [ISO_FILENAME_MAXLENGTH_WITH_PADDING];
185*5978408cSSascha Wildner 
186*5978408cSSascha Wildner 	/***** SPACE RESERVED FOR EXTENSIONS *****/
187*5978408cSSascha Wildner 	/* For memory efficiency's sake - we should move this to a separate struct
188*5978408cSSascha Wildner 		and point to null if not needed */
189*5978408cSSascha Wildner 	/* For Rock Ridge */
190*5978408cSSascha Wildner 	struct _cd9660node *rr_real_parent, *rr_relocated;
191*5978408cSSascha Wildner 
192*5978408cSSascha Wildner 	int64_t susp_entry_size;
193*5978408cSSascha Wildner 	int64_t susp_dot_entry_size;
194*5978408cSSascha Wildner 	int64_t susp_dot_dot_entry_size;
195*5978408cSSascha Wildner 
196*5978408cSSascha Wildner 	/* Continuation area stuff */
197*5978408cSSascha Wildner 	int64_t susp_entry_ce_start;
198*5978408cSSascha Wildner 	int64_t susp_dot_ce_start;
199*5978408cSSascha Wildner 	int64_t susp_dot_dot_ce_start;
200*5978408cSSascha Wildner 
201*5978408cSSascha Wildner 	int64_t susp_entry_ce_length;
202*5978408cSSascha Wildner 	int64_t susp_dot_ce_length;
203*5978408cSSascha Wildner 	int64_t susp_dot_dot_ce_length;
204*5978408cSSascha Wildner 
205*5978408cSSascha Wildner 	/* Data to put at the end of the System Use field */
206*5978408cSSascha Wildner 	int64_t su_tail_size;
207*5978408cSSascha Wildner 	char *su_tail_data;
208*5978408cSSascha Wildner 
209*5978408cSSascha Wildner 	/*** PATH TABLE STUFF ***/
210*5978408cSSascha Wildner 	int level;			/*depth*/
211*5978408cSSascha Wildner 	int ptnumber;
212*5978408cSSascha Wildner 	struct _cd9660node *ptnext, *ptprev, *ptlast;
213*5978408cSSascha Wildner 
214*5978408cSSascha Wildner 	/* SUSP entries */
215*5978408cSSascha Wildner 	TAILQ_HEAD(susp_linked_list, ISO_SUSP_ATTRIBUTES) head;
216*5978408cSSascha Wildner } cd9660node;
217*5978408cSSascha Wildner 
218*5978408cSSascha Wildner typedef struct _path_table_entry
219*5978408cSSascha Wildner {
220*5978408cSSascha Wildner 	u_char length[ISODCL (1, 1)];
221*5978408cSSascha Wildner 	u_char extended_attribute_length[ISODCL (2, 2)];
222*5978408cSSascha Wildner 	u_char first_sector[ISODCL (3, 6)];
223*5978408cSSascha Wildner 	u_char parent_number[ISODCL (7, 8)];
224*5978408cSSascha Wildner 	u_char name[ISO_FILENAME_MAXLENGTH_WITH_PADDING];
225*5978408cSSascha Wildner } path_table_entry;
226*5978408cSSascha Wildner 
227*5978408cSSascha Wildner typedef struct _volume_descriptor
228*5978408cSSascha Wildner {
229*5978408cSSascha Wildner 	u_char *volumeDescriptorData; /*ALWAYS 2048 bytes long*/
230*5978408cSSascha Wildner 	int64_t sector;
231*5978408cSSascha Wildner 	struct _volume_descriptor *next;
232*5978408cSSascha Wildner } volume_descriptor;
233*5978408cSSascha Wildner 
234*5978408cSSascha Wildner typedef struct _iso9660_disk {
235*5978408cSSascha Wildner 	int sectorSize;
236*5978408cSSascha Wildner 	struct iso_primary_descriptor		primaryDescriptor;
237*5978408cSSascha Wildner 	struct iso_supplementary_descriptor	supplementaryDescriptor;
238*5978408cSSascha Wildner 
239*5978408cSSascha Wildner 	volume_descriptor *firstVolumeDescriptor;
240*5978408cSSascha Wildner 
241*5978408cSSascha Wildner 	cd9660node *rootNode;
242*5978408cSSascha Wildner 
243*5978408cSSascha Wildner 	/* Important sector numbers here */
244*5978408cSSascha Wildner 	/* primaryDescriptor.type_l_path_table*/
245*5978408cSSascha Wildner 	int64_t primaryBigEndianTableSector;
246*5978408cSSascha Wildner 
247*5978408cSSascha Wildner 	/* primaryDescriptor.type_m_path_table*/
248*5978408cSSascha Wildner 	int64_t primaryLittleEndianTableSector;
249*5978408cSSascha Wildner 
250*5978408cSSascha Wildner 	/* primaryDescriptor.opt_type_l_path_table*/
251*5978408cSSascha Wildner 	int64_t secondaryBigEndianTableSector;
252*5978408cSSascha Wildner 
253*5978408cSSascha Wildner 	/* primaryDescriptor.opt_type_m_path_table*/
254*5978408cSSascha Wildner 	int64_t secondaryLittleEndianTableSector;
255*5978408cSSascha Wildner 
256*5978408cSSascha Wildner 	/* primaryDescriptor.path_table_size*/
257*5978408cSSascha Wildner 	int pathTableLength;
258*5978408cSSascha Wildner 	int64_t dataFirstSector;
259*5978408cSSascha Wildner 
260*5978408cSSascha Wildner 	int64_t totalSectors;
261*5978408cSSascha Wildner 	/* OPTIONS GO HERE */
262*5978408cSSascha Wildner 	int	isoLevel;
263*5978408cSSascha Wildner 
264*5978408cSSascha Wildner 	int include_padding_areas;
265*5978408cSSascha Wildner 
266*5978408cSSascha Wildner 	int follow_sym_links;
267*5978408cSSascha Wildner 	int verbose_level;
268*5978408cSSascha Wildner 	int displayHelp;
269*5978408cSSascha Wildner 	int keep_bad_images;
270*5978408cSSascha Wildner 
271*5978408cSSascha Wildner 	/* SUSP options and variables */
272*5978408cSSascha Wildner 	int64_t susp_continuation_area_start_sector;
273*5978408cSSascha Wildner 	int64_t susp_continuation_area_size;
274*5978408cSSascha Wildner 	int64_t susp_continuation_area_current_free;
275*5978408cSSascha Wildner 
276*5978408cSSascha Wildner 	int rock_ridge_enabled;
277*5978408cSSascha Wildner 	/* Other Rock Ridge Variables */
278*5978408cSSascha Wildner 	char *rock_ridge_renamed_dir_name;
279*5978408cSSascha Wildner 	int rock_ridge_move_count;
280*5978408cSSascha Wildner 	cd9660node *rr_moved_dir;
281*5978408cSSascha Wildner 
282*5978408cSSascha Wildner 	int archimedes_enabled;
283*5978408cSSascha Wildner 	int chrp_boot;
284*5978408cSSascha Wildner 
285*5978408cSSascha Wildner 	/* Spec breaking options */
286*5978408cSSascha Wildner 	u_char allow_deep_trees;
287*5978408cSSascha Wildner 	u_char allow_start_dot;
288*5978408cSSascha Wildner 	u_char allow_max_name; /* Allow 37 char filenames*/
289*5978408cSSascha Wildner 	u_char allow_illegal_chars; /* ~, !, # */
290*5978408cSSascha Wildner 	u_char allow_lowercase;
291*5978408cSSascha Wildner 	u_char allow_multidot;
292*5978408cSSascha Wildner 	u_char omit_trailing_period;
293*5978408cSSascha Wildner 
294*5978408cSSascha Wildner 	/* BOOT INFORMATION HERE */
295*5978408cSSascha Wildner 	int has_generic_bootimage; /* Default to 0 */
296*5978408cSSascha Wildner 	char *generic_bootimage;
297*5978408cSSascha Wildner 
298*5978408cSSascha Wildner 	int is_bootable;/* Default to 0 */
299*5978408cSSascha Wildner 	int64_t boot_catalog_sector;
300*5978408cSSascha Wildner 	boot_volume_descriptor *boot_descriptor;
301*5978408cSSascha Wildner 	char * boot_image_directory;
302*5978408cSSascha Wildner 
303*5978408cSSascha Wildner 	TAILQ_HEAD(boot_image_list,cd9660_boot_image) boot_images;
304*5978408cSSascha Wildner 	int image_serialno;
305*5978408cSSascha Wildner 	LIST_HEAD(boot_catalog_entries,boot_catalog_entry) boot_entries;
306*5978408cSSascha Wildner 
307*5978408cSSascha Wildner } iso9660_disk;
308*5978408cSSascha Wildner 
309*5978408cSSascha Wildner /************ FUNCTIONS **************/
310*5978408cSSascha Wildner int			cd9660_valid_a_chars(const char *);
311*5978408cSSascha Wildner int			cd9660_valid_d_chars(const char *);
312*5978408cSSascha Wildner void			cd9660_uppercase_characters(char *, int);
313*5978408cSSascha Wildner 
314*5978408cSSascha Wildner /* ISO Data Types */
315*5978408cSSascha Wildner void			cd9660_721(uint16_t, unsigned char *);
316*5978408cSSascha Wildner void			cd9660_731(uint32_t, unsigned char *);
317*5978408cSSascha Wildner void			cd9660_722(uint16_t, unsigned char *);
318*5978408cSSascha Wildner void			cd9660_732(uint32_t, unsigned char *);
319*5978408cSSascha Wildner void			cd9660_bothendian_dword(uint32_t dw, unsigned char *);
320*5978408cSSascha Wildner void			cd9660_bothendian_word(uint16_t dw, unsigned char *);
321*5978408cSSascha Wildner void			cd9660_set_date(char *, time_t);
322*5978408cSSascha Wildner void			cd9660_time_8426(unsigned char *, time_t);
323*5978408cSSascha Wildner void			cd9660_time_915(unsigned char *, time_t);
324*5978408cSSascha Wildner 
325*5978408cSSascha Wildner /*** Boot Functions ***/
326*5978408cSSascha Wildner int	cd9660_write_generic_bootimage(FILE *);
327*5978408cSSascha Wildner int	cd9660_write_boot(iso9660_disk *, FILE *);
328*5978408cSSascha Wildner int	cd9660_add_boot_disk(iso9660_disk *, const char *);
329*5978408cSSascha Wildner int	cd9660_eltorito_add_boot_option(iso9660_disk *, const char *,
330*5978408cSSascha Wildner     const char *);
331*5978408cSSascha Wildner int	cd9660_setup_boot(iso9660_disk *, int);
332*5978408cSSascha Wildner int	cd9660_setup_boot_volume_descriptor(iso9660_disk *,
333*5978408cSSascha Wildner     volume_descriptor *);
334*5978408cSSascha Wildner 
335*5978408cSSascha Wildner 
336*5978408cSSascha Wildner /*** Write Functions ***/
337*5978408cSSascha Wildner int	cd9660_write_image(iso9660_disk *, const char *image);
338*5978408cSSascha Wildner int	cd9660_copy_file(iso9660_disk *, FILE *, off_t, const char *);
339*5978408cSSascha Wildner 
340*5978408cSSascha Wildner void	cd9660_compute_full_filename(cd9660node *, char *);
341*5978408cSSascha Wildner int	cd9660_compute_record_size(iso9660_disk *, cd9660node *);
342*5978408cSSascha Wildner 
343*5978408cSSascha Wildner /* Debugging functions */
344*5978408cSSascha Wildner void	debug_print_tree(iso9660_disk *, cd9660node *,int);
345*5978408cSSascha Wildner void	debug_print_path_tree(cd9660node *);
346*5978408cSSascha Wildner void	debug_print_volume_descriptor_information(iso9660_disk *);
347*5978408cSSascha Wildner void	debug_dump_to_xml_ptentry(path_table_entry *,int, int);
348*5978408cSSascha Wildner void	debug_dump_to_xml_path_table(FILE *, off_t, int, int);
349*5978408cSSascha Wildner void	debug_dump_to_xml(FILE *);
350*5978408cSSascha Wildner int	debug_get_encoded_number(unsigned char *, int);
351*5978408cSSascha Wildner void	debug_dump_integer(const char *, char *,int);
352*5978408cSSascha Wildner void	debug_dump_string(const char *,unsigned char *,int);
353*5978408cSSascha Wildner void	debug_dump_directory_record_9_1(unsigned char *);
354*5978408cSSascha Wildner void	debug_dump_to_xml_volume_descriptor(unsigned char *,int);
355*5978408cSSascha Wildner 
356*5978408cSSascha Wildner void	cd9660_pad_string_spaces(char *, int);
357*5978408cSSascha Wildner 
358*5978408cSSascha Wildner #endif
359