From 599ae952519138a697b96c369da218f2cf876524 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Fri, 2 Feb 2018 04:47:16 +0800 Subject: [PATCH] Support moving files across filesystems --- native/jni/core/bootstages.c | 2 +- native/jni/utils/img.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/native/jni/core/bootstages.c b/native/jni/core/bootstages.c index 8216c68a2..329272972 100644 --- a/native/jni/core/bootstages.c +++ b/native/jni/core/bootstages.c @@ -51,7 +51,7 @@ struct node_entry { static void concat_path(struct node_entry *node) { if (node->parent) concat_path(node->parent); - int len = strlen(buf); + size_t len = strlen(buf); buf[len] = '/'; strcpy(buf + len + 1, node->name); } diff --git a/native/jni/utils/img.c b/native/jni/utils/img.c index cd28b8011..4adabd288 100644 --- a/native/jni/utils/img.c +++ b/native/jni/utils/img.c @@ -3,9 +3,11 @@ #include #include +#include #include #include #include +#include #include #include "magisk.h" @@ -167,7 +169,15 @@ int merge_img(const char *source, const char *target) { return 0; LOGI("* Merging %s -> %s\n", source, target); if (access(target, F_OK) == -1) { - xrename(source, target); + if (rename(source, target) < 0) { + // Copy and remove + int tgt = creat(target, 0644); + int src = xopen(source, O_RDONLY | O_CLOEXEC); + sendfile(tgt, src, 0, INT_MAX); + close(tgt); + close(src); + unlink(source); + } return 0; }