#include <fcntl.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
#include <stdio.h>

main(int argc, char *argv[]) {
	int i, j, fd;
	char device[32]; 
	unsigned int flag, bc, bh, bs, sysid, ec, eh, es, start, size;
	unsigned char buf[512], *mbr = buf, *pt = buf + 446, *p;
	
	if(argc == 1) {
		strncpy(device, "/dev/ad0", 9);
	} else if(argc == 2) {
		strncpy(device, argv[1], 31);
		device[31] = '\0';
	} else {
		printf("usage: showdisk <device>\n");
		exit();
	}

	if((fd = open(device, O_RDONLY)) == -1) {
		printf("cannot open %s\n", device);
		exit();
	}

	read(fd, buf, 512);
	close(fd);

	printf("--- begin mbr ---\n");
	for(i = 0; i < 446; i++) {
		printf("%02x ", buf[i]);
		if( i % 16 == 15) {
			printf("\n");
		}
	}
	printf("\n--- end mbr ---\n\n");

	printf("--- begin patition table ---\n");
	for(i = 0; i < 4; i++) {
		printf("²Ä %d ­Ó¤À³Î°Ï : ", i + 1);
		p = pt + 16 * i;
		for(j = 0; j < 16; j++) {
			printf("%02x ", p[j]);
		}
		printf("\n");

		flag = p[0];
		
		bc = ((p[2] & 192) << 2) | p[3];
		bh = p[1];
		bs = p[2] & 63;
		
		sysid = p[4];

		ec = ((p[6] & 192) << 2) | p[7];
		eh = p[5];
		es = p[6] & 63;

		start = *(unsigned int *)(p + 8);
		size = *(unsigned int *)(p + 12);
		
		if(size == 0) {
			printf("<UNUSED>\n\n");
			continue;
		}

		printf("sysid: %u\n", sysid);
		printf("start: %u, size: %u (%u MB), flag: %x%s\n", start, size, size * 512 / 1048576, flag, flag == 0x80 ? " (active)" : "");
		printf("begin: cyl %u, head %u, sector %u\n", bc, bh, bs);
		printf("end: cyl %u, head %u, sector %u\n", ec, eh, es);
		printf("\n");
	}
	printf("--- end patition table ---\n");
}

