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,
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;
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
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);
libfdisk/src/init.c \
libfdisk/src/alignment.c \
libfdisk/src/label.c \
+ libfdisk/src/utils.c \
libfdisk/src/parttype.c
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 */
--- /dev/null
+
+#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;
+}