/* * hook called before writing new disklabel. */ int md_pre_disklabel(void) { char diskpath[MAXPATHLEN]; if (clear_mbr(pm->diskdev, diskpath, sizeof(diskpath)) == -1) { msg_display(MSG_badclearmbr, diskpath); process_menu(MENU_ok, NULL); } return 0; }
int main(int argc, char *argv[]) { int rc; int cmd; int done = 0; // Check arguments if (argc == 1) { devname = "/dev/hd0"; } else if (argc == 2) { devname = argv[1]; } else { printf("usage: fdisk <device>\n"); return 1; } // Open device hdev = open(devname, O_RDWR | O_BINARY); if (hdev < 0) { printf("%s: error %d opening device\n", devname, errno); return 1; } // Get disk geometry rc = ioctl(hdev, IOCTL_GETGEOMETRY, &geom , sizeof(struct geometry)); if (rc < 0) { printf("%s: error %d determining disk geometry\n", devname, errno); close(hdev); return 1; } // Read master boot record rc = read_mbr(); if (rc < 0 && errno != EINVAL) { printf("%s: error %d reading master boot record\n", devname, errno); close(hdev); return 1; } // Ask to create new master boot record if the existing is invalid if (rc < 0 && errno == EINVAL) { printf("%s: invalid master boot record\n", devname); if (ask("create new master boot record (y/n)? ", "yn") == 'y') { memcpy(&mbr, bootrecord, sizeof(mbr)); } } // Read commands printf("(a)dd (b)oot (c)ommit (d)elete (l)ist (m)br (h)elp e(x)it\n"); while (!done) { cmd = ask("fdisk> ", "abcdlmhx?"); switch (cmd) { case 'a': add_partition(); break; case 'b': set_boot_part(); break; case 'c': commit_mbr(); break; case 'd': delete_partition(); break; case 'l': list_partitions(); break; case 'm': clear_mbr(); break; case 'h': case '?': help(); break; case 'x': done = 1; break; } } // Close device close(hdev); return 0; }