]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: add firstsector utils
authorKarel Zak <kzak@redhat.com>
Wed, 5 Dec 2012 16:08:54 +0000 (17:08 +0100)
committerKarel Zak <kzak@redhat.com>
Mon, 11 Mar 2013 10:20:41 +0000 (11:20 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
fdisks/fdisk.h
fdisks/utils.c
libfdisk/src/Makemodule.am
libfdisk/src/fdiskP.h
libfdisk/src/utils.c [new file with mode: 0644]

index 8afa7e9d19bb68843c8ecdb3696c16505336da11..4736bccb9b82d0b0703257d38a028e63afb9bb63 100644 (file)
@@ -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,
index 275fee139ac3abfbcceb9a6298d0ade913fd62ad..24f169efd03e0db2cb10b4039a0f2b9d5735b49c 100644 (file)
@@ -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);
index f14e1541d44075d43b1d9ab3ea53d546cb34a012..639a3d2f00f7f1e5f39480021e0b99063a7bf5d9 100644 (file)
@@ -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
 
 
index 6d2fef1cf720d65c9e895232de91875b2b927410..4f5585733abb2f90b9cf542109a70b2967239882 100644 (file)
@@ -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 (file)
index 0000000..6668e23
--- /dev/null
@@ -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;
+}