fix_partition_table_order();
break;
case 'g':
- create_sgilabel(cxt);
+ fdisk_create_disklabel(cxt, "sgi");
break;
case 'h':
user_heads = cxt->geom.heads = read_int(cxt, 1, cxt->geom.heads, 256, 0,
new_partition(cxt);
break;
case 'o':
- create_doslabel(cxt);
+ fdisk_create_disklabel(cxt, "dos");
break;
case 'p':
list_table(cxt, 0);
case 'q':
handle_quit(cxt);
case 's':
- create_sunlabel(cxt);
+ fdisk_create_disklabel(cxt, "sun");
break;
case 't':
change_sysid(cxt);
if (!fdisk_dev_has_disklabel(cxt)) {
fprintf(stderr,
_("Device does not contain a recognized partition table\n"));
- fdisk_create_default_disklabel(cxt);
+ fdisk_create_disklabel(cxt, NULL);
}
command_prompt(cxt);
int (*write)(struct fdisk_context *cxt);
/* verify the partition table */
int (*verify)(struct fdisk_context *cxt);
+ /* create new disk label */
+ int (*create)(struct fdisk_context *cxt);
/* new partition */
void (*part_add)(struct fdisk_context *cxt, int partnum, int parttype);
/* delete partition */
extern int fdisk_context_set_user_geometry(struct fdisk_context *cxt,
unsigned int cylinders, unsigned int heads,
unsigned int sectors);
-extern int fdisk_create_default_disklabel(struct fdisk_context *cxt);
extern int fdisk_delete_partition(struct fdisk_context *cxt, int partnum);
extern int fdisk_add_partition(struct fdisk_context *cxt, int partnum, int parttype);
extern int fdisk_write_disklabel(struct fdisk_context *cxt);
extern int fdisk_verify_disklabel(struct fdisk_context *cxt);
+extern int fdisk_create_disklabel(struct fdisk_context *cxt, const char *name);
/* prototypes for fdisk.c */
extern char *disk_device, *line_ptr;
.probe = aix_probe_label,
.write = NULL,
.verify = NULL,
+ .create = NULL,
.part_add = aix_add_partition,
.part_delete = NULL,
};
#include "fdiskbsdlabel.h"
static void xbsd_delete_part (struct fdisk_context *cxt, int partnum);
-static int xbsd_create_disklabel (struct fdisk_context *cxt);
static void xbsd_edit_disklabel (void);
static void xbsd_write_bootstrap (struct fdisk_context *cxt);
static void xbsd_change_fstype (void);
xbsd_dlabel.d_partitions[i].p_fstype = BSD_FS_UNUSED;
}
+static int xbsd_create_disklabel (struct fdisk_context *cxt)
+{
+ char c;
+
+#if defined (__alpha__)
+ fprintf (stderr, _("%s contains no disklabel.\n"), cxt->dev_path);
+#else
+ fprintf (stderr, _("%s contains no disklabel.\n"),
+ partname(cxt->dev_path, xbsd_part_index+1, 0));
+#endif
+
+ while (1) {
+ c = read_char (_("Do you want to create a disklabel? (y/n) "));
+ if (tolower(c) == 'y') {
+ if (xbsd_initlabel (cxt,
+#if defined (__alpha__) || defined (__powerpc__) || defined (__hppa__) || \
+ defined (__s390__) || defined (__s390x__)
+ NULL, &xbsd_dlabel, 0
+#else
+ xbsd_part, &xbsd_dlabel, xbsd_part_index
+#endif
+ ) == 1) {
+ xbsd_print_disklabel (cxt, 1);
+ return 1;
+ } else
+ return 0;
+ } else if (c == 'n')
+ return 0;
+ }
+}
+
void
bsd_command_prompt (struct fdisk_context *cxt)
{
}
}
-static int
-xbsd_create_disklabel (struct fdisk_context *cxt) {
- char c;
-
-#if defined (__alpha__)
- fprintf (stderr, _("%s contains no disklabel.\n"), cxt->dev_path);
-#else
- fprintf (stderr, _("%s contains no disklabel.\n"),
- partname(cxt->dev_path, xbsd_part_index+1, 0));
-#endif
-
- while (1) {
- c = read_char (_("Do you want to create a disklabel? (y/n) "));
- if (tolower(c) == 'y') {
- if (xbsd_initlabel (cxt,
-#if defined (__alpha__) || defined (__powerpc__) || defined (__hppa__) || \
- defined (__s390__) || defined (__s390x__)
- NULL, &xbsd_dlabel, 0
-#else
- xbsd_part, &xbsd_dlabel, xbsd_part_index
-#endif
- ) == 1) {
- xbsd_print_disklabel (cxt, 1);
- return 1;
- } else
- return 0;
- } else if (c == 'n')
- return 0;
- }
-}
-
static int
edit_int (int def, char *mesg)
{
.probe = osf_probe_label,
.write = xbsd_write_disklabel,
.verify = NULL,
+ .create = xbsd_create_disklabel,
.part_add = xbsd_add_part,
.part_delete = xbsd_delete_part,
};
printf(_("Disk identifier: 0x%08x\n"), mbr_get_id(cxt->firstsector));
}
-int create_doslabel(struct fdisk_context *cxt)
+static int dos_create_disklabel(struct fdisk_context *cxt)
{
unsigned int id;
.probe = dos_probe_label,
.write = dos_write_disklabel,
.verify = dos_verify_disklabel,
+ .create = dos_create_disklabel,
.part_add = dos_add_partition,
.part_delete = dos_delete_partition,
};
return pe->offset + get_start_sect(pe->part_table);
}
-extern int create_doslabel(struct fdisk_context *cxt);
extern void dos_print_mbr_id(struct fdisk_context *cxt);
extern void dos_set_mbr_id(struct fdisk_context *cxt);
extern int is_dos_partition(int t);
.probe = mac_probe_label,
.write = NULL,
.verify = NULL,
+ .create = NULL,
.part_add = mac_add_partition,
.part_delete = NULL,
};
sgi_set_partition(cxt, n, first, last-first, sys);
}
-void
-create_sgilabel(struct fdisk_context *cxt)
+static int sgi_create_disklabel(struct fdisk_context *cxt)
{
struct hd_geometry geometry;
struct {
.probe = sgi_probe_label,
.write = sgi_write_disklabel,
.verify = sgi_verify_disklabel,
+ .create = sgi_create_disklabel,
.part_add = sgi_add_partition,
.part_delete = sgi_delete_partition,
};
extern unsigned int sgi_get_start_sector(struct fdisk_context *cxt, int i );
extern unsigned int sgi_get_num_sectors(struct fdisk_context *cxt, int i );
extern int sgi_get_sysid(struct fdisk_context *cxt, int i );
-extern void create_sgilabel( struct fdisk_context *cxt );
extern void create_sgiinfo(struct fdisk_context *cxt);
extern void sgi_set_ilfact( void );
extern void sgi_set_rspeed( void );
return 1;
}
-int create_sunlabel(struct fdisk_context *cxt)
+static int sun_create_disklabel(struct fdisk_context *cxt)
{
struct hd_geometry geometry;
sector_t llsectors, llcyls;
.probe = sun_probe_label,
.write = sun_write_disklabel,
.verify = sun_verify_disklabel,
+ .create = sun_create_disklabel,
.part_add = sun_add_partition,
.part_delete = sun_delete_partition,
};
/* fdisksunlabel.c */
extern struct systypes sun_sys_types[];
-extern int create_sunlabel(struct fdisk_context *cxt);
extern int sun_change_sysid(struct fdisk_context *cxt, int i, uint16_t sys);
extern void sun_list_table(struct fdisk_context *cxt, int xtra);
extern void sun_set_alt_cyl(struct fdisk_context *cxt);
}
/**
- * fdisk_create_default_disklabel:
+ * fdisk_create_disklabel:
* @cxt: fdisk context
+ * @name: label name
*
- * Creates (in memory) disk label which is usual default for the system. For
- * example sun label on sparcs, gpt on UEFI machines (TODO), DOS on another
- * machines, ...etc.
+ * Creates a new disk label of type @name. If @name is NULL, then it
+ * will create a default system label type, either SUN or DOS.
*
- * Returns: 0 on sucess, < 0 on error.
+ * Returns 0 on success, otherwise, a corresponding error.
*/
-int fdisk_create_default_disklabel(struct fdisk_context *cxt)
+int fdisk_create_disklabel(struct fdisk_context *cxt, const char *name)
{
if (!cxt)
return -EINVAL;
- /* TODO: use fdisk_create_disklabel() */
-#ifdef __sparc__
- cxt->label = &sun_label;
- return create_sunlabel(cxt);
+ cxt->label = NULL;
+ if (!name) { /* use default label creation */
+#ifdef __sparc__
+ cxt->label = &sun_label;
#else
- cxt->label = &dos_label;
- return create_doslabel(cxt);
+ cxt->label = &dos_label;
#endif
+ } else {
+ size_t i;
+
+ for (i = 0; i < ARRAY_SIZE(labels); i++) {
+ if (strcmp(name, labels[i]->name) != 0)
+ continue;
+
+ cxt->label = labels[i];
+ DBG(LABEL, dbgprint("changing to %s label\n", cxt->label->name));
+ break;
+ }
+ }
+
+ if (!cxt->label)
+ return -EINVAL;
+
+ return cxt->label->create(cxt);
}
/**