Files
oldlinux-files/bin-src/fdisk.c
2024-02-19 00:21:55 -05:00

111 lines
2.3 KiB
C

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <linux/hdreg.h>
#define DISK_STRING "/dev/hd"
static int current_minor;
static int indent;
char * disk_type(unsigned char type)
{
switch (type) {
case 1: return "12-bit DOS";
case 4: return "16-bit DOS (<32M)";
case 5: return "extended partition (don't use)";
case 6: return "16-bit DOS (>=32M)";
case 0x81: return "minix";
}
return NULL;
}
char * dev_name(int minor)
{
char * ctl;
static char name[100];
if (minor & 0x3f)
ctl = "%s%c%d";
else
ctl = "%s%c";
sprintf(name,ctl,DISK_STRING,'a'+(minor >> 6),minor & 0x3f);
return name;
}
void fdisk(int minor)
{
char * type, * name;
char buffer[1024];
struct partition * p;
int fd;
int i;
int this_minor = current_minor;
if ((fd=open(name = dev_name(minor),O_RDONLY)) < 0) {
fprintf(stderr,"Unable to open %s\n",name);
exit(1);
}
if (1024 != read(fd,buffer,1024))
return;
if (!(minor & 0x3f)) {
printf("Disk %d:\n", minor >> 6);
indent = 4;
}
p = (struct partition *) (buffer + 0x1be);
for (i=0 ; i<4 ; p++,i++) {
if (!p->nr_sects)
continue;
printf("%*c",indent,' ');
printf("%s: %6d blocks",dev_name(this_minor+i),p->nr_sects>>1);
if (p->boot_ind == 0x80)
printf(" active");
else if (p->boot_ind)
printf(" active? (%02x)",p->boot_ind);
if (type = disk_type(p->sys_ind))
printf(" %s\n",type);
else
printf(" unknown partition type 0x%02X\n",p->sys_ind);
if (p->sys_ind == 5 && (0x3f & current_minor) < 60) {
indent += 4;
current_minor += 4;
fdisk(this_minor+i);
indent -= 4;
}
}
/* check for disk-manager partitions */
if (*(unsigned short *) (buffer + 0xfc) != 0x55AA)
return;
p = (struct partition *) (buffer + 0x1be);
for (i=4; i<16; i++) {
p--;
if ((current_minor & 0x3f) >= 60)
break;
if (!p->nr_sects)
continue;
printf("%*c",indent,' ');
printf("%s: %6d blocks disk-manager",dev_name(current_minor),p->nr_sects>>1);
if (p->boot_ind == 0x80)
printf(" active");
else if (p->boot_ind)
printf(" active? (%02x)",p->boot_ind);
if (type = disk_type(p->sys_ind))
printf(" %s\n",type);
else
printf(" unknown partition type 0x%02X\n",p->sys_ind);
current_minor++;
}
}
int main(int argc, char ** argv)
{
current_minor = 1;
fdisk(0);
current_minor = 65;
fdisk(64);
return 0;
}