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 15 static void 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 d = vd->creation_date; 22 memcpy(date, d, 4); /* year */ 23 memcpy(date + 5, d + 4, 2); /* month */ 24 memcpy(date + 8, d + 6, 2); /* day */ 25 memcpy(date + 11, d + 8, 2); /* hour */ 26 memcpy(date + 14, d + 10, 2); /* min */ 27 printf("ISO filesystem, label \"%s\", creation time: %s\n", 28 label, date); 29 } 30 31 int 32 check_primary_vd(int fd, int start, int len) 33 { 34 int i, res, isiso; 35 struct iso_primary_descriptor *vd; 36 37 isiso = 0; 38 vd = malloc(BLKSIZ); 39 40 for (i = 16; (i < 100) && (i < len); i++) { 41 res = pread(fd, vd, BLKSIZ, (start + i) * BLKSIZ); 42 if (res < 0) { 43 warn("read CD sector %d", start + i); 44 break; 45 } 46 47 if (memcmp(vd->id, ISO_STANDARD_ID, sizeof(vd->id))) 48 continue; 49 if (isonum_711(vd->type) == ISO_VD_PRIMARY) { 50 printinfo(vd); 51 isiso = 1; 52 break; 53 } else if (isonum_711(vd->type) == ISO_VD_END) 54 break; 55 } 56 57 free(vd); 58 return (isiso); 59 } 60