Home | History | Annotate | Line # | Download | only in mscdlabel
iso9660.c revision 1.1
      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