return;
}
-static int aix_probe_label(struct fdisk_context *cxt)
+static int aix_probe_label(
+ struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
struct aix_partition *aixlabel = (struct aix_partition *) cxt->firstsector;
static int aix_add_partition(
struct fdisk_context *cxt __attribute__((__unused__)),
+ struct fdisk_label *lb __attribute__((__unused__)),
int partnum __attribute__((__unused__)),
struct fdisk_parttype *t __attribute__((__unused__)))
{
};
-static int xbsd_delete_part (struct fdisk_context *cxt, int partnum);
+static int xbsd_delete_part (struct fdisk_context *cxt,
+ struct fdisk_label *lb, int partnum);
static void xbsd_edit_disklabel (void);
static void xbsd_write_bootstrap (struct fdisk_context *cxt);
-static void xbsd_change_fstype (struct fdisk_context *cxt);
+static void xbsd_change_fstype (struct fdisk_context *cxt, struct fdisk_label *lb);
static int xbsd_get_part_index (int max);
static int xbsd_check_new_partition (int *i);
static unsigned short xbsd_dkcksum (struct xbsd_disklabel *lp);
* so this does not mean that there is a BSD disk label.
*/
static int
-osf_probe_label(struct fdisk_context *cxt) {
+osf_probe_label(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
+{
if (xbsd_readlabel (cxt, NULL, &xbsd_dlabel) == 0)
return 0;
return 1;
}
#endif
-static int xbsd_write_disklabel (struct fdisk_context *cxt)
+static int xbsd_write_disklabel (struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
#if defined (__alpha__)
printf (_("Writing disklabel to %s.\n"), cxt->dev_path);
}
static int xbsd_add_part (struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)),
int partnum __attribute__((__unused__)),
struct fdisk_parttype *t __attribute__((__unused__)))
{
return 0;
}
-static int xbsd_create_disklabel (struct fdisk_context *cxt)
+static int xbsd_create_disklabel (struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
char c;
printf (_("Reading disklabel of %s at sector %d.\n"),
partname(cxt->dev_path, t+1, 0), ss + BSD_LABELSECTOR);
if (xbsd_readlabel (cxt, xbsd_part, &xbsd_dlabel) == 0)
- if (xbsd_create_disklabel (cxt) == 0)
+ if (xbsd_create_disklabel (cxt, cxt->label) == 0)
return;
break;
}
putchar ('\n');
switch (tolower (read_char (_("BSD disklabel command (m for help): ")))) {
case 'd':
- xbsd_delete_part(cxt, xbsd_get_part_index(xbsd_dlabel.d_npartitions));
+ xbsd_delete_part(cxt, cxt->label, xbsd_get_part_index(xbsd_dlabel.d_npartitions));
break;
case 'e':
xbsd_edit_disklabel ();
list_partition_types (cxt);
break;
case 'n':
- xbsd_add_part (cxt, 0, 0);
+ xbsd_add_part (cxt, cxt->label, 0, 0);
break;
case 'p':
xbsd_print_disklabel (cxt, 0);
xbsd_print_disklabel (cxt, 1);
break;
case 't':
- xbsd_change_fstype (cxt);
+ xbsd_change_fstype (cxt, cxt->label);
break;
case 'u':
change_units(cxt);
break;
case 'w':
- xbsd_write_disklabel (cxt);
+ xbsd_write_disklabel (cxt, cxt->label);
break;
#if !defined (__alpha__)
case 'x':
}
}
-static int xbsd_delete_part(struct fdisk_context *cxt __attribute__((__unused__)),
- int partnum)
+static int xbsd_delete_part(
+ struct fdisk_context *cxt __attribute__((__unused__)),
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int partnum)
{
xbsd_dlabel.d_partitions[partnum].p_size = 0;
xbsd_dlabel.d_partitions[partnum].p_offset = 0;
/* TODO: remove this, use regular change_partition_type() in fdisk.c */
static void
-xbsd_change_fstype (struct fdisk_context *cxt)
+xbsd_change_fstype (
+ struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
int i;
struct fdisk_parttype *t;
}
#endif /* __alpha__ */
-static struct fdisk_parttype *xbsd_get_parttype(struct fdisk_context *cxt, int n)
+static struct fdisk_parttype *xbsd_get_parttype(
+ struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int n)
{
struct fdisk_parttype *t;
return t;
}
-static int xbsd_set_parttype(struct fdisk_context *cxt, int partnum,
- struct fdisk_parttype *t)
+static int xbsd_set_parttype(
+ struct fdisk_context *cxt __attribute__((__unused__)),
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int partnum,
+ struct fdisk_parttype *t)
{
struct xbsd_partition *p;
static int dos_delete_partition(
struct fdisk_context *cxt __attribute__ ((__unused__)),
+ struct fdisk_label *lb __attribute__ ((__unused__)),
int partnum)
{
struct pte *pe = &ptes[partnum];
if (!get_nr_sects(pe->part_table) &&
(partitions > 5 || ptes[4].part_table->sys_ind)) {
printf(_("omitting empty partition (%d)\n"), i+1);
- dos_delete_partition(cxt, i);
+ dos_delete_partition(cxt, cxt->label, i);
goto remove; /* numbering changed */
}
}
printf(_("Disk identifier: 0x%08x\n"), mbr_get_id(cxt->firstsector));
}
-static int dos_create_disklabel(struct fdisk_context *cxt)
+static int dos_create_disklabel(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
unsigned int id;
DBG(CONTEXT, dbgprint("DOS PT geometry: heads=%u, sectors=%u", *ph, *ps));
}
-static int dos_reset_alignment(struct fdisk_context *cxt)
+static int dos_reset_alignment(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
/* overwrite necessary stuff by DOS deprecated stuff */
if (is_dos_compatible(cxt)) {
return 0;
}
-static int dos_probe_label(struct fdisk_context *cxt)
+static int dos_probe_label(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
int i;
unsigned int h = 0, s = 0;
return add_partition(cxt, partitions - 1, NULL);
}
-static int dos_verify_disklabel(struct fdisk_context *cxt)
+static int dos_verify_disklabel(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
int i, j;
sector_t total = 1, n_sectors = cxt->total_sectors;
*/
static int dos_add_partition(
struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)),
int partnum __attribute__ ((__unused__)),
struct fdisk_parttype *t)
{
return 0;
}
-static int dos_write_disklabel(struct fdisk_context *cxt)
+static int dos_write_disklabel(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
int i, rc = 0;
return rc;
}
-static struct fdisk_parttype *dos_get_parttype(struct fdisk_context *cxt, int partnum)
+static struct fdisk_parttype *dos_get_parttype(
+ struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int partnum)
{
struct fdisk_parttype *t;
struct partition *p;
return t;
}
-static int dos_set_parttype(struct fdisk_context *cxt, int partnum,
- struct fdisk_parttype *t)
+static int dos_set_parttype(
+ struct fdisk_context *cxt __attribute__((__unused__)),
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int partnum,
+ struct fdisk_parttype *t)
{
struct partition *p;
}
static int
-mac_probe_label(struct fdisk_context *cxt)
+mac_probe_label(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
struct mac_partition *maclabel = (struct mac_partition *) cxt->firstsector;
}
static int mac_add_partition(
- struct fdisk_context *cxt __attribute__ ((__unused__)),
- int partnum __attribute__ ((__unused__)),
- struct fdisk_parttype *t __attribute__ ((__unused__)))
+ struct fdisk_context *cxt __attribute__ ((__unused__)),
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int partnum __attribute__ ((__unused__)),
+ struct fdisk_parttype *t __attribute__ ((__unused__)))
{
printf(_("\tSorry - this fdisk cannot handle Mac disk labels."
"\n\tIf you want to add DOS-type partitions, create"
}
static int
-sgi_probe_label(struct fdisk_context *cxt) {
+sgi_probe_label(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
+{
if (sizeof(sgilabel) > 512) {
fprintf(stderr,
_("According to MIPS Computer Systems, Inc the "
}
-static int sgi_write_disklabel(struct fdisk_context *cxt)
+static int sgi_write_disklabel(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
sgiinfo *info = NULL;
}
}
-static int sgi_verify_disklabel(struct fdisk_context *cxt)
+static int sgi_verify_disklabel(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
int Index[16]; /* list of valid partitions */
int sortcount = 0; /* number of used partitions, i.e. non-zero lengths */
* < 0 : there is an overlap
* > 0 : there is still some vacant space
*/
- return sgi_verify_disklabel(cxt);
+ return sgi_verify_disklabel(cxt, cxt->label);
}
}
}
-static int sgi_delete_partition(struct fdisk_context *cxt, int partnum)
+static int sgi_delete_partition(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int partnum)
{
return sgi_set_partition(cxt, partnum, 0, 0, 0);
}
-static int sgi_add_partition(struct fdisk_context *cxt, int n,
- struct fdisk_parttype *t)
+static int sgi_add_partition(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int n,
+ struct fdisk_parttype *t)
{
char mesg[256];
unsigned int first=0, last=0;
return 0;
}
-static int sgi_create_disklabel(struct fdisk_context *cxt)
+static int sgi_create_disklabel(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
struct hd_geometry geometry;
struct {
return info;
}
-static struct fdisk_parttype *sgi_get_parttype(struct fdisk_context *cxt, int n)
+static struct fdisk_parttype *sgi_get_parttype(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int n)
{
struct fdisk_parttype *t;
return t;
}
-static int sgi_set_parttype(struct fdisk_context *cxt, int i,
- struct fdisk_parttype *t)
+static int sgi_set_parttype(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int i,
+ struct fdisk_parttype *t)
{
if (i >= partitions || !t || t->type > UINT32_MAX)
return -EINVAL;
partitions = SUN_NUM_PARTITIONS;
}
-static int sun_probe_label(struct fdisk_context *cxt)
+static int sun_probe_label(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
unsigned short *ush;
int csum;
return 1;
}
-static int sun_create_disklabel(struct fdisk_context *cxt)
+static int sun_create_disklabel(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
struct hd_geometry geometry;
sector_t llsectors, llcyls;
return -1;
}
-static int sun_verify_disklabel(struct fdisk_context *cxt)
+static int sun_verify_disklabel(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
uint32_t starts[SUN_NUM_PARTITIONS], lens[SUN_NUM_PARTITIONS], start, stop;
uint32_t i,j,k,starto,endo;
return 0;
}
-static int sun_add_partition(struct fdisk_context *cxt, int n,
- struct fdisk_parttype *t)
+static int sun_add_partition(
+ struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int n,
+ struct fdisk_parttype *t)
{
uint32_t starts[SUN_NUM_PARTITIONS], lens[SUN_NUM_PARTITIONS];
struct sun_partition *part = &sunlabel->partitions[n];
return 0;
}
-static int sun_delete_partition(struct fdisk_context *cxt, int partnum)
+static int sun_delete_partition(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int partnum)
{
struct sun_partition *part = &sunlabel->partitions[partnum];
struct sun_tag_flag *tag = &sunlabel->part_tags[partnum];
_("Number of physical cylinders")));
}
-static int sun_write_disklabel(struct fdisk_context *cxt)
+static int sun_write_disklabel(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
unsigned short *ush = (unsigned short *)sunlabel;
unsigned short csum = 0;
return 0;
}
-static struct fdisk_parttype *sun_get_parttype(struct fdisk_context *cxt, int n)
+static struct fdisk_parttype *sun_get_parttype(
+ struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int n)
{
struct fdisk_parttype *t;
return t;
}
-static int sun_set_parttype(struct fdisk_context *cxt, int i,
- struct fdisk_parttype *t)
+static int sun_set_parttype(
+ struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int i,
+ struct fdisk_parttype *t)
{
struct sun_partition *part;
struct sun_tag_flag *tag;
}
-static int sun_reset_alignment(struct fdisk_context *cxt)
+static int sun_reset_alignment(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
/* this is shared with DOS ... */
update_units(cxt);
}
-static int gpt_probe_label(struct fdisk_context *cxt)
+static int gpt_probe_label(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
int mbr_type;
* Returns 0 if successful write, otherwise, a corresponding error.
* Any indication of error will abort the operation.
*/
-static int gpt_write_disklabel(struct fdisk_context *cxt)
+static int gpt_write_disklabel(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
if (!cxt)
goto err0;
* - primary and backup header validations
* - paritition validations
*/
-static int gpt_verify_disklabel(struct fdisk_context *cxt)
+static int gpt_verify_disklabel(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
int nerror = 0, ptnum;
}
/* Delete a single GPT partition, specified by partnum. */
-static int gpt_delete_partition(struct fdisk_context *cxt, int partnum)
+static int gpt_delete_partition(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int partnum)
{
if (!cxt || partition_unused(&ents[partnum]) || partnum < 0)
return -EINVAL;
}
/* Performs logical checks to add a new partition entry */
-static int gpt_add_partition(struct fdisk_context *cxt, int partnum,
- struct fdisk_parttype *t)
+static int gpt_add_partition(
+ struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int partnum,
+ struct fdisk_parttype *t)
{
uint64_t user_f, user_l; /* user input ranges for first and last sectors */
uint64_t disk_f, disk_l; /* first and last available sector ranges on device*/
/*
* Create a new GPT disklabel - destroys any previous data.
*/
-static int gpt_create_disklabel(struct fdisk_context *cxt)
+static int gpt_create_disklabel(struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)))
{
int rc = 0;
ssize_t entry_sz = 0;
return rc;
}
-static struct fdisk_parttype *gpt_get_partition_type(struct fdisk_context *cxt,
- int i)
+static struct fdisk_parttype *gpt_get_partition_type(
+ struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int i)
{
struct fdisk_parttype *t;
struct gpt_guid uuid;
}
-static int gpt_set_partition_type(struct fdisk_context *cxt, int i,
- struct fdisk_parttype *t)
+static int gpt_set_partition_type(
+ struct fdisk_context *cxt,
+ struct fdisk_label *lb __attribute__((__unused__)),
+ int i,
+ struct fdisk_parttype *t)
{
struct gpt_guid uuid;
/*
* Deinitialize fdisk-specific variables
*/
-static void gpt_deinit(struct fdisk_label *lb)
+static void gpt_deinit(struct fdisk_label *lb __attribute__((unused)))
{
free(ents);
free(pheader);
ents = NULL;
pheader = NULL;
bheader = NULL;
-
- if (lb->cxt && lb->cxt->disklabel == FDISK_DISKLABEL_GPT)
- lb->cxt->disklabel = FDISK_DISKLABEL_ANY;
-
partitions = 0;
}
/* overwrite default by label stuff */
if (cxt->label && cxt->label->op->reset_alignment)
- rc = cxt->label->op->reset_alignment(cxt);
+ rc = cxt->label->op->reset_alignment(cxt, cxt->label);
DBG(LABEL, dbgprint("%s alignment reseted to: "
"first LBA=%ju, grain=%lu [rc=%d]",
struct fdisk_context *fdisk_new_context(void)
{
struct fdisk_context *cxt;
- size_t i;
cxt = calloc(1, sizeof(*cxt));
if (!cxt)
cxt->labels[ cxt->nlabels++ ] = fdisk_new_sgi_label(cxt);
cxt->labels[ cxt->nlabels++ ] = fdisk_new_sun_label(cxt);
- DBG(CONTEXT, dbgprint("supported labels:"));
- for (i = 0; i < cxt->nlabels; i++) {
- DBG(CONTEXT, dbgprint(" %s", cxt->labels[i]->name));
- cxt->labels[i]->cxt = cxt;
- }
-
return cxt;
}
*/
struct fdisk_label_operations {
/* probe disk label */
- int (*probe)(struct fdisk_context *cxt);
+ int (*probe)(struct fdisk_context *cxt, struct fdisk_label *lb);
/* write in-memory changes to disk */
- int (*write)(struct fdisk_context *cxt);
+ int (*write)(struct fdisk_context *cxt, struct fdisk_label *lb);
/* verify the partition table */
- int (*verify)(struct fdisk_context *cxt);
+ int (*verify)(struct fdisk_context *cxt, struct fdisk_label *lb);
/* create new disk label */
- int (*create)(struct fdisk_context *cxt);
+ int (*create)(struct fdisk_context *cxt, struct fdisk_label *lb);
/* new partition */
- int (*part_add)(struct fdisk_context *cxt, int partnum, struct fdisk_parttype *t);
+ int (*part_add)(struct fdisk_context *cxt, struct fdisk_label *lb,
+ int partnum,
+ struct fdisk_parttype *t);
/* delete partition */
- int (*part_delete)(struct fdisk_context *cxt, int partnum);
+ int (*part_delete)(struct fdisk_context *cxt, struct fdisk_label *lb,
+ int partnum);
/* get partition type */
- struct fdisk_parttype *(*part_get_type)(struct fdisk_context *cxt, int partnum);
+ struct fdisk_parttype *(*part_get_type)(struct fdisk_context *cxt,
+ struct fdisk_label *lb,
+ int partnum);
/* set partition type */
- int (*part_set_type)(struct fdisk_context *cxt, int partnum, struct fdisk_parttype *t);
+ int (*part_set_type)(struct fdisk_context *cxt, struct fdisk_label *lb,
+ int partnum,
+ struct fdisk_parttype *t);
/* refresh alignment setting */
- int (*reset_alignment)(struct fdisk_context *cxt);
+ int (*reset_alignment)(struct fdisk_context *cxt,
+ struct fdisk_label *lb);
/* free in-memory label stuff */
void (*free)(struct fdisk_label *lb);
const char *name;
struct fdisk_parttype *parttypes;
size_t nparttypes; /* number of items in parttypes[] */
- struct fdisk_context *cxt;
const struct fdisk_label_operations *op;
continue;
DBG(LABEL, dbgprint("probing for %s", lb->name));
- if (lb->op->probe(cxt) != 1) {
+ if (lb->op->probe(cxt, lb) != 1) {
if (lb->op->deinit)
lb->op->deinit(lb); /* for sure */
continue;
if (!cxt->label->op->write)
return -ENOSYS;
- return cxt->label->op->write(cxt);
+ return cxt->label->op->write(cxt, cxt->label);
}
/**
if (!cxt->label->op->verify)
return -ENOSYS;
- return cxt->label->op->verify(cxt);
+ return cxt->label->op->verify(cxt, cxt->label);
}
/**
return -ENOSYS;
DBG(LABEL, dbgprint("adding new partition number %d", partnum));
- cxt->label->op->part_add(cxt, partnum, t);
+ cxt->label->op->part_add(cxt, cxt->label, partnum, t);
return 0;
}
DBG(LABEL, dbgprint("deleting %s partition number %d",
cxt->label->name, partnum));
- return cxt->label->op->part_delete(cxt, partnum);
+ return cxt->label->op->part_delete(cxt, cxt->label, partnum);
}
/**
return -ENOSYS;
fdisk_reset_alignment(cxt);
- return cxt->label->op->create(cxt);
+ return cxt->label->op->create(cxt, cxt->label);
}
/**
return NULL;
DBG(LABEL, dbgprint("partition: %d: get type", partnum));
- return cxt->label->op->part_get_type(cxt, partnum);
+ return cxt->label->op->part_get_type(cxt, cxt->label, partnum);
}
/**
return -EINVAL;
DBG(LABEL, dbgprint("partition: %d: set type", partnum));
- return cxt->label->op->part_set_type(cxt, partnum, t);
+ return cxt->label->op->part_set_type(cxt, cxt->label, partnum, t);
}
/**