1 /* $NetBSD: cd9660_debug.c,v 1.13 2013/10/19 17:16:37 christos 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.13 2013/10/19 17:16:37 christos 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(iso9660_disk
*diskStructure
, 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) (%" PRIu32
" to %" PRId64
")\n",
109 node
->fileDataSector
,
110 node
->fileDataSector
+
111 node
->fileSectorsUsed
- 1);
113 printf("%s (%s) (%" PRIu32
" to %" PRId64
")\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(diskStructure
, 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(iso9660_disk
*diskStructure
)
155 volume_descriptor
*tmp
= diskStructure
->firstVolumeDescriptor
;
156 char temp
[CD9660_SECTOR_SIZE
];
158 printf("==Listing Volume Descriptors==\n");
160 while (tmp
!= NULL
) {
161 memset(temp
, 0, CD9660_SECTOR_SIZE
);
162 memcpy(temp
, tmp
->volumeDescriptorData
+ 1, 5);
163 printf("Volume descriptor in sector %" PRId64
164 ": type %i, ID %s\n",
165 tmp
->sector
, tmp
->volumeDescriptorData
[0], temp
);
166 switch(tmp
->volumeDescriptorData
[0]) {
167 case 0:/*boot record*/
176 case 3: /* Volume Partition Descriptor */
179 case 255: /* terminator */
185 printf("==Done Listing Volume Descriptors==\n");
189 debug_dump_to_xml_ptentry(path_table_entry
*pttemp
, int num
, int mode
)
191 printf("<ptentry num=\"%i\">\n" ,num
);
192 printf("<length>%i</length>\n", pttemp
->length
[0]);
193 printf("<extended_attribute_length>%i</extended_attribute_length>\n",
194 pttemp
->extended_attribute_length
[0]);
195 printf("<parent_number>%i</parent_number>\n",
196 debug_get_encoded_number(pttemp
->parent_number
,mode
));
197 debug_dump_to_xml_padded_hex_output("name",
198 pttemp
->name
, pttemp
->length
[0]);
199 printf("</ptentry>\n");
203 debug_dump_to_xml_path_table(FILE *fd
, off_t sector
, int size
, int mode
)
205 path_table_entry pttemp
;
209 if (fseeko(fd
, CD9660_SECTOR_SIZE
* sector
, SEEK_SET
) == -1)
213 /* Read fixed data first */
214 fread(&pttemp
, 1, 8, fd
);
217 fread(((unsigned char*)&pttemp
) + 8, 1, pttemp
.length
[0], fd
);
218 t
+= pttemp
.length
[0];
219 debug_dump_to_xml_ptentry(&pttemp
, n
, mode
);
226 * XML Debug output functions
227 * Dump hierarchy of CD, as well as volume info, to XML
228 * Can be used later to diff against a standard,
229 * or just provide easy to read detailed debug output
232 debug_dump_to_xml(FILE *fd
)
234 unsigned char buf
[CD9660_SECTOR_SIZE
];
237 struct iso_primary_descriptor primaryVD
;
238 struct _boot_volume_descriptor bootVD
;
240 memset(&primaryVD
, 0, sizeof(primaryVD
));
241 printf("<cd9660dump>\n");
243 /* Display Volume Descriptors */
246 if (fseeko(fd
, CD9660_SECTOR_SIZE
* sector
, SEEK_SET
) == -1)
248 fread(buf
, 1, CD9660_SECTOR_SIZE
, fd
);
249 t
= (int)((unsigned char)buf
[0]);
252 memcpy(&bootVD
, buf
, CD9660_SECTOR_SIZE
);
255 memcpy(&primaryVD
, buf
, CD9660_SECTOR_SIZE
);
258 debug_dump_to_xml_volume_descriptor(buf
, sector
);
262 t
= debug_get_encoded_number((u_char
*)primaryVD
.type_l_path_table
,
264 t2
= debug_get_encoded_number((u_char
*)primaryVD
.path_table_size
, 733);
265 printf("Path table 1 located at sector %i and is %i bytes long\n",
267 debug_dump_to_xml_path_table(fd
, t
, t2
, 721);
269 t
= debug_get_encoded_number((u_char
*)primaryVD
.type_m_path_table
,
271 debug_dump_to_xml_path_table(fd
, t
, t2
, 722);
273 printf("</cd9660dump>\n");
277 debug_dump_to_xml_padded_hex_output(const char *element
, unsigned char *buf
,
283 printf("<%s>",element
);
284 for (i
= 0; i
< len
; i
++) {
285 t
= (unsigned char)buf
[i
];
286 if (t
>= 32 && t
< 127)
289 printf("</%s>\n",element
);
291 printf("<%s:hex>",element
);
292 for (i
= 0; i
< len
; i
++) {
293 t
= (unsigned char)buf
[i
];
296 printf("</%s:hex>\n",element
);
300 debug_get_encoded_number(unsigned char* buf
, int mode
)
302 #if !HAVE_NBTOOL_CONFIG_H
304 /* 711: Single bite */
306 return isonum_711(buf
);
308 /* 712: Single signed byte */
310 return isonum_712((signed char *)buf
);
314 return isonum_721(buf
);
318 return isonum_731(buf
);
322 return isonum_722(buf
);
326 return isonum_732(buf
);
328 /* 723: 16 bit bothE */
330 return isonum_723(buf
);
332 /* 733: 32 bit bothE */
334 return isonum_733(buf
);
341 debug_dump_integer(const char *element
, char* buf
, int mode
)
343 printf("<%s>%i</%s>\n", element
,
344 debug_get_encoded_number((unsigned char *)buf
, mode
), element
);
348 debug_dump_string(const char *element __unused
, unsigned char *buf __unused
, int len __unused
)
354 debug_dump_directory_record_9_1(unsigned char* buf
)
356 printf("<directoryrecord>\n");
357 debug_dump_integer("length",
358 ((struct iso_directory_record
*) buf
)->length
, 711);
359 debug_dump_integer("ext_attr_length",
360 ((struct iso_directory_record
*) buf
)->ext_attr_length
,711);
361 debug_dump_integer("extent",
362 (char *)((struct iso_directory_record
*) buf
)->extent
, 733);
363 debug_dump_integer("size",
364 (char *)((struct iso_directory_record
*) buf
)->size
, 733);
365 debug_dump_integer("flags",
366 ((struct iso_directory_record
*) buf
)->flags
, 711);
367 debug_dump_integer("file_unit_size",
368 ((struct iso_directory_record
*) buf
)->file_unit_size
,711);
369 debug_dump_integer("interleave",
370 ((struct iso_directory_record
*) buf
)->interleave
, 711);
371 debug_dump_integer("volume_sequence_number",
372 ((struct iso_directory_record
*) buf
)->volume_sequence_number
,
374 debug_dump_integer("name_len",
375 ((struct iso_directory_record
*) buf
)->name_len
, 711);
376 debug_dump_to_xml_padded_hex_output("name",
377 (u_char
*)((struct iso_directory_record
*) buf
)->name
,
378 debug_get_encoded_number((u_char
*)
379 ((struct iso_directory_record
*) buf
)->length
, 711));
380 printf("</directoryrecord>\n");
385 debug_dump_to_xml_volume_descriptor(unsigned char* buf
, int sector
)
387 printf("<volumedescriptor sector=\"%i\">\n", sector
);
399 printf("supplementary");
403 printf("volume partition descriptor");
407 printf("terminator");
411 printf("</vdtype>\n");
414 debug_dump_integer("type",
415 ((struct iso_primary_descriptor
*)buf
)->type
, 711);
416 debug_dump_to_xml_padded_hex_output("id",
417 (u_char
*)((struct iso_primary_descriptor
*) buf
)->id
,
419 debug_dump_integer("version",
420 ((struct iso_primary_descriptor
*)buf
)->version
,
422 debug_dump_to_xml_padded_hex_output("system_id",
423 (u_char
*)((struct iso_primary_descriptor
*)buf
)->system_id
,
425 debug_dump_to_xml_padded_hex_output("volume_id",
426 (u_char
*)((struct iso_primary_descriptor
*)buf
)->volume_id
,
428 debug_dump_integer("volume_space_size",
429 ((struct iso_primary_descriptor
*)buf
)->volume_space_size
,
431 debug_dump_integer("volume_set_size",
432 ((struct iso_primary_descriptor
*)buf
)->volume_set_size
,
434 debug_dump_integer("volume_sequence_number",
435 ((struct iso_primary_descriptor
*)buf
)->volume_sequence_number
,
437 debug_dump_integer("logical_block_size",
438 ((struct iso_primary_descriptor
*)buf
)->logical_block_size
,
440 debug_dump_integer("path_table_size",
441 ((struct iso_primary_descriptor
*)buf
)->path_table_size
,
443 debug_dump_integer("type_l_path_table",
444 ((struct iso_primary_descriptor
*)buf
)->type_l_path_table
,
446 debug_dump_integer("opt_type_l_path_table",
447 ((struct iso_primary_descriptor
*)buf
)->opt_type_l_path_table
,
449 debug_dump_integer("type_m_path_table",
450 ((struct iso_primary_descriptor
*)buf
)->type_m_path_table
,
452 debug_dump_integer("opt_type_m_path_table",
453 ((struct iso_primary_descriptor
*)buf
)->opt_type_m_path_table
,732);
454 debug_dump_directory_record_9_1(
455 (u_char
*)((struct iso_primary_descriptor
*)buf
)->root_directory_record
);
456 debug_dump_to_xml_padded_hex_output("volume_set_id",
457 (u_char
*)((struct iso_primary_descriptor
*) buf
)->volume_set_id
,
459 debug_dump_to_xml_padded_hex_output("publisher_id",
460 (u_char
*)((struct iso_primary_descriptor
*) buf
)->publisher_id
,
462 debug_dump_to_xml_padded_hex_output("preparer_id",
463 (u_char
*)((struct iso_primary_descriptor
*) buf
)->preparer_id
,
465 debug_dump_to_xml_padded_hex_output("application_id",
466 (u_char
*)((struct iso_primary_descriptor
*) buf
)->application_id
,
468 debug_dump_to_xml_padded_hex_output("copyright_file_id",
469 (u_char
*)((struct iso_primary_descriptor
*) buf
)->copyright_file_id
,
471 debug_dump_to_xml_padded_hex_output("abstract_file_id",
472 (u_char
*)((struct iso_primary_descriptor
*) buf
)->abstract_file_id
,
474 debug_dump_to_xml_padded_hex_output("bibliographic_file_id",
475 (u_char
*)((struct iso_primary_descriptor
*) buf
)->bibliographic_file_id
,
478 debug_dump_to_xml_padded_hex_output("creation_date",
479 (u_char
*)((struct iso_primary_descriptor
*) buf
)->creation_date
,
481 debug_dump_to_xml_padded_hex_output("modification_date",
482 (u_char
*)((struct iso_primary_descriptor
*) buf
)->modification_date
,
484 debug_dump_to_xml_padded_hex_output("expiration_date",
485 (u_char
*)((struct iso_primary_descriptor
*) buf
)->expiration_date
,
487 debug_dump_to_xml_padded_hex_output("effective_date",
488 (u_char
*)((struct iso_primary_descriptor
*) buf
)->effective_date
,
491 debug_dump_to_xml_padded_hex_output("file_structure_version",
492 (u_char
*)((struct iso_primary_descriptor
*) buf
)->file_structure_version
,
496 printf("</volumedescriptor>\n");