1/* $NetBSD: iso9660.c,v 1.1 2004/07/04 14:11:44 drochner Exp $ */
2
3#include <sys/types.h>
4#include <stdlib.h>
5#include <unistd.h>
6#include <string.h>
7#include <stdio.h>
8#include <err.h>
9#include <isofs/cd9660/iso.h>
10
11#include "mscdlabel.h"
12
13#define BLKSIZ ISO_DEFAULT_BLOCK_SIZE
14
15static void
16printinfo(struct iso_primary_descriptor *vd)
17{
18	char label[32 + 1], date[] = "yyyy/mm/dd hh:mm", *d;
19
20	strlcpy(label, vd->volume_id, sizeof(label));
21	/* strip trailing blanks */
22	d = label + strlen(label);
23	while (d > label && *(d - 1) == ' ')
24		d--;
25	*d = '\0';
26
27	d = vd->creation_date;
28	memcpy(date, d, 4); /* year */
29	memcpy(date + 5, d + 4, 2); /* month */
30	memcpy(date + 8, d + 6, 2); /* day */
31	memcpy(date + 11, d + 8, 2); /* hour */
32	memcpy(date + 14, d + 10, 2); /* min */
33	printf("ISO filesystem, label \"%s\", creation time: %s\n",
34	       label, date);
35}
36
37int
38check_primary_vd(int fd, int start, int len)
39{
40	int i, res, isiso;
41	struct iso_primary_descriptor *vd;
42
43	isiso = 0;
44	vd = malloc(BLKSIZ);
45
46	for (i = 16; (i < 100) && (i < len); i++) {
47		res = pread(fd, vd, BLKSIZ, (start + i) * BLKSIZ);
48		if (res < 0) {
49			warn("read CD sector %d", start + i);
50			break;
51		}
52
53		if (memcmp(vd->id, ISO_STANDARD_ID, sizeof(vd->id)))
54			continue;
55		if (isonum_711(vd->type) == ISO_VD_PRIMARY) {
56			printinfo(vd);
57			isiso = 1;
58			break;
59		} else if (isonum_711(vd->type) == ISO_VD_END)
60			break;
61	}
62
63	free(vd);
64	return (isiso);
65}
66