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);
}