chiark / gitweb /
volume_id: add squashfs detection
authorKay Sievers <kay.sievers@suse.de>
Wed, 8 Mar 2006 18:44:28 +0000 (19:44 +0100)
committerKay Sievers <kay.sievers@suse.de>
Wed, 8 Mar 2006 18:44:28 +0000 (19:44 +0100)
extras/volume_id/libvolume_id/Makefile
extras/volume_id/libvolume_id/squashfs.c [new file with mode: 0644]
extras/volume_id/libvolume_id/volume_id.c
extras/volume_id/libvolume_id/volume_id.h

index 07f6662f2584299e68c3d1d4fa809d4e60520a91..2a86e931a419d0d2c35c4f8b4da26d013e1eac9c 100644 (file)
@@ -38,6 +38,7 @@ OBJS=                         \
        luks.o                  \
        ocfs.o                  \
        vxfs.o                  \
        luks.o                  \
        ocfs.o                  \
        vxfs.o                  \
+       squashfs.o              \
        volume_id.o             \
        util.o
 
        volume_id.o             \
        util.o
 
diff --git a/extras/volume_id/libvolume_id/squashfs.c b/extras/volume_id/libvolume_id/squashfs.c
new file mode 100644 (file)
index 0000000..f220721
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * volume_id - reads filesystem label and uuid
+ *
+ * Copyright (C) 2006 Kay Sievers <kay.sievers@vrfy.org>
+ *
+ *     This program is free software; you can redistribute it and/or modify it
+ *     under the terms of the GNU General Public License as published by the
+ *     Free Software Foundation version 2 of the License.
+ */
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE 1
+#endif
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+
+#include "volume_id.h"
+#include "logging.h"
+#include "util.h"
+
+#define SQUASHFS_MAGIC         0x73717368
+
+struct squashfs_super {
+       uint32_t                s_magic;
+} PACKED;
+
+int volume_id_probe_squashfs(struct volume_id *id, uint64_t off)
+{
+       struct squashfs_super *sqs;
+
+       dbg("probing at offset 0x%llx", (unsigned long long) off);
+
+       sqs = (struct squashfs_super *) volume_id_get_buffer(id, off + 0x200, 0x200);
+       if (sqs == NULL)
+               return -1;
+
+       if (sqs->s_magic == SQUASHFS_MAGIC || sqs->s_magic == bswap_32(SQUASHFS_MAGIC)) {
+               volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
+               id->type = "squashfs";
+               return 0;
+       }
+
+       return -1;
+}
index 6a900ab2818bb72e171d54954e2928ab5ca064c7..fdecf396c4abadd090dd4f0828d32153dbf660de 100644 (file)
@@ -149,6 +149,9 @@ int volume_id_probe_filesystem(struct volume_id *id, uint64_t off, uint64_t size
        if (volume_id_probe_vxfs(id, off) == 0)
                goto found;
 
        if (volume_id_probe_vxfs(id, off) == 0)
                goto found;
 
+       if (volume_id_probe_squashfs(id, off) == 0)
+               goto found;
+
        return -1;
 
 found:
        return -1;
 
 found:
index 78baf59820a0bbc9ed854e586cd86d63232ddd8f..15f1ac01f82587fa09062e78567eee0dd11007ee 100644 (file)
@@ -14,7 +14,7 @@
 #include <stdint.h>
 #include <stddef.h>
 
 #include <stdint.h>
 #include <stddef.h>
 
-#define VOLUME_ID_VERSION              58
+#define VOLUME_ID_VERSION              59
 
 #ifndef PACKED
 #define PACKED                         __attribute__((packed))
 
 #ifndef PACKED
 #define PACKED                         __attribute__((packed))
@@ -96,6 +96,7 @@ extern int volume_id_probe_udf(struct volume_id *id, uint64_t off);
 extern int volume_id_probe_ufs(struct volume_id *id, uint64_t off);
 extern int volume_id_probe_vxfs(struct volume_id *id, uint64_t off);
 extern int volume_id_probe_xfs(struct volume_id *id, uint64_t off);
 extern int volume_id_probe_ufs(struct volume_id *id, uint64_t off);
 extern int volume_id_probe_vxfs(struct volume_id *id, uint64_t off);
 extern int volume_id_probe_xfs(struct volume_id *id, uint64_t off);
+extern int volume_id_probe_squashfs(struct volume_id *id, uint64_t off);
 
 /* special formats */
 extern int volume_id_probe_linux_swap(struct volume_id *id, uint64_t off);
 
 /* special formats */
 extern int volume_id_probe_linux_swap(struct volume_id *id, uint64_t off);