]> git.wh0rd.org - dump.git/blobdiff - compat/lib/bylabel.c
Be sure the di_size in a map header has the correct value.
[dump.git] / compat / lib / bylabel.c
index 31bdd0d601746b66a31b477ff73461a040b18ed6..5a40a70e6eb5af34dfbe3d388a99904a38c80df2 100644 (file)
@@ -12,6 +12,8 @@
  */
 
 #include <config.h>
+#include <compatlfs.h>
+#include <sys/types.h>
 #include <stdio.h>
 #include <sys/param.h>
 #include <string.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <malloc.h>
+#include <sys/cdefs.h>
 #include "bylabel.h"
 
+#ifndef HAVE_BLKID
+
 #define PROC_PARTITIONS "/proc/partitions"
 #define DEVLABELDIR    "/dev"
 
-#define EXT2_SUPER_MAGIC 0xEF53
+#define EXT2_SUPER_OFFSET      1024
+#define EXT2_SUPER_SIZE                sizeof(struct ext2_super_block)
+#define EXT2_SUPER_MAGIC       0xEF53
+
+#define VOLNAMSZ       16
+
 struct ext2_super_block {
        unsigned char   s_dummy1[56];
        unsigned char   s_magic[2];
        unsigned char   s_dummy2[46];
        unsigned char   s_uuid[16];
-       unsigned char   s_volume_name[16];
+       unsigned char   s_volume_name[VOLNAMSZ];
 };
 #define ext2magic(s)   ((unsigned int) s.s_magic[0] + (((unsigned int) s.s_magic[1]) << 8))
 
@@ -52,13 +62,13 @@ get_label_uuid(const char *device, char **label, char *uuid) {
        int fd;
        struct ext2_super_block e2sb;
 
-       fd = open(device, O_RDONLY);
+       fd = OPEN(device, O_RDONLY);
        if (fd < 0)
                return 1;
 
-       if (lseek(fd, 1024, SEEK_SET) != 1024
-           || read(fd, (char *) &e2sb, sizeof(e2sb)) != sizeof(e2sb)
-           || (ext2magic(e2sb) != EXT2_SUPER_MAGIC)) {
+       if (LSEEK(fd, EXT2_SUPER_OFFSET, SEEK_SET) != EXT2_SUPER_OFFSET ||
+           read(fd, (char *) &e2sb, EXT2_SUPER_SIZE) != EXT2_SUPER_SIZE ||
+           ext2magic(e2sb) != EXT2_SUPER_MAGIC) {
                close(fd);
                return 1;
        }
@@ -67,7 +77,9 @@ get_label_uuid(const char *device, char **label, char *uuid) {
 
        /* superblock is ext2 - now what is its label? */
        memcpy(uuid, e2sb.s_uuid, sizeof(e2sb.s_uuid));
-       *label = strdup(e2sb.s_volume_name);
+       *label = malloc(VOLNAMSZ + 1);
+       strncpy(*label, e2sb.s_volume_name, VOLNAMSZ);
+       (*label)[VOLNAMSZ] = 0;
 
        return 0;
 }
@@ -245,3 +257,5 @@ get_device_label(const char * spec) {
        }
        return NULL;
 }
+
+#endif /* !HAVE_BLKID */