xref: /dflybsd-src/usr.sbin/makefs/cd9660/cd9660_debug.c (revision 5978408cff2328494a506cbe167612129b5db833)
1*5978408cSSascha Wildner /*	$NetBSD: cd9660_debug.c,v 1.11 2010/10/27 18:51:35 christos 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 
37*5978408cSSascha Wildner #include <sys/cdefs.h>
38*5978408cSSascha Wildner __FBSDID("$FreeBSD: head/usr.sbin/makefs/cd9660/cd9660_debug.c 333664 2018-05-16 02:58:05Z emaste $");
39*5978408cSSascha Wildner #include <sys/param.h>
40*5978408cSSascha Wildner 
41*5978408cSSascha Wildner #include <sys/mount.h>
42*5978408cSSascha Wildner 
43*5978408cSSascha Wildner #include "makefs.h"
44*5978408cSSascha Wildner #include "cd9660.h"
45*5978408cSSascha Wildner #include "iso9660_rrip.h"
46*5978408cSSascha Wildner 
47*5978408cSSascha Wildner static void debug_print_susp_attrs(cd9660node *, int);
48*5978408cSSascha Wildner static void debug_dump_to_xml_padded_hex_output(const char *, unsigned char *,
49*5978408cSSascha Wildner 						int);
50*5978408cSSascha Wildner 
51*5978408cSSascha Wildner static inline void
52*5978408cSSascha Wildner print_n_tabs(int n)
53*5978408cSSascha Wildner {
54*5978408cSSascha Wildner 	int i;
55*5978408cSSascha Wildner 
56*5978408cSSascha Wildner 	for (i = 1; i <= n; i ++)
57*5978408cSSascha Wildner 		printf("\t");
58*5978408cSSascha Wildner }
59*5978408cSSascha Wildner 
60*5978408cSSascha Wildner #if 0
61*5978408cSSascha Wildner void
62*5978408cSSascha Wildner debug_print_rrip_info(cd9660node *n)
63*5978408cSSascha Wildner {
64*5978408cSSascha Wildner 	struct ISO_SUSP_ATTRIBUTES *t;
65*5978408cSSascha Wildner 	TAILQ_FOREACH(t, &node->head, rr_ll) {
66*5978408cSSascha Wildner 
67*5978408cSSascha Wildner 	}
68*5978408cSSascha Wildner }
69*5978408cSSascha Wildner #endif
70*5978408cSSascha Wildner 
71*5978408cSSascha Wildner static void
72*5978408cSSascha Wildner debug_print_susp_attrs(cd9660node *n, int indent)
73*5978408cSSascha Wildner {
74*5978408cSSascha Wildner 	struct ISO_SUSP_ATTRIBUTES *t;
75*5978408cSSascha Wildner 
76*5978408cSSascha Wildner 	TAILQ_FOREACH(t, &n->head, rr_ll) {
77*5978408cSSascha Wildner 		print_n_tabs(indent);
78*5978408cSSascha Wildner 		printf("-");
79*5978408cSSascha Wildner 		printf("%c%c: L:%i",t->attr.su_entry.SP.h.type[0],
80*5978408cSSascha Wildner 		    t->attr.su_entry.SP.h.type[1],
81*5978408cSSascha Wildner 		    (int)t->attr.su_entry.SP.h.length[0]);
82*5978408cSSascha Wildner 		printf("\n");
83*5978408cSSascha Wildner 	}
84*5978408cSSascha Wildner }
85*5978408cSSascha Wildner 
86*5978408cSSascha Wildner void
87*5978408cSSascha Wildner debug_print_tree(iso9660_disk *diskStructure, cd9660node *node, int level)
88*5978408cSSascha Wildner {
89*5978408cSSascha Wildner #if !HAVE_NBTOOL_CONFIG_H
90*5978408cSSascha Wildner 	cd9660node *cn;
91*5978408cSSascha Wildner 
92*5978408cSSascha Wildner 	print_n_tabs(level);
93*5978408cSSascha Wildner 	if (node->type & CD9660_TYPE_DOT) {
94*5978408cSSascha Wildner 		printf(". (%i)\n",
95*5978408cSSascha Wildner 		    isonum_733(node->isoDirRecord->extent));
96*5978408cSSascha Wildner 	} else if (node->type & CD9660_TYPE_DOTDOT) {
97*5978408cSSascha Wildner 		printf("..(%i)\n",
98*5978408cSSascha Wildner 		    isonum_733(node->isoDirRecord->extent));
99*5978408cSSascha Wildner 	} else if (node->isoDirRecord->name[0]=='\0') {
100*5978408cSSascha Wildner 		printf("(ROOT) (%" PRIu32 " to %" PRId64 ")\n",
101*5978408cSSascha Wildner 		    node->fileDataSector,
102*5978408cSSascha Wildner 		    node->fileDataSector +
103*5978408cSSascha Wildner 			node->fileSectorsUsed - 1);
104*5978408cSSascha Wildner 	} else {
105*5978408cSSascha Wildner 		printf("%s (%s) (%" PRIu32 " to %" PRId64 ")\n",
106*5978408cSSascha Wildner 		    node->isoDirRecord->name,
107*5978408cSSascha Wildner 		    (node->isoDirRecord->flags[0]
108*5978408cSSascha Wildner 			& ISO_FLAG_DIRECTORY) ?  "DIR" : "FILE",
109*5978408cSSascha Wildner 		    node->fileDataSector,
110*5978408cSSascha Wildner 		    (node->fileSectorsUsed == 0) ?
111*5978408cSSascha Wildner 			node->fileDataSector :
112*5978408cSSascha Wildner 			node->fileDataSector
113*5978408cSSascha Wildner 			    + node->fileSectorsUsed - 1);
114*5978408cSSascha Wildner 	}
115*5978408cSSascha Wildner 	if (diskStructure->rock_ridge_enabled)
116*5978408cSSascha Wildner 		debug_print_susp_attrs(node, level + 1);
117*5978408cSSascha Wildner 	TAILQ_FOREACH(cn, &node->cn_children, cn_next_child)
118*5978408cSSascha Wildner 		debug_print_tree(diskStructure, cn, level + 1);
119*5978408cSSascha Wildner #else
120*5978408cSSascha Wildner 	printf("Sorry, debugging is not supported in host-tools mode.\n");
121*5978408cSSascha Wildner #endif
122*5978408cSSascha Wildner }
123*5978408cSSascha Wildner 
124*5978408cSSascha Wildner void
125*5978408cSSascha Wildner debug_print_path_tree(cd9660node *n)
126*5978408cSSascha Wildner {
127*5978408cSSascha Wildner 	cd9660node *iterator = n;
128*5978408cSSascha Wildner 
129*5978408cSSascha Wildner 	/* Only display this message when called with the root node */
130*5978408cSSascha Wildner 	if (n->parent == NULL)
131*5978408cSSascha Wildner 		printf("debug_print_path_table: Dumping path table contents\n");
132*5978408cSSascha Wildner 
133*5978408cSSascha Wildner 	while (iterator != NULL) {
134*5978408cSSascha Wildner 		if (iterator->isoDirRecord->name[0] == '\0')
135*5978408cSSascha Wildner 			printf("0) (ROOT)\n");
136*5978408cSSascha Wildner 		else
137*5978408cSSascha Wildner 			printf("%i) %s\n", iterator->level,
138*5978408cSSascha Wildner 			    iterator->isoDirRecord->name);
139*5978408cSSascha Wildner 
140*5978408cSSascha Wildner 		iterator = iterator->ptnext;
141*5978408cSSascha Wildner 	}
142*5978408cSSascha Wildner }
143*5978408cSSascha Wildner 
144*5978408cSSascha Wildner void
145*5978408cSSascha Wildner debug_print_volume_descriptor_information(iso9660_disk *diskStructure)
146*5978408cSSascha Wildner {
147*5978408cSSascha Wildner 	volume_descriptor *tmp = diskStructure->firstVolumeDescriptor;
148*5978408cSSascha Wildner 	char temp[CD9660_SECTOR_SIZE];
149*5978408cSSascha Wildner 
150*5978408cSSascha Wildner 	printf("==Listing Volume Descriptors==\n");
151*5978408cSSascha Wildner 
152*5978408cSSascha Wildner 	while (tmp != NULL) {
153*5978408cSSascha Wildner 		memset(temp, 0, CD9660_SECTOR_SIZE);
154*5978408cSSascha Wildner 		memcpy(temp, tmp->volumeDescriptorData + 1, 5);
155*5978408cSSascha Wildner 		printf("Volume descriptor in sector %" PRId64
156*5978408cSSascha Wildner 		    ": type %i, ID %s\n",
157*5978408cSSascha Wildner 		    tmp->sector, tmp->volumeDescriptorData[0], temp);
158*5978408cSSascha Wildner 		switch(tmp->volumeDescriptorData[0]) {
159*5978408cSSascha Wildner 		case 0:/*boot record*/
160*5978408cSSascha Wildner 			break;
161*5978408cSSascha Wildner 
162*5978408cSSascha Wildner 		case 1:		/* PVD */
163*5978408cSSascha Wildner 			break;
164*5978408cSSascha Wildner 
165*5978408cSSascha Wildner 		case 2:		/* SVD */
166*5978408cSSascha Wildner 			break;
167*5978408cSSascha Wildner 
168*5978408cSSascha Wildner 		case 3:		/* Volume Partition Descriptor */
169*5978408cSSascha Wildner 			break;
170*5978408cSSascha Wildner 
171*5978408cSSascha Wildner 		case 255:	/* terminator */
172*5978408cSSascha Wildner 			break;
173*5978408cSSascha Wildner 		}
174*5978408cSSascha Wildner 		tmp = tmp->next;
175*5978408cSSascha Wildner 	}
176*5978408cSSascha Wildner 
177*5978408cSSascha Wildner 	printf("==Done Listing Volume Descriptors==\n");
178*5978408cSSascha Wildner }
179*5978408cSSascha Wildner 
180*5978408cSSascha Wildner void
181*5978408cSSascha Wildner debug_dump_to_xml_ptentry(path_table_entry *pttemp, int num, int mode)
182*5978408cSSascha Wildner {
183*5978408cSSascha Wildner 	printf("<ptentry num=\"%i\">\n" ,num);
184*5978408cSSascha Wildner 	printf("<length>%i</length>\n", pttemp->length[0]);
185*5978408cSSascha Wildner 	printf("<extended_attribute_length>%i</extended_attribute_length>\n",
186*5978408cSSascha Wildner 	    pttemp->extended_attribute_length[0]);
187*5978408cSSascha Wildner 	printf("<parent_number>%i</parent_number>\n",
188*5978408cSSascha Wildner 	    debug_get_encoded_number(pttemp->parent_number,mode));
189*5978408cSSascha Wildner 	debug_dump_to_xml_padded_hex_output("name",
190*5978408cSSascha Wildner 	    pttemp->name, pttemp->length[0]);
191*5978408cSSascha Wildner 	printf("</ptentry>\n");
192*5978408cSSascha Wildner }
193*5978408cSSascha Wildner 
194*5978408cSSascha Wildner void
195*5978408cSSascha Wildner debug_dump_to_xml_path_table(FILE *fd, off_t sector, int size, int mode)
196*5978408cSSascha Wildner {
197*5978408cSSascha Wildner 	path_table_entry pttemp;
198*5978408cSSascha Wildner 	int t = 0;
199*5978408cSSascha Wildner 	int n = 0;
200*5978408cSSascha Wildner 
201*5978408cSSascha Wildner 	if (fseeko(fd, CD9660_SECTOR_SIZE * sector, SEEK_SET) == -1)
202*5978408cSSascha Wildner 		err(1, "fseeko");
203*5978408cSSascha Wildner 
204*5978408cSSascha Wildner 	while (t < size) {
205*5978408cSSascha Wildner 		/* Read fixed data first */
206*5978408cSSascha Wildner 		fread(&pttemp, 1, 8, fd);
207*5978408cSSascha Wildner 		t += 8;
208*5978408cSSascha Wildner 		/* Read variable */
209*5978408cSSascha Wildner 		fread(((unsigned char*)&pttemp) + 8, 1, pttemp.length[0], fd);
210*5978408cSSascha Wildner 		t += pttemp.length[0];
211*5978408cSSascha Wildner 		debug_dump_to_xml_ptentry(&pttemp, n, mode);
212*5978408cSSascha Wildner 		n++;
213*5978408cSSascha Wildner 	}
214*5978408cSSascha Wildner 
215*5978408cSSascha Wildner }
216*5978408cSSascha Wildner 
217*5978408cSSascha Wildner /*
218*5978408cSSascha Wildner  * XML Debug output functions
219*5978408cSSascha Wildner  * Dump hierarchy of CD, as well as volume info, to XML
220*5978408cSSascha Wildner  * Can be used later to diff against a standard,
221*5978408cSSascha Wildner  * or just provide easy to read detailed debug output
222*5978408cSSascha Wildner  */
223*5978408cSSascha Wildner void
224*5978408cSSascha Wildner debug_dump_to_xml(FILE *fd)
225*5978408cSSascha Wildner {
226*5978408cSSascha Wildner 	unsigned char buf[CD9660_SECTOR_SIZE];
227*5978408cSSascha Wildner 	off_t sector;
228*5978408cSSascha Wildner 	int t, t2;
229*5978408cSSascha Wildner 	struct iso_primary_descriptor primaryVD;
230*5978408cSSascha Wildner 	struct _boot_volume_descriptor bootVD;
231*5978408cSSascha Wildner 
232*5978408cSSascha Wildner 	printf("<cd9660dump>\n");
233*5978408cSSascha Wildner 
234*5978408cSSascha Wildner 	/* Display Volume Descriptors */
235*5978408cSSascha Wildner 	sector = 16;
236*5978408cSSascha Wildner 	do {
237*5978408cSSascha Wildner 		if (fseeko(fd, CD9660_SECTOR_SIZE * sector, SEEK_SET) == -1)
238*5978408cSSascha Wildner 			err(1, "fseeko");
239*5978408cSSascha Wildner 		fread(buf, 1, CD9660_SECTOR_SIZE, fd);
240*5978408cSSascha Wildner 		t = (int)((unsigned char)buf[0]);
241*5978408cSSascha Wildner 		switch (t) {
242*5978408cSSascha Wildner 		case 0:
243*5978408cSSascha Wildner 			memcpy(&bootVD, buf, CD9660_SECTOR_SIZE);
244*5978408cSSascha Wildner 			break;
245*5978408cSSascha Wildner 		case 1:
246*5978408cSSascha Wildner 			memcpy(&primaryVD, buf, CD9660_SECTOR_SIZE);
247*5978408cSSascha Wildner 			break;
248*5978408cSSascha Wildner 		}
249*5978408cSSascha Wildner 		debug_dump_to_xml_volume_descriptor(buf, sector);
250*5978408cSSascha Wildner 		sector++;
251*5978408cSSascha Wildner 	} while (t != 255);
252*5978408cSSascha Wildner 
253*5978408cSSascha Wildner 	t = debug_get_encoded_number((u_char *)primaryVD.type_l_path_table,
254*5978408cSSascha Wildner 	    731);
255*5978408cSSascha Wildner 	t2 = debug_get_encoded_number((u_char *)primaryVD.path_table_size, 733);
256*5978408cSSascha Wildner 	printf("Path table 1 located at sector %i and is %i bytes long\n",
257*5978408cSSascha Wildner 	    t,t2);
258*5978408cSSascha Wildner 	debug_dump_to_xml_path_table(fd, t, t2, 721);
259*5978408cSSascha Wildner 
260*5978408cSSascha Wildner 	t = debug_get_encoded_number((u_char *)primaryVD.type_m_path_table,
261*5978408cSSascha Wildner 	    731);
262*5978408cSSascha Wildner 	debug_dump_to_xml_path_table(fd, t, t2, 722);
263*5978408cSSascha Wildner 
264*5978408cSSascha Wildner 	printf("</cd9660dump>\n");
265*5978408cSSascha Wildner }
266*5978408cSSascha Wildner 
267*5978408cSSascha Wildner static void
268*5978408cSSascha Wildner debug_dump_to_xml_padded_hex_output(const char *element, unsigned char *buf,
269*5978408cSSascha Wildner 				    int len)
270*5978408cSSascha Wildner {
271*5978408cSSascha Wildner 	int i;
272*5978408cSSascha Wildner 	int t;
273*5978408cSSascha Wildner 
274*5978408cSSascha Wildner 	printf("<%s>",element);
275*5978408cSSascha Wildner 	for (i = 0; i < len; i++) {
276*5978408cSSascha Wildner 		t = (unsigned char)buf[i];
277*5978408cSSascha Wildner 		if (t >= 32 && t < 127)
278*5978408cSSascha Wildner 			printf("%c",t);
279*5978408cSSascha Wildner 	}
280*5978408cSSascha Wildner 	printf("</%s>\n",element);
281*5978408cSSascha Wildner 
282*5978408cSSascha Wildner 	printf("<%s:hex>",element);
283*5978408cSSascha Wildner 	for (i = 0; i < len; i++) {
284*5978408cSSascha Wildner 		t = (unsigned char)buf[i];
285*5978408cSSascha Wildner 		printf(" %x",t);
286*5978408cSSascha Wildner 	}
287*5978408cSSascha Wildner 	printf("</%s:hex>\n",element);
288*5978408cSSascha Wildner }
289*5978408cSSascha Wildner 
290*5978408cSSascha Wildner int
291*5978408cSSascha Wildner debug_get_encoded_number(unsigned char* buf, int mode)
292*5978408cSSascha Wildner {
293*5978408cSSascha Wildner #if !HAVE_NBTOOL_CONFIG_H
294*5978408cSSascha Wildner 	switch (mode) {
295*5978408cSSascha Wildner 	/* 711: Single bite */
296*5978408cSSascha Wildner 	case 711:
297*5978408cSSascha Wildner 		return isonum_711(buf);
298*5978408cSSascha Wildner 
299*5978408cSSascha Wildner 	/* 712: Single signed byte */
300*5978408cSSascha Wildner 	case 712:
301*5978408cSSascha Wildner 		return isonum_712((signed char *)buf);
302*5978408cSSascha Wildner 
303*5978408cSSascha Wildner 	/* 721: 16 bit LE */
304*5978408cSSascha Wildner 	case 721:
305*5978408cSSascha Wildner 		return isonum_721(buf);
306*5978408cSSascha Wildner 
307*5978408cSSascha Wildner 	/* 731: 32 bit LE */
308*5978408cSSascha Wildner 	case 731:
309*5978408cSSascha Wildner 		return isonum_731(buf);
310*5978408cSSascha Wildner 
311*5978408cSSascha Wildner 	/* 722: 16 bit BE */
312*5978408cSSascha Wildner 	case 722:
313*5978408cSSascha Wildner 		return isonum_722(buf);
314*5978408cSSascha Wildner 
315*5978408cSSascha Wildner 	/* 732: 32 bit BE */
316*5978408cSSascha Wildner 	case 732:
317*5978408cSSascha Wildner 		return isonum_732(buf);
318*5978408cSSascha Wildner 
319*5978408cSSascha Wildner 	/* 723: 16 bit bothE */
320*5978408cSSascha Wildner 	case 723:
321*5978408cSSascha Wildner 		return isonum_723(buf);
322*5978408cSSascha Wildner 
323*5978408cSSascha Wildner 	/* 733: 32 bit bothE */
324*5978408cSSascha Wildner 	case 733:
325*5978408cSSascha Wildner 		return isonum_733(buf);
326*5978408cSSascha Wildner 	}
327*5978408cSSascha Wildner #endif
328*5978408cSSascha Wildner 	return 0;
329*5978408cSSascha Wildner }
330*5978408cSSascha Wildner 
331*5978408cSSascha Wildner void
332*5978408cSSascha Wildner debug_dump_integer(const char *element, char* buf, int mode)
333*5978408cSSascha Wildner {
334*5978408cSSascha Wildner 	printf("<%s>%i</%s>\n", element,
335*5978408cSSascha Wildner 	    debug_get_encoded_number((unsigned char *)buf, mode), element);
336*5978408cSSascha Wildner }
337*5978408cSSascha Wildner 
338*5978408cSSascha Wildner void
339*5978408cSSascha Wildner debug_dump_string(const char *element __unused, unsigned char *buf __unused, int len __unused)
340*5978408cSSascha Wildner {
341*5978408cSSascha Wildner 
342*5978408cSSascha Wildner }
343*5978408cSSascha Wildner 
344*5978408cSSascha Wildner void
345*5978408cSSascha Wildner debug_dump_directory_record_9_1(unsigned char* buf)
346*5978408cSSascha Wildner {
347*5978408cSSascha Wildner 	printf("<directoryrecord>\n");
348*5978408cSSascha Wildner 	debug_dump_integer("length",
349*5978408cSSascha Wildner 	    ((struct iso_directory_record*) buf)->length, 711);
350*5978408cSSascha Wildner 	debug_dump_integer("ext_attr_length",
351*5978408cSSascha Wildner 	    ((struct iso_directory_record*) buf)->ext_attr_length,711);
352*5978408cSSascha Wildner 	debug_dump_integer("extent",
353*5978408cSSascha Wildner 	    (char *)((struct iso_directory_record*) buf)->extent, 733);
354*5978408cSSascha Wildner 	debug_dump_integer("size",
355*5978408cSSascha Wildner 	    (char *)((struct iso_directory_record*) buf)->size, 733);
356*5978408cSSascha Wildner 	debug_dump_integer("flags",
357*5978408cSSascha Wildner 	    ((struct iso_directory_record*) buf)->flags, 711);
358*5978408cSSascha Wildner 	debug_dump_integer("file_unit_size",
359*5978408cSSascha Wildner 	    ((struct iso_directory_record*) buf)->file_unit_size,711);
360*5978408cSSascha Wildner 	debug_dump_integer("interleave",
361*5978408cSSascha Wildner 	    ((struct iso_directory_record*) buf)->interleave, 711);
362*5978408cSSascha Wildner 	debug_dump_integer("volume_sequence_number",
363*5978408cSSascha Wildner 	    ((struct iso_directory_record*) buf)->volume_sequence_number,
364*5978408cSSascha Wildner 	    723);
365*5978408cSSascha Wildner 	debug_dump_integer("name_len",
366*5978408cSSascha Wildner 	    ((struct iso_directory_record*) buf)->name_len, 711);
367*5978408cSSascha Wildner 	debug_dump_to_xml_padded_hex_output("name",
368*5978408cSSascha Wildner 	    (u_char *)((struct iso_directory_record*) buf)->name,
369*5978408cSSascha Wildner 		debug_get_encoded_number((u_char *)
370*5978408cSSascha Wildner 		    ((struct iso_directory_record*) buf)->length, 711));
371*5978408cSSascha Wildner 	printf("</directoryrecord>\n");
372*5978408cSSascha Wildner }
373*5978408cSSascha Wildner 
374*5978408cSSascha Wildner 
375*5978408cSSascha Wildner void
376*5978408cSSascha Wildner debug_dump_to_xml_volume_descriptor(unsigned char* buf, int sector)
377*5978408cSSascha Wildner {
378*5978408cSSascha Wildner 	printf("<volumedescriptor sector=\"%i\">\n", sector);
379*5978408cSSascha Wildner 	printf("<vdtype>");
380*5978408cSSascha Wildner 	switch(buf[0]) {
381*5978408cSSascha Wildner 	case 0:
382*5978408cSSascha Wildner 		printf("boot");
383*5978408cSSascha Wildner 		break;
384*5978408cSSascha Wildner 
385*5978408cSSascha Wildner 	case 1:
386*5978408cSSascha Wildner 		printf("primary");
387*5978408cSSascha Wildner 		break;
388*5978408cSSascha Wildner 
389*5978408cSSascha Wildner 	case 2:
390*5978408cSSascha Wildner 		printf("supplementary");
391*5978408cSSascha Wildner 		break;
392*5978408cSSascha Wildner 
393*5978408cSSascha Wildner 	case 3:
394*5978408cSSascha Wildner 		printf("volume partition descriptor");
395*5978408cSSascha Wildner 		break;
396*5978408cSSascha Wildner 
397*5978408cSSascha Wildner 	case 255:
398*5978408cSSascha Wildner 		printf("terminator");
399*5978408cSSascha Wildner 		break;
400*5978408cSSascha Wildner 	}
401*5978408cSSascha Wildner 
402*5978408cSSascha Wildner 	printf("</vdtype>\n");
403*5978408cSSascha Wildner 	switch(buf[0]) {
404*5978408cSSascha Wildner 	case 1:
405*5978408cSSascha Wildner 		debug_dump_integer("type",
406*5978408cSSascha Wildner 		    ((struct iso_primary_descriptor*)buf)->type, 711);
407*5978408cSSascha Wildner 		debug_dump_to_xml_padded_hex_output("id",
408*5978408cSSascha Wildner 		    (u_char *)((struct iso_primary_descriptor*) buf)->id,
409*5978408cSSascha Wildner 		    ISODCL (  2,   6));
410*5978408cSSascha Wildner 		debug_dump_integer("version",
411*5978408cSSascha Wildner 		    ((struct iso_primary_descriptor*)buf)->version,
412*5978408cSSascha Wildner 		     711);
413*5978408cSSascha Wildner 		debug_dump_to_xml_padded_hex_output("system_id",
414*5978408cSSascha Wildner 		    (u_char *)((struct iso_primary_descriptor*)buf)->system_id,
415*5978408cSSascha Wildner 		    ISODCL(9,40));
416*5978408cSSascha Wildner 		debug_dump_to_xml_padded_hex_output("volume_id",
417*5978408cSSascha Wildner 		    (u_char *)((struct iso_primary_descriptor*)buf)->volume_id,
418*5978408cSSascha Wildner 		    ISODCL(41,72));
419*5978408cSSascha Wildner 		debug_dump_integer("volume_space_size",
420*5978408cSSascha Wildner 		    ((struct iso_primary_descriptor*)buf)->volume_space_size,
421*5978408cSSascha Wildner 		    733);
422*5978408cSSascha Wildner 		debug_dump_integer("volume_set_size",
423*5978408cSSascha Wildner 		    ((struct iso_primary_descriptor*)buf)->volume_set_size,
424*5978408cSSascha Wildner 			    733);
425*5978408cSSascha Wildner 		debug_dump_integer("volume_sequence_number",
426*5978408cSSascha Wildner 		    ((struct iso_primary_descriptor*)buf)->volume_sequence_number,
427*5978408cSSascha Wildner 		    723);
428*5978408cSSascha Wildner 		debug_dump_integer("logical_block_size",
429*5978408cSSascha Wildner 		    ((struct iso_primary_descriptor*)buf)->logical_block_size,
430*5978408cSSascha Wildner 			    723);
431*5978408cSSascha Wildner 		debug_dump_integer("path_table_size",
432*5978408cSSascha Wildner 		    ((struct iso_primary_descriptor*)buf)->path_table_size,
433*5978408cSSascha Wildner 			    733);
434*5978408cSSascha Wildner 		debug_dump_integer("type_l_path_table",
435*5978408cSSascha Wildner 		    ((struct iso_primary_descriptor*)buf)->type_l_path_table,
436*5978408cSSascha Wildner 		    731);
437*5978408cSSascha Wildner 		debug_dump_integer("opt_type_l_path_table",
438*5978408cSSascha Wildner 		    ((struct iso_primary_descriptor*)buf)->opt_type_l_path_table,
439*5978408cSSascha Wildner 		    731);
440*5978408cSSascha Wildner 		debug_dump_integer("type_m_path_table",
441*5978408cSSascha Wildner 		    ((struct iso_primary_descriptor*)buf)->type_m_path_table,
442*5978408cSSascha Wildner 		    732);
443*5978408cSSascha Wildner 		debug_dump_integer("opt_type_m_path_table",
444*5978408cSSascha Wildner 			((struct iso_primary_descriptor*)buf)->opt_type_m_path_table,732);
445*5978408cSSascha Wildner 		debug_dump_directory_record_9_1(
446*5978408cSSascha Wildner 		    (u_char *)((struct iso_primary_descriptor*)buf)->root_directory_record);
447*5978408cSSascha Wildner 		debug_dump_to_xml_padded_hex_output("volume_set_id",
448*5978408cSSascha Wildner 		    (u_char *)((struct iso_primary_descriptor*) buf)->volume_set_id,
449*5978408cSSascha Wildner 		    ISODCL (191, 318));
450*5978408cSSascha Wildner 		debug_dump_to_xml_padded_hex_output("publisher_id",
451*5978408cSSascha Wildner 		    (u_char *)((struct iso_primary_descriptor*) buf)->publisher_id,
452*5978408cSSascha Wildner 		    ISODCL (319, 446));
453*5978408cSSascha Wildner 		debug_dump_to_xml_padded_hex_output("preparer_id",
454*5978408cSSascha Wildner 		    (u_char *)((struct iso_primary_descriptor*) buf)->preparer_id,
455*5978408cSSascha Wildner 		    ISODCL (447, 574));
456*5978408cSSascha Wildner 		debug_dump_to_xml_padded_hex_output("application_id",
457*5978408cSSascha Wildner 		    (u_char *)((struct iso_primary_descriptor*) buf)->application_id,
458*5978408cSSascha Wildner 		    ISODCL (575, 702));
459*5978408cSSascha Wildner 		debug_dump_to_xml_padded_hex_output("copyright_file_id",
460*5978408cSSascha Wildner 		    (u_char *)((struct iso_primary_descriptor*) buf)->copyright_file_id,
461*5978408cSSascha Wildner 		    ISODCL (703, 739));
462*5978408cSSascha Wildner 		debug_dump_to_xml_padded_hex_output("abstract_file_id",
463*5978408cSSascha Wildner 		    (u_char *)((struct iso_primary_descriptor*) buf)->abstract_file_id,
464*5978408cSSascha Wildner 		    ISODCL (740, 776));
465*5978408cSSascha Wildner 		debug_dump_to_xml_padded_hex_output("bibliographic_file_id",
466*5978408cSSascha Wildner 		    (u_char *)((struct iso_primary_descriptor*) buf)->bibliographic_file_id,
467*5978408cSSascha Wildner 		    ISODCL (777, 813));
468*5978408cSSascha Wildner 
469*5978408cSSascha Wildner 		debug_dump_to_xml_padded_hex_output("creation_date",
470*5978408cSSascha Wildner 		    (u_char *)((struct iso_primary_descriptor*) buf)->creation_date,
471*5978408cSSascha Wildner 		    ISODCL (814, 830));
472*5978408cSSascha Wildner 		debug_dump_to_xml_padded_hex_output("modification_date",
473*5978408cSSascha Wildner 		    (u_char *)((struct iso_primary_descriptor*) buf)->modification_date,
474*5978408cSSascha Wildner 		    ISODCL (831, 847));
475*5978408cSSascha Wildner 		debug_dump_to_xml_padded_hex_output("expiration_date",
476*5978408cSSascha Wildner 		    (u_char *)((struct iso_primary_descriptor*) buf)->expiration_date,
477*5978408cSSascha Wildner 		    ISODCL (848, 864));
478*5978408cSSascha Wildner 		debug_dump_to_xml_padded_hex_output("effective_date",
479*5978408cSSascha Wildner 		    (u_char *)((struct iso_primary_descriptor*) buf)->effective_date,
480*5978408cSSascha Wildner 		    ISODCL (865, 881));
481*5978408cSSascha Wildner 
482*5978408cSSascha Wildner 		debug_dump_to_xml_padded_hex_output("file_structure_version",
483*5978408cSSascha Wildner 		    (u_char *)((struct iso_primary_descriptor*) buf)->file_structure_version,
484*5978408cSSascha Wildner 		    ISODCL(882,882));
485*5978408cSSascha Wildner 		break;
486*5978408cSSascha Wildner 	}
487*5978408cSSascha Wildner 	printf("</volumedescriptor>\n");
488*5978408cSSascha Wildner }
489*5978408cSSascha Wildner 
490