OSDN Git Service

f2fs utils: Add mkf2fsuserimg.sh and make_f2fs
authorJP Abgrall <jpa@google.com>
Mon, 16 Jun 2014 18:08:45 +0000 (11:08 -0700)
committerJP Abgrall <jpa@google.com>
Tue, 17 Jun 2014 20:32:16 +0000 (13:32 -0700)
This is used to generate empty userdata.img files.
Normally, "fastboot format userdata" should be used.

Caveats:
 - It only builds an empty sparse image.
 - windows/mac unsupported

Change-Id: I5fbd9724fdd3f4513e7c91f123fc5fffcb475012
Signed-off-by: JP Abgrall <jpa@google.com>
f2fs_utils/Android.mk
f2fs_utils/make_f2fs_main.c [new file with mode: 0644]
f2fs_utils/mkf2fsuserimg.sh [new file with mode: 0755]

index f3a186c..8fb607c 100644 (file)
@@ -34,7 +34,6 @@ LOCAL_STATIC_LIBRARIES := \
 LOCAL_C_INCLUDES := external/f2fs-tools/include external/f2fs-tools/mkfs
 include $(BUILD_HOST_STATIC_LIBRARY)
 
-
 #
 # -- All host/targets excluding windows
 #
@@ -42,6 +41,17 @@ include $(BUILD_HOST_STATIC_LIBRARY)
 ifneq ($(HOST_OS),windows)
 
 include $(CLEAR_VARS)
+LOCAL_SRC_FILES := make_f2fs_main.c
+LOCAL_MODULE := make_f2fs
+LOCAL_STATIC_LIBRARIES += \
+    libf2fs_utils_host \
+    libf2fs_dlutils_host
+# libf2fs_dlutils_host will dlopen("libf2fs_fmt_host_dyn")
+LOCAL_LDLIBS := -ldl
+LOCAL_SHARED_LIBRARIES := libf2fs_fmt_host_dyn
+include $(BUILD_HOST_EXECUTABLE)
+
+include $(CLEAR_VARS)
 LOCAL_MODULE := libf2fs_dlutils
 LOCAL_SRC_FILES := f2fs_dlutils.c
 LOCAL_C_INCLUDES := external/f2fs-tools/include external/f2fs-tools/mkfs
@@ -63,5 +73,15 @@ LOCAL_STATIC_LIBRARIES := \
     libsparse_static
 include $(BUILD_STATIC_LIBRARY)
 
+include $(CLEAR_VARS)
+LOCAL_MODULE := mkf2fsuserimg.sh
+LOCAL_SRC_FILES := mkf2fsuserimg.sh
+LOCAL_MODULE_CLASS := EXECUTABLES
+# We don't need any additional suffix.
+LOCAL_MODULE_SUFFIX :=
+LOCAL_BUILT_MODULE_STEM := $(notdir $(LOCAL_SRC_FILES))
+LOCAL_IS_HOST_MODULE := true
+include $(BUILD_PREBUILT)
+
 endif
 
diff --git a/f2fs_utils/make_f2fs_main.c b/f2fs_utils/make_f2fs_main.c
new file mode 100644 (file)
index 0000000..8404266
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <fcntl.h>
+#include <libgen.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#if defined(__linux__)
+#include <linux/fs.h>
+#elif defined(__APPLE__) && defined(__MACH__)
+#include <sys/disk.h>
+#endif
+
+#ifndef USE_MINGW /* O_BINARY is windows-specific flag */
+#define O_BINARY 0
+#endif
+
+static void usage(char *path)
+{
+       fprintf(stderr, "%s -l <len>\n", basename(path));
+       fprintf(stderr, "    <filename>\n");
+}
+
+int main(int argc, char **argv)
+{
+       int opt;
+       const char *filename = NULL;
+       int fd;
+       int exitcode;
+       long long len;
+       while ((opt = getopt(argc, argv, "l:")) != -1) {
+               switch (opt) {
+               case 'l':
+                       len = atoll(optarg);
+                       break;
+               default: /* '?' */
+                       usage(argv[0]);
+                       exit(EXIT_FAILURE);
+               }
+       }
+
+
+       if (optind >= argc) {
+               fprintf(stderr, "Expected filename after options\n");
+               usage(argv[0]);
+               exit(EXIT_FAILURE);
+       }
+
+       filename = argv[optind++];
+
+       if (optind < argc) {
+               fprintf(stderr, "Unexpected argument: %s\n", argv[optind]);
+               usage(argv[0]);
+               exit(EXIT_FAILURE);
+       }
+
+       if (strcmp(filename, "-")) {
+               fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644);
+               if (fd < 0) {
+                       perror("open");
+                       return EXIT_FAILURE;
+               }
+       } else {
+               fd = STDOUT_FILENO;
+       }
+
+        exitcode = make_f2fs_sparse_fd(fd, len, NULL, NULL);
+
+       close(fd);
+       if (exitcode && strcmp(filename, "-"))
+               unlink(filename);
+       return exitcode;
+}
diff --git a/f2fs_utils/mkf2fsuserimg.sh b/f2fs_utils/mkf2fsuserimg.sh
new file mode 100755 (executable)
index 0000000..93ec743
--- /dev/null
@@ -0,0 +1,34 @@
+#!/bin/bash
+#
+# To call this script, make sure make_f2fs is somewhere in PATH
+
+function usage() {
+cat<<EOT
+Usage:
+${0##*/} OUTPUT_FILE SIZE
+EOT
+}
+
+echo "in mkf2fsuserimg.sh PATH=$PATH"
+
+if [ $# -lt 2 ]; then
+  usage
+  exit 1
+fi
+
+OUTPUT_FILE=$1
+SIZE=$2
+shift; shift
+
+
+if [ -z $SIZE ]; then
+  echo "Need size of filesystem"
+  exit 2
+fi
+
+MAKE_F2FS_CMD="make_f2fs -l $SIZE $OUTPUT_FILE"
+echo $MAKE_F2FS_CMD
+$MAKE_F2FS_CMD
+if [ $? -ne 0 ]; then
+  exit 4
+fi