summaryrefslogtreecommitdiffstats
path: root/libfdisk/src/utils.c
diff options
context:
space:
mode:
authorKarel Zak2012-12-05 17:08:54 +0100
committerKarel Zak2013-03-11 11:20:41 +0100
commit3eb78aa7453f9466e6050e9ee876c672b5e7d7dd (patch)
tree2badce13e089c38d59a31c7742b519191339de94 /libfdisk/src/utils.c
parentfdisk: remove duplicate code (already in libfdisk) (diff)
downloadkernel-qcow2-util-linux-3eb78aa7453f9466e6050e9ee876c672b5e7d7dd.tar.gz
kernel-qcow2-util-linux-3eb78aa7453f9466e6050e9ee876c672b5e7d7dd.tar.xz
kernel-qcow2-util-linux-3eb78aa7453f9466e6050e9ee876c672b5e7d7dd.zip
libfdisk: add firstsector utils
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libfdisk/src/utils.c')
-rw-r--r--libfdisk/src/utils.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/libfdisk/src/utils.c b/libfdisk/src/utils.c
new file mode 100644
index 000000000..6668e23e3
--- /dev/null
+++ b/libfdisk/src/utils.c
@@ -0,0 +1,42 @@
+
+#include "fdiskP.h"
+
+/*
+ * Zeros in-memory first sector buffer
+ */
+void fdisk_zeroize_firstsector(struct fdisk_context *cxt)
+{
+ if (!cxt || !cxt->firstsector)
+ return;
+
+ DBG(CONTEXT, dbgprint("zeroize in-memory first sector buffer"));
+ memset(cxt->firstsector, 0, cxt->sector_size);
+}
+
+int fdisk_read_firstsector(struct fdisk_context *cxt)
+{
+ ssize_t r;
+
+ assert(cxt);
+ assert(cxt->sector_size);
+
+ DBG(TOPOLOGY, dbgprint("initialize first sector "
+ "buffer [sector_size=%lu]", cxt->sector_size));
+
+ if (!cxt->firstsector) {
+ cxt->firstsector = calloc(1, cxt->sector_size);
+ if (!cxt->firstsector)
+ return -ENOMEM;
+ } else
+ fdisk_zeroize_firstsector(cxt);
+
+ r = read(cxt->dev_fd, cxt->firstsector, cxt->sector_size);
+
+ if (r != cxt->sector_size) {
+ if (!errno)
+ errno = EINVAL; /* probably too small file/device */
+ return -errno;
+ }
+
+ return 0;
+}