diff options
author | Karel Zak | 2012-12-05 17:08:54 +0100 |
---|---|---|
committer | Karel Zak | 2013-03-11 11:20:41 +0100 |
commit | 3eb78aa7453f9466e6050e9ee876c672b5e7d7dd (patch) | |
tree | 2badce13e089c38d59a31c7742b519191339de94 /libfdisk/src/utils.c | |
parent | fdisk: remove duplicate code (already in libfdisk) (diff) | |
download | kernel-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.c | 42 |
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; +} |