1 /* $NetBSD: iso9660.c,v 1.2 2005/09/14 09:41:24 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
15 static void
printinfo(struct iso_primary_descriptor * vd)16 printinfo(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
37 int
check_primary_vd(int fd,int start,int len)38 check_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