aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@suse.de>2006-03-08 19:44:28 +0100
committerKay Sievers <kay.sievers@suse.de>2006-03-08 19:44:28 +0100
commit2f567dd62ede3cf979e426738925446f1182ba52 (patch)
treea34bf9cdbb1c2a071d347c29cadb22505b99cc19
parentb2885eeecf517e82830f585a69ebc9c2c60cfa5e (diff)
downloadudev-2f567dd62ede3cf979e426738925446f1182ba52.tar.gz
volume_id: add squashfs detection
-rw-r--r--extras/volume_id/libvolume_id/Makefile1
-rw-r--r--extras/volume_id/libvolume_id/squashfs.c53
-rw-r--r--extras/volume_id/libvolume_id/volume_id.c3
-rw-r--r--extras/volume_id/libvolume_id/volume_id.h3
4 files changed, 59 insertions, 1 deletions
diff --git a/extras/volume_id/libvolume_id/Makefile b/extras/volume_id/libvolume_id/Makefile
index 07f6662f..2a86e931 100644
--- a/extras/volume_id/libvolume_id/Makefile
+++ b/extras/volume_id/libvolume_id/Makefile
@@ -38,6 +38,7 @@ OBJS= \
luks.o \
ocfs.o \
vxfs.o \
+ squashfs.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
index 00000000..f220721d
--- /dev/null
+++ b/extras/volume_id/libvolume_id/squashfs.c
@@ -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;
+}
diff --git a/extras/volume_id/libvolume_id/volume_id.c b/extras/volume_id/libvolume_id/volume_id.c
index 6a900ab2..fdecf396 100644
--- a/extras/volume_id/libvolume_id/volume_id.c
+++ b/extras/volume_id/libvolume_id/volume_id.c
@@ -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_squashfs(id, off) == 0)
+ goto found;
+
return -1;
found:
diff --git a/extras/volume_id/libvolume_id/volume_id.h b/extras/volume_id/libvolume_id/volume_id.h
index 78baf598..15f1ac01 100644
--- a/extras/volume_id/libvolume_id/volume_id.h
+++ b/extras/volume_id/libvolume_id/volume_id.h
@@ -14,7 +14,7 @@
#include <stdint.h>
#include <stddef.h>
-#define VOLUME_ID_VERSION 58
+#define VOLUME_ID_VERSION 59
#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_squashfs(struct volume_id *id, uint64_t off);
/* special formats */
extern int volume_id_probe_linux_swap(struct volume_id *id, uint64_t off);