Support moving files across filesystems

This commit is contained in:
topjohnwu 2018-02-02 04:47:16 +08:00
parent d1be34c34a
commit 599ae95251
2 changed files with 12 additions and 2 deletions

View File

@ -51,7 +51,7 @@ struct node_entry {
static void concat_path(struct node_entry *node) { static void concat_path(struct node_entry *node) {
if (node->parent) if (node->parent)
concat_path(node->parent); concat_path(node->parent);
int len = strlen(buf); size_t len = strlen(buf);
buf[len] = '/'; buf[len] = '/';
strcpy(buf + len + 1, node->name); strcpy(buf + len + 1, node->name);
} }

View File

@ -3,9 +3,11 @@
#include <unistd.h> #include <unistd.h>
#include <libgen.h> #include <libgen.h>
#include <fcntl.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <sys/mount.h> #include <sys/mount.h>
#include <sys/sendfile.h>
#include <linux/loop.h> #include <linux/loop.h>
#include "magisk.h" #include "magisk.h"
@ -167,7 +169,15 @@ int merge_img(const char *source, const char *target) {
return 0; return 0;
LOGI("* Merging %s -> %s\n", source, target); LOGI("* Merging %s -> %s\n", source, target);
if (access(target, F_OK) == -1) { 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; return 0;
} }