1 /* $NetBSD: cd9660_debug.c,v 1.8 2007/01/30 01:46:33 dogcow Exp $ */
4 * Copyright (c) 2005 Daniel Watt, Walter Deignan, Ryan Gabrys, Alan
5 * Perez-Rathke and Ram Vedam. All rights reserved.
7 * This code was written by Daniel Watt, Walter Deignan, Ryan Gabrys,
8 * Alan Perez-Rathke and Ram Vedam.
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above
16 * copyright notice, this list of conditions and the following
17 * disclaimer in the documentation and/or other materials provided
18 * with the distribution.
20 * THIS SOFTWARE IS PROVIDED BY DANIEL WATT, WALTER DEIGNAN, RYAN
21 * GABRYS, ALAN PEREZ-RATHKE AND RAM VEDAM ``AS IS'' AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 * DISCLAIMED. IN NO EVENT SHALL DANIEL WATT, WALTER DEIGNAN, RYAN
25 * GABRYS, ALAN PEREZ-RATHKE AND RAM VEDAM BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28 * USE,DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
29 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
35 #if HAVE_NBTOOL_CONFIG_H
36 #include "nbtool_config.h"
39 #include <sys/cdefs.h>
40 #include <sys/param.h>
42 #if defined(__RCSID) && !defined(__lint)
43 __RCSID("$NetBSD: cd9660_debug.c,v 1.8 2007/01/30 01:46:33 dogcow Exp $");
46 #if !HAVE_NBTOOL_CONFIG_H
47 #include <sys/mount.h>
52 #include "iso9660_rrip.h"
54 static void debug_print_susp_attrs(cd9660node
*, int);
55 static void debug_dump_to_xml_padded_hex_output(const char *, unsigned char *,
63 for (i
= 1; i
<= n
; i
++)
69 debug_print_rrip_info(n
)
72 struct ISO_SUSP_ATTRIBUTES
*t
;
73 TAILQ_FOREACH(t
, &node
->head
, rr_ll
) {
80 debug_print_susp_attrs(cd9660node
*n
, int indent
)
82 struct ISO_SUSP_ATTRIBUTES
*t
;
84 TAILQ_FOREACH(t
, &n
->head
, rr_ll
) {
87 printf("%c%c: L:%i",t
->attr
.su_entry
.SP
.h
.type
[0],
88 t
->attr
.su_entry
.SP
.h
.type
[1],
89 (int)t
->attr
.su_entry
.SP
.h
.length
[0]);
95 debug_print_tree(cd9660node
*node
, int level
)
97 #if !HAVE_NBTOOL_CONFIG_H
101 if (node
->type
& CD9660_TYPE_DOT
) {
103 isonum_733(node
->isoDirRecord
->extent
));
104 } else if (node
->type
& CD9660_TYPE_DOTDOT
) {
106 isonum_733(node
->isoDirRecord
->extent
));
107 } else if (node
->isoDirRecord
->name
[0]=='\0') {
108 printf("(ROOT) (%i to %i)\n",
109 node
->fileDataSector
,
110 node
->fileDataSector
+
111 node
->fileSectorsUsed
- 1);
113 printf("%s (%s) (%i to %i)\n",
114 node
->isoDirRecord
->name
,
115 (node
->isoDirRecord
->flags
[0]
116 & ISO_FLAG_DIRECTORY
) ? "DIR" : "FILE",
117 node
->fileDataSector
,
118 (node
->fileSectorsUsed
== 0) ?
119 node
->fileDataSector
:
121 + node
->fileSectorsUsed
- 1);
123 if (diskStructure
.rock_ridge_enabled
)
124 debug_print_susp_attrs(node
, level
+ 1);
125 TAILQ_FOREACH(cn
, &node
->cn_children
, cn_next_child
)
126 debug_print_tree(cn
, level
+ 1);
128 printf("Sorry, debugging is not supported in host-tools mode.\n");
133 debug_print_path_tree(cd9660node
*n
)
135 cd9660node
*iterator
= n
;
137 /* Only display this message when called with the root node */
138 if (n
->parent
== NULL
)
139 printf("debug_print_path_table: Dumping path table contents\n");
141 while (iterator
!= NULL
) {
142 if (iterator
->isoDirRecord
->name
[0] == '\0')
143 printf("0) (ROOT)\n");
145 printf("%i) %s\n", iterator
->level
,
146 iterator
->isoDirRecord
->name
);
148 iterator
= iterator
->ptnext
;
153 debug_print_volume_descriptor_information(void)
155 volume_descriptor
*tmp
= diskStructure
.firstVolumeDescriptor
;
158 printf("==Listing Volume Descriptors==\n");
160 while (tmp
!= NULL
) {
161 memset(temp
, 0, 2048);
162 memcpy(temp
, tmp
->volumeDescriptorData
+ 1, 5);
163 printf("Volume descriptor in sector %i: type %i, ID %s\n",
164 tmp
->sector
, tmp
->volumeDescriptorData
[0], temp
);
165 switch(tmp
->volumeDescriptorData
[0]) {
166 case 0:/*boot record*/
175 case 3: /* Volume Partition Descriptor */
178 case 255: /* terminator */
184 printf("==Done Listing Volume Descriptors==\n");
188 debug_dump_to_xml_ptentry(path_table_entry
*pttemp
, int num
, int mode
)
190 printf("<ptentry num=\"%i\">\n" ,num
);
191 printf("<length>%i</length>\n", pttemp
->length
[0]);
192 printf("<extended_attribute_length>%i</extended_attribute_length>\n",
193 pttemp
->extended_attribute_length
[0]);
194 printf("<parent_number>%i</parent_number>\n",
195 debug_get_encoded_number(pttemp
->parent_number
,mode
));
196 debug_dump_to_xml_padded_hex_output("name",
197 pttemp
->name
, pttemp
->length
[0]);
198 printf("</ptentry>\n");
202 debug_dump_to_xml_path_table(FILE *fd
, int sector
, int size
, int mode
)
204 path_table_entry pttemp
;
208 fseek(fd
, 2048 * sector
, SEEK_SET
);
211 /* Read fixed data first */
212 fread(&pttemp
, 1, 8, fd
);
215 fread(((unsigned char*)&pttemp
) + 8, 1, pttemp
.length
[0], fd
);
216 t
+= pttemp
.length
[0];
217 debug_dump_to_xml_ptentry(&pttemp
, n
, mode
);
224 * XML Debug output functions
225 * Dump hierarchy of CD, as well as volume info, to XML
226 * Can be used later to diff against a standard,
227 * or just provide easy to read detailed debug output
230 debug_dump_to_xml(FILE *fd
)
232 unsigned char buf
[2048];
235 struct iso_primary_descriptor primaryVD
;
236 struct _boot_volume_descriptor bootVD
;
238 printf("<cd9660dump>\n");
240 /* Display Volume Descriptors */
243 fseek(fd
, 2048*sector
, SEEK_SET
);
244 fread(buf
, 1, 2048, fd
);
245 t
= (int)((unsigned char)buf
[0]);
248 memcpy(&bootVD
, buf
, 2048);
251 memcpy(&primaryVD
, buf
, 2048);
254 debug_dump_to_xml_volume_descriptor(buf
, sector
);
258 t
= debug_get_encoded_number((u_char
*)primaryVD
.type_l_path_table
,
260 t2
= debug_get_encoded_number((u_char
*)primaryVD
.path_table_size
, 733);
261 printf("Path table 1 located at sector %i and is %i bytes long\n",
263 debug_dump_to_xml_path_table(fd
, t
, t2
, 721);
265 t
= debug_get_encoded_number((u_char
*)primaryVD
.type_m_path_table
,
267 debug_dump_to_xml_path_table(fd
, t
, t2
, 722);
269 printf("</cd9660dump>\n");
273 debug_dump_to_xml_padded_hex_output(const char *element
, unsigned char *buf
,
279 printf("<%s>",element
);
280 for (i
= 0; i
< len
; i
++) {
281 t
= (unsigned char)buf
[i
];
282 if (t
>= 32 && t
< 127)
285 printf("</%s>\n",element
);
287 printf("<%s:hex>",element
);
288 for (i
= 0; i
< len
; i
++) {
289 t
= (unsigned char)buf
[i
];
292 printf("</%s:hex>\n",element
);
296 debug_get_encoded_number(unsigned char* buf
, int mode
)
298 #if !HAVE_NBTOOL_CONFIG_H
300 /* 711: Single bite */
302 return isonum_711(buf
);
304 /* 712: Single signed byte */
306 return isonum_712((signed char *)buf
);
310 return isonum_721(buf
);
314 return isonum_731(buf
);
318 return isonum_722(buf
);
322 return isonum_732(buf
);
324 /* 723: 16 bit bothE */
326 return isonum_723(buf
);
328 /* 733: 32 bit bothE */
330 return isonum_733(buf
);
337 debug_dump_integer(const char *element
, char* buf
, int mode
)
339 printf("<%s>%i</%s>\n", element
,
340 debug_get_encoded_number((unsigned char *)buf
, mode
), element
);
344 debug_dump_string(const char *element __unused
, unsigned char *buf __unused
, int len __unused
)
350 debug_dump_directory_record_9_1(unsigned char* buf
)
352 printf("<directoryrecord>\n");
353 debug_dump_integer("length",
354 ((struct iso_directory_record
*) buf
)->length
, 711);
355 debug_dump_integer("ext_attr_length",
356 ((struct iso_directory_record
*) buf
)->ext_attr_length
,711);
357 debug_dump_integer("extent",
358 (char *)((struct iso_directory_record
*) buf
)->extent
, 733);
359 debug_dump_integer("size",
360 (char *)((struct iso_directory_record
*) buf
)->size
, 733);
361 debug_dump_integer("flags",
362 ((struct iso_directory_record
*) buf
)->flags
, 711);
363 debug_dump_integer("file_unit_size",
364 ((struct iso_directory_record
*) buf
)->file_unit_size
,711);
365 debug_dump_integer("interleave",
366 ((struct iso_directory_record
*) buf
)->interleave
, 711);
367 debug_dump_integer("volume_sequence_number",
368 ((struct iso_directory_record
*) buf
)->volume_sequence_number
,
370 debug_dump_integer("name_len",
371 ((struct iso_directory_record
*) buf
)->name_len
, 711);
372 debug_dump_to_xml_padded_hex_output("name",
373 (u_char
*)((struct iso_directory_record
*) buf
)->name
,
374 debug_get_encoded_number((u_char
*)
375 ((struct iso_directory_record
*) buf
)->length
, 711));
376 printf("</directoryrecord>\n");
381 debug_dump_to_xml_volume_descriptor(unsigned char* buf
, int sector
)
383 printf("<volumedescriptor sector=\"%i\">\n", sector
);
395 printf("supplementary");
399 printf("volume partition descriptor");
403 printf("terminator");
407 printf("</vdtype>\n");
410 debug_dump_integer("type",
411 ((struct iso_primary_descriptor
*)buf
)->type
, 711);
412 debug_dump_to_xml_padded_hex_output("id",
413 (u_char
*)((struct iso_primary_descriptor
*) buf
)->id
,
415 debug_dump_integer("version",
416 ((struct iso_primary_descriptor
*)buf
)->version
,
418 debug_dump_to_xml_padded_hex_output("system_id",
419 (u_char
*)((struct iso_primary_descriptor
*)buf
)->system_id
,
421 debug_dump_to_xml_padded_hex_output("volume_id",
422 (u_char
*)((struct iso_primary_descriptor
*)buf
)->volume_id
,
424 debug_dump_integer("volume_space_size",
425 ((struct iso_primary_descriptor
*)buf
)->volume_space_size
,
427 debug_dump_integer("volume_set_size",
428 ((struct iso_primary_descriptor
*)buf
)->volume_set_size
,
430 debug_dump_integer("volume_sequence_number",
431 ((struct iso_primary_descriptor
*)buf
)->volume_sequence_number
,
433 debug_dump_integer("logical_block_size",
434 ((struct iso_primary_descriptor
*)buf
)->logical_block_size
,
436 debug_dump_integer("path_table_size",
437 ((struct iso_primary_descriptor
*)buf
)->path_table_size
,
439 debug_dump_integer("type_l_path_table",
440 ((struct iso_primary_descriptor
*)buf
)->type_l_path_table
,
442 debug_dump_integer("opt_type_l_path_table",
443 ((struct iso_primary_descriptor
*)buf
)->opt_type_l_path_table
,
445 debug_dump_integer("type_m_path_table",
446 ((struct iso_primary_descriptor
*)buf
)->type_m_path_table
,
448 debug_dump_integer("opt_type_m_path_table",
449 ((struct iso_primary_descriptor
*)buf
)->opt_type_m_path_table
,732);
450 debug_dump_directory_record_9_1(
451 (u_char
*)((struct iso_primary_descriptor
*)buf
)->root_directory_record
);
452 debug_dump_to_xml_padded_hex_output("volume_set_id",
453 (u_char
*)((struct iso_primary_descriptor
*) buf
)->volume_set_id
,
455 debug_dump_to_xml_padded_hex_output("publisher_id",
456 (u_char
*)((struct iso_primary_descriptor
*) buf
)->publisher_id
,
458 debug_dump_to_xml_padded_hex_output("preparer_id",
459 (u_char
*)((struct iso_primary_descriptor
*) buf
)->preparer_id
,
461 debug_dump_to_xml_padded_hex_output("application_id",
462 (u_char
*)((struct iso_primary_descriptor
*) buf
)->application_id
,
464 debug_dump_to_xml_padded_hex_output("copyright_file_id",
465 (u_char
*)((struct iso_primary_descriptor
*) buf
)->copyright_file_id
,
467 debug_dump_to_xml_padded_hex_output("abstract_file_id",
468 (u_char
*)((struct iso_primary_descriptor
*) buf
)->abstract_file_id
,
470 debug_dump_to_xml_padded_hex_output("bibliographic_file_id",
471 (u_char
*)((struct iso_primary_descriptor
*) buf
)->bibliographic_file_id
,
474 debug_dump_to_xml_padded_hex_output("creation_date",
475 (u_char
*)((struct iso_primary_descriptor
*) buf
)->creation_date
,
477 debug_dump_to_xml_padded_hex_output("modification_date",
478 (u_char
*)((struct iso_primary_descriptor
*) buf
)->modification_date
,
480 debug_dump_to_xml_padded_hex_output("expiration_date",
481 (u_char
*)((struct iso_primary_descriptor
*) buf
)->expiration_date
,
483 debug_dump_to_xml_padded_hex_output("effective_date",
484 (u_char
*)((struct iso_primary_descriptor
*) buf
)->effective_date
,
487 debug_dump_to_xml_padded_hex_output("file_structure_version",
488 (u_char
*)((struct iso_primary_descriptor
*) buf
)->file_structure_version
,
492 printf("</volumedescriptor>\n");