DECLARE_MENU_CB(sun_menu_cb);
DECLARE_MENU_CB(geo_menu_cb);
DECLARE_MENU_CB(dos_menu_cb);
+DECLARE_MENU_CB(bsd_menu_cb);
/*
* Menu entry macros:
};
struct menu menu_bsd = {
-/* .callback = bsd_menu_cb,*/
+ .callback = bsd_menu_cb,
.label = FDISK_DISKLABEL_OSF,
.entries = {
MENU_SEP(N_("BSD")),
MENU_ENT('e', N_("edit drive data")),
MENU_ENT('i', N_("install bootstrap")),
MENU_ENT('s', N_("show complete disklabel")),
-#if !defined (__alpha__)
MENU_ENT('x', N_("link BSD partition to non-BSD partition")),
-#endif
{ 0, NULL }
}
};
return rc;
}
+/*
+ * This is fdisk frontend for BSD specific libfdisk functions that
+ * are not expported by generic libfdisk API.
+ */
+static int bsd_menu_cb(struct fdisk_context **cxt0,
+ const struct menu *menu __attribute__((__unused__)),
+ const struct menu_entry *ent)
+{
+ struct fdisk_context *cxt = *cxt0;
+ int rc = 0;
+
+ assert(cxt);
+ assert(ent);
+ assert(fdisk_is_disklabel(cxt, OSF));
+
+ DBG(FRONTEND, dbgprint("enter BSD menu"));
+
+ switch(ent->key) {
+ case 'e':
+ rc = fdisk_bsd_edit_disklabel(cxt);
+ break;
+ case 'i':
+ rc = fdisk_bsd_write_bootstrap(cxt);
+ break;
+ case 's':
+ xbsd_print_disklabel(cxt, 1);
+ break;
+ case 'x':
+ rc = fdisk_bsd_link_partition(cxt);
+ break;
+ }
+ return rc;
+}
+
/* C/H/S commands */
static int geo_menu_cb(struct fdisk_context **cxt0,
const struct menu *menu __attribute__((__unused__)),
static int xbsd_delete_part (struct fdisk_context *cxt, size_t partnum);
-static void xbsd_edit_disklabel (struct fdisk_context *cxt);
-static int xbsd_write_bootstrap (struct fdisk_context *cxt);
static void xbsd_change_fstype (struct fdisk_context *cxt);
static int xbsd_get_part_index (struct fdisk_context *cxt, int max, int *n);
static int xbsd_check_new_partition (struct fdisk_context *cxt, int *i);
#if !defined (__alpha__)
static int xbsd_translate_fstype (int linux_type);
-static void xbsd_link_part (struct fdisk_context *cxt);
#endif
return rc;
}
-
-void
-bsd_command_prompt (struct fdisk_context *cxt)
-{
-
- while (1) {
- char buf[16];
- int rc;
- size_t n;
-
- /*
- * BIG-FAT-TODO: don't use bsd_command_prompt(), just initialialize BSD
- * stuff by label probe() libfdisk function, and use standard fdisk.c
- * menu code.
- */
- putchar ('\n');
- rc = get_user_reply(cxt, _("BSD disklabel command (m for help): "),
- buf, sizeof(buf));
- if (rc)
- return;
-
- switch (tolower(buf[0])) {
- case 'e':
- xbsd_edit_disklabel (cxt);
- break;
- case 'i':
- xbsd_write_bootstrap (cxt);
- break;
- case 's':
- xbsd_print_disklabel (cxt, 1);
- break;
-#if !defined (__alpha__)
- case 'x':
- xbsd_link_part (cxt);
- break;
-#endif
- }
- }
-}
-
static int xbsd_delete_part(
struct fdisk_context *cxt,
size_t partnum)
return dflt;
}
-static void xbsd_edit_disklabel(struct fdisk_context *cxt)
+int fdisk_bsd_edit_disklabel(struct fdisk_context *cxt)
{
struct bsd_disklabel *d = self_disklabel(cxt);
uintmax_t res;
d->d_trkseek = ask_uint32(cxt, d->d_trkseek, _("track-to-track seek"));
d->d_secperunit = d->d_secpercyl * d->d_ncylinders;
+ return 0;
}
static int xbsd_get_bootstrap(struct fdisk_context *cxt,
return 0;
}
-static int xbsd_write_bootstrap (struct fdisk_context *cxt)
+int fdisk_bsd_write_bootstrap(struct fdisk_context *cxt)
{
struct bsd_disklabel dl, *d = self_disklabel(cxt);
struct fdisk_bsd_label *l = self_label(cxt);
return BSD_FS_OTHER;
}
}
+#endif
/*
* link partition from parent (DOS) to nested BSD partition table
*/
-static void
-xbsd_link_part (struct fdisk_context *cxt)
+int fdisk_bsd_link_partition(struct fdisk_context *cxt)
{
size_t k;
- int i;
+ int i, rc;
struct dos_partition *p;
struct bsd_disklabel *d = self_disklabel(cxt);
- if (!cxt->parent || !fdisk_is_disklabel(cxt->parent, DOS))
- return; /* not nested PT */
+ if (!cxt->parent || !fdisk_is_disklabel(cxt->parent, DOS)) {
+ fdisk_warnx(cxt, _("BSD label is not nested within a DOS partition"));
+ return -EINVAL;
+ }
- if (fdisk_ask_partnum(cxt->parent, &k, FALSE))
- return;
+ rc = fdisk_ask_partnum(cxt->parent, &k, FALSE);
+ if (rc)
+ return rc;
- if (xbsd_check_new_partition(cxt, &i))
- return;
+ rc = xbsd_check_new_partition(cxt, &i);
+ if (rc)
+ return rc;
/* TODO: what about to update label->dos_part? */
p = fdisk_dos_get_partition(cxt->parent, k);
d->d_partitions[i].p_size = dos_partition_get_size(p);
d->d_partitions[i].p_offset = dos_partition_get_start(p);
d->d_partitions[i].p_fstype = xbsd_translate_fstype(p->sys_ind);
+
+ return 0;
}
-#endif
#if defined (__alpha__)