mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-12-24 05:44:39 +00:00
Add cpio-mv action
This commit is contained in:
parent
7e65296470
commit
b7b4164f4f
@ -40,7 +40,7 @@ static void cpio_vec_insert(struct vector *v, cpio_file *n) {
|
||||
vec_push_back(v, n);
|
||||
}
|
||||
|
||||
static int cpio_compare(const void *a, const void *b) {
|
||||
static int cpio_cmp(const void *a, const void *b) {
|
||||
return strcmp((*(cpio_file **) a)->filename, (*(cpio_file **) b)->filename);
|
||||
}
|
||||
|
||||
@ -92,7 +92,7 @@ static void dump_cpio(const char *filename, struct vector *v) {
|
||||
unsigned inode = 300000;
|
||||
char header[111];
|
||||
// Sort by name
|
||||
vec_sort(v, cpio_compare);
|
||||
vec_sort(v, cpio_cmp);
|
||||
cpio_file *f;
|
||||
vec_for_each(v, f) {
|
||||
if (f->remove) continue;
|
||||
@ -139,13 +139,15 @@ static void cpio_vec_destroy(struct vector *v) {
|
||||
static void cpio_rm(int recursive, const char *entry, struct vector *v) {
|
||||
cpio_file *f;
|
||||
vec_for_each(v, f) {
|
||||
if ((recursive && strncmp(f->filename, entry, strlen(entry)) == 0)
|
||||
|| (strcmp(f->filename, entry) == 0) ) {
|
||||
if (!f->remove) {
|
||||
fprintf(stderr, "Remove [%s]\n", entry);
|
||||
f->remove = 1;
|
||||
if (strncmp(f->filename, entry, strlen(entry)) == 0) {
|
||||
char next = f->filename[strlen(entry)];
|
||||
if ((recursive && next == '/') || next == '\0') {
|
||||
if (!f->remove) {
|
||||
fprintf(stderr, "Remove [%s]\n", f->filename);
|
||||
f->remove = 1;
|
||||
}
|
||||
if (!recursive) return;
|
||||
}
|
||||
if (!recursive) return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -345,8 +347,8 @@ static void cpio_backup(const char *orig, struct vector *v) {
|
||||
cpio_rm(1, ".backup", v);
|
||||
|
||||
// Sort both vectors before comparing
|
||||
vec_sort(v, cpio_compare);
|
||||
vec_sort(o, cpio_compare);
|
||||
vec_sort(v, cpio_cmp);
|
||||
vec_sort(o, cpio_cmp);
|
||||
|
||||
// Init the directory and rmlist
|
||||
dir->filename = strdup(".backup");
|
||||
@ -470,6 +472,27 @@ static void cpio_stocksha1(struct vector *v) {
|
||||
}
|
||||
}
|
||||
|
||||
static void cpio_mv(struct vector *v, const char *from, const char *to) {
|
||||
struct cpio_file *f, *t;
|
||||
vec_for_each(v, f) {
|
||||
if (strcmp(f->filename, from) == 0) {
|
||||
fprintf(stderr, "Move [%s] -> [%s]\n", from, to);
|
||||
vec_for_each(v, t) {
|
||||
if (strcmp(t->filename, to) == 0) {
|
||||
t->remove = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
free(f->filename);
|
||||
f->namesize = strlen(to) + 1;
|
||||
f->filename = strdup(to);
|
||||
return;
|
||||
}
|
||||
}
|
||||
fprintf(stderr, "Cannot find entry %s\n", from);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int cpio_commands(const char *command, int argc, char *argv[]) {
|
||||
int recursive = 0, ret = 0;
|
||||
command_t cmd;
|
||||
@ -491,6 +514,8 @@ int cpio_commands(const char *command, int argc, char *argv[]) {
|
||||
++argv;
|
||||
--argc;
|
||||
}
|
||||
} else if (argc == 2 && strcmp(command, "mv") == 0) {
|
||||
cmd = MV;
|
||||
} else if (argc == 2 && strcmp(command, "patch") == 0) {
|
||||
cmd = PATCH;
|
||||
} else if (argc == 2 && strcmp(command, "extract") == 0) {
|
||||
@ -532,6 +557,9 @@ int cpio_commands(const char *command, int argc, char *argv[]) {
|
||||
case ADD:
|
||||
cpio_add(strtoul(argv[0], NULL, 8), argv[1], argv[2], &v);
|
||||
break;
|
||||
case MV:
|
||||
cpio_mv(&v, argv[0], argv[1]);
|
||||
break;
|
||||
case NONE:
|
||||
return 1;
|
||||
}
|
||||
|
@ -52,6 +52,7 @@ typedef enum {
|
||||
RM,
|
||||
MKDIR,
|
||||
ADD,
|
||||
MV,
|
||||
EXTRACT,
|
||||
TEST,
|
||||
PATCH,
|
||||
|
@ -24,6 +24,7 @@ static void usage(char *arg0) {
|
||||
" -rm [-r] <entry>\n Remove entry from <incpio>, flag -r to remove recursively\n"
|
||||
" -mkdir <mode> <entry>\n Create directory as an <entry>\n"
|
||||
" -add <mode> <entry> <infile>\n Add <infile> as an <entry>; replaces <entry> if already exists\n"
|
||||
" -mv <from-entry> <to-entry>\n Move <from-entry> to <to-entry>\n"
|
||||
" -extract <entry> <outfile>\n Extract <entry> to <outfile>\n"
|
||||
" -test \n Return value: 0/not patched 1/Magisk 2/Other (e.g. phh, SuperSU)\n"
|
||||
" -patch <KEEPVERITY> <KEEPFORCEENCRYPT>\n Patch cpio for Magisk. KEEP**** are true/false values\n"
|
||||
|
Loading…
x
Reference in New Issue
Block a user