diff options
author | Karel Zak | 2012-12-06 15:17:53 +0100 |
---|---|---|
committer | Karel Zak | 2013-03-11 12:46:37 +0100 |
commit | f4be9e2b99f96cb2250535bd5b1e322d6c0ea234 (patch) | |
tree | 7c6b5a61f1ed342f18de7ecd6c26e8e6dcdd6b14 /libfdisk/src | |
parent | libfdisk: add probing function (diff) | |
download | kernel-qcow2-util-linux-f4be9e2b99f96cb2250535bd5b1e322d6c0ea234.tar.gz kernel-qcow2-util-linux-f4be9e2b99f96cb2250535bd5b1e322d6c0ea234.tar.xz kernel-qcow2-util-linux-f4be9e2b99f96cb2250535bd5b1e322d6c0ea234.zip |
libfdisk: add context functions
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libfdisk/src')
-rw-r--r-- | libfdisk/src/Makemodule.am | 1 | ||||
-rw-r--r-- | libfdisk/src/context.c | 78 | ||||
-rw-r--r-- | libfdisk/src/libfdisk.h | 5 |
3 files changed, 84 insertions, 0 deletions
diff --git a/libfdisk/src/Makemodule.am b/libfdisk/src/Makemodule.am index 639a3d2f0..4f9048e90 100644 --- a/libfdisk/src/Makemodule.am +++ b/libfdisk/src/Makemodule.am @@ -12,6 +12,7 @@ libfdisk_la_SOURCES = \ libfdisk/src/alignment.c \ libfdisk/src/label.c \ libfdisk/src/utils.c \ + libfdisk/src/context.c \ libfdisk/src/parttype.c diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c new file mode 100644 index 000000000..302020590 --- /dev/null +++ b/libfdisk/src/context.c @@ -0,0 +1,78 @@ + +#include "fdiskP.h" + +/** + * fdisk_new_context: + * @fname: path to the device to be handled + * @readonly: how to open the device + * + * If the @readonly flag is set to false, fdisk will attempt to open + * the device with read-write mode and will fallback to read-only if + * unsuccessful. + * + * Returns: newly allocated fdisk context or NULL upon failure. + */ +struct fdisk_context *fdisk_new_context_from_filename(const char *fname, int readonly) +{ + int fd, errsv = 0; + struct fdisk_context *cxt = NULL; + + DBG(CONTEXT, dbgprint("initializing context for %s", fname)); + + if (readonly == 1 || (fd = open(fname, O_RDWR)) < 0) { + if ((fd = open(fname, O_RDONLY)) < 0) + return NULL; + readonly = 1; + } + + cxt = calloc(1, sizeof(*cxt)); + if (!cxt) + goto fail; + + cxt->dev_fd = fd; + cxt->dev_path = strdup(fname); + if (!cxt->dev_path) + goto fail; + + fdisk_discover_topology(cxt); + fdisk_discover_geometry(cxt); + + if (fdisk_read_firstsector(cxt) < 0) + goto fail; + + /* detect labels and apply labes specific stuff (e.g geomery) + * to the context */ + fdisk_probe_labels(cxt); + + fdisk_reset_alignment(cxt); + + DBG(CONTEXT, dbgprint("context %p initialized for %s [%s]", + cxt, fname, + readonly ? "READ-ONLY" : "READ-WRITE")); + return cxt; +fail: + errsv = errno; + fdisk_free_context(cxt); + errno = errsv; + + DBG(CONTEXT, dbgprint("failed to initialize context for %s: %m", fname)); + return NULL; +} + +/** + * fdisk_free_context: + * @cxt: fdisk context + * + * Deallocates context struct. + */ +void fdisk_free_context(struct fdisk_context *cxt) +{ + if (!cxt) + return; + + DBG(CONTEXT, dbgprint("freeing context %p for %s", cxt, cxt->dev_path)); + close(cxt->dev_fd); + free(cxt->dev_path); + free(cxt->firstsector); + free(cxt); +} diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h index 08df05bed..276f79b83 100644 --- a/libfdisk/src/libfdisk.h +++ b/libfdisk/src/libfdisk.h @@ -45,6 +45,11 @@ enum fdisk_labeltype { /* init.c */ extern void fdisk_init_debug(int mask); +/* context.h */ +extern struct fdisk_context *fdisk_new_context_from_filename( + const char *fname, int readonly); +extern void fdisk_free_context(struct fdisk_context *cxt); + /* parttype.c */ extern struct fdisk_parttype *fdisk_get_parttype_from_code(struct fdisk_context *cxt, unsigned int code); |