Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
M
Magisk
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Magisk
Commits
2e25431b
Commit
2e25431b
authored
Dec 03, 2017
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Generalize cpio functions
parent
32c8e752
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
100 additions
and
144 deletions
+100
-144
cpio.h
jni/include/cpio.h
+14
-11
magiskboot.h
jni/magiskboot/magiskboot.h
+0
-14
main.c
jni/magiskboot/main.c
+1
-0
ramdisk.c
jni/magiskboot/ramdisk.c
+20
-49
cpio.c
jni/utils/cpio.c
+65
-70
No files found.
jni/include/cpio.h
View file @
2e25431b
...
@@ -17,7 +17,7 @@ typedef struct cpio_entry {
...
@@ -17,7 +17,7 @@ typedef struct cpio_entry {
// uint32_t devminor;
// uint32_t devminor;
// uint32_t rdevmajor;
// uint32_t rdevmajor;
// uint32_t rdevminor;
// uint32_t rdevminor;
uint32_t
namesize
;
//
uint32_t namesize;
// uint32_t check;
// uint32_t check;
char
*
filename
;
char
*
filename
;
char
*
data
;
char
*
data
;
...
@@ -41,17 +41,20 @@ typedef struct cpio_newc_header {
...
@@ -41,17 +41,20 @@ typedef struct cpio_newc_header {
char
check
[
8
];
char
check
[
8
];
}
cpio_newc_header
;
}
cpio_newc_header
;
void
parse_cpio
(
const
char
*
filename
,
struct
vector
*
v
);
// Basic cpio functions
void
dump_cpio
(
const
char
*
filename
,
struct
vector
*
v
);
void
parse_cpio
(
struct
vector
*
v
,
const
char
*
filename
);
void
dump_cpio
(
struct
vector
*
v
,
const
char
*
filename
);
void
cpio_vec_destroy
(
struct
vector
*
v
);
void
cpio_vec_destroy
(
struct
vector
*
v
);
void
cpio_rm
(
int
recursive
,
const
char
*
entry
,
struct
vector
*
v
);
void
cpio_rm
(
struct
vector
*
v
,
int
recursive
,
const
char
*
entry
);
void
cpio_mkdir
(
mode_t
mode
,
const
char
*
entry
,
struct
vector
*
v
);
void
cpio_mkdir
(
struct
vector
*
v
,
mode_t
mode
,
const
char
*
entry
);
void
cpio_add
(
mode_t
mode
,
const
char
*
entry
,
const
char
*
filename
,
struct
vector
*
v
);
void
cpio_add
(
struct
vector
*
v
,
mode_t
mode
,
const
char
*
entry
,
const
char
*
filename
);
void
cpio_mv
(
struct
vector
*
v
,
const
char
*
from
,
const
char
*
to
);
int
cpio_mv
(
struct
vector
*
v
,
const
char
*
from
,
const
char
*
to
);
void
cpio_test
(
struct
vector
*
v
);
int
cpio_extract
(
struct
vector
*
v
,
const
char
*
entry
,
const
char
*
filename
);
void
cpio_extract
(
const
char
*
entry
,
const
char
*
filename
,
struct
vector
*
v
);
void
cpio_backup
(
const
char
*
orig
,
const
char
*
sha1
,
struct
vector
*
v
);
// Magisk specific
int
cpio_test
(
struct
vector
*
v
);
void
cpio_backup
(
struct
vector
*
v
,
const
char
*
orig
,
const
char
*
sha1
);
int
cpio_restore
(
struct
vector
*
v
);
int
cpio_restore
(
struct
vector
*
v
);
void
cpio_stocksha1
(
struct
vector
*
v
);
char
*
cpio_stocksha1
(
struct
vector
*
v
);
#endif
#endif
jni/magiskboot/magiskboot.h
View file @
2e25431b
...
@@ -32,18 +32,4 @@ size_t lz4_legacy(int mode, int fd, const void *buf, size_t size);
...
@@ -32,18 +32,4 @@ size_t lz4_legacy(int mode, int fd, const void *buf, size_t size);
long
long
comp
(
file_t
type
,
int
to
,
const
void
*
from
,
size_t
size
);
long
long
comp
(
file_t
type
,
int
to
,
const
void
*
from
,
size_t
size
);
long
long
decomp
(
file_t
type
,
int
to
,
const
void
*
from
,
size_t
size
);
long
long
decomp
(
file_t
type
,
int
to
,
const
void
*
from
,
size_t
size
);
typedef
enum
{
NONE
,
RM
,
MKDIR
,
ADD
,
MV
,
EXTRACT
,
TEST
,
PATCH
,
BACKUP
,
RESTORE
,
STOCKSHA1
}
command_t
;
#endif
#endif
jni/magiskboot/main.c
View file @
2e25431b
...
@@ -96,6 +96,7 @@ static void usage(char *arg0) {
...
@@ -96,6 +96,7 @@ static void usage(char *arg0) {
int
main
(
int
argc
,
char
*
argv
[])
{
int
main
(
int
argc
,
char
*
argv
[])
{
fprintf
(
stderr
,
"MagiskBoot v"
xstr
(
MAGISK_VERSION
)
"("
xstr
(
MAGISK_VER_CODE
)
") (by topjohnwu) - Boot Image Modification Tool
\n\n
"
);
fprintf
(
stderr
,
"MagiskBoot v"
xstr
(
MAGISK_VERSION
)
"("
xstr
(
MAGISK_VER_CODE
)
") (by topjohnwu) - Boot Image Modification Tool
\n\n
"
);
umask
(
0
);
if
(
argc
>
1
&&
strcmp
(
argv
[
1
],
"--cleanup"
)
==
0
)
{
if
(
argc
>
1
&&
strcmp
(
argv
[
1
],
"--cleanup"
)
==
0
)
{
fprintf
(
stderr
,
"Cleaning up...
\n\n
"
);
fprintf
(
stderr
,
"Cleaning up...
\n\n
"
);
char
name
[
PATH_MAX
];
char
name
[
PATH_MAX
];
...
...
jni/magiskboot/ramdisk.c
View file @
2e25431b
...
@@ -71,76 +71,47 @@ void cpio_patch(struct vector *v, int keepverity, int keepforceencrypt) {
...
@@ -71,76 +71,47 @@ void cpio_patch(struct vector *v, int keepverity, int keepforceencrypt) {
}
}
int
cpio_commands
(
const
char
*
command
,
int
argc
,
char
*
argv
[])
{
int
cpio_commands
(
const
char
*
command
,
int
argc
,
char
*
argv
[])
{
int
recursive
=
0
,
ret
=
0
;
int
ret
=
0
;
command_t
cmd
;
char
*
incpio
=
argv
[
0
];
char
*
incpio
=
argv
[
0
];
++
argv
;
++
argv
;
--
argc
;
--
argc
;
struct
vector
v
;
vec_init
(
&
v
);
parse_cpio
(
&
v
,
incpio
);
if
(
strcmp
(
command
,
"test"
)
==
0
)
{
if
(
strcmp
(
command
,
"test"
)
==
0
)
{
cmd
=
TEST
;
return
cpio_test
(
&
v
)
;
}
else
if
(
strcmp
(
command
,
"restore"
)
==
0
)
{
}
else
if
(
strcmp
(
command
,
"restore"
)
==
0
)
{
cmd
=
RESTORE
;
ret
=
cpio_restore
(
&
v
)
;
}
else
if
(
strcmp
(
command
,
"stocksha1"
)
==
0
)
{
}
else
if
(
strcmp
(
command
,
"stocksha1"
)
==
0
)
{
cmd
=
STOCKSHA1
;
printf
(
"%s
\n
"
,
cpio_stocksha1
(
&
v
));
return
0
;
}
else
if
(
argc
>=
1
&&
strcmp
(
command
,
"backup"
)
==
0
)
{
}
else
if
(
argc
>=
1
&&
strcmp
(
command
,
"backup"
)
==
0
)
{
c
md
=
BACKUP
;
c
pio_backup
(
&
v
,
argv
[
0
],
argc
>
1
?
argv
[
1
]
:
NULL
)
;
}
else
if
(
argc
>
0
&&
strcmp
(
command
,
"rm"
)
==
0
)
{
}
else
if
(
argc
>
0
&&
strcmp
(
command
,
"rm"
)
==
0
)
{
cmd
=
RM
;
int
recursive
=
0
;
if
(
argc
==
2
&&
strcmp
(
argv
[
0
],
"-r"
)
==
0
)
{
if
(
argc
==
2
&&
strcmp
(
argv
[
0
],
"-r"
)
==
0
)
{
recursive
=
1
;
recursive
=
1
;
++
argv
;
++
argv
;
--
argc
;
--
argc
;
}
}
cpio_rm
(
&
v
,
recursive
,
argv
[
0
]);
}
else
if
(
argc
==
2
&&
strcmp
(
command
,
"mv"
)
==
0
)
{
}
else
if
(
argc
==
2
&&
strcmp
(
command
,
"mv"
)
==
0
)
{
cmd
=
MV
;
if
(
cpio_mv
(
&
v
,
argv
[
0
],
argv
[
1
]))
return
1
;
}
else
if
(
argc
==
2
&&
strcmp
(
command
,
"patch"
)
==
0
)
{
}
else
if
(
argc
==
2
&&
strcmp
(
command
,
"patch"
)
==
0
)
{
c
md
=
PATCH
;
c
pio_patch
(
&
v
,
strcmp
(
argv
[
0
],
"true"
)
==
0
,
strcmp
(
argv
[
1
],
"true"
)
==
0
)
;
}
else
if
(
argc
==
2
&&
strcmp
(
command
,
"extract"
)
==
0
)
{
}
else
if
(
argc
==
2
&&
strcmp
(
command
,
"extract"
)
==
0
)
{
cmd
=
EXTRACT
;
return
cpio_extract
(
&
v
,
argv
[
0
],
argv
[
1
])
;
}
else
if
(
argc
==
2
&&
strcmp
(
command
,
"mkdir"
)
==
0
)
{
}
else
if
(
argc
==
2
&&
strcmp
(
command
,
"mkdir"
)
==
0
)
{
c
md
=
MKDIR
;
c
pio_mkdir
(
&
v
,
strtoul
(
argv
[
0
],
NULL
,
8
),
argv
[
1
])
;
}
else
if
(
argc
==
3
&&
strcmp
(
command
,
"add"
)
==
0
)
{
}
else
if
(
argc
==
3
&&
strcmp
(
command
,
"add"
)
==
0
)
{
c
md
=
ADD
;
c
pio_add
(
&
v
,
strtoul
(
argv
[
0
],
NULL
,
8
),
argv
[
1
],
argv
[
2
])
;
}
else
{
}
else
{
cmd
=
NONE
;
}
struct
vector
v
;
vec_init
(
&
v
);
parse_cpio
(
incpio
,
&
v
);
switch
(
cmd
)
{
case
TEST
:
cpio_test
(
&
v
);
break
;
case
RESTORE
:
ret
=
cpio_restore
(
&
v
);
break
;
case
STOCKSHA1
:
cpio_stocksha1
(
&
v
);
return
0
;
case
BACKUP
:
cpio_backup
(
argv
[
0
],
argc
>
1
?
argv
[
1
]
:
NULL
,
&
v
);
case
RM
:
cpio_rm
(
recursive
,
argv
[
0
],
&
v
);
break
;
case
PATCH
:
cpio_patch
(
&
v
,
strcmp
(
argv
[
0
],
"true"
)
==
0
,
strcmp
(
argv
[
1
],
"true"
)
==
0
);
break
;
case
EXTRACT
:
cpio_extract
(
argv
[
0
],
argv
[
1
],
&
v
);
break
;
case
MKDIR
:
cpio_mkdir
(
strtoul
(
argv
[
0
],
NULL
,
8
),
argv
[
1
],
&
v
);
break
;
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
;
return
1
;
}
}
dump_cpio
(
incpio
,
&
v
);
dump_cpio
(
&
v
,
incpio
);
cpio_vec_destroy
(
&
v
);
cpio_vec_destroy
(
&
v
);
exit
(
ret
);
exit
(
ret
);
}
}
jni/utils/cpio.c
View file @
2e25431b
...
@@ -48,9 +48,10 @@ static int cpio_cmp(const void *a, const void *b) {
...
@@ -48,9 +48,10 @@ static int cpio_cmp(const void *a, const void *b) {
}
}
// Parse cpio file to a vector of cpio_entry
// Parse cpio file to a vector of cpio_entry
void
parse_cpio
(
const
char
*
filename
,
struct
vector
*
v
)
{
void
parse_cpio
(
struct
vector
*
v
,
const
char
*
filename
)
{
fprintf
(
stderr
,
"Loading cpio: [%s]
\n\n
"
,
filename
);
fprintf
(
stderr
,
"Loading cpio: [%s]
\n\n
"
,
filename
);
int
fd
=
xopen
(
filename
,
O_RDONLY
);
int
fd
=
open
(
filename
,
O_RDONLY
);
if
(
fd
<
0
)
return
;
cpio_newc_header
header
;
cpio_newc_header
header
;
cpio_entry
*
f
;
cpio_entry
*
f
;
while
(
xxread
(
fd
,
&
header
,
110
)
!=
-
1
)
{
while
(
xxread
(
fd
,
&
header
,
110
)
!=
-
1
)
{
...
@@ -66,10 +67,10 @@ void parse_cpio(const char *filename, struct vector *v) {
...
@@ -66,10 +67,10 @@ void parse_cpio(const char *filename, struct vector *v) {
// f->devminor = x8u(header.devminor);
// f->devminor = x8u(header.devminor);
// f->rdevmajor = x8u(header.rdevmajor);
// f->rdevmajor = x8u(header.rdevmajor);
// f->rdevminor = x8u(header.rdevminor);
// f->rdevminor = x8u(header.rdevminor);
f
->
namesize
=
x8u
(
header
.
namesize
);
uint32_t
namesize
=
x8u
(
header
.
namesize
);
// f->check = x8u(header.check);
// f->check = x8u(header.check);
f
->
filename
=
xmalloc
(
f
->
namesize
);
f
->
filename
=
xmalloc
(
namesize
);
xxread
(
fd
,
f
->
filename
,
f
->
namesize
);
xxread
(
fd
,
f
->
filename
,
namesize
);
file_align
(
fd
,
4
,
0
);
file_align
(
fd
,
4
,
0
);
if
(
strcmp
(
f
->
filename
,
"."
)
==
0
||
strcmp
(
f
->
filename
,
".."
)
==
0
)
{
if
(
strcmp
(
f
->
filename
,
"."
)
==
0
||
strcmp
(
f
->
filename
,
".."
)
==
0
)
{
cpio_free
(
f
);
cpio_free
(
f
);
...
@@ -80,7 +81,7 @@ void parse_cpio(const char *filename, struct vector *v) {
...
@@ -80,7 +81,7 @@ void parse_cpio(const char *filename, struct vector *v) {
break
;
break
;
}
}
if
(
f
->
filesize
)
{
if
(
f
->
filesize
)
{
f
->
data
=
malloc
(
f
->
filesize
);
f
->
data
=
x
malloc
(
f
->
filesize
);
xxread
(
fd
,
f
->
data
,
f
->
filesize
);
xxread
(
fd
,
f
->
data
,
f
->
filesize
);
file_align
(
fd
,
4
,
0
);
file_align
(
fd
,
4
,
0
);
}
}
...
@@ -89,7 +90,7 @@ void parse_cpio(const char *filename, struct vector *v) {
...
@@ -89,7 +90,7 @@ void parse_cpio(const char *filename, struct vector *v) {
close
(
fd
);
close
(
fd
);
}
}
void
dump_cpio
(
const
char
*
filename
,
struct
vector
*
v
)
{
void
dump_cpio
(
struct
vector
*
v
,
const
char
*
filename
)
{
fprintf
(
stderr
,
"
\n
Dump cpio: [%s]
\n\n
"
,
filename
);
fprintf
(
stderr
,
"
\n
Dump cpio: [%s]
\n\n
"
,
filename
);
int
fd
=
creat
(
filename
,
0644
);
int
fd
=
creat
(
filename
,
0644
);
unsigned
inode
=
300000
;
unsigned
inode
=
300000
;
...
@@ -111,11 +112,11 @@ void dump_cpio(const char *filename, struct vector *v) {
...
@@ -111,11 +112,11 @@ void dump_cpio(const char *filename, struct vector *v) {
0
,
// f->devminor
0
,
// f->devminor
0
,
// f->rdevmajor
0
,
// f->rdevmajor
0
,
// f->rdevminor
0
,
// f->rdevminor
f
->
namesize
,
(
uint32_t
)
strlen
(
f
->
filename
)
+
1
,
0
// f->check
0
// f->check
);
);
xwrite
(
fd
,
header
,
110
);
xwrite
(
fd
,
header
,
110
);
xwrite
(
fd
,
f
->
filename
,
f
->
namesize
);
xwrite
(
fd
,
f
->
filename
,
strlen
(
f
->
filename
)
+
1
);
file_align
(
fd
,
4
,
1
);
file_align
(
fd
,
4
,
1
);
if
(
f
->
filesize
)
{
if
(
f
->
filesize
)
{
xwrite
(
fd
,
f
->
data
,
f
->
filesize
);
xwrite
(
fd
,
f
->
data
,
f
->
filesize
);
...
@@ -139,7 +140,7 @@ void cpio_vec_destroy(struct vector *v) {
...
@@ -139,7 +140,7 @@ void cpio_vec_destroy(struct vector *v) {
vec_destroy
(
v
);
vec_destroy
(
v
);
}
}
void
cpio_rm
(
int
recursive
,
const
char
*
entry
,
struct
vector
*
v
)
{
void
cpio_rm
(
struct
vector
*
v
,
int
recursive
,
const
char
*
entry
)
{
cpio_entry
*
f
;
cpio_entry
*
f
;
vec_for_each
(
v
,
f
)
{
vec_for_each
(
v
,
f
)
{
if
(
strncmp
(
f
->
filename
,
entry
,
strlen
(
entry
))
==
0
)
{
if
(
strncmp
(
f
->
filename
,
entry
,
strlen
(
entry
))
==
0
)
{
...
@@ -155,20 +156,18 @@ void cpio_rm(int recursive, const char *entry, struct vector *v) {
...
@@ -155,20 +156,18 @@ void cpio_rm(int recursive, const char *entry, struct vector *v) {
}
}
}
}
void
cpio_mkdir
(
mode_t
mode
,
const
char
*
entry
,
struct
vector
*
v
)
{
void
cpio_mkdir
(
struct
vector
*
v
,
mode_t
mode
,
const
char
*
entry
)
{
cpio_entry
*
f
=
xcalloc
(
sizeof
(
*
f
),
1
);
cpio_entry
*
f
=
xcalloc
(
sizeof
(
*
f
),
1
);
f
->
mode
=
S_IFDIR
|
mode
;
f
->
mode
=
S_IFDIR
|
mode
;
f
->
namesize
=
strlen
(
entry
)
+
1
;
f
->
filename
=
strdup
(
entry
);
f
->
filename
=
strdup
(
entry
);
cpio_vec_insert
(
v
,
f
);
cpio_vec_insert
(
v
,
f
);
fprintf
(
stderr
,
"Create directory [%s] (%04o)
\n
"
,
entry
,
mode
);
fprintf
(
stderr
,
"Create directory [%s] (%04o)
\n
"
,
entry
,
mode
);
}
}
void
cpio_add
(
mode_t
mode
,
const
char
*
entry
,
const
char
*
filename
,
struct
vector
*
v
)
{
void
cpio_add
(
struct
vector
*
v
,
mode_t
mode
,
const
char
*
entry
,
const
char
*
filename
)
{
int
fd
=
xopen
(
filename
,
O_RDONLY
);
int
fd
=
xopen
(
filename
,
O_RDONLY
);
cpio_entry
*
f
=
xcalloc
(
sizeof
(
*
f
),
1
);
cpio_entry
*
f
=
xcalloc
(
sizeof
(
*
f
),
1
);
f
->
mode
=
S_IFREG
|
mode
;
f
->
mode
=
S_IFREG
|
mode
;
f
->
namesize
=
strlen
(
entry
)
+
1
;
f
->
filename
=
strdup
(
entry
);
f
->
filename
=
strdup
(
entry
);
f
->
filesize
=
lseek
(
fd
,
0
,
SEEK_END
);
f
->
filesize
=
lseek
(
fd
,
0
,
SEEK_END
);
lseek
(
fd
,
0
,
SEEK_SET
);
lseek
(
fd
,
0
,
SEEK_SET
);
...
@@ -179,7 +178,7 @@ void cpio_add(mode_t mode, const char *entry, const char *filename, struct vecto
...
@@ -179,7 +178,7 @@ void cpio_add(mode_t mode, const char *entry, const char *filename, struct vecto
fprintf
(
stderr
,
"Add entry [%s] (%04o)
\n
"
,
entry
,
mode
);
fprintf
(
stderr
,
"Add entry [%s] (%04o)
\n
"
,
entry
,
mode
);
}
}
void
cpio_mv
(
struct
vector
*
v
,
const
char
*
from
,
const
char
*
to
)
{
int
cpio_mv
(
struct
vector
*
v
,
const
char
*
from
,
const
char
*
to
)
{
struct
cpio_entry
*
f
,
*
t
;
struct
cpio_entry
*
f
,
*
t
;
vec_for_each
(
v
,
f
)
{
vec_for_each
(
v
,
f
)
{
if
(
strcmp
(
f
->
filename
,
from
)
==
0
)
{
if
(
strcmp
(
f
->
filename
,
from
)
==
0
)
{
...
@@ -191,16 +190,36 @@ void cpio_mv(struct vector *v, const char *from, const char *to) {
...
@@ -191,16 +190,36 @@ void cpio_mv(struct vector *v, const char *from, const char *to) {
}
}
}
}
free
(
f
->
filename
);
free
(
f
->
filename
);
f
->
namesize
=
strlen
(
to
)
+
1
;
f
->
filename
=
strdup
(
to
);
f
->
filename
=
strdup
(
to
);
return
;
return
0
;
}
}
}
}
fprintf
(
stderr
,
"Cannot find entry %s
\n
"
,
from
);
fprintf
(
stderr
,
"Cannot find entry %s
\n
"
,
from
);
exit
(
1
)
;
return
1
;
}
}
void
cpio_test
(
struct
vector
*
v
)
{
int
cpio_extract
(
struct
vector
*
v
,
const
char
*
entry
,
const
char
*
filename
)
{
cpio_entry
*
f
;
vec_for_each
(
v
,
f
)
{
if
(
strcmp
(
f
->
filename
,
entry
)
==
0
)
{
fprintf
(
stderr
,
"Extracting [%s] to [%s]
\n\n
"
,
entry
,
filename
);
unlink
(
filename
);
if
(
S_ISREG
(
f
->
mode
))
{
int
fd
=
creat
(
filename
,
f
->
mode
&
0777
);
xwrite
(
fd
,
f
->
data
,
f
->
filesize
);
fchown
(
fd
,
f
->
uid
,
f
->
gid
);
close
(
fd
);
}
else
if
(
S_ISLNK
(
f
->
mode
))
{
symlink
(
f
->
data
,
filename
);
}
return
0
;
}
}
fprintf
(
stderr
,
"Cannot find the file entry [%s]
\n
"
,
entry
);
return
1
;
}
int
cpio_test
(
struct
vector
*
v
)
{
#define STOCK_BOOT 0x0
#define STOCK_BOOT 0x0
#define MAGISK_PATCH 0x1
#define MAGISK_PATCH 0x1
#define OTHER_PATCH 0x2
#define OTHER_PATCH 0x2
...
@@ -222,74 +241,52 @@ void cpio_test(struct vector *v) {
...
@@ -222,74 +241,52 @@ void cpio_test(struct vector *v) {
}
}
}
}
cpio_vec_destroy
(
v
);
cpio_vec_destroy
(
v
);
exit
(
ret
);
return
ret
;
}
void
cpio_extract
(
const
char
*
entry
,
const
char
*
filename
,
struct
vector
*
v
)
{
cpio_entry
*
f
;
vec_for_each
(
v
,
f
)
{
if
(
strcmp
(
f
->
filename
,
entry
)
==
0
&&
S_ISREG
(
f
->
mode
))
{
fprintf
(
stderr
,
"Extracting [%s] to [%s]
\n\n
"
,
entry
,
filename
);
int
fd
=
creat
(
filename
,
0644
);
xwrite
(
fd
,
f
->
data
,
f
->
filesize
);
fchmod
(
fd
,
f
->
mode
);
fchown
(
fd
,
f
->
uid
,
f
->
gid
);
close
(
fd
);
exit
(
0
);
}
}
LOGE
(
"Cannot find the file entry [%s]
\n
"
,
entry
);
}
}
void
cpio_backup
(
const
char
*
orig
,
const
char
*
sha1
,
struct
vector
*
v
)
{
void
cpio_backup
(
struct
vector
*
v
,
const
char
*
orig
,
const
char
*
sha1
)
{
struct
vector
o_body
,
*
o
=
&
o_body
,
bak
;
struct
vector
o_body
,
*
o
=
&
o_body
,
bak
;
cpio_entry
*
m
,
*
n
,
*
rem
,
*
cksm
;
cpio_entry
*
m
,
*
n
,
*
rem
,
*
cksm
;
char
buf
[
PATH_MAX
];
char
buf
[
PATH_MAX
];
int
res
,
doBak
;
int
res
,
doBak
;
if
(
sha1
)
cksm
=
xcalloc
(
sizeof
(
*
cksm
),
1
);
vec_init
(
o
);
vec_init
(
o
);
vec_init
(
&
bak
);
vec_init
(
&
bak
);
m
=
xcalloc
(
sizeof
(
*
m
),
1
);
m
=
xcalloc
(
sizeof
(
*
m
),
1
);
m
->
filename
=
strdup
(
".backup"
);
m
->
filename
=
strdup
(
".backup"
);
m
->
namesize
=
strlen
(
m
->
filename
)
+
1
;
m
->
mode
=
S_IFDIR
;
m
->
mode
=
S_IFDIR
;
vec_push_back
(
&
bak
,
m
);
vec_push_back
(
&
bak
,
m
);
m
=
xcalloc
(
sizeof
(
*
m
),
1
);
m
=
xcalloc
(
sizeof
(
*
m
),
1
);
m
->
filename
=
strdup
(
".backup/.magisk"
);
m
->
filename
=
strdup
(
".backup/.magisk"
);
m
->
namesize
=
strlen
(
m
->
filename
)
+
1
;
m
->
mode
=
S_IFREG
;
m
->
mode
=
S_IFREG
;
vec_push_back
(
&
bak
,
m
);
vec_push_back
(
&
bak
,
m
);
rem
=
xcalloc
(
sizeof
(
*
rem
),
1
);
rem
=
xcalloc
(
sizeof
(
*
rem
),
1
);
rem
->
filename
=
strdup
(
".backup/.rmlist"
);
rem
->
filename
=
strdup
(
".backup/.rmlist"
);
rem
->
namesize
=
strlen
(
rem
->
filename
)
+
1
;
rem
->
mode
=
S_IFREG
;
rem
->
mode
=
S_IFREG
;
vec_push_back
(
&
bak
,
rem
);
vec_push_back
(
&
bak
,
rem
);
if
(
sha1
)
vec_push_back
(
&
bak
,
cksm
);
parse_cpio
(
orig
,
o
);
// Remove possible backups in original ramdisk
cpio_rm
(
1
,
".backup"
,
o
);
cpio_rm
(
1
,
".backup"
,
v
);
// Sort both vectors before comparing
vec_sort
(
v
,
cpio_cmp
);
vec_sort
(
o
,
cpio_cmp
);
if
(
sha1
)
{
if
(
sha1
)
{
fprintf
(
stderr
,
"Save SHA1: [%s] -> [.backup/.sha1]
\n
"
,
sha1
);
fprintf
(
stderr
,
"Save SHA1: [%s] -> [.backup/.sha1]
\n
"
,
sha1
);
cksm
=
xcalloc
(
sizeof
(
*
cksm
),
1
);
vec_push_back
(
&
bak
,
cksm
);
cksm
->
filename
=
strdup
(
".backup/.sha1"
);
cksm
->
filename
=
strdup
(
".backup/.sha1"
);
cksm
->
namesize
=
strlen
(
cksm
->
filename
)
+
1
;
cksm
->
mode
=
S_IFREG
;
cksm
->
mode
=
S_IFREG
;
cksm
->
data
=
strdup
(
sha1
);
cksm
->
data
=
strdup
(
sha1
);
cksm
->
filesize
=
strlen
(
sha1
)
+
1
;
cksm
->
filesize
=
strlen
(
sha1
)
+
1
;
}
}
parse_cpio
(
o
,
orig
);
// Remove possible backups in original ramdisk
cpio_rm
(
o
,
1
,
".backup"
);
cpio_rm
(
v
,
1
,
".backup"
);
// Sort both vectors before comparing
vec_sort
(
v
,
cpio_cmp
);
vec_sort
(
o
,
cpio_cmp
);
// Start comparing
// Start comparing
size_t
i
=
0
,
j
=
0
;
size_t
i
=
0
,
j
=
0
;
while
(
i
!=
vec_size
(
o
)
||
j
!=
vec_size
(
v
))
{
while
(
i
!=
vec_size
(
o
)
||
j
!=
vec_size
(
v
))
{
...
@@ -322,16 +319,15 @@ void cpio_backup(const char *orig, const char *sha1, struct vector *v) {
...
@@ -322,16 +319,15 @@ void cpio_backup(const char *orig, const char *sha1, struct vector *v) {
// Someting new in ramdisk, record in rem
// Someting new in ramdisk, record in rem
++
j
;
++
j
;
if
(
n
->
remove
)
continue
;
if
(
n
->
remove
)
continue
;
rem
->
data
=
xrealloc
(
rem
->
data
,
rem
->
filesize
+
n
->
namesize
);
rem
->
data
=
xrealloc
(
rem
->
data
,
rem
->
filesize
+
strlen
(
n
->
filename
)
+
1
);
memcpy
(
rem
->
data
+
rem
->
filesize
,
n
->
filename
,
n
->
namesize
);
memcpy
(
rem
->
data
+
rem
->
filesize
,
n
->
filename
,
strlen
(
n
->
filename
)
+
1
);
rem
->
filesize
+=
n
->
namesize
;
rem
->
filesize
+=
strlen
(
n
->
filename
)
+
1
;
fprintf
(
stderr
,
"Record new entry: [%s] -> [.backup/.rmlist]
\n
"
,
n
->
filename
);
fprintf
(
stderr
,
"Record new entry: [%s] -> [.backup/.rmlist]
\n
"
,
n
->
filename
);
}
}
if
(
doBak
)
{
if
(
doBak
)
{
m
->
namesize
+=
8
;
sprintf
(
buf
,
".backup/%s"
,
m
->
filename
);
m
->
filename
=
realloc
(
m
->
filename
,
m
->
namesize
);
free
(
m
->
filename
);
strcpy
(
buf
,
m
->
filename
);
m
->
filename
=
strdup
(
buf
);
sprintf
(
m
->
filename
,
".backup/%s"
,
buf
);
fprintf
(
stderr
,
"[%s] -> [%s]
\n
"
,
buf
,
m
->
filename
);
fprintf
(
stderr
,
"[%s] -> [%s]
\n
"
,
buf
,
m
->
filename
);
vec_push_back
(
&
bak
,
m
);
vec_push_back
(
&
bak
,
m
);
// NULL the original entry, so it won't be freed
// NULL the original entry, so it won't be freed
...
@@ -362,13 +358,12 @@ int cpio_restore(struct vector *v) {
...
@@ -362,13 +358,12 @@ int cpio_restore(struct vector *v) {
if
(
f
->
filename
[
8
]
==
'.'
)
{
if
(
f
->
filename
[
8
]
==
'.'
)
{
if
(
strcmp
(
f
->
filename
,
".backup/.rmlist"
)
==
0
)
{
if
(
strcmp
(
f
->
filename
,
".backup/.rmlist"
)
==
0
)
{
for
(
int
pos
=
0
;
pos
<
f
->
filesize
;
pos
+=
strlen
(
f
->
data
+
pos
)
+
1
)
for
(
int
pos
=
0
;
pos
<
f
->
filesize
;
pos
+=
strlen
(
f
->
data
+
pos
)
+
1
)
cpio_rm
(
0
,
f
->
data
+
pos
,
v
);
cpio_rm
(
v
,
0
,
f
->
data
+
pos
);
}
}
continue
;
continue
;
}
else
{
}
else
{
n
=
xcalloc
(
sizeof
(
*
n
),
1
);
n
=
xcalloc
(
sizeof
(
*
n
),
1
);
memcpy
(
n
,
f
,
sizeof
(
*
f
));
memcpy
(
n
,
f
,
sizeof
(
*
f
));
n
->
namesize
-=
8
;
n
->
filename
=
strdup
(
f
->
filename
+
8
);
n
->
filename
=
strdup
(
f
->
filename
+
8
);
n
->
data
=
f
->
data
;
n
->
data
=
f
->
data
;
f
->
data
=
NULL
;
f
->
data
=
NULL
;
...
@@ -379,13 +374,13 @@ int cpio_restore(struct vector *v) {
...
@@ -379,13 +374,13 @@ int cpio_restore(struct vector *v) {
}
}
}
}
// Some known stuff we can remove
// Some known stuff we can remove
cpio_rm
(
0
,
"sbin/magic_mask.sh"
,
v
);
cpio_rm
(
v
,
0
,
"sbin/magic_mask.sh"
);
cpio_rm
(
0
,
"init.magisk.rc"
,
v
);
cpio_rm
(
v
,
0
,
"init.magisk.rc"
);
cpio_rm
(
0
,
"magisk"
,
v
);
cpio_rm
(
v
,
0
,
"magisk"
);
return
ret
;
return
ret
;
}
}
void
cpio_stocksha1
(
struct
vector
*
v
)
{
char
*
cpio_stocksha1
(
struct
vector
*
v
)
{
cpio_entry
*
f
;
cpio_entry
*
f
;
char
sha1
[
41
];
char
sha1
[
41
];
vec_for_each
(
v
,
f
)
{
vec_for_each
(
v
,
f
)
{
...
@@ -396,12 +391,12 @@ void cpio_stocksha1(struct vector *v) {
...
@@ -396,12 +391,12 @@ void cpio_stocksha1(struct vector *v) {
pos
+=
12
;
pos
+=
12
;
memcpy
(
sha1
,
pos
,
40
);
memcpy
(
sha1
,
pos
,
40
);
sha1
[
40
]
=
'\0'
;
sha1
[
40
]
=
'\0'
;
printf
(
"%s
\n
"
,
sha1
);
return
strdup
(
sha1
);
return
;
}
}
}
}
}
else
if
(
strcmp
(
f
->
filename
,
".backup/.sha1"
)
==
0
)
{
}
else
if
(
strcmp
(
f
->
filename
,
".backup/.sha1"
)
==
0
)
{
printf
(
"%s
\n
"
,
f
->
data
)
;
return
f
->
data
;
}
}
}
}
return
NULL
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment