summaryrefslogtreecommitdiffstats
path: root/libfdisk/src/fdiskP.h
diff options
context:
space:
mode:
authorKarel Zak2012-12-11 12:56:27 +0100
committerKarel Zak2013-03-11 12:47:29 +0100
commit0c5d095e46306ed4d6009f56e0339857d733d72e (patch)
treeea751328b6a158c199c7595faf3200a8039dd176 /libfdisk/src/fdiskP.h
parentlibfdisk: cleanup the rest of fdisks/utils.c stuff (diff)
downloadkernel-qcow2-util-linux-0c5d095e46306ed4d6009f56e0339857d733d72e.tar.gz
kernel-qcow2-util-linux-0c5d095e46306ed4d6009f56e0339857d733d72e.tar.xz
kernel-qcow2-util-linux-0c5d095e46306ed4d6009f56e0339857d733d72e.zip
libfdisk: split label and label operations
Changes: - fdisk_label is a private label driver struct - generic header of the fdisk_label points to fdisk_label_operations - the private fdisk_label stuff is always allocated for all drivers during fdisk_context initialization - context->labels[] contains pointers to all supported labels (drivers) - context->label is a pointer to the currently used label This change allows to: - store label specific global settings (e.g. dos compatible mode, display units, ...) independently on the current label - add label specific function to the API Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libfdisk/src/fdiskP.h')
-rw-r--r--libfdisk/src/fdiskP.h85
1 files changed, 55 insertions, 30 deletions
diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h
index eac127ee6..01dd71f51 100644
--- a/libfdisk/src/fdiskP.h
+++ b/libfdisk/src/fdiskP.h
@@ -118,6 +118,56 @@ struct fdisk_geometry {
sector_t cylinders;
};
+/*
+ * Label specific operations
+ */
+struct fdisk_label_operations {
+ /* probe disk label */
+ int (*probe)(struct fdisk_context *cxt);
+ /* write in-memory changes to disk */
+ 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 */
+ int (*part_add)(struct fdisk_context *cxt, int partnum, struct fdisk_parttype *t);
+ /* delete partition */
+ int (*part_delete)(struct fdisk_context *cxt, int partnum);
+ /* get partition type */
+ struct fdisk_parttype *(*part_get_type)(struct fdisk_context *cxt, int partnum);
+ /* set partition type */
+ int (*part_set_type)(struct fdisk_context *cxt, int partnum, struct fdisk_parttype *t);
+ /* refresh alignment setting */
+ int (*reset_alignment)(struct fdisk_context *cxt);
+
+ /* free in-memory label stuff */
+ void (*free)(struct fdisk_label *lb);
+};
+
+/*
+ * Generic label
+ */
+struct fdisk_label {
+ const char *name;
+
+ struct fdisk_parttype *parttypes;
+ size_t nparttypes; /* number of items in parttypes[] */
+
+ const struct fdisk_label_operations *op;
+
+ struct fdisk_context *cxt;
+};
+
+/* label allocators */
+extern struct fdisk_label *fdisk_new_gpt_label(struct fdisk_context *cxt);
+extern struct fdisk_label *fdisk_new_dos_label(struct fdisk_context *cxt);
+extern struct fdisk_label *fdisk_new_aix_label(struct fdisk_context *cxt);
+extern struct fdisk_label *fdisk_new_bsd_label(struct fdisk_context *cxt);
+extern struct fdisk_label *fdisk_new_mac_label(struct fdisk_context *cxt);
+extern struct fdisk_label *fdisk_new_sgi_label(struct fdisk_context *cxt);
+extern struct fdisk_label *fdisk_new_sun_label(struct fdisk_context *cxt);
+
struct fdisk_context {
int dev_fd; /* device descriptor */
char *dev_path; /* device path */
@@ -141,39 +191,14 @@ struct fdisk_context {
sector_t total_sectors; /* in logical sectors */
struct fdisk_geometry geom;
- /* label operations and description */
- const struct fdisk_label *label;
-};
+ struct fdisk_label *label; /* current label, pointer to labels[] */
-/*
- * Label specific operations
- */
-struct fdisk_label {
- const char *name;
+ size_t nlabels; /* number of initialized label drivers */
+ struct fdisk_label *labels[8]; /* all supported labels,
+ * FIXME: use any enum rather than hardcoded number */
+};
- /* array with partition types */
- struct fdisk_parttype *parttypes;
- size_t nparttypes; /* number of items in parttypes[] */
- /* probe disk label */
- int (*probe)(struct fdisk_context *cxt);
- /* write in-memory changes to disk */
- 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 */
- int (*part_add)(struct fdisk_context *cxt, int partnum, struct fdisk_parttype *t);
- /* delete partition */
- int (*part_delete)(struct fdisk_context *cxt, int partnum);
- /* get partition type */
- struct fdisk_parttype *(*part_get_type)(struct fdisk_context *cxt, int partnum);
- /* set partition type */
- int (*part_set_type)(struct fdisk_context *cxt, int partnum, struct fdisk_parttype *t);
- /* refresh alignment setting */
- int (*reset_alignment)(struct fdisk_context *cxt);
-};
/* alignment.c */
extern sector_t fdisk_topology_get_first_lba(struct fdisk_context *cxt);