This shows how the partitioning information can be extracted in user-mode (running under Unix). In the kernel, it would likely be necessary to pass a driver_info structure to a device-specific read function. In this case, driver_info is simply a filename string.
/* This is the testing program for the partitioning code. */ #include <oskit/diskpart/diskpart.h> #include <stdio.h> #include <fcntl.h> #define FILENAME "/dev/sd0c" /* We pass in a fixed-size table; this defines how big we want it. */ #define MAX_PARTS 30 diskpart_t part_array[MAX_PARTS]; /* * In this case, we are defining the disk size to be 10000 sectors. * Normally, this would be the number of physical sectors on the * disk. If the `disk' is a `file', it would be better to get the * equivalent number of sectors from the file size. * This is only used to fill in the whole-drive partition entry. */ #define DISK_SIZE 10000 /* * This is the function pointer I pass to the partition code * to read sectors on the drive. */ int my_read_fun(void *driver_info, int sector, char *buf); int main(int argc, char *argv[]) { int numparts; char *filename; if (argc == 2) filename = argv[1]; else filename = FILENAME; /* call the partition code */ numparts = diskpart_get_partition(filename, my_read_fun, part_array, MAX_PARTS, DISK_SIZE); printf("%d partitions found\n",numparts); /* diskpart_dump(part_array, 0); */ } static int my_read_fun(void *driver_info, int sector, char *buf) { char *filename = driver_info; int fd = open(filename, O_RDONLY, 0775); lseek(fd, SECTOR_SIZE * sector, SEEK_SET); read(fd, buf, SECTOR_SIZE); close(fd); /* Should bzero the result if read error occurs */ return(0); }