Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
L
libplist
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
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
pwn
libplist
Commits
d174ba08
Commit
d174ba08
authored
Jan 08, 2009
by
Jonathan Beck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add edition and reading fonctions so that handling plist is less confusing.
Fix indent.
parent
c8d5e261
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
176 additions
and
61 deletions
+176
-61
Makefile.am
Makefile.am
+1
-1
plist.h
include/plist/plist.h
+21
-0
bplist.c
src/bplist.c
+13
-13
plist.c
src/plist.c
+134
-39
plist.h
src/plist.h
+0
-1
xplist.c
src/xplist.c
+7
-7
No files found.
Makefile.am
View file @
d174ba08
...
...
@@ -9,4 +9,4 @@ doc:
doxygen doxygen.cfg
indent
:
indent
-kr
-ut
-ts4
-l120
src/
*
.c src/
*
.h
dev
/
*
.c
indent
-kr
-ut
-ts4
-l120
src/
*
.c src/
*
.h
plutil
/
*
.c
include/plist/plist.h
View file @
d174ba08
...
...
@@ -52,6 +52,17 @@ plist_t plist_new_array();
//Plist edition, create a new root if node is NULL
plist_t
plist_add_sub_element
(
plist_t
node
,
plist_type
type
,
void
*
value
,
uint64_t
length
);
//Plist edition, only work for dict and array node
void
plist_add_sub_node
(
plist_t
node
,
plist_t
subnode
);
void
plist_add_sub_key_el
(
plist_t
node
,
char
*
val
);
void
plist_add_sub_string_el
(
plist_t
node
,
char
*
val
);
void
plist_add_sub_bool_el
(
plist_t
node
,
uint8_t
val
);
void
plist_add_sub_uint_el
(
plist_t
node
,
uint64_t
val
);
void
plist_add_sub_real_el
(
plist_t
node
,
double
val
);
void
plist_add_sub_data_el
(
plist_t
node
,
char
*
val
,
uint64_t
length
);
//plist free
void
plist_free
(
plist_t
plist
);
...
...
@@ -63,6 +74,16 @@ plist_t plist_get_prev_sibling(plist_t node);
plist_t
plist_find_node
(
plist_t
plist
,
plist_type
type
,
void
*
value
,
uint64_t
length
);
void
plist_get_type_and_value
(
plist_t
node
,
plist_type
*
type
,
void
*
value
,
uint64_t
*
length
);
//Plist reading
plist_type
plist_get_node_type
(
plist_t
node
);
void
plist_get_key_val
(
plist_t
node
,
char
**
val
);
void
plist_get_string_val
(
plist_t
node
,
char
**
val
);
void
plist_get_bool_val
(
plist_t
node
,
uint8_t
*
val
);
void
plist_get_uint_val
(
plist_t
node
,
uint64_t
*
val
);
void
plist_get_real_val
(
plist_t
node
,
double
*
val
);
void
plist_get_data_val
(
plist_t
node
,
char
**
val
,
uint64_t
*
length
);
//import and export functions
void
plist_to_xml
(
plist_t
plist
,
char
**
plist_xml
,
uint32_t
*
length
);
void
plist_to_bin
(
plist_t
plist
,
char
**
plist_bin
,
uint32_t
*
length
);
...
...
src/bplist.c
View file @
d174ba08
...
...
@@ -59,7 +59,7 @@ enum {
BPLIST_MASK
=
0xF0
};
static
void
byte_convert
(
uint8_t
*
address
,
size_t
size
)
static
void
byte_convert
(
uint8_t
*
address
,
size_t
size
)
{
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
uint8_t
i
=
0
,
j
=
0
;
...
...
@@ -124,7 +124,7 @@ static plist_t parse_real_node(char *bnode, uint8_t size)
switch
(
size
)
{
case
sizeof
(
float
):
case
sizeof
(
double
):
data
->
intval
=
UINT_TO_HOST
(
bnode
,
size
);
//use the fact that we have an union to cheat byte swapping
data
->
intval
=
UINT_TO_HOST
(
bnode
,
size
);
//use the fact that we have an union to cheat byte swapping
break
;
default:
free
(
data
);
...
...
@@ -140,8 +140,8 @@ static plist_t parse_date_node(char *bnode, uint8_t size)
plist_data_t
data
=
plist_get_data
(
node
);
double
time_real
=
data
->
realval
;
data
->
timeval
.
tv_sec
=
(
glong
)
time_real
;
data
->
timeval
.
tv_usec
=
(
time_real
-
(
glong
)
time_real
)
*
G_USEC_PER_SEC
;
data
->
timeval
.
tv_sec
=
(
glong
)
time_real
;
data
->
timeval
.
tv_usec
=
(
time_real
-
(
glong
)
time_real
)
*
G_USEC_PER_SEC
;
data
->
type
=
PLIST_DATE
;
return
node
;
}
...
...
@@ -475,7 +475,7 @@ static guint plist_data_hash(gconstpointer key)
case
PLIST_BOOLEAN
:
case
PLIST_UINT
:
case
PLIST_REAL
:
buff
=
(
char
*
)
&
data
->
intval
;
//works also for real as we use an union
buff
=
(
char
*
)
&
data
->
intval
;
//works also for real as we use an union
size
=
8
;
break
;
case
PLIST_KEY
:
...
...
@@ -574,7 +574,7 @@ static void serialize_plist(GNode * node, gpointer data)
return
;
}
//insert new ref
uint64_t
*
index_val
=
(
uint64_t
*
)
malloc
(
sizeof
(
uint64_t
));
uint64_t
*
index_val
=
(
uint64_t
*
)
malloc
(
sizeof
(
uint64_t
));
*
index_val
=
current_index
;
g_hash_table_insert
(
ser
->
ref_table
,
node
,
index_val
);
...
...
@@ -586,9 +586,9 @@ static void serialize_plist(GNode * node, gpointer data)
return
;
}
static
gboolean
free_index
(
gpointer
key
,
gpointer
value
,
gpointer
user_data
)
static
gboolean
free_index
(
gpointer
key
,
gpointer
value
,
gpointer
user_data
)
{
free
((
uint64_t
*
)
value
);
free
((
uint64_t
*
)
value
);
return
TRUE
;
}
...
...
@@ -618,7 +618,7 @@ static void write_real(GByteArray * bplist, double val)
static
void
write_date
(
GByteArray
*
bplist
,
double
val
)
{
uint64_t
size
=
8
;
//dates always use 8 bytes
uint64_t
size
=
8
;
//dates always use 8 bytes
uint8_t
*
buff
=
(
uint8_t
*
)
malloc
(
sizeof
(
uint8_t
)
+
size
);
buff
[
0
]
=
BPLIST_DATE
|
Log2
(
size
);
memcpy
(
buff
+
1
,
&
val
,
size
);
...
...
@@ -651,7 +651,7 @@ static void write_data(GByteArray * bplist, uint8_t * val, uint64_t size)
static
void
write_string
(
GByteArray
*
bplist
,
char
*
val
)
{
uint64_t
size
=
strlen
(
val
);
write_raw_data
(
bplist
,
BPLIST_STRING
,
(
uint8_t
*
)
val
,
size
);
write_raw_data
(
bplist
,
BPLIST_STRING
,
(
uint8_t
*
)
val
,
size
);
}
static
void
write_array
(
GByteArray
*
bplist
,
GNode
*
node
,
GHashTable
*
ref_table
,
uint8_t
dict_param_size
)
...
...
@@ -672,7 +672,7 @@ static void write_array(GByteArray * bplist, GNode * node, GHashTable * ref_tabl
GNode
*
cur
=
NULL
;
uint64_t
i
=
0
;
for
(
i
=
0
,
cur
=
node
->
children
;
cur
&&
i
<
size
;
cur
=
cur
->
next
,
i
++
)
{
idx
=
*
(
uint64_t
*
)
(
g_hash_table_lookup
(
ref_table
,
cur
));
idx
=
*
(
uint64_t
*
)
(
g_hash_table_lookup
(
ref_table
,
cur
));
memcpy
(
buff
+
i
*
dict_param_size
,
&
idx
,
dict_param_size
);
byte_convert
(
buff
+
i
*
dict_param_size
,
dict_param_size
);
}
...
...
@@ -787,7 +787,7 @@ void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length)
write_dict
(
bplist_buff
,
g_ptr_array_index
(
objects
,
i
),
ref_table
,
dict_param_size
);
break
;
case
PLIST_DATE
:
write_date
(
bplist_buff
,
data
->
timeval
.
tv_sec
+
(
double
)
data
->
timeval
.
tv_usec
/
G_USEC_PER_SEC
);
write_date
(
bplist_buff
,
data
->
timeval
.
tv_sec
+
(
double
)
data
->
timeval
.
tv_usec
/
G_USEC_PER_SEC
);
break
;
default:
break
;
...
...
@@ -795,7 +795,7 @@ void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length)
}
//free intermediate objects
g_hash_table_foreach_remove
(
ref_table
,
free_index
,
NULL
);
g_hash_table_foreach_remove
(
ref_table
,
free_index
,
NULL
);
//write offsets
offset_size
=
get_needed_bytes
(
bplist_buff
->
len
);
...
...
src/plist.c
View file @
d174ba08
...
...
@@ -74,46 +74,50 @@ plist_t plist_new_array()
plist_t
plist_add_sub_element
(
plist_t
node
,
plist_type
type
,
void
*
value
,
uint64_t
length
)
{
//only structured types are allowed to have nulll value
if
(
value
||
(
!
value
&&
(
type
==
PLIST_DICT
||
type
==
PLIST_ARRAY
)))
{
//now handle value
plist_data_t
data
=
plist_new_plist_data
();
data
->
type
=
type
;
data
->
length
=
length
;
switch
(
type
)
{
case
PLIST_BOOLEAN
:
data
->
boolval
=
*
((
char
*
)
value
);
break
;
case
PLIST_UINT
:
data
->
intval
=
*
((
uint64_t
*
)
value
);
break
;
case
PLIST_REAL
:
data
->
realval
=
*
((
double
*
)
value
);
break
;
case
PLIST_KEY
:
case
PLIST_STRING
:
data
->
strval
=
strdup
((
char
*
)
value
);
break
;
case
PLIST_UNICODE
:
data
->
unicodeval
=
wcsdup
((
wchar_t
*
)
value
);
break
;
case
PLIST_DATA
:
memcpy
(
data
->
buff
,
value
,
length
);
break
;
case
PLIST_ARRAY
:
case
PLIST_DICT
:
case
PLIST_DATE
:
default:
break
;
}
//only structured types can have children
plist_type
node_type
=
plist_get_node_type
(
node
);
if
(
node_type
==
PLIST_DICT
||
node_type
==
PLIST_ARRAY
)
{
//only structured types are allowed to have nulll value
if
(
value
||
(
!
value
&&
(
type
==
PLIST_DICT
||
type
==
PLIST_ARRAY
)))
{
//now handle value
plist_data_t
data
=
plist_new_plist_data
();
data
->
type
=
type
;
data
->
length
=
length
;
plist_t
subnode
=
plist_new_node
(
data
);
if
(
node
)
g_node_append
(
node
,
subnode
);
return
subnode
;
}
else
return
NULL
;
switch
(
type
)
{
case
PLIST_BOOLEAN
:
data
->
boolval
=
*
((
char
*
)
value
);
break
;
case
PLIST_UINT
:
data
->
intval
=
*
((
uint64_t
*
)
value
);
break
;
case
PLIST_REAL
:
data
->
realval
=
*
((
double
*
)
value
);
break
;
case
PLIST_KEY
:
case
PLIST_STRING
:
data
->
strval
=
strdup
((
char
*
)
value
);
break
;
case
PLIST_UNICODE
:
data
->
unicodeval
=
wcsdup
((
wchar_t
*
)
value
);
break
;
case
PLIST_DATA
:
memcpy
(
data
->
buff
,
value
,
length
);
break
;
case
PLIST_ARRAY
:
case
PLIST_DICT
:
case
PLIST_DATE
:
default:
break
;
}
plist_t
subnode
=
plist_new_node
(
data
);
if
(
node
)
g_node_append
(
node
,
subnode
);
return
subnode
;
}
else
return
NULL
;
}
}
void
plist_free
(
plist_t
plist
)
...
...
@@ -243,3 +247,94 @@ uint64_t plist_get_node_uint_val(plist_t node)
else
return
0
;
}
void
plist_add_sub_node
(
plist_t
node
,
plist_t
subnode
)
{
if
(
node
&&
subnode
)
{
plist_type
type
=
plist_get_node_type
(
node
);
if
(
type
==
PLIST_DICT
||
type
==
PLIST_ARRAY
)
g_node_append
(
node
,
subnode
);
}
}
void
plist_add_sub_key_el
(
plist_t
node
,
char
*
val
)
{
plist_add_sub_element
(
node
,
PLIST_KEY
,
val
,
strlen
(
val
));
}
void
plist_add_sub_string_el
(
plist_t
node
,
char
*
val
)
{
plist_add_sub_element
(
node
,
PLIST_STRING
,
val
,
strlen
(
val
));
}
void
plist_add_sub_bool_el
(
plist_t
node
,
uint8_t
val
)
{
plist_add_sub_element
(
node
,
PLIST_BOOLEAN
,
&
val
,
sizeof
(
uint8_t
));
}
void
plist_add_sub_uint_el
(
plist_t
node
,
uint64_t
val
)
{
plist_add_sub_element
(
node
,
PLIST_UINT
,
&
val
,
sizeof
(
uint64_t
));
}
void
plist_add_sub_real_el
(
plist_t
node
,
double
val
)
{
plist_add_sub_element
(
node
,
PLIST_REAL
,
&
val
,
sizeof
(
double
));
}
void
plist_add_sub_data_el
(
plist_t
node
,
char
*
val
,
uint64_t
length
)
{
plist_add_sub_element
(
node
,
PLIST_DATA
,
val
,
length
);
}
void
plist_get_key_val
(
plist_t
node
,
char
**
val
)
{
plist_type
type
=
plist_get_node_type
(
node
);
uint64_t
length
=
0
;
if
(
PLIST_KEY
==
type
)
plist_get_type_and_value
(
node
,
&
type
,
(
void
*
)
val
,
&
length
);
assert
(
length
==
strlen
(
*
val
));
}
void
plist_get_string_val
(
plist_t
node
,
char
**
val
)
{
plist_type
type
=
plist_get_node_type
(
node
);
uint64_t
length
=
0
;
if
(
PLIST_STRING
==
type
)
plist_get_type_and_value
(
node
,
&
type
,
(
void
*
)
val
,
&
length
);
assert
(
length
==
strlen
(
*
val
));
}
void
plist_get_bool_val
(
plist_t
node
,
uint8_t
*
val
)
{
plist_type
type
=
plist_get_node_type
(
node
);
uint64_t
length
=
0
;
if
(
PLIST_BOOLEAN
==
type
)
plist_get_type_and_value
(
node
,
&
type
,
(
void
*
)
val
,
&
length
);
assert
(
length
==
sizeof
(
uint8_t
));
}
void
plist_get_uint_val
(
plist_t
node
,
uint64_t
*
val
)
{
plist_type
type
=
plist_get_node_type
(
node
);
uint64_t
length
=
0
;
if
(
PLIST_UINT
==
type
)
plist_get_type_and_value
(
node
,
&
type
,
(
void
*
)
val
,
&
length
);
assert
(
length
==
sizeof
(
uint64_t
));
}
void
plist_get_real_val
(
plist_t
node
,
double
*
val
)
{
plist_type
type
=
plist_get_node_type
(
node
);
uint64_t
length
=
0
;
if
(
PLIST_REAL
==
type
)
plist_get_type_and_value
(
node
,
&
type
,
(
void
*
)
val
,
&
length
);
assert
(
length
==
sizeof
(
double
));
}
void
plist_get_data_val
(
plist_t
node
,
char
**
val
,
uint64_t
*
length
)
{
plist_type
type
=
plist_get_node_type
(
node
);
if
(
PLIST_UINT
==
type
)
plist_get_type_and_value
(
node
,
&
type
,
(
void
*
)
val
,
length
);
}
src/plist.h
View file @
d174ba08
...
...
@@ -56,7 +56,6 @@ plist_t plist_new_node(plist_data_t data);
plist_data_t
plist_get_data
(
const
plist_t
node
);
plist_data_t
plist_new_plist_data
();
void
plist_free_plist_data
(
plist_data_t
node
);
plist_type
plist_get_node_type
(
plist_t
node
);
uint64_t
plist_get_node_uint_val
(
plist_t
node
);
...
...
src/xplist.c
View file @
d174ba08
...
...
@@ -256,7 +256,7 @@ static void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node)
}
if
(
!
xmlStrcmp
(
node
->
name
,
XPLIST_INT
))
{
char
*
strval
=
(
char
*
)
xmlNodeGetContent
(
node
);
char
*
strval
=
(
char
*
)
xmlNodeGetContent
(
node
);
data
->
intval
=
g_ascii_strtoull
(
strval
,
NULL
,
0
);
data
->
type
=
PLIST_UINT
;
data
->
length
=
8
;
...
...
@@ -264,7 +264,7 @@ static void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node)
}
if
(
!
xmlStrcmp
(
node
->
name
,
XPLIST_REAL
))
{
char
*
strval
=
(
char
*
)
xmlNodeGetContent
(
node
);
char
*
strval
=
(
char
*
)
xmlNodeGetContent
(
node
);
data
->
realval
=
atof
(
strval
);
data
->
type
=
PLIST_REAL
;
data
->
length
=
8
;
...
...
@@ -272,21 +272,21 @@ static void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node)
}
if
(
!
xmlStrcmp
(
node
->
name
,
XPLIST_DATE
))
{
g_time_val_from_iso8601
((
char
*
)
xmlNodeGetContent
(
node
),
&
data
->
timeval
);
g_time_val_from_iso8601
((
char
*
)
xmlNodeGetContent
(
node
),
&
data
->
timeval
);
data
->
type
=
PLIST_DATE
;
data
->
length
=
sizeof
(
GTimeVal
);
continue
;
//TODO : handle date tag
}
if
(
!
xmlStrcmp
(
node
->
name
,
XPLIST_STRING
))
{
data
->
strval
=
strdup
(
(
char
*
)
xmlNodeGetContent
(
node
));
data
->
strval
=
strdup
(
(
char
*
)
xmlNodeGetContent
(
node
));
data
->
type
=
PLIST_STRING
;
data
->
length
=
strlen
(
data
->
strval
);
continue
;
}
if
(
!
xmlStrcmp
(
node
->
name
,
XPLIST_KEY
))
{
data
->
strval
=
strdup
(
(
char
*
)
xmlNodeGetContent
(
node
));
data
->
strval
=
strdup
(
(
char
*
)
xmlNodeGetContent
(
node
));
data
->
type
=
PLIST_KEY
;
data
->
length
=
strlen
(
data
->
strval
);
continue
;
...
...
@@ -294,7 +294,7 @@ static void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node)
if
(
!
xmlStrcmp
(
node
->
name
,
XPLIST_DATA
))
{
gsize
size
=
0
;
data
->
buff
=
g_base64_decode
((
char
*
)
xmlNodeGetContent
(
node
),
&
size
);
data
->
buff
=
g_base64_decode
((
char
*
)
xmlNodeGetContent
(
node
),
&
size
);
data
->
length
=
size
;
data
->
type
=
PLIST_DATA
;
continue
;
...
...
@@ -326,7 +326,7 @@ void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length)
int
size
=
0
;
xmlDocDumpMemory
(
plist_doc
,
(
xmlChar
**
)
plist_xml
,
&
size
);
if
(
size
>=
0
)
if
(
size
>=
0
)
*
length
=
size
;
free_plist
(
plist_doc
);
}
...
...
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