OSDN Git Service

squashfs_utils: Add host library and parsing from buffer
authorSami Tolvanen <samitolvanen@google.com>
Mon, 1 Jun 2015 09:46:06 +0000 (10:46 +0100)
committerSami Tolvanen <samitolvanen@google.com>
Thu, 25 Jun 2015 15:08:52 +0000 (16:08 +0100)
Allow the squashfs_utils library to be used on host and add a function to
parse the super block from a buffer.

Change-Id: I7cc59cba9882e159faeb0b203df20aaefb5c6e16

squashfs_utils/Android.mk
squashfs_utils/squashfs_utils.c
squashfs_utils/squashfs_utils.h

index c3d2f2d..2e0456a 100644 (file)
@@ -9,6 +9,14 @@ LOCAL_C_INCLUDES := external/squashfs-tools/squashfs-tools
 LOCAL_MODULE := libsquashfs_utils
 include $(BUILD_STATIC_LIBRARY)
 
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := squashfs_utils.c
+LOCAL_STATIC_LIBRARIES := libcutils
+LOCAL_C_INCLUDES := external/squashfs-tools/squashfs-tools
+LOCAL_CFLAGS := -Wall -Werror -D_GNU_SOURCE -DSQUASHFS_NO_KLOG
+LOCAL_MODULE := libsquashfs_utils_host
+include $(BUILD_HOST_STATIC_LIBRARY)
+
 ifeq ($(HOST_OS),linux)
 
 include $(CLEAR_VARS)
index 6189189..1d619ce 100644 (file)
 
 #include "squashfs_fs.h"
 
+#ifdef SQUASHFS_NO_KLOG
+#include <stdio.h>
+#define ERROR(x...)   fprintf(stderr, x)
+#else
 #define ERROR(x...)   KLOG_ERROR("squashfs_utils", x)
+#endif
 
-int squashfs_parse_sb(char *blk_device, struct squashfs_info *info) {
+size_t squashfs_get_sb_size()
+{
+    return sizeof(struct squashfs_super_block);
+}
+
+int squashfs_parse_sb_buffer(const void *buf, struct squashfs_info *info)
+{
+    const struct squashfs_super_block *sb =
+        (const struct squashfs_super_block *)buf;
+
+    if (sb->s_magic != SQUASHFS_MAGIC) {
+        return -1;
+    }
+
+    info->block_size = sb->block_size;
+    info->inodes = sb->inodes;
+    info->bytes_used = sb->bytes_used;
+    // by default mksquashfs pads the filesystem to 4K blocks
+    info->bytes_used_4K_padded =
+        sb->bytes_used + (4096 - (sb->bytes_used & (4096 - 1)));
+
+    return 0;
+}
+
+int squashfs_parse_sb(const char *blk_device, struct squashfs_info *info)
+{
     int ret = 0;
     struct squashfs_super_block sb;
     int data_device;
@@ -44,19 +74,13 @@ int squashfs_parse_sb(char *blk_device, struct squashfs_info *info) {
         ret = -1;
         goto cleanup;
     }
-    if (sb.s_magic != SQUASHFS_MAGIC) {
+
+    if (squashfs_parse_sb_buffer(&sb, info) == -1) {
         ERROR("Not a valid squashfs filesystem\n");
         ret = -1;
         goto cleanup;
     }
 
-    info->block_size = sb.block_size;
-    info->inodes = sb.inodes;
-    info->bytes_used = sb.bytes_used;
-    // by default mksquashfs pads the filesystem to 4K blocks
-    info->bytes_used_4K_padded =
-        sb.bytes_used + (4096 - (sb.bytes_used & (4096 - 1)));
-
 cleanup:
     close(data_device);
     return ret;
index ccad32d..465429f 100644 (file)
@@ -17,6 +17,7 @@
 #ifndef _SQUASHFS_UTILS_H_
 #define _SQUASHFS_UTILS_H_
 
+#include <stddef.h>
 #include <stdint.h>
 
 #ifdef __cplusplus
@@ -30,7 +31,9 @@ struct squashfs_info {
     uint64_t bytes_used_4K_padded;
 };
 
-int squashfs_parse_sb(char *blk_device, struct squashfs_info *info);
+size_t squashfs_get_sb_size();
+int squashfs_parse_sb_buffer(const void *data, struct squashfs_info *info);
+int squashfs_parse_sb(const char *blk_device, struct squashfs_info *info);
 
 #ifdef __cplusplus
 }