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
bf650332
Commit
bf650332
authored
Nov 04, 2020
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update nanopb
parent
f32e0af8
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
127 additions
and
162 deletions
+127
-162
nanopb
native/jni/external/nanopb
+1
-1
resetprop.hpp
native/jni/include/resetprop.hpp
+1
-1
_resetprop.hpp
native/jni/resetprop/_resetprop.hpp
+15
-26
persist_properties.cpp
native/jni/resetprop/persist_properties.cpp
+67
-96
resetprop.cpp
native/jni/resetprop/resetprop.cpp
+43
-38
No files found.
nanopb
@
1466e6f9
Subproject commit
3c69a905b16df149e1bda12f25e0522073a24678
Subproject commit
1466e6f953835b191a7f5acf0c06c941d4cd33d9
native/jni/include/resetprop.hpp
View file @
bf650332
...
@@ -8,4 +8,4 @@ std::string getprop(const char *name, bool persist = false);
...
@@ -8,4 +8,4 @@ std::string getprop(const char *name, bool persist = false);
void
getprops
(
void
(
*
callback
)(
const
char
*
,
const
char
*
,
void
*
),
void
getprops
(
void
(
*
callback
)(
const
char
*
,
const
char
*
,
void
*
),
void
*
cookie
=
nullptr
,
bool
persist
=
false
);
void
*
cookie
=
nullptr
,
bool
persist
=
false
);
int
delprop
(
const
char
*
name
,
bool
persist
=
false
);
int
delprop
(
const
char
*
name
,
bool
persist
=
false
);
void
load_prop_file
(
const
char
*
filename
,
bool
trigger
=
true
);
void
load_prop_file
(
const
char
*
filename
,
bool
prop_svc
=
true
);
native/jni/resetprop/_resetprop.hpp
View file @
bf650332
...
@@ -8,41 +8,30 @@
...
@@ -8,41 +8,30 @@
#define PERSISTENT_PROPERTY_DIR "/data/property"
#define PERSISTENT_PROPERTY_DIR "/data/property"
struct
prop_cb
{
struct
prop_cb
{
virtual
void
exec
(
const
char
*
name
,
const
char
*
value
)
=
0
;
virtual
void
exec
(
const
char
*
name
,
const
char
*
value
)
{
exec
(
std
::
string
(
name
),
value
);
}
virtual
void
exec
(
std
::
string
&&
name
,
const
char
*
value
)
{
exec
(
name
.
data
(),
value
);
}
};
};
template
<
class
T
>
extern
bool
use_pb
;
struct
prop_cb_impl
:
public
prop_cb
{
typedef
void
(
*
callback_type
)(
const
char
*
,
const
char
*
,
T
&
);
#pragma GCC diagnostic push
using
prop_list
=
std
::
map
<
std
::
string
,
std
::
string
>
;
#pragma GCC diagnostic ignored "-Wdangling-field" // Dangling field is expected
prop_cb_impl
(
T
&
arg
,
callback_type
fn
)
:
arg
(
arg
),
fn
(
fn
)
{}
#pragma GCC diagnostic pop
struct
prop_collector
:
prop_cb
{
explicit
prop_collector
(
prop_list
&
list
)
:
list
(
list
)
{}
void
exec
(
const
char
*
name
,
const
char
*
value
)
override
{
void
exec
(
const
char
*
name
,
const
char
*
value
)
override
{
fn
(
name
,
value
,
arg
);
list
.
insert_or_assign
(
name
,
value
);
}
void
exec
(
std
::
string
&&
name
,
const
char
*
value
)
override
{
list
.
insert_or_assign
(
std
::
move
(
name
),
value
);
}
}
private
:
private
:
T
&
arg
;
prop_list
&
list
;
callback_type
fn
;
};
extern
bool
use_pb
;
using
prop_list
=
std
::
map
<
std
::
string_view
,
std
::
string
>
;
struct
prop_collector
:
prop_cb_impl
<
prop_list
>
{
prop_collector
(
prop_list
&
list
)
:
prop_cb_impl
<
prop_list
>
(
list
,
[](
auto
name
,
auto
val
,
auto
list
){
list
.
emplace
(
name
,
val
);
})
{}
};
};
template
<
class
T
,
class
Func
>
prop_cb_impl
<
T
>
make_prop_cb
(
T
&
arg
,
Func
f
)
{
return
prop_cb_impl
<
T
>
(
arg
,
f
);
}
std
::
string
persist_getprop
(
const
char
*
name
);
std
::
string
persist_getprop
(
const
char
*
name
);
void
persist_getprops
(
prop_cb
*
prop_cb
);
void
persist_getprops
(
prop_cb
*
prop_cb
);
bool
persist_deleteprop
(
const
char
*
name
);
bool
persist_deleteprop
(
const
char
*
name
);
void
persist_cleanup
();
native/jni/resetprop/persist_properties.cpp
View file @
bf650332
#include <stdbool.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <vector>
#include <pb.h>
#include <pb.h>
#include <pb_decode.h>
#include <pb_decode.h>
#include <pb_encode.h>
#include <pb_encode.h>
#include <utils.hpp>
#include <utils.hpp>
#include "_resetprop.hpp"
#include "_resetprop.hpp"
...
@@ -16,34 +9,28 @@
...
@@ -16,34 +9,28 @@
using
namespace
std
;
using
namespace
std
;
/* ***********************************************************************
/* ***********************************************************************
* Auto generated header and constant definitions compiled from
* Auto generated header and field definitions compiled from
* android/platform/system/core/master/init/persistent_properties.proto
* https://android.googlesource.com/platform/system/core/+/master/init/persistent_properties.proto
* using Nanopb's protoc
* Generated with Nanopb: https://github.com/nanopb/nanopb
* Nanopb: https://github.com/nanopb/nanopb
* ***********************************************************************/
* ***********************************************************************/
/* Automatically generated nanopb header */
/* Automatically generated nanopb header */
/* Generated by nanopb-0.
3.9.1 at Sun Apr 22 14:36:22 2018.
*/
/* Generated by nanopb-0.
4.3
*/
/* @@protoc_insertion_point(includes) */
#if PB_PROTO_HEADER_VERSION != 40
#if PB_PROTO_HEADER_VERSION != 30
#error Regenerate this file with the current version of nanopb generator.
#error Regenerate this file with the current version of nanopb generator.
#endif
#endif
/* Struct definitions */
/* Struct definitions */
typedef
struct
_PersistentProperties
{
struct
PersistentProperties
{
pb_callback_t
properties
;
pb_callback_t
properties
;
/* @@protoc_insertion_point(struct:PersistentProperties) */
};
}
PersistentProperties
;
typedef
struct
_PersistentProperties_PersistentPropertyRecord
{
pb_callback_t
name
;
bool
has_value
;
char
value
[
92
];
/* @@protoc_insertion_point(struct:PersistentProperties_PersistentPropertyRecord) */
}
PersistentProperties_PersistentPropertyRecord
;
/* Default values for struct fields */
struct
PersistentProperties_PersistentPropertyRecord
{
pb_callback_t
name
;
bool
has_value
;
char
value
[
92
];
};
/* Initializer values for message structs */
/* Initializer values for message structs */
#define PersistentProperties_init_default {{{NULL}, NULL}}
#define PersistentProperties_init_default {{{NULL}, NULL}}
...
@@ -56,33 +43,33 @@ typedef struct _PersistentProperties_PersistentPropertyRecord {
...
@@ -56,33 +43,33 @@ typedef struct _PersistentProperties_PersistentPropertyRecord {
#define PersistentProperties_PersistentPropertyRecord_name_tag 1
#define PersistentProperties_PersistentPropertyRecord_name_tag 1
#define PersistentProperties_PersistentPropertyRecord_value_tag 2
#define PersistentProperties_PersistentPropertyRecord_value_tag 2
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.3.9.1 at Sun Apr 22 14:36:22 2018. */
/* Struct field encoding specification for nanopb */
/* Struct field encoding specification for nanopb */
const
pb_field_t
PersistentProperties_PersistentPropertyRecord_fields
[
3
]
=
{
#define PersistentProperties_FIELDLIST(X, a) \
PB_FIELD
(
1
,
STRING
,
OPTIONAL
,
CALLBACK
,
FIRST
,
PersistentProperties_PersistentPropertyRecord
,
name
,
name
,
0
),
X(a, CALLBACK, REPEATED, MESSAGE, properties, 1)
PB_FIELD
(
2
,
STRING
,
OPTIONAL
,
STATIC
,
OTHER
,
PersistentProperties_PersistentPropertyRecord
,
value
,
name
,
0
),
#define PersistentProperties_CALLBACK pb_default_field_callback
PB_LAST_FIELD
#define PersistentProperties_DEFAULT NULL
};
#define PersistentProperties_properties_MSGTYPE PersistentProperties_PersistentPropertyRecord
const
pb_field_t
PersistentProperties_fields
[
2
]
=
{
#define PersistentProperties_PersistentPropertyRecord_FIELDLIST(X, a) \
PB_FIELD
(
1
,
MESSAGE
,
REPEATED
,
CALLBACK
,
FIRST
,
PersistentProperties
,
properties
,
properties
,
&
PersistentProperties_PersistentPropertyRecord_fields
),
X(a, CALLBACK, OPTIONAL, STRING, name, 1) \
PB_LAST_FIELD
X(a, STATIC, OPTIONAL, STRING, value, 2)
};
#define PersistentProperties_PersistentPropertyRecord_CALLBACK pb_default_field_callback
#define PersistentProperties_PersistentPropertyRecord_DEFAULT NULL
extern
const
pb_msgdesc_t
PersistentProperties_msg
;
extern
const
pb_msgdesc_t
PersistentProperties_PersistentPropertyRecord_msg
;
/* Defines for backwards compatibility with code written before nanopb-0.4.0 */
#define PersistentProperties_fields &PersistentProperties_msg
#define PersistentProperties_PersistentPropertyRecord_fields &PersistentProperties_PersistentPropertyRecord_msg
/* Maximum encoded size of messages (where known) */
/* Maximum encoded size of messages (where known) */
/* PersistentProperties_size depends on runtime parameters */
/* PersistentProperties_size depends on runtime parameters */
/* PersistentProperties_PersistentPropertyRecord_size depends on runtime parameters */
/* PersistentProperties_PersistentPropertyRecord_size depends on runtime parameters */
/* Message IDs (where set with "msgid" option) */
PB_BIND
(
PersistentProperties
,
PersistentProperties
,
AUTO
)
#ifdef PB_MSGID
#define PROPS_MESSAGES \
#endif
/* @@protoc_insertion_point(eof) */
PB_BIND
(
PersistentProperties_PersistentPropertyRecord
,
PersistentProperties_PersistentPropertyRecord
,
AUTO
)
/* ***************************
/* ***************************
* End of auto generated code
* End of auto generated code
...
@@ -90,27 +77,10 @@ const pb_field_t PersistentProperties_fields[2] = {
...
@@ -90,27 +77,10 @@ const pb_field_t PersistentProperties_fields[2] = {
bool
use_pb
=
false
;
bool
use_pb
=
false
;
#ifdef APPLET_STUB_MAIN
struct
{
void
push_back
(...){};
}
allocs
;
void
persist_cleanup
(){}
#else
static
thread_local
vector
<
void
*>
allocs
;
void
persist_cleanup
()
{
std
::
for_each
(
allocs
.
begin
(),
allocs
.
end
(),
[](
auto
p
){
free
(
p
);
});
allocs
.
clear
();
}
#endif
static
bool
name_decode
(
pb_istream_t
*
stream
,
const
pb_field_t
*
field
,
void
**
arg
)
{
static
bool
name_decode
(
pb_istream_t
*
stream
,
const
pb_field_t
*
field
,
void
**
arg
)
{
auto
name
=
(
pb_byte_t
*
)
malloc
(
stream
->
bytes_left
+
1
);
string
&
name
=
*
static_cast
<
string
*>
(
*
arg
);
allocs
.
push_back
(
name
);
/* Record all mallocs to cleanup */
name
.
resize
(
stream
->
bytes_left
);
name
[
stream
->
bytes_left
]
=
'\0'
;
return
pb_read
(
stream
,
(
pb_byte_t
*
)(
name
.
data
()),
stream
->
bytes_left
);
if
(
!
pb_read
(
stream
,
name
,
stream
->
bytes_left
))
return
false
;
*
arg
=
name
;
return
true
;
}
}
static
bool
name_encode
(
pb_ostream_t
*
stream
,
const
pb_field_t
*
field
,
void
*
const
*
arg
)
{
static
bool
name_encode
(
pb_ostream_t
*
stream
,
const
pb_field_t
*
field
,
void
*
const
*
arg
)
{
...
@@ -119,25 +89,28 @@ static bool name_encode(pb_ostream_t *stream, const pb_field_t *field, void * co
...
@@ -119,25 +89,28 @@ static bool name_encode(pb_ostream_t *stream, const pb_field_t *field, void * co
}
}
static
bool
prop_decode
(
pb_istream_t
*
stream
,
const
pb_field_t
*
field
,
void
**
arg
)
{
static
bool
prop_decode
(
pb_istream_t
*
stream
,
const
pb_field_t
*
field
,
void
**
arg
)
{
PersistentProperties_PersistentPropertyRecord
prop
=
{};
PersistentProperties_PersistentPropertyRecord
prop
{};
string
name
;
prop
.
name
.
funcs
.
decode
=
name_decode
;
prop
.
name
.
funcs
.
decode
=
name_decode
;
if
(
!
pb_decode
(
stream
,
PersistentProperties_PersistentPropertyRecord_fields
,
&
prop
))
prop
.
name
.
arg
=
&
name
;
if
(
!
pb_decode
(
stream
,
&
PersistentProperties_PersistentPropertyRecord_msg
,
&
prop
))
return
false
;
return
false
;
reinterpret_cast
<
prop_cb
*>
(
*
arg
)
->
exec
((
const
char
*
)
prop
.
name
.
arg
,
prop
.
value
);
auto
cb
=
reinterpret_cast
<
prop_cb
*>
(
*
arg
);
cb
->
exec
(
std
::
move
(
name
),
prop
.
value
);
return
true
;
return
true
;
}
}
static
bool
prop_encode
(
pb_ostream_t
*
stream
,
const
pb_field_t
*
field
,
void
*
const
*
arg
)
{
static
bool
prop_encode
(
pb_ostream_t
*
stream
,
const
pb_field_t
*
field
,
void
*
const
*
arg
)
{
PersistentProperties_PersistentPropertyRecord
prop
=
{};
PersistentProperties_PersistentPropertyRecord
prop
{};
prop
.
name
.
funcs
.
encode
=
name_encode
;
prop
.
name
.
funcs
.
encode
=
name_encode
;
prop
.
has_value
=
true
;
prop
.
has_value
=
true
;
auto
&
list
=
*
(
prop_list
*
)
*
arg
;
auto
&
list
=
*
static_cast
<
prop_list
*>
(
*
arg
)
;
for
(
auto
&
p
:
list
)
{
for
(
auto
&
p
:
list
)
{
if
(
!
pb_encode_tag_for_field
(
stream
,
field
))
if
(
!
pb_encode_tag_for_field
(
stream
,
field
))
return
false
;
return
false
;
prop
.
name
.
arg
=
(
void
*
)
p
.
first
.
data
();
prop
.
name
.
arg
=
(
void
*
)
p
.
first
.
data
();
strcpy
(
prop
.
value
,
p
.
second
.
data
());
strcpy
(
prop
.
value
,
p
.
second
.
data
());
if
(
!
pb_encode_submessage
(
stream
,
PersistentProperties_PersistentPropertyRecord_fields
,
&
prop
))
if
(
!
pb_encode_submessage
(
stream
,
&
PersistentProperties_PersistentPropertyRecord_msg
,
&
prop
))
return
false
;
return
false
;
}
}
return
true
;
return
true
;
...
@@ -168,18 +141,18 @@ static void pb_getprop(prop_cb *prop_cb) {
...
@@ -168,18 +141,18 @@ static void pb_getprop(prop_cb *prop_cb) {
size_t
size
;
size_t
size
;
mmap_ro
(
PERSISTENT_PROPERTY_DIR
"/persistent_properties"
,
buf
,
size
);
mmap_ro
(
PERSISTENT_PROPERTY_DIR
"/persistent_properties"
,
buf
,
size
);
pb_istream_t
stream
=
pb_istream_from_buffer
(
buf
,
size
);
pb_istream_t
stream
=
pb_istream_from_buffer
(
buf
,
size
);
pb_decode
(
&
stream
,
PersistentProperties_fields
,
&
props
);
pb_decode
(
&
stream
,
&
PersistentProperties_msg
,
&
props
);
munmap
(
buf
,
size
);
munmap
(
buf
,
size
);
}
}
static
bool
file_getprop
(
const
char
*
name
,
char
*
value
)
{
static
bool
file_getprop
(
const
char
*
name
,
char
*
value
)
{
char
path
[
PATH_MAX
];
char
path
[
4096
];
snprintf
(
path
,
sizeof
(
path
),
PERSISTENT_PROPERTY_DIR
"/%s"
,
name
);
snprintf
(
path
,
sizeof
(
path
),
PERSISTENT_PROPERTY_DIR
"/%s"
,
name
);
int
fd
=
open
(
path
,
O_RDONLY
|
O_CLOEXEC
);
int
fd
=
open
(
path
,
O_RDONLY
|
O_CLOEXEC
);
if
(
fd
<
0
)
if
(
fd
<
0
)
return
false
;
return
false
;
LOGD
(
"resetprop: read prop from [%s]
\n
"
,
path
);
LOGD
(
"resetprop: read prop from [%s]
\n
"
,
path
);
value
[
read
(
fd
,
value
,
PROP_VALUE_MAX
)]
=
'\0'
;
// Null terminate the read value
value
[
read
(
fd
,
value
,
PROP_VALUE_MAX
-
1
)]
=
'\0'
;
// Null terminate the read value
close
(
fd
);
close
(
fd
);
return
value
[
0
]
!=
'\0'
;
return
value
[
0
]
!=
'\0'
;
}
}
...
@@ -188,11 +161,9 @@ void persist_getprops(prop_cb *prop_cb) {
...
@@ -188,11 +161,9 @@ void persist_getprops(prop_cb *prop_cb) {
if
(
use_pb
)
{
if
(
use_pb
)
{
pb_getprop
(
prop_cb
);
pb_getprop
(
prop_cb
);
}
else
{
}
else
{
DIR
*
dir
=
opendir
(
PERSISTENT_PROPERTY_DIR
);
auto
dir
=
open_dir
(
PERSISTENT_PROPERTY_DIR
);
struct
dirent
*
entry
;
if
(
!
dir
)
return
;
while
((
entry
=
readdir
(
dir
)))
{
for
(
dirent
*
entry
;
(
entry
=
xreaddir
(
dir
.
get
()));)
{
if
(
strcmp
(
entry
->
d_name
,
"."
)
==
0
||
strcmp
(
entry
->
d_name
,
".."
)
==
0
)
continue
;
char
value
[
PROP_VALUE_MAX
];
char
value
[
PROP_VALUE_MAX
];
if
(
file_getprop
(
entry
->
d_name
,
value
))
if
(
file_getprop
(
entry
->
d_name
,
value
))
prop_cb
->
exec
(
entry
->
d_name
,
value
);
prop_cb
->
exec
(
entry
->
d_name
,
value
);
...
@@ -200,20 +171,21 @@ void persist_getprops(prop_cb *prop_cb) {
...
@@ -200,20 +171,21 @@ void persist_getprops(prop_cb *prop_cb) {
}
}
}
}
struct
match_prop_name
:
prop_cb
{
explicit
match_prop_name
(
const
char
*
name
)
:
_name
(
name
)
{
value
[
0
]
=
'\0'
;
}
void
exec
(
string
&&
name
,
const
char
*
val
)
override
{
if
(
name
==
_name
)
strcpy
(
value
,
val
);
}
char
value
[
PROP_VALUE_MAX
];
private
:
const
char
*
_name
;
};
string
persist_getprop
(
const
char
*
name
)
{
string
persist_getprop
(
const
char
*
name
)
{
if
(
use_pb
)
{
if
(
use_pb
)
{
run_finally
f
([]{
persist_cleanup
();
});
auto
prop
=
match_prop_name
(
name
);
struct
{
pb_getprop
(
&
prop
);
const
char
*
name
;
char
value
[
PROP_VALUE_MAX
];
}
prop
;
prop
.
name
=
name
;
prop
.
value
[
0
]
=
'\0'
;
auto
reader
=
make_prop_cb
(
prop
,
[](
auto
name
,
auto
value
,
auto
prop
)
{
if
(
strcmp
(
name
,
prop
.
name
)
==
0
)
strcpy
(
prop
.
value
,
value
);
});
pb_getprop
(
&
reader
);
if
(
prop
.
value
[
0
])
if
(
prop
.
value
[
0
])
return
prop
.
value
;
return
prop
.
value
;
}
else
{
}
else
{
...
@@ -227,7 +199,6 @@ string persist_getprop(const char *name) {
...
@@ -227,7 +199,6 @@ string persist_getprop(const char *name) {
bool
persist_deleteprop
(
const
char
*
name
)
{
bool
persist_deleteprop
(
const
char
*
name
)
{
if
(
use_pb
)
{
if
(
use_pb
)
{
run_finally
f
([]{
persist_cleanup
();
});
prop_list
list
;
prop_list
list
;
prop_collector
collector
(
list
);
prop_collector
collector
(
list
);
persist_getprops
(
&
collector
);
persist_getprops
(
&
collector
);
...
@@ -236,14 +207,14 @@ bool persist_deleteprop(const char *name) {
...
@@ -236,14 +207,14 @@ bool persist_deleteprop(const char *name) {
if
(
it
->
first
==
name
)
{
if
(
it
->
first
==
name
)
{
list
.
erase
(
it
);
list
.
erase
(
it
);
// Dump the props back
// Dump the props back
PersistentProperties
props
=
PersistentProperties_init_zero
;
PersistentProperties
props
{}
;
pb_ostream_t
ostream
=
create_ostream
(
PERSISTENT_PROPERTY_DIR
pb_ostream_t
ostream
=
create_ostream
(
PERSISTENT_PROPERTY_DIR
"/persistent_properties.tmp"
);
"/persistent_properties.tmp"
);
props
.
properties
.
funcs
.
encode
=
prop_encode
;
props
.
properties
.
funcs
.
encode
=
prop_encode
;
props
.
properties
.
arg
=
&
list
;
props
.
properties
.
arg
=
&
list
;
LOGD
(
"resetprop: encode with protobuf ["
PERSISTENT_PROPERTY_DIR
LOGD
(
"resetprop: encode with protobuf ["
PERSISTENT_PROPERTY_DIR
"/persistent_properties.tmp]
\n
"
);
"/persistent_properties.tmp]
\n
"
);
if
(
!
pb_encode
(
&
ostream
,
PersistentProperties_fields
,
&
props
))
if
(
!
pb_encode
(
&
ostream
,
&
PersistentProperties_msg
,
&
props
))
return
false
;
return
false
;
clone_attr
(
PERSISTENT_PROPERTY_DIR
"/persistent_properties"
,
clone_attr
(
PERSISTENT_PROPERTY_DIR
"/persistent_properties"
,
PERSISTENT_PROPERTY_DIR
"/persistent_properties.tmp"
);
PERSISTENT_PROPERTY_DIR
"/persistent_properties.tmp"
);
...
@@ -254,7 +225,7 @@ bool persist_deleteprop(const char *name) {
...
@@ -254,7 +225,7 @@ bool persist_deleteprop(const char *name) {
}
}
return
false
;
return
false
;
}
else
{
}
else
{
char
path
[
PATH_MAX
];
char
path
[
4096
];
snprintf
(
path
,
sizeof
(
path
),
PERSISTENT_PROPERTY_DIR
"/%s"
,
name
);
snprintf
(
path
,
sizeof
(
path
),
PERSISTENT_PROPERTY_DIR
"/%s"
,
name
);
if
(
unlink
(
path
)
==
0
)
{
if
(
unlink
(
path
)
==
0
)
{
LOGD
(
"resetprop: unlink [%s]
\n
"
,
path
);
LOGD
(
"resetprop: unlink [%s]
\n
"
,
path
);
...
...
native/jni/resetprop/resetprop.cpp
View file @
bf650332
...
@@ -67,25 +67,25 @@ static bool check_legal_property_name(const char *name) {
...
@@ -67,25 +67,25 @@ static bool check_legal_property_name(const char *name) {
return
true
;
return
true
;
illegal
:
illegal
:
LOGE
(
"Illegal property name: [%s]
\n
"
,
name
);
LOGE
(
"Illegal property name: [%s]
\n
"
,
name
);
return
false
;
return
false
;
}
}
static
void
read_prop
(
const
prop_info
*
pi
,
void
*
cb
)
{
static
void
read_prop
(
const
prop_info
*
pi
,
void
*
cb
)
{
__system_property_read_callback
(
auto
callback
=
[](
void
*
cb
,
const
char
*
name
,
const
char
*
value
,
uint32_t
)
{
pi
,
[](
auto
cb
,
auto
name
,
auto
value
,
auto
)
{
static_cast
<
prop_cb
*>
(
cb
)
->
exec
(
name
,
value
);
reinterpret_cast
<
prop_cb
*>
(
cb
)
->
exec
(
name
,
value
)
;
}
;
}
,
cb
);
__system_property_read_callback
(
pi
,
callback
,
cb
);
}
}
static
void
print_props
(
bool
persist
)
{
static
void
print_props
(
bool
persist
)
{
getprops
([](
auto
name
,
auto
value
,
auto
)
{
getprops
([](
const
char
*
name
,
const
char
*
value
,
auto
)
{
printf
(
"[%s]: [%s]
\n
"
,
name
,
value
);
printf
(
"[%s]: [%s]
\n
"
,
name
,
value
);
},
nullptr
,
persist
);
},
nullptr
,
persist
);
}
}
struct
sysprop
{
struct
sysprop
_stub
{
virtual
int
setprop
(
const
char
*
name
,
const
char
*
value
,
bool
trigger
)
{
return
1
;
}
virtual
int
setprop
(
const
char
*
name
,
const
char
*
value
,
bool
trigger
)
{
return
1
;
}
virtual
string
getprop
(
const
char
*
name
,
bool
persist
)
{
return
""
;
}
virtual
string
getprop
(
const
char
*
name
,
bool
persist
)
{
return
""
;
}
virtual
void
getprops
(
void
(
*
callback
)(
const
char
*
,
const
char
*
,
void
*
),
virtual
void
getprops
(
void
(
*
callback
)(
const
char
*
,
const
char
*
,
void
*
),
...
@@ -93,7 +93,7 @@ struct sysprop {
...
@@ -93,7 +93,7 @@ struct sysprop {
virtual
int
delprop
(
const
char
*
name
,
bool
persist
)
{
return
1
;
}
virtual
int
delprop
(
const
char
*
name
,
bool
persist
)
{
return
1
;
}
};
};
struct
s
tock_sysprop
:
public
sysprop
{
struct
s
ysprop
:
public
sysprop_stub
{
int
setprop
(
const
char
*
name
,
const
char
*
value
,
bool
)
override
{
int
setprop
(
const
char
*
name
,
const
char
*
value
,
bool
)
override
{
return
system_property_set
(
name
,
value
);
return
system_property_set
(
name
,
value
);
}
}
...
@@ -105,31 +105,30 @@ struct stock_sysprop : public sysprop {
...
@@ -105,31 +105,30 @@ struct stock_sysprop : public sysprop {
}
}
};
};
struct
resetprop
:
public
sysprop
{
struct
resetprop
:
public
sysprop
_stub
{
int
setprop
(
const
char
*
name
,
const
char
*
value
,
bool
trigger
)
override
{
int
setprop
(
const
char
*
name
,
const
char
*
value
,
bool
prop_svc
)
override
{
if
(
!
check_legal_property_name
(
name
))
if
(
!
check_legal_property_name
(
name
))
return
1
;
return
1
;
const
char
*
msg
=
prop_svc
?
"property_service"
:
"modifying prop data structure"
;
int
ret
;
int
ret
;
auto
pi
=
const_cast
<
prop_info
*>
(
__system_property_find
(
name
));
auto
pi
=
const_cast
<
prop_info
*>
(
__system_property_find
(
name
));
if
(
pi
!=
nullptr
)
{
if
(
pi
!=
nullptr
)
{
if
(
trigger
)
{
if
(
prop_svc
)
{
if
(
strncmp
(
name
,
"ro."
,
3
)
==
0
)
if
(
strncmp
(
name
,
"ro."
,
3
)
==
0
)
delprop
(
name
,
false
);
delprop
(
name
,
false
);
ret
=
system_property_set
(
name
,
value
);
ret
=
system_property_set
(
name
,
value
);
}
else
{
}
else
{
ret
=
__system_property_update
(
pi
,
value
,
strlen
(
value
));
ret
=
__system_property_update
(
pi
,
value
,
strlen
(
value
));
}
}
LOGD
(
"resetprop: update prop [%s]: [%s] by %s
\n
"
,
name
,
value
,
LOGD
(
"resetprop: update prop [%s]: [%s] by %s
\n
"
,
name
,
value
,
msg
);
trigger
?
"property_service"
:
"modifying prop data structure"
);
}
else
{
}
else
{
if
(
trigger
)
{
if
(
prop_svc
)
{
ret
=
system_property_set
(
name
,
value
);
ret
=
system_property_set
(
name
,
value
);
}
else
{
}
else
{
ret
=
__system_property_add
(
name
,
strlen
(
name
),
value
,
strlen
(
value
));
ret
=
__system_property_add
(
name
,
strlen
(
name
),
value
,
strlen
(
value
));
}
}
LOGD
(
"resetprop: create prop [%s]: [%s] by %s
\n
"
,
name
,
value
,
LOGD
(
"resetprop: create prop [%s]: [%s] by %s
\n
"
,
name
,
value
,
msg
);
trigger
?
"property_service"
:
"modifying prop data structure"
);
}
}
if
(
ret
)
if
(
ret
)
...
@@ -138,24 +137,30 @@ struct resetprop : public sysprop {
...
@@ -138,24 +137,30 @@ struct resetprop : public sysprop {
return
ret
;
return
ret
;
}
}
struct
prop_to_string
:
prop_cb
{
explicit
prop_to_string
(
string
&
s
)
:
val
(
s
)
{}
void
exec
(
const
char
*
name
,
const
char
*
value
)
override
{
val
=
value
;
}
private
:
string
&
val
;
};
string
getprop
(
const
char
*
name
,
bool
persist
)
override
{
string
getprop
(
const
char
*
name
,
bool
persist
)
override
{
if
(
!
check_legal_property_name
(
name
))
if
(
!
check_legal_property_name
(
name
))
return
string
();
return
string
();
auto
pi
=
__system_property_find
(
name
);
auto
pi
=
__system_property_find
(
name
);
if
(
pi
==
nullptr
)
{
if
(
pi
==
nullptr
)
{
if
(
persist
&&
strncmp
(
name
,
"persist."
,
8
)
==
0
)
{
if
(
persist
&&
strncmp
(
name
,
"persist."
,
8
)
==
0
)
{
auto
value
=
persist_getprop
(
name
);
if
(
auto
value
=
persist_getprop
(
name
);
!
value
.
empty
())
if
(
value
.
empty
())
return
value
;
goto
not_found
;
return
value
;
}
}
not_found
:
LOGD
(
"resetprop: prop [%s] does not exist
\n
"
,
name
);
LOGD
(
"resetprop: prop [%s] does not exist
\n
"
,
name
);
return
string
();
return
string
();
}
else
{
}
else
{
string
val
;
string
val
;
auto
reader
=
make_prop_cb
(
val
,
[](
auto
,
auto
value
,
auto
str
){
str
=
value
;
}
);
auto
prop
=
prop_to_string
(
val
);
read_prop
(
pi
,
&
reader
);
read_prop
(
pi
,
&
prop
);
LOGD
(
"resetprop: getprop [%s]: [%s]
\n
"
,
name
,
val
.
data
());
LOGD
(
"resetprop: getprop [%s]: [%s]
\n
"
,
name
,
val
.
data
());
return
val
;
return
val
;
}
}
...
@@ -170,8 +175,6 @@ struct resetprop : public sysprop {
...
@@ -170,8 +175,6 @@ struct resetprop : public sysprop {
persist_getprops
(
&
collector
);
persist_getprops
(
&
collector
);
for
(
auto
&
[
key
,
val
]
:
list
)
for
(
auto
&
[
key
,
val
]
:
list
)
callback
(
key
.
data
(),
val
.
data
(),
cookie
);
callback
(
key
.
data
(),
val
.
data
(),
cookie
);
if
(
persist
)
persist_cleanup
();
}
}
int
delprop
(
const
char
*
name
,
bool
persist
)
override
{
int
delprop
(
const
char
*
name
,
bool
persist
)
override
{
...
@@ -187,8 +190,8 @@ struct resetprop : public sysprop {
...
@@ -187,8 +190,8 @@ struct resetprop : public sysprop {
#define DLOAD(name) \
#define DLOAD(name) \
*(void **) &name = dlsym(RTLD_DEFAULT, "__" #name)
*(void **) &name = dlsym(RTLD_DEFAULT, "__" #name)
static
sysprop
*
get_impl
()
{
static
sysprop
_stub
*
get_impl
()
{
static
sysprop
*
impl
=
nullptr
;
static
sysprop
_stub
*
impl
=
nullptr
;
if
(
impl
==
nullptr
)
{
if
(
impl
==
nullptr
)
{
use_pb
=
access
(
PERSISTENT_PROPERTY_DIR
"/persistent_properties"
,
R_OK
)
==
0
;
use_pb
=
access
(
PERSISTENT_PROPERTY_DIR
"/persistent_properties"
,
R_OK
)
==
0
;
#ifdef APPLET_STUB_MAIN
#ifdef APPLET_STUB_MAIN
...
@@ -203,7 +206,7 @@ static sysprop *get_impl() {
...
@@ -203,7 +206,7 @@ static sysprop *get_impl() {
if
(
__system_properties_init
())
{
if
(
__system_properties_init
())
{
LOGW
(
"resetprop: __system_properties_init error
\n
"
);
LOGW
(
"resetprop: __system_properties_init error
\n
"
);
DLOAD
(
system_property_get
);
DLOAD
(
system_property_get
);
impl
=
system_property_get
?
new
s
tock_sysprop
()
:
new
sysprop
();
impl
=
system_property_get
?
new
s
ysprop
()
:
new
sysprop_stub
();
}
else
{
}
else
{
impl
=
new
resetprop
();
impl
=
new
resetprop
();
}
}
...
@@ -232,11 +235,11 @@ int delprop(const char *name, bool persist) {
...
@@ -232,11 +235,11 @@ int delprop(const char *name, bool persist) {
return
get_impl
()
->
delprop
(
name
,
persist
);
return
get_impl
()
->
delprop
(
name
,
persist
);
}
}
void
load_prop_file
(
const
char
*
filename
,
bool
trigger
)
{
void
load_prop_file
(
const
char
*
filename
,
bool
prop_svc
)
{
auto
impl
=
get_impl
();
auto
impl
=
get_impl
();
LOGD
(
"resetprop: Parse prop file [%s]
\n
"
,
filename
);
LOGD
(
"resetprop: Parse prop file [%s]
\n
"
,
filename
);
parse_prop_file
(
filename
,
[
=
](
auto
key
,
auto
val
)
->
bool
{
parse_prop_file
(
filename
,
[
=
](
auto
key
,
auto
val
)
->
bool
{
impl
->
setprop
(
key
.
data
(),
val
.
data
(),
trigger
);
impl
->
setprop
(
key
.
data
(),
val
.
data
(),
prop_svc
);
return
true
;
return
true
;
});
});
}
}
...
@@ -244,9 +247,9 @@ void load_prop_file(const char *filename, bool trigger) {
...
@@ -244,9 +247,9 @@ void load_prop_file(const char *filename, bool trigger) {
int
resetprop_main
(
int
argc
,
char
*
argv
[])
{
int
resetprop_main
(
int
argc
,
char
*
argv
[])
{
log_cb
.
d
=
[](
auto
fmt
,
auto
ap
)
->
int
{
return
verbose
?
vfprintf
(
stderr
,
fmt
,
ap
)
:
0
;
};
log_cb
.
d
=
[](
auto
fmt
,
auto
ap
)
->
int
{
return
verbose
?
vfprintf
(
stderr
,
fmt
,
ap
)
:
0
;
};
bool
trigger
=
true
,
persist
=
false
;
bool
prop_svc
=
true
;
bool
persist
=
false
;
char
*
argv0
=
argv
[
0
];
char
*
argv0
=
argv
[
0
];
string
prop
;
--
argc
;
--
argc
;
++
argv
;
++
argv
;
...
@@ -257,7 +260,7 @@ int resetprop_main(int argc, char *argv[]) {
...
@@ -257,7 +260,7 @@ int resetprop_main(int argc, char *argv[]) {
switch
(
argv
[
0
][
idx
])
{
switch
(
argv
[
0
][
idx
])
{
case
'-'
:
case
'-'
:
if
(
strcmp
(
argv
[
0
],
"--file"
)
==
0
&&
argc
==
2
)
{
if
(
strcmp
(
argv
[
0
],
"--file"
)
==
0
&&
argc
==
2
)
{
load_prop_file
(
argv
[
1
],
trigger
);
load_prop_file
(
argv
[
1
],
prop_svc
);
return
0
;
return
0
;
}
else
if
(
strcmp
(
argv
[
0
],
"--delete"
)
==
0
&&
argc
==
2
)
{
}
else
if
(
strcmp
(
argv
[
0
],
"--delete"
)
==
0
&&
argc
==
2
)
{
return
delprop
(
argv
[
1
],
persist
);
return
delprop
(
argv
[
1
],
persist
);
...
@@ -271,7 +274,7 @@ int resetprop_main(int argc, char *argv[]) {
...
@@ -271,7 +274,7 @@ int resetprop_main(int argc, char *argv[]) {
persist
=
true
;
persist
=
true
;
continue
;
continue
;
case
'n'
:
case
'n'
:
trigger
=
false
;
prop_svc
=
false
;
continue
;
continue
;
case
'\0'
:
case
'\0'
:
break
;
break
;
...
@@ -289,13 +292,15 @@ int resetprop_main(int argc, char *argv[]) {
...
@@ -289,13 +292,15 @@ int resetprop_main(int argc, char *argv[]) {
case
0
:
case
0
:
print_props
(
persist
);
print_props
(
persist
);
return
0
;
return
0
;
case
1
:
case
1
:
{
prop
=
getprop
(
argv
[
0
],
persist
);
string
prop
=
getprop
(
argv
[
0
],
persist
);
if
(
prop
.
empty
())
return
1
;
if
(
prop
.
empty
())
return
1
;
printf
(
"%s
\n
"
,
prop
.
data
());
printf
(
"%s
\n
"
,
prop
.
data
());
return
0
;
return
0
;
}
case
2
:
case
2
:
return
setprop
(
argv
[
0
],
argv
[
1
],
trigger
);
return
setprop
(
argv
[
0
],
argv
[
1
],
prop_svc
);
default:
default:
usage
(
argv0
);
usage
(
argv0
);
}
}
...
...
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