From: Karel Zak Date: Wed, 5 Dec 2012 16:08:54 +0000 (+0100) Subject: libfdisk: add firstsector utils X-Git-Tag: v2.23-rc1~163 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3eb78aa7453f9466e6050e9ee876c672b5e7d7dd;p=thirdparty%2Futil-linux.git libfdisk: add firstsector utils Signed-off-by: Karel Zak --- diff --git a/fdisks/fdisk.h b/fdisks/fdisk.h index 8afa7e9d19..4736bccb9b 100644 --- a/fdisks/fdisk.h +++ b/fdisks/fdisk.h @@ -75,7 +75,6 @@ extern struct fdisk_context *fdisk_new_context_from_filename(const char *fname, extern int fdisk_dev_has_topology(struct fdisk_context *cxt); extern int fdisk_dev_sectsz_is_default(struct fdisk_context *cxt); extern void fdisk_free_context(struct fdisk_context *cxt); -extern void fdisk_zeroize_firstsector(struct fdisk_context *cxt); extern int fdisk_context_force_sector_size(struct fdisk_context *cxt, sector_t s); extern int fdisk_context_set_user_geometry(struct fdisk_context *cxt, unsigned int cylinders, unsigned int heads, diff --git a/fdisks/utils.c b/fdisks/utils.c index 275fee139a..24f169efd0 100644 --- a/fdisks/utils.c +++ b/fdisks/utils.c @@ -69,26 +69,6 @@ static int __probe_labels(struct fdisk_context *cxt) return 1; /* not found */ } -static int __init_firstsector_buffer(struct fdisk_context *cxt) -{ - DBG(TOPOLOGY, dbgprint("initialize first sector buffer")); - - cxt->firstsector = calloc(1, MAX_SECTOR_SIZE); - if (!cxt->firstsector) - goto fail; - - /* read MBR */ - if (512 != read(cxt->dev_fd, cxt->firstsector, 512)) { - if (errno == 0) - errno = EINVAL; /* probably too small file/device */ - goto fail; - } - - return 0; -fail: - return -errno; -} - static unsigned long __get_sector_size(int fd) { int sect_sz; @@ -236,24 +216,6 @@ static int __discover_topology(struct fdisk_context *cxt) return 0; } - -/** - * fdisk_zeroize_firstsector: - * @cxt: fdisk context - * - * Zeros in-memory first sector buffer - */ -void fdisk_zeroize_firstsector(struct fdisk_context *cxt) -{ - if (!cxt) - return; - - if (cxt->firstsector) { - DBG(CONTEXT, dbgprint("zeroize in-memory first sector buffer")); - memset(cxt->firstsector, 0, MAX_SECTOR_SIZE); - } -} - /** * fdisk_dev_sectsz_is_default: * @cxt: fdisk context @@ -475,12 +437,12 @@ struct fdisk_context *fdisk_new_context_from_filename(const char *fname, int rea if (!cxt->dev_path) goto fail; - if (__init_firstsector_buffer(cxt) < 0) - goto fail; - __discover_topology(cxt); __discover_system_geometry(cxt); + if (fdisk_read_firstsector(cxt) < 0) + goto fail; + /* detect labels and apply labes specific stuff (e.g geomery) * to the context */ __probe_labels(cxt); diff --git a/libfdisk/src/Makemodule.am b/libfdisk/src/Makemodule.am index f14e1541d4..639a3d2f00 100644 --- a/libfdisk/src/Makemodule.am +++ b/libfdisk/src/Makemodule.am @@ -11,6 +11,7 @@ libfdisk_la_SOURCES = \ libfdisk/src/init.c \ libfdisk/src/alignment.c \ libfdisk/src/label.c \ + libfdisk/src/utils.c \ libfdisk/src/parttype.c diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h index 6d2fef1cf7..4f5585733a 100644 --- a/libfdisk/src/fdiskP.h +++ b/libfdisk/src/fdiskP.h @@ -191,4 +191,9 @@ extern sector_t fdisk_align_lba(struct fdisk_context *cxt, sector_t lba, int dir extern sector_t fdisk_align_lba_in_range(struct fdisk_context *cxt, sector_t lba, sector_t start, sector_t stop); + +/* utils.c */ +extern void fdisk_zeroize_firstsector(struct fdisk_context *cxt); +extern int fdisk_read_firstsector(struct fdisk_context *cxt); + #endif /* _LIBFDISK_PRIVATE_H */ diff --git a/libfdisk/src/utils.c b/libfdisk/src/utils.c new file mode 100644 index 0000000000..6668e23e34 --- /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; +}