Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

/* $NetBSD: iso9660.c,v 1.2 2005/09/14 09:41:24 drochner Exp $ */

#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <err.h>
#include <isofs/cd9660/iso.h>

#include "mscdlabel.h"

#define BLKSIZ ISO_DEFAULT_BLOCK_SIZE

static void
printinfo(struct iso_primary_descriptor *vd)
{
	char label[32 + 1], date[] = "yyyy/mm/dd hh:mm", *d;

	strlcpy(label, vd->volume_id, sizeof(label));
	/* strip trailing blanks */
	d = label + strlen(label);
	while (d > label && *(d - 1) == ' ')
		d--;
	*d = '\0';

	d = vd->creation_date;
	memcpy(date, d, 4); /* year */
	memcpy(date + 5, d + 4, 2); /* month */
	memcpy(date + 8, d + 6, 2); /* day */
	memcpy(date + 11, d + 8, 2); /* hour */
	memcpy(date + 14, d + 10, 2); /* min */
	printf("ISO filesystem, label \"%s\", creation time: %s\n",
	       label, date);
}

int
check_primary_vd(int fd, int start, int len)
{
	int i, res, isiso;
	struct iso_primary_descriptor *vd;

	isiso = 0;
	vd = malloc(BLKSIZ);

	for (i = 16; (i < 100) && (i < len); i++) {
		res = pread(fd, vd, BLKSIZ, (start + i) * BLKSIZ);
		if (res < 0) {
			warn("read CD sector %d", start + i);
			break;
		}

		if (memcmp(vd->id, ISO_STANDARD_ID, sizeof(vd->id)))
			continue;
		if (isonum_711(vd->type) == ISO_VD_PRIMARY) {
			printinfo(vd);
			isiso = 1;
			break;
		} else if (isonum_711(vd->type) == ISO_VD_END)
			break;
	}

	free(vd);
	return (isiso);
}