GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.sbin/makefs/cd9660/cd9660_debug.c Lines: 0 212 0.0 %
Date: 2017-11-13 Branches: 0 58 0.0 %

Line Branch Exec Source
1
/*	$OpenBSD: cd9660_debug.c,v 1.3 2016/10/16 20:26:56 natano Exp $	*/
2
/*	$NetBSD: cd9660_debug.c,v 1.13 2013/10/19 17:16:37 christos Exp $	*/
3
4
/*
5
 * Copyright (c) 2005 Daniel Watt, Walter Deignan, Ryan Gabrys, Alan
6
 * Perez-Rathke and Ram Vedam.  All rights reserved.
7
 *
8
 * This code was written by Daniel Watt, Walter Deignan, Ryan Gabrys,
9
 * Alan Perez-Rathke and Ram Vedam.
10
 *
11
 * Redistribution and use in source and binary forms, with or
12
 * without modification, are permitted provided that the following
13
 * conditions are met:
14
 * 1. Redistributions of source code must retain the above copyright
15
 *    notice, this list of conditions and the following disclaimer.
16
 * 2. Redistributions in binary form must reproduce the above
17
 *    copyright notice, this list of conditions and the following
18
 *    disclaimer in the documentation and/or other materials provided
19
 *    with the distribution.
20
 *
21
 * THIS SOFTWARE IS PROVIDED BY DANIEL WATT, WALTER DEIGNAN, RYAN
22
 * GABRYS, ALAN PEREZ-RATHKE AND RAM VEDAM ``AS IS'' AND ANY EXPRESS OR
23
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25
 * DISCLAIMED.  IN NO EVENT SHALL DANIEL WATT, WALTER DEIGNAN, RYAN
26
 * GABRYS, ALAN PEREZ-RATHKE AND RAM VEDAM BE LIABLE FOR ANY DIRECT, INDIRECT,
27
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
29
 * USE,DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
31
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
33
 * OF SUCH DAMAGE.
34
 */
35
36
#include <inttypes.h>
37
38
#include "cd9660.h"
39
#include "iso9660_rrip.h"
40
41
static void debug_print_susp_attrs(cd9660node *, int);
42
static void debug_dump_to_xml_padded_hex_output(const char *, unsigned char *,
43
						int);
44
45
static inline void
46
print_n_tabs(int n)
47
{
48
	int i;
49
50
	for (i = 1; i <= n; i ++)
51
		printf("\t");
52
}
53
54
#if 0
55
void
56
debug_print_rrip_info(n)
57
cd9660node *n;
58
{
59
	struct ISO_SUSP_ATTRIBUTES *t;
60
	TAILQ_FOREACH(t, &node->head, rr_ll) {
61
62
	}
63
}
64
#endif
65
66
static void
67
debug_print_susp_attrs(cd9660node *n, int indent)
68
{
69
	struct ISO_SUSP_ATTRIBUTES *t;
70
71
	TAILQ_FOREACH(t, &n->head, rr_ll) {
72
		print_n_tabs(indent);
73
		printf("-");
74
		printf("%c%c: L:%i",t->attr.su_entry.SP.h.type[0],
75
		    t->attr.su_entry.SP.h.type[1],
76
		    (int)t->attr.su_entry.SP.h.length[0]);
77
		printf("\n");
78
	}
79
}
80
81
void
82
debug_print_tree(iso9660_disk *diskStructure, cd9660node *node, int level)
83
{
84
	cd9660node *cn;
85
86
	print_n_tabs(level);
87
	if (node->type & CD9660_TYPE_DOT) {
88
		printf(". (%i)\n",
89
		    isonum_733(node->isoDirRecord->extent));
90
	} else if (node->type & CD9660_TYPE_DOTDOT) {
91
		printf("..(%i)\n",
92
		    isonum_733(node->isoDirRecord->extent));
93
	} else if (node->isoDirRecord->name[0]=='\0') {
94
		printf("(ROOT) (%" PRIu32 " to %" PRId64 ")\n",
95
		    node->fileDataSector,
96
		    node->fileDataSector +
97
			node->fileSectorsUsed - 1);
98
	} else {
99
		printf("%s (%s) (%" PRIu32 " to %" PRId64 ")\n",
100
		    node->isoDirRecord->name,
101
		    (node->isoDirRecord->flags[0]
102
			& ISO_FLAG_DIRECTORY) ?  "DIR" : "FILE",
103
		    node->fileDataSector,
104
		    (node->fileSectorsUsed == 0) ?
105
			node->fileDataSector :
106
			node->fileDataSector
107
			    + node->fileSectorsUsed - 1);
108
	}
109
	if (diskStructure->rock_ridge_enabled)
110
		debug_print_susp_attrs(node, level + 1);
111
	TAILQ_FOREACH(cn, &node->cn_children, cn_next_child)
112
		debug_print_tree(diskStructure, cn, level + 1);
113
}
114
115
void
116
debug_print_path_tree(cd9660node *n)
117
{
118
	cd9660node *iterator = n;
119
120
	/* Only display this message when called with the root node */
121
	if (n->parent == NULL)
122
		printf("debug_print_path_table: Dumping path table contents\n");
123
124
	while (iterator != NULL) {
125
		if (iterator->isoDirRecord->name[0] == '\0')
126
			printf("0) (ROOT)\n");
127
		else
128
			printf("%i) %s\n", iterator->level,
129
			    iterator->isoDirRecord->name);
130
131
		iterator = iterator->ptnext;
132
	}
133
}
134
135
void
136
debug_print_volume_descriptor_information(iso9660_disk *diskStructure)
137
{
138
	volume_descriptor *tmp = diskStructure->firstVolumeDescriptor;
139
	char temp[CD9660_SECTOR_SIZE];
140
141
	printf("==Listing Volume Descriptors==\n");
142
143
	while (tmp != NULL) {
144
		memset(temp, 0, CD9660_SECTOR_SIZE);
145
		memcpy(temp, tmp->volumeDescriptorData + 1, 5);
146
		printf("Volume descriptor in sector %" PRId64
147
		    ": type %i, ID %s\n",
148
		    tmp->sector, tmp->volumeDescriptorData[0], temp);
149
		switch(tmp->volumeDescriptorData[0]) {
150
		case 0:/*boot record*/
151
			break;
152
153
		case 1:		/* PVD */
154
			break;
155
156
		case 2:		/* SVD */
157
			break;
158
159
		case 3:		/* Volume Partition Descriptor */
160
			break;
161
162
		case 255:	/* terminator */
163
			break;
164
		}
165
		tmp = tmp->next;
166
	}
167
168
	printf("==Done Listing Volume Descriptors==\n");
169
}
170
171
void
172
debug_dump_to_xml_ptentry(path_table_entry *pttemp, int num, int mode)
173
{
174
	printf("<ptentry num=\"%i\">\n" ,num);
175
	printf("<length>%i</length>\n", pttemp->length[0]);
176
	printf("<extended_attribute_length>%i</extended_attribute_length>\n",
177
	    pttemp->extended_attribute_length[0]);
178
	printf("<parent_number>%i</parent_number>\n",
179
	    debug_get_encoded_number(pttemp->parent_number,mode));
180
	debug_dump_to_xml_padded_hex_output("name",
181
	    pttemp->name, pttemp->length[0]);
182
	printf("</ptentry>\n");
183
}
184
185
void
186
debug_dump_to_xml_path_table(FILE *fd, off_t sector, int size, int mode)
187
{
188
	path_table_entry pttemp;
189
	int t = 0;
190
	int n = 0;
191
192
	if (fseeko(fd, CD9660_SECTOR_SIZE * sector, SEEK_SET) == -1)
193
		err(1, "fseeko");
194
195
	while (t < size) {
196
		/* Read fixed data first */
197
		fread(&pttemp, 1, 8, fd);
198
		t += 8;
199
		/* Read variable */
200
		fread(((unsigned char*)&pttemp) + 8, 1, pttemp.length[0], fd);
201
		t += pttemp.length[0];
202
		debug_dump_to_xml_ptentry(&pttemp, n, mode);
203
		n++;
204
	}
205
206
}
207
208
/*
209
 * XML Debug output functions
210
 * Dump hierarchy of CD, as well as volume info, to XML
211
 * Can be used later to diff against a standard,
212
 * or just provide easy to read detailed debug output
213
 */
214
void
215
debug_dump_to_xml(FILE *fd)
216
{
217
	unsigned char buf[CD9660_SECTOR_SIZE];
218
	off_t sector;
219
	int t, t2;
220
	struct iso_primary_descriptor primaryVD;
221
	struct _boot_volume_descriptor bootVD;
222
223
	memset(&primaryVD, 0, sizeof(primaryVD));
224
	printf("<cd9660dump>\n");
225
226
	/* Display Volume Descriptors */
227
	sector = 16;
228
	do {
229
		if (fseeko(fd, CD9660_SECTOR_SIZE * sector, SEEK_SET) == -1)
230
			err(1, "fseeko");
231
		fread(buf, 1, CD9660_SECTOR_SIZE, fd);
232
		t = (int)((unsigned char)buf[0]);
233
		switch (t) {
234
		case 0:
235
			memcpy(&bootVD, buf, CD9660_SECTOR_SIZE);
236
			break;
237
		case 1:
238
			memcpy(&primaryVD, buf, CD9660_SECTOR_SIZE);
239
			break;
240
		}
241
		debug_dump_to_xml_volume_descriptor(buf, sector);
242
		sector++;
243
	} while (t != 255);
244
245
	t = debug_get_encoded_number((u_char *)primaryVD.type_l_path_table,
246
	    731);
247
	t2 = debug_get_encoded_number((u_char *)primaryVD.path_table_size, 733);
248
	printf("Path table 1 located at sector %i and is %i bytes long\n",
249
	    t,t2);
250
	debug_dump_to_xml_path_table(fd, t, t2, 721);
251
252
	t = debug_get_encoded_number((u_char *)primaryVD.type_m_path_table,
253
	    731);
254
	debug_dump_to_xml_path_table(fd, t, t2, 722);
255
256
	printf("</cd9660dump>\n");
257
}
258
259
static void
260
debug_dump_to_xml_padded_hex_output(const char *element, unsigned char *buf,
261
				    int len)
262
{
263
	int i;
264
	int t;
265
266
	printf("<%s>",element);
267
	for (i = 0; i < len; i++) {
268
		t = (unsigned char)buf[i];
269
		if (t >= 32 && t < 127)
270
			printf("%c",t);
271
	}
272
	printf("</%s>\n",element);
273
274
	printf("<%s:hex>",element);
275
	for (i = 0; i < len; i++) {
276
		t = (unsigned char)buf[i];
277
		printf(" %x",t);
278
	}
279
	printf("</%s:hex>\n",element);
280
}
281
282
int
283
debug_get_encoded_number(unsigned char* buf, int mode)
284
{
285
	switch (mode) {
286
	/* 711: Single bite */
287
	case 711:
288
		return isonum_711(buf);
289
290
	/* 712: Single signed byte */
291
	case 712:
292
		return isonum_712((signed char *)buf);
293
294
	/* 721: 16 bit LE */
295
	case 721:
296
		return isonum_721(buf);
297
298
	/* 731: 32 bit LE */
299
	case 731:
300
		return isonum_731(buf);
301
302
	/* 722: 16 bit BE */
303
	case 722:
304
		return isonum_722(buf);
305
306
	/* 732: 32 bit BE */
307
	case 732:
308
		return isonum_732(buf);
309
310
	/* 723: 16 bit bothE */
311
	case 723:
312
		return isonum_723(buf);
313
314
	/* 733: 32 bit bothE */
315
	case 733:
316
		return isonum_733(buf);
317
	}
318
	return 0;
319
}
320
321
void
322
debug_dump_integer(const char *element, char* buf, int mode)
323
{
324
	printf("<%s>%i</%s>\n", element,
325
	    debug_get_encoded_number((unsigned char *)buf, mode), element);
326
}
327
328
void
329
debug_dump_string(const char *element __unused, unsigned char *buf __unused, int len __unused)
330
{
331
332
}
333
334
void
335
debug_dump_directory_record_9_1(unsigned char* buf)
336
{
337
	printf("<directoryrecord>\n");
338
	debug_dump_integer("length",
339
	    ((struct iso_directory_record*) buf)->length, 711);
340
	debug_dump_integer("ext_attr_length",
341
	    ((struct iso_directory_record*) buf)->ext_attr_length,711);
342
	debug_dump_integer("extent",
343
	    (char *)((struct iso_directory_record*) buf)->extent, 733);
344
	debug_dump_integer("size",
345
	    (char *)((struct iso_directory_record*) buf)->size, 733);
346
	debug_dump_integer("flags",
347
	    ((struct iso_directory_record*) buf)->flags, 711);
348
	debug_dump_integer("file_unit_size",
349
	    ((struct iso_directory_record*) buf)->file_unit_size,711);
350
	debug_dump_integer("interleave",
351
	    ((struct iso_directory_record*) buf)->interleave, 711);
352
	debug_dump_integer("volume_sequence_number",
353
	    ((struct iso_directory_record*) buf)->volume_sequence_number,
354
	    723);
355
	debug_dump_integer("name_len",
356
	    ((struct iso_directory_record*) buf)->name_len, 711);
357
	debug_dump_to_xml_padded_hex_output("name",
358
	    (u_char *)((struct iso_directory_record*) buf)->name,
359
		debug_get_encoded_number((u_char *)
360
		    ((struct iso_directory_record*) buf)->length, 711));
361
	printf("</directoryrecord>\n");
362
}
363
364
365
void
366
debug_dump_to_xml_volume_descriptor(unsigned char* buf, int sector)
367
{
368
	printf("<volumedescriptor sector=\"%i\">\n", sector);
369
	printf("<vdtype>");
370
	switch(buf[0]) {
371
	case 0:
372
		printf("boot");
373
		break;
374
375
	case 1:
376
		printf("primary");
377
		break;
378
379
	case 2:
380
		printf("supplementary");
381
		break;
382
383
	case 3:
384
		printf("volume partition descriptor");
385
		break;
386
387
	case 255:
388
		printf("terminator");
389
		break;
390
	}
391
392
	printf("</vdtype>\n");
393
	switch(buf[0]) {
394
	case 1:
395
		debug_dump_integer("type",
396
		    ((struct iso_primary_descriptor*)buf)->type, 711);
397
		debug_dump_to_xml_padded_hex_output("id",
398
		    (u_char *)((struct iso_primary_descriptor*) buf)->id,
399
		    ISODCL (  2,   6));
400
		debug_dump_integer("version",
401
		    ((struct iso_primary_descriptor*)buf)->version,
402
		     711);
403
		debug_dump_to_xml_padded_hex_output("system_id",
404
		    (u_char *)((struct iso_primary_descriptor*)buf)->system_id,
405
		    ISODCL(9,40));
406
		debug_dump_to_xml_padded_hex_output("volume_id",
407
		    (u_char *)((struct iso_primary_descriptor*)buf)->volume_id,
408
		    ISODCL(41,72));
409
		debug_dump_integer("volume_space_size",
410
		    ((struct iso_primary_descriptor*)buf)->volume_space_size,
411
		    733);
412
		debug_dump_integer("volume_set_size",
413
		    ((struct iso_primary_descriptor*)buf)->volume_set_size,
414
			    733);
415
		debug_dump_integer("volume_sequence_number",
416
		    ((struct iso_primary_descriptor*)buf)->volume_sequence_number,
417
		    723);
418
		debug_dump_integer("logical_block_size",
419
		    ((struct iso_primary_descriptor*)buf)->logical_block_size,
420
			    723);
421
		debug_dump_integer("path_table_size",
422
		    ((struct iso_primary_descriptor*)buf)->path_table_size,
423
			    733);
424
		debug_dump_integer("type_l_path_table",
425
		    ((struct iso_primary_descriptor*)buf)->type_l_path_table,
426
		    731);
427
		debug_dump_integer("opt_type_l_path_table",
428
		    ((struct iso_primary_descriptor*)buf)->opt_type_l_path_table,
429
		    731);
430
		debug_dump_integer("type_m_path_table",
431
		    ((struct iso_primary_descriptor*)buf)->type_m_path_table,
432
		    732);
433
		debug_dump_integer("opt_type_m_path_table",
434
			((struct iso_primary_descriptor*)buf)->opt_type_m_path_table,732);
435
		debug_dump_directory_record_9_1(
436
		    (u_char *)((struct iso_primary_descriptor*)buf)->root_directory_record);
437
		debug_dump_to_xml_padded_hex_output("volume_set_id",
438
		    (u_char *)((struct iso_primary_descriptor*) buf)->volume_set_id,
439
		    ISODCL (191, 318));
440
		debug_dump_to_xml_padded_hex_output("publisher_id",
441
		    (u_char *)((struct iso_primary_descriptor*) buf)->publisher_id,
442
		    ISODCL (319, 446));
443
		debug_dump_to_xml_padded_hex_output("preparer_id",
444
		    (u_char *)((struct iso_primary_descriptor*) buf)->preparer_id,
445
		    ISODCL (447, 574));
446
		debug_dump_to_xml_padded_hex_output("application_id",
447
		    (u_char *)((struct iso_primary_descriptor*) buf)->application_id,
448
		    ISODCL (575, 702));
449
		debug_dump_to_xml_padded_hex_output("copyright_file_id",
450
		    (u_char *)((struct iso_primary_descriptor*) buf)->copyright_file_id,
451
		    ISODCL (703, 739));
452
		debug_dump_to_xml_padded_hex_output("abstract_file_id",
453
		    (u_char *)((struct iso_primary_descriptor*) buf)->abstract_file_id,
454
		    ISODCL (740, 776));
455
		debug_dump_to_xml_padded_hex_output("bibliographic_file_id",
456
		    (u_char *)((struct iso_primary_descriptor*) buf)->bibliographic_file_id,
457
		    ISODCL (777, 813));
458
459
		debug_dump_to_xml_padded_hex_output("creation_date",
460
		    (u_char *)((struct iso_primary_descriptor*) buf)->creation_date,
461
		    ISODCL (814, 830));
462
		debug_dump_to_xml_padded_hex_output("modification_date",
463
		    (u_char *)((struct iso_primary_descriptor*) buf)->modification_date,
464
		    ISODCL (831, 847));
465
		debug_dump_to_xml_padded_hex_output("expiration_date",
466
		    (u_char *)((struct iso_primary_descriptor*) buf)->expiration_date,
467
		    ISODCL (848, 864));
468
		debug_dump_to_xml_padded_hex_output("effective_date",
469
		    (u_char *)((struct iso_primary_descriptor*) buf)->effective_date,
470
		    ISODCL (865, 881));
471
472
		debug_dump_to_xml_padded_hex_output("file_structure_version",
473
		    (u_char *)((struct iso_primary_descriptor*) buf)->file_structure_version,
474
		    ISODCL(882,882));
475
		break;
476
	}
477
	printf("</volumedescriptor>\n");
478
}
479