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
9ca88730
Commit
9ca88730
authored
Dec 12, 2008
by
Jonathan Beck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix some bugs in binary plist generation.
parent
31379321
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
129 additions
and
115 deletions
+129
-115
plutil.c
dev/plutil.c
+24
-13
bplist.c
src/bplist.c
+16
-13
lockdown.c
src/lockdown.c
+48
-57
plist.c
src/plist.c
+18
-9
plist.h
src/plist.h
+9
-11
xplist.c
src/xplist.c
+14
-12
No files found.
dev/plutil.c
View file @
9ca88730
...
@@ -14,9 +14,7 @@
...
@@ -14,9 +14,7 @@
int
main
(
int
argc
,
char
*
argv
[])
int
main
(
int
argc
,
char
*
argv
[])
{
{
struct
stat
*
filestats
=
(
struct
stat
*
)
malloc
(
sizeof
(
struct
stat
));
struct
stat
*
filestats
=
(
struct
stat
*
)
malloc
(
sizeof
(
struct
stat
));
uint32_t
position
=
0
;
Options
*
options
=
parse_arguments
(
argc
,
argv
);
Options
*
options
=
parse_arguments
(
argc
,
argv
);
int
argh
=
0
;
if
(
!
options
)
{
if
(
!
options
)
{
print_usage
();
print_usage
();
...
@@ -25,29 +23,42 @@ int main(int argc, char *argv[])
...
@@ -25,29 +23,42 @@ int main(int argc, char *argv[])
iphone_set_debug
(
options
->
debug
);
iphone_set_debug
(
options
->
debug
);
FILE
*
bplist
=
fopen
(
options
->
in_file
,
"r"
);
//read input file
FILE
*
iplist
=
fopen
(
options
->
in_file
,
"r"
);
if
(
!
iplist
)
return
1
;
stat
(
options
->
in_file
,
filestats
);
stat
(
options
->
in_file
,
filestats
);
char
*
plist_entire
=
(
char
*
)
malloc
(
sizeof
(
char
)
*
(
filestats
->
st_size
+
1
));
fread
(
plist_entire
,
sizeof
(
char
),
filestats
->
st_size
,
iplist
);
fclose
(
iplist
);
char
*
bplist_entire
=
(
char
*
)
malloc
(
sizeof
(
char
)
*
(
filestats
->
st_size
+
1
));
argh
=
fread
(
bplist_entire
,
sizeof
(
char
),
filestats
->
st_size
,
bplist
);
fclose
(
bplist
);
// bplist_entire contains our stuff
//convert one format to another
plist_t
root_node
=
NULL
;
plist_t
root_node
=
NULL
;
char
*
plist_out
=
NULL
;
char
*
plist_out
=
NULL
;
int
size
=
0
;
int
size
=
0
;
if
(
memcmp
(
b
plist_entire
,
"bplist00"
,
8
)
==
0
)
{
if
(
memcmp
(
plist_entire
,
"bplist00"
,
8
)
==
0
)
{
bin_to_plist
(
b
plist_entire
,
filestats
->
st_size
,
&
root_node
);
bin_to_plist
(
plist_entire
,
filestats
->
st_size
,
&
root_node
);
plist_to_xml
(
root_node
,
&
plist_out
,
&
size
);
plist_to_xml
(
root_node
,
&
plist_out
,
&
size
);
}
else
{
}
else
{
xml_to_plist
(
b
plist_entire
,
filestats
->
st_size
,
&
root_node
);
xml_to_plist
(
plist_entire
,
filestats
->
st_size
,
&
root_node
);
plist_to_bin
(
root_node
,
&
plist_out
,
&
size
);
plist_to_bin
(
root_node
,
&
plist_out
,
&
size
);
}
}
if
(
plist_out
)
{
printf
(
"%s
\n
"
,
plist_out
);
if
(
options
->
out_file
!=
NULL
)
{
FILE
*
oplist
=
fopen
(
options
->
out_file
,
"wb"
);
if
(
!
oplist
)
return
1
;
fwrite
(
plist_out
,
size
,
sizeof
(
char
),
oplist
);
fclose
(
oplist
);
}
//if no output file specified, write to stdout
else
fwrite
(
plist_out
,
size
,
sizeof
(
char
),
stdout
);
}
else
printf
(
"ERROR
\n
"
);
return
0
;
return
0
;
}
}
...
...
src/bplist.c
View file @
9ca88730
...
@@ -567,15 +567,15 @@ void serialize_plist(GNode * node, gpointer data)
...
@@ -567,15 +567,15 @@ void serialize_plist(GNode * node, gpointer data)
return
;
return
;
}
}
#define Log2(x) (x == 8 ? 3 : (x == 4 ? 2 : (x == 2 ? 1 : 0)))
void
write_int
(
GByteArray
*
bplist
,
uint64_t
val
)
void
write_int
(
GByteArray
*
bplist
,
uint64_t
val
)
{
{
uint64_t
size
=
get_needed_bytes
(
val
);
uint64_t
size
=
get_needed_bytes
(
val
);
uint8_t
*
buff
=
(
uint8_t
*
)
malloc
(
sizeof
(
uint8_t
)
+
size
);
uint8_t
*
buff
=
(
uint8_t
*
)
malloc
(
sizeof
(
uint8_t
)
+
size
);
buff
[
0
]
=
BPLIST_UINT
|
size
>>
1
;
buff
[
0
]
=
BPLIST_UINT
|
Log2
(
size
)
;
memcpy
(
buff
+
1
,
&
val
,
size
);
memcpy
(
buff
+
1
,
&
val
,
size
);
swap_n_bytes
(
buff
+
1
,
size
);
byte_convert
(
buff
+
1
,
size
);
g_byte_array_append
(
bplist
,
buff
,
sizeof
(
uint8_t
)
+
size
);
g_byte_array_append
(
bplist
,
buff
,
sizeof
(
uint8_t
)
+
size
);
free
(
buff
);
free
(
buff
);
}
}
...
@@ -584,9 +584,9 @@ void write_real(GByteArray * bplist, double val)
...
@@ -584,9 +584,9 @@ void write_real(GByteArray * bplist, double val)
{
{
uint64_t
size
=
get_real_bytes
(
*
((
uint64_t
*
)
&
val
));
//cheat to know used space
uint64_t
size
=
get_real_bytes
(
*
((
uint64_t
*
)
&
val
));
//cheat to know used space
uint8_t
*
buff
=
(
uint8_t
*
)
malloc
(
sizeof
(
uint8_t
)
+
size
);
uint8_t
*
buff
=
(
uint8_t
*
)
malloc
(
sizeof
(
uint8_t
)
+
size
);
buff
[
0
]
=
BPLIST_REAL
|
size
>>
1
;
buff
[
0
]
=
BPLIST_REAL
|
Log2
(
size
)
;
memcpy
(
buff
+
1
,
&
val
,
size
);
memcpy
(
buff
+
1
,
&
val
,
size
);
swap_n_bytes
(
buff
+
1
,
size
);
byte_convert
(
buff
+
1
,
size
);
g_byte_array_append
(
bplist
,
buff
,
sizeof
(
uint8_t
)
+
size
);
g_byte_array_append
(
bplist
,
buff
,
sizeof
(
uint8_t
)
+
size
);
free
(
buff
);
free
(
buff
);
}
}
...
@@ -638,7 +638,7 @@ void write_array(GByteArray * bplist, GNode * node, GHashTable * ref_table, uint
...
@@ -638,7 +638,7 @@ void write_array(GByteArray * bplist, GNode * node, GHashTable * ref_table, uint
for
(
i
=
0
,
cur
=
node
->
children
;
cur
&&
i
<
size
;
cur
=
cur
->
next
,
i
++
)
{
for
(
i
=
0
,
cur
=
node
->
children
;
cur
&&
i
<
size
;
cur
=
cur
->
next
,
i
++
)
{
idx
=
GPOINTER_TO_UINT
(
g_hash_table_lookup
(
ref_table
,
cur
));
idx
=
GPOINTER_TO_UINT
(
g_hash_table_lookup
(
ref_table
,
cur
));
memcpy
(
buff
+
i
*
dict_param_size
,
&
idx
,
dict_param_size
);
memcpy
(
buff
+
i
*
dict_param_size
,
&
idx
,
dict_param_size
);
swap_n_bytes
(
buff
+
i
*
dict_param_size
,
dict_param_size
);
byte_convert
(
buff
+
i
*
dict_param_size
,
dict_param_size
);
}
}
//now append to bplist
//now append to bplist
...
@@ -650,7 +650,7 @@ void write_array(GByteArray * bplist, GNode * node, GHashTable * ref_table, uint
...
@@ -650,7 +650,7 @@ void write_array(GByteArray * bplist, GNode * node, GHashTable * ref_table, uint
void
write_dict
(
GByteArray
*
bplist
,
GNode
*
node
,
GHashTable
*
ref_table
,
uint8_t
dict_param_size
)
void
write_dict
(
GByteArray
*
bplist
,
GNode
*
node
,
GHashTable
*
ref_table
,
uint8_t
dict_param_size
)
{
{
uint64_t
size
=
g_node_n_children
(
node
)
/
2
;
uint64_t
size
=
g_node_n_children
(
node
)
/
2
;
uint8_t
marker
=
BPLIST_
ARRAY
|
(
size
<
15
?
size
:
0xf
);
uint8_t
marker
=
BPLIST_
DICT
|
(
size
<
15
?
size
:
0xf
);
g_byte_array_append
(
bplist
,
&
marker
,
sizeof
(
uint8_t
));
g_byte_array_append
(
bplist
,
&
marker
,
sizeof
(
uint8_t
));
if
(
size
>=
15
)
{
if
(
size
>=
15
)
{
GByteArray
*
int_buff
=
g_byte_array_new
();
GByteArray
*
int_buff
=
g_byte_array_new
();
...
@@ -668,22 +668,24 @@ void write_dict(GByteArray * bplist, GNode * node, GHashTable * ref_table, uint8
...
@@ -668,22 +668,24 @@ void write_dict(GByteArray * bplist, GNode * node, GHashTable * ref_table, uint8
for
(
i
=
0
,
cur
=
node
->
children
;
cur
&&
i
<
size
;
cur
=
cur
->
next
->
next
,
i
++
)
{
for
(
i
=
0
,
cur
=
node
->
children
;
cur
&&
i
<
size
;
cur
=
cur
->
next
->
next
,
i
++
)
{
idx1
=
GPOINTER_TO_UINT
(
g_hash_table_lookup
(
ref_table
,
cur
));
idx1
=
GPOINTER_TO_UINT
(
g_hash_table_lookup
(
ref_table
,
cur
));
memcpy
(
buff
+
i
*
dict_param_size
,
&
idx1
,
dict_param_size
);
memcpy
(
buff
+
i
*
dict_param_size
,
&
idx1
,
dict_param_size
);
swap_n_bytes
(
buff
+
i
*
dict_param_size
,
dict_param_size
);
byte_convert
(
buff
+
i
*
dict_param_size
,
dict_param_size
);
idx2
=
GPOINTER_TO_UINT
(
g_hash_table_lookup
(
ref_table
,
cur
->
next
));
idx2
=
GPOINTER_TO_UINT
(
g_hash_table_lookup
(
ref_table
,
cur
->
next
));
memcpy
(
buff
+
(
i
+
size
)
*
dict_param_size
,
&
idx2
,
dict_param_size
);
memcpy
(
buff
+
(
i
+
size
)
*
dict_param_size
,
&
idx2
,
dict_param_size
);
swap_n_bytes
(
buff
+
(
i
+
size
)
*
dict_param_size
,
dict_param_size
);
byte_convert
(
buff
+
(
i
+
size
)
*
dict_param_size
,
dict_param_size
);
}
}
//now append to bplist
//now append to bplist
g_byte_array_append
(
bplist
,
buff
,
size
*
dict_param_size
);
g_byte_array_append
(
bplist
,
buff
,
size
*
2
*
dict_param_size
);
free
(
buff
);
free
(
buff
);
}
}
void
plist_to_bin
(
plist_t
plist
,
char
**
plist_bin
,
uint32_t
*
length
)
void
plist_to_bin
(
plist_t
plist
,
char
**
plist_bin
,
uint32_t
*
length
)
{
{
//first serialize tree
//check for valid input
if
(
!
plist
||
!
plist_bin
||
*
plist_bin
||
!
length
)
return
;
//list of objects
//list of objects
GPtrArray
*
objects
=
g_ptr_array_new
();
GPtrArray
*
objects
=
g_ptr_array_new
();
...
@@ -692,7 +694,7 @@ void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length)
...
@@ -692,7 +694,7 @@ void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length)
//serialize plist
//serialize plist
struct
serialize_s
ser_s
=
{
objects
,
ref_table
};
struct
serialize_s
ser_s
=
{
objects
,
ref_table
};
g_node_children_foreach
(
plist
,
G_TRAVERSE_ALL
,
serialize_
plist
,
&
ser_s
);
serialize_plist
(
plist
,
&
ser_s
);
//now stream to output buffer
//now stream to output buffer
uint8_t
offset_size
=
0
;
//unknown yet
uint8_t
offset_size
=
0
;
//unknown yet
...
@@ -759,10 +761,11 @@ void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length)
...
@@ -759,10 +761,11 @@ void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length)
//write offsets
//write offsets
offset_size
=
get_needed_bytes
(
bplist_buff
->
len
);
offset_size
=
get_needed_bytes
(
bplist_buff
->
len
);
offset_table_index
=
bplist_buff
->
len
;
for
(
i
=
0
;
i
<=
num_objects
;
i
++
)
{
for
(
i
=
0
;
i
<=
num_objects
;
i
++
)
{
uint8_t
*
buff
=
(
uint8_t
*
)
malloc
(
offset_size
);
uint8_t
*
buff
=
(
uint8_t
*
)
malloc
(
offset_size
);
memcpy
(
buff
,
offsets
+
i
,
offset_size
);
memcpy
(
buff
,
offsets
+
i
,
offset_size
);
swap_n_bytes
(
buff
,
offset_size
);
byte_convert
(
buff
,
offset_size
);
g_byte_array_append
(
bplist_buff
,
buff
,
offset_size
);
g_byte_array_append
(
bplist_buff
,
buff
,
offset_size
);
free
(
buff
);
free
(
buff
);
}
}
...
...
src/lockdown.c
View file @
9ca88730
...
@@ -177,11 +177,8 @@ iphone_error_t lockdownd_hello(iphone_lckd_client_t control)
...
@@ -177,11 +177,8 @@ iphone_error_t lockdownd_hello(iphone_lckd_client_t control)
int
bytes
=
0
,
i
=
0
;
int
bytes
=
0
,
i
=
0
;
iphone_error_t
ret
=
IPHONE_E_UNKNOWN_ERROR
;
iphone_error_t
ret
=
IPHONE_E_UNKNOWN_ERROR
;
plist_t
plist
=
NULL
;
plist_t
dict
=
NULL
;
plist_new_plist
(
&
plist
);
plist_new_dict
(
&
dict
);
dict_t
dict
=
NULL
;
plist_new_dict_in_plist
(
plist
,
&
dict
);
plist_add_dict_element
(
dict
,
"Request"
,
PLIST_STRING
,
(
void
*
)
"QueryType"
);
plist_add_dict_element
(
dict
,
"Request"
,
PLIST_STRING
,
(
void
*
)
"QueryType"
);
...
@@ -189,23 +186,23 @@ iphone_error_t lockdownd_hello(iphone_lckd_client_t control)
...
@@ -189,23 +186,23 @@ iphone_error_t lockdownd_hello(iphone_lckd_client_t control)
char
*
XML_content
=
NULL
;
char
*
XML_content
=
NULL
;
uint32_t
length
=
0
;
uint32_t
length
=
0
;
plist_to_xml
(
plis
t
,
&
XML_content
,
&
length
);
plist_to_xml
(
dic
t
,
&
XML_content
,
&
length
);
log_debug_msg
(
"Send msg :
\n
size : %i
\n
xml : %s"
,
length
,
XML_content
);
log_debug_msg
(
"Send msg :
\n
size : %i
\n
xml : %s"
,
length
,
XML_content
);
ret
=
iphone_lckd_send
(
control
,
XML_content
,
length
,
&
bytes
);
ret
=
iphone_lckd_send
(
control
,
XML_content
,
length
,
&
bytes
);
xmlFree
(
XML_content
);
xmlFree
(
XML_content
);
XML_content
=
NULL
;
XML_content
=
NULL
;
plist_free
(
plis
t
);
plist_free
(
dic
t
);
plis
t
=
NULL
;
dic
t
=
NULL
;
ret
=
iphone_lckd_recv
(
control
,
&
XML_content
,
&
bytes
);
ret
=
iphone_lckd_recv
(
control
,
&
XML_content
,
&
bytes
);
log_debug_msg
(
"Receive msg :
\n
size : %i
\n
xml : %s"
,
bytes
,
XML_content
);
log_debug_msg
(
"Receive msg :
\n
size : %i
\n
xml : %s"
,
bytes
,
XML_content
);
xml_to_plist
(
XML_content
,
bytes
,
&
plis
t
);
xml_to_plist
(
XML_content
,
bytes
,
&
dic
t
);
if
(
!
plis
t
)
if
(
!
dic
t
)
return
IPHONE_E_PLIST_ERROR
;
return
IPHONE_E_PLIST_ERROR
;
plist_t
query_node
=
find_query_node
(
plis
t
,
"Request"
,
"QueryType"
);
plist_t
query_node
=
find_query_node
(
dic
t
,
"Request"
,
"QueryType"
);
plist_t
result_node
=
g_node_next_sibling
(
query_node
);
plist_t
result_node
=
g_node_next_sibling
(
query_node
);
plist_t
value_node
=
g_node_next_sibling
(
result_node
);
plist_t
value_node
=
g_node_next_sibling
(
result_node
);
...
@@ -239,19 +236,18 @@ iphone_error_t lockdownd_generic_get_value(iphone_lckd_client_t control, char *r
...
@@ -239,19 +236,18 @@ iphone_error_t lockdownd_generic_get_value(iphone_lckd_client_t control, char *r
{
{
if
(
!
control
||
!
req_key
||
!
value
||
(
value
&&
*
value
))
if
(
!
control
||
!
req_key
||
!
value
||
(
value
&&
*
value
))
return
IPHONE_E_INVALID_ARG
;
return
IPHONE_E_INVALID_ARG
;
plist_t
plist
=
NULL
;
dic
t_t
dict
=
NULL
;
plis
t_t
dict
=
NULL
;
int
bytes
=
0
,
i
=
0
;
int
bytes
=
0
,
i
=
0
;
char
*
XML_content
=
NULL
;
char
*
XML_content
=
NULL
;
uint32_t
length
=
0
;
uint32_t
length
=
0
;
iphone_error_t
ret
=
IPHONE_E_UNKNOWN_ERROR
;
iphone_error_t
ret
=
IPHONE_E_UNKNOWN_ERROR
;
/* Setup DevicePublicKey request plist */
/* Setup DevicePublicKey request plist */
plist_new_plist
(
&
plist
);
plist_new_dict
(
&
dict
);
plist_new_dict_in_plist
(
plist
,
&
dict
);
plist_add_dict_element
(
dict
,
req_key
,
PLIST_STRING
,
(
void
*
)
req_string
);
plist_add_dict_element
(
dict
,
req_key
,
PLIST_STRING
,
(
void
*
)
req_string
);
plist_add_dict_element
(
dict
,
"Request"
,
PLIST_STRING
,
(
void
*
)
"GetValue"
);
plist_add_dict_element
(
dict
,
"Request"
,
PLIST_STRING
,
(
void
*
)
"GetValue"
);
plist_to_xml
(
plis
t
,
&
XML_content
,
&
length
);
plist_to_xml
(
dic
t
,
&
XML_content
,
&
length
);
/* send to iPhone */
/* send to iPhone */
log_debug_msg
(
"Send msg :
\n
size : %i
\n
xml : %s"
,
length
,
XML_content
);
log_debug_msg
(
"Send msg :
\n
size : %i
\n
xml : %s"
,
length
,
XML_content
);
...
@@ -259,8 +255,8 @@ iphone_error_t lockdownd_generic_get_value(iphone_lckd_client_t control, char *r
...
@@ -259,8 +255,8 @@ iphone_error_t lockdownd_generic_get_value(iphone_lckd_client_t control, char *r
xmlFree
(
XML_content
);
xmlFree
(
XML_content
);
XML_content
=
NULL
;
XML_content
=
NULL
;
plist_free
(
plis
t
);
plist_free
(
dic
t
);
plis
t
=
NULL
;
dic
t
=
NULL
;
if
(
ret
!=
IPHONE_E_SUCCESS
)
if
(
ret
!=
IPHONE_E_SUCCESS
)
return
ret
;
return
ret
;
...
@@ -272,11 +268,11 @@ iphone_error_t lockdownd_generic_get_value(iphone_lckd_client_t control, char *r
...
@@ -272,11 +268,11 @@ iphone_error_t lockdownd_generic_get_value(iphone_lckd_client_t control, char *r
if
(
ret
!=
IPHONE_E_SUCCESS
)
if
(
ret
!=
IPHONE_E_SUCCESS
)
return
ret
;
return
ret
;
xml_to_plist
(
XML_content
,
bytes
,
&
plis
t
);
xml_to_plist
(
XML_content
,
bytes
,
&
dic
t
);
if
(
!
plis
t
)
if
(
!
dic
t
)
return
IPHONE_E_PLIST_ERROR
;
return
IPHONE_E_PLIST_ERROR
;
plist_t
query_node
=
find_query_node
(
plis
t
,
"Request"
,
"GetValue"
);
plist_t
query_node
=
find_query_node
(
dic
t
,
"Request"
,
"GetValue"
);
plist_t
result_key_node
=
g_node_next_sibling
(
query_node
);
plist_t
result_key_node
=
g_node_next_sibling
(
query_node
);
plist_t
result_value_node
=
g_node_next_sibling
(
result_key_node
);
plist_t
result_value_node
=
g_node_next_sibling
(
result_key_node
);
...
@@ -314,7 +310,7 @@ iphone_error_t lockdownd_generic_get_value(iphone_lckd_client_t control, char *r
...
@@ -314,7 +310,7 @@ iphone_error_t lockdownd_generic_get_value(iphone_lckd_client_t control, char *r
ret
=
IPHONE_E_SUCCESS
;
ret
=
IPHONE_E_SUCCESS
;
}
}
plist_free
(
plis
t
);
plist_free
(
dic
t
);
free
(
XML_content
);
free
(
XML_content
);
return
ret
;
return
ret
;
}
}
...
@@ -408,9 +404,8 @@ iphone_error_t iphone_lckd_new_client(iphone_device_t device, iphone_lckd_client
...
@@ -408,9 +404,8 @@ iphone_error_t iphone_lckd_new_client(iphone_device_t device, iphone_lckd_client
iphone_error_t
lockdownd_pair_device
(
iphone_lckd_client_t
control
,
char
*
uid
,
char
*
host_id
)
iphone_error_t
lockdownd_pair_device
(
iphone_lckd_client_t
control
,
char
*
uid
,
char
*
host_id
)
{
{
iphone_error_t
ret
=
IPHONE_E_UNKNOWN_ERROR
;
iphone_error_t
ret
=
IPHONE_E_UNKNOWN_ERROR
;
plist_t
plist
=
NULL
;
plist_t
dict
=
NULL
;
dict_t
dict
=
NULL
;
plist_t
dict_record
=
NULL
;
dict_t
dict_record
=
NULL
;
int
bytes
=
0
,
i
=
0
;
int
bytes
=
0
,
i
=
0
;
char
*
XML_content
=
NULL
;
char
*
XML_content
=
NULL
;
uint32_t
length
=
0
;
uint32_t
length
=
0
;
...
@@ -433,8 +428,7 @@ iphone_error_t lockdownd_pair_device(iphone_lckd_client_t control, char *uid, ch
...
@@ -433,8 +428,7 @@ iphone_error_t lockdownd_pair_device(iphone_lckd_client_t control, char *uid, ch
}
}
/* Setup Pair request plist */
/* Setup Pair request plist */
plist_new_plist
(
&
plist
);
plist_new_dict
(
&
dict
);
plist_new_dict_in_plist
(
plist
,
&
dict
);
plist_add_dict_element
(
dict
,
"PairRecord"
,
PLIST_DICT
,
NULL
);
plist_add_dict_element
(
dict
,
"PairRecord"
,
PLIST_DICT
,
NULL
);
dict_record
=
g_node_last_child
(
dict
);
dict_record
=
g_node_last_child
(
dict
);
plist_add_dict_element
(
dict_record
,
"DeviceCertificate"
,
PLIST_DATA
,
(
void
*
)
device_cert_b64
);
plist_add_dict_element
(
dict_record
,
"DeviceCertificate"
,
PLIST_DATA
,
(
void
*
)
device_cert_b64
);
...
@@ -442,15 +436,15 @@ iphone_error_t lockdownd_pair_device(iphone_lckd_client_t control, char *uid, ch
...
@@ -442,15 +436,15 @@ iphone_error_t lockdownd_pair_device(iphone_lckd_client_t control, char *uid, ch
plist_add_dict_element
(
dict_record
,
"HostID"
,
PLIST_STRING
,
(
void
*
)
host_id
);
plist_add_dict_element
(
dict_record
,
"HostID"
,
PLIST_STRING
,
(
void
*
)
host_id
);
plist_add_dict_element
(
dict_record
,
"RootCertificate"
,
PLIST_DATA
,
(
void
*
)
root_cert_b64
);
plist_add_dict_element
(
dict_record
,
"RootCertificate"
,
PLIST_DATA
,
(
void
*
)
root_cert_b64
);
plist_add_dict_element
(
dict
,
"Request"
,
PLIST_STRING
,
(
void
*
)
"Pair"
);
plist_add_dict_element
(
dict
,
"Request"
,
PLIST_STRING
,
(
void
*
)
"Pair"
);
plist_to_xml
(
plis
t
,
&
XML_content
,
&
length
);
plist_to_xml
(
dic
t
,
&
XML_content
,
&
length
);
log_debug_msg
(
"XML Pairing request :
\n
size : %i
\n
xml :
\n
%s"
,
length
,
XML_content
);
log_debug_msg
(
"XML Pairing request :
\n
size : %i
\n
xml :
\n
%s"
,
length
,
XML_content
);
/* send to iPhone */
/* send to iPhone */
ret
=
iphone_lckd_send
(
control
,
XML_content
,
length
,
&
bytes
);
ret
=
iphone_lckd_send
(
control
,
XML_content
,
length
,
&
bytes
);
xmlFree
(
XML_content
);
xmlFree
(
XML_content
);
plist_free
(
plis
t
);
plist_free
(
dic
t
);
plis
t
=
NULL
;
dic
t
=
NULL
;
if
(
ret
!=
IPHONE_E_SUCCESS
)
if
(
ret
!=
IPHONE_E_SUCCESS
)
return
ret
;
return
ret
;
...
@@ -465,11 +459,11 @@ iphone_error_t lockdownd_pair_device(iphone_lckd_client_t control, char *uid, ch
...
@@ -465,11 +459,11 @@ iphone_error_t lockdownd_pair_device(iphone_lckd_client_t control, char *uid, ch
log_debug_msg
(
XML_content
);
log_debug_msg
(
XML_content
);
log_debug_msg
(
"
\n\n
"
);
log_debug_msg
(
"
\n\n
"
);
xml_to_plist
(
XML_content
,
bytes
,
&
plis
t
);
xml_to_plist
(
XML_content
,
bytes
,
&
dic
t
);
if
(
!
plis
t
)
if
(
!
dic
t
)
return
IPHONE_E_PLIST_ERROR
;
return
IPHONE_E_PLIST_ERROR
;
plist_t
query_node
=
find_query_node
(
plis
t
,
"Request"
,
"Pair"
);
plist_t
query_node
=
find_query_node
(
dic
t
,
"Request"
,
"Pair"
);
plist_t
result_key_node
=
g_node_next_sibling
(
query_node
);
plist_t
result_key_node
=
g_node_next_sibling
(
query_node
);
plist_t
result_value_node
=
g_node_next_sibling
(
result_key_node
);
plist_t
result_value_node
=
g_node_next_sibling
(
result_key_node
);
...
@@ -635,27 +629,25 @@ iphone_error_t lockdownd_gen_pair_cert(char *public_key_b64, char **device_cert_
...
@@ -635,27 +629,25 @@ iphone_error_t lockdownd_gen_pair_cert(char *public_key_b64, char **device_cert_
*/
*/
iphone_error_t
lockdownd_start_SSL_session
(
iphone_lckd_client_t
control
,
const
char
*
HostID
)
iphone_error_t
lockdownd_start_SSL_session
(
iphone_lckd_client_t
control
,
const
char
*
HostID
)
{
{
plist_t
plist
=
NULL
;
plist_t
dict
=
NULL
;
dict_t
dict
=
NULL
;
char
*
XML_content
=
NULL
;
char
*
XML_content
=
NULL
;
uint32_t
length
=
0
,
bytes
=
0
,
return_me
=
0
;
uint32_t
length
=
0
,
bytes
=
0
,
return_me
=
0
;
iphone_error_t
ret
=
IPHONE_E_UNKNOWN_ERROR
;
iphone_error_t
ret
=
IPHONE_E_UNKNOWN_ERROR
;
/* Setup DevicePublicKey request plist */
/* Setup DevicePublicKey request plist */
plist_new_plist
(
&
plist
);
plist_new_dict
(
&
dict
);
plist_new_dict_in_plist
(
plist
,
&
dict
);
plist_add_dict_element
(
dict
,
"HostID"
,
PLIST_STRING
,
(
void
*
)
HostID
);
plist_add_dict_element
(
dict
,
"HostID"
,
PLIST_STRING
,
(
void
*
)
HostID
);
plist_add_dict_element
(
dict
,
"Request"
,
PLIST_STRING
,
(
void
*
)
"StartSession"
);
plist_add_dict_element
(
dict
,
"Request"
,
PLIST_STRING
,
(
void
*
)
"StartSession"
);
plist_to_xml
(
plis
t
,
&
XML_content
,
&
length
);
plist_to_xml
(
dic
t
,
&
XML_content
,
&
length
);
log_debug_msg
(
"Send msg :
\n
size : %i
\n
xml : %s"
,
length
,
XML_content
);
log_debug_msg
(
"Send msg :
\n
size : %i
\n
xml : %s"
,
length
,
XML_content
);
ret
=
iphone_lckd_send
(
control
,
XML_content
,
length
,
&
bytes
);
ret
=
iphone_lckd_send
(
control
,
XML_content
,
length
,
&
bytes
);
xmlFree
(
XML_content
);
xmlFree
(
XML_content
);
XML_content
=
NULL
;
XML_content
=
NULL
;
plist_free
(
plis
t
);
plist_free
(
dic
t
);
plis
t
=
NULL
;
dic
t
=
NULL
;
if
(
ret
!=
IPHONE_E_SUCCESS
)
if
(
ret
!=
IPHONE_E_SUCCESS
)
return
ret
;
return
ret
;
...
@@ -663,11 +655,11 @@ iphone_error_t lockdownd_start_SSL_session(iphone_lckd_client_t control, const c
...
@@ -663,11 +655,11 @@ iphone_error_t lockdownd_start_SSL_session(iphone_lckd_client_t control, const c
if
(
bytes
>
0
)
{
if
(
bytes
>
0
)
{
ret
=
iphone_lckd_recv
(
control
,
&
XML_content
,
&
bytes
);
ret
=
iphone_lckd_recv
(
control
,
&
XML_content
,
&
bytes
);
log_debug_msg
(
"Receive msg :
\n
size : %i
\n
xml : %s"
,
bytes
,
XML_content
);
log_debug_msg
(
"Receive msg :
\n
size : %i
\n
xml : %s"
,
bytes
,
XML_content
);
xml_to_plist
(
XML_content
,
bytes
,
&
plis
t
);
xml_to_plist
(
XML_content
,
bytes
,
&
dic
t
);
if
(
!
plis
t
)
if
(
!
dic
t
)
return
IPHONE_E_PLIST_ERROR
;
return
IPHONE_E_PLIST_ERROR
;
plist_t
query_node
=
find_query_node
(
plis
t
,
"Request"
,
"StartSession"
);
plist_t
query_node
=
find_query_node
(
dic
t
,
"Request"
,
"StartSession"
);
plist_t
result_key_node
=
g_node_next_sibling
(
query_node
);
plist_t
result_key_node
=
g_node_next_sibling
(
query_node
);
plist_t
result_value_node
=
g_node_next_sibling
(
result_key_node
);
plist_t
result_value_node
=
g_node_next_sibling
(
result_key_node
);
...
@@ -681,8 +673,8 @@ iphone_error_t lockdownd_start_SSL_session(iphone_lckd_client_t control, const c
...
@@ -681,8 +673,8 @@ iphone_error_t lockdownd_start_SSL_session(iphone_lckd_client_t control, const c
xmlFree
(
XML_content
);
xmlFree
(
XML_content
);
XML_content
=
NULL
;
XML_content
=
NULL
;
plist_free
(
plis
t
);
plist_free
(
dic
t
);
plis
t
=
NULL
;
dic
t
=
NULL
;
if
(
result_key_type
==
PLIST_KEY
&&
if
(
result_key_type
==
PLIST_KEY
&&
result_value_type
==
PLIST_STRING
&&
!
strcmp
(
result_key
,
"Result"
)
&&
!
strcmp
(
result_value
,
"Success"
))
{
result_value_type
==
PLIST_STRING
&&
!
strcmp
(
result_key
,
"Result"
)
&&
!
strcmp
(
result_value
,
"Success"
))
{
...
@@ -871,8 +863,7 @@ iphone_error_t iphone_lckd_start_service(iphone_lckd_client_t client, const char
...
@@ -871,8 +863,7 @@ iphone_error_t iphone_lckd_start_service(iphone_lckd_client_t client, const char
return
IPHONE_E_SSL_ERROR
;
return
IPHONE_E_SSL_ERROR
;
plist_t
plist
=
NULL
;
plist_t
dict
=
NULL
;
dict_t
dict
=
NULL
;
char
*
XML_content
=
NULL
;
char
*
XML_content
=
NULL
;
uint32_t
length
,
i
=
0
,
port_loc
=
0
,
bytes
=
0
;
uint32_t
length
,
i
=
0
,
port_loc
=
0
,
bytes
=
0
;
iphone_error_t
ret
=
IPHONE_E_UNKNOWN_ERROR
;
iphone_error_t
ret
=
IPHONE_E_UNKNOWN_ERROR
;
...
@@ -880,11 +871,10 @@ iphone_error_t iphone_lckd_start_service(iphone_lckd_client_t client, const char
...
@@ -880,11 +871,10 @@ iphone_error_t iphone_lckd_start_service(iphone_lckd_client_t client, const char
free
(
host_id
);
free
(
host_id
);
host_id
=
NULL
;
host_id
=
NULL
;
plist_new_plist
(
&
plist
);
plist_new_dict
(
&
dict
);
plist_new_dict_in_plist
(
plist
,
&
dict
);
plist_add_dict_element
(
dict
,
"Request"
,
PLIST_STRING
,
(
void
*
)
"StartService"
);
plist_add_dict_element
(
dict
,
"Request"
,
PLIST_STRING
,
(
void
*
)
"StartService"
);
plist_add_dict_element
(
dict
,
"Service"
,
PLIST_STRING
,
(
void
*
)
service
);
plist_add_dict_element
(
dict
,
"Service"
,
PLIST_STRING
,
(
void
*
)
service
);
plist_to_xml
(
plis
t
,
&
XML_content
,
&
length
);
plist_to_xml
(
dic
t
,
&
XML_content
,
&
length
);
/* send to iPhone */
/* send to iPhone */
log_debug_msg
(
"Send msg :
\n
size : %i
\n
xml : %s"
,
length
,
XML_content
);
log_debug_msg
(
"Send msg :
\n
size : %i
\n
xml : %s"
,
length
,
XML_content
);
...
@@ -892,8 +882,8 @@ iphone_error_t iphone_lckd_start_service(iphone_lckd_client_t client, const char
...
@@ -892,8 +882,8 @@ iphone_error_t iphone_lckd_start_service(iphone_lckd_client_t client, const char
xmlFree
(
XML_content
);
xmlFree
(
XML_content
);
XML_content
=
NULL
;
XML_content
=
NULL
;
plist_free
(
plis
t
);
plist_free
(
dic
t
);
plis
t
=
NULL
;
dic
t
=
NULL
;
if
(
IPHONE_E_SUCCESS
!=
ret
)
if
(
IPHONE_E_SUCCESS
!=
ret
)
return
ret
;
return
ret
;
...
@@ -903,8 +893,8 @@ iphone_error_t iphone_lckd_start_service(iphone_lckd_client_t client, const char
...
@@ -903,8 +893,8 @@ iphone_error_t iphone_lckd_start_service(iphone_lckd_client_t client, const char
if
(
IPHONE_E_SUCCESS
!=
ret
)
if
(
IPHONE_E_SUCCESS
!=
ret
)
return
ret
;
return
ret
;
xml_to_plist
(
XML_content
,
bytes
,
&
plis
t
);
xml_to_plist
(
XML_content
,
bytes
,
&
dic
t
);
if
(
!
plis
t
)
if
(
!
dic
t
)
return
IPHONE_E_PLIST_ERROR
;
return
IPHONE_E_PLIST_ERROR
;
...
@@ -912,11 +902,11 @@ iphone_error_t iphone_lckd_start_service(iphone_lckd_client_t client, const char
...
@@ -912,11 +902,11 @@ iphone_error_t iphone_lckd_start_service(iphone_lckd_client_t client, const char
return
IPHONE_E_NOT_ENOUGH_DATA
;
return
IPHONE_E_NOT_ENOUGH_DATA
;
else
{
else
{
plist_t
query_node
=
find_query_node
(
plis
t
,
"Request"
,
"StartService"
);
plist_t
query_node
=
find_query_node
(
dic
t
,
"Request"
,
"StartService"
);
plist_t
result_key_node
=
g_node_next_sibling
(
query_node
);
plist_t
result_key_node
=
g_node_next_sibling
(
query_node
);
plist_t
result_value_node
=
g_node_next_sibling
(
result_key_node
);
plist_t
result_value_node
=
g_node_next_sibling
(
result_key_node
);
plist_t
port_key_node
=
find_node
(
plis
t
,
PLIST_KEY
,
"Port"
);
plist_t
port_key_node
=
find_node
(
dic
t
,
PLIST_KEY
,
"Port"
);
plist_t
port_value_node
=
g_node_next_sibling
(
port_key_node
);
plist_t
port_value_node
=
g_node_next_sibling
(
port_key_node
);
plist_type
result_key_type
;
plist_type
result_key_type
;
...
@@ -947,7 +937,8 @@ iphone_error_t iphone_lckd_start_service(iphone_lckd_client_t client, const char
...
@@ -947,7 +937,8 @@ iphone_error_t iphone_lckd_start_service(iphone_lckd_client_t client, const char
log_debug_msg
(
"end data received by lockdownd_start_service()
\n
"
);
log_debug_msg
(
"end data received by lockdownd_start_service()
\n
"
);
free
(
XML_content
);
free
(
XML_content
);
plist_free
(
plist
);
plist_free
(
dict
);
dict
=
NULL
;
if
(
port
&&
ret
==
IPHONE_E_SUCCESS
)
{
if
(
port
&&
ret
==
IPHONE_E_SUCCESS
)
{
*
port
=
port_loc
;
*
port
=
port_loc
;
return
IPHONE_E_SUCCESS
;
return
IPHONE_E_SUCCESS
;
...
...
src/plist.c
View file @
9ca88730
...
@@ -29,7 +29,7 @@
...
@@ -29,7 +29,7 @@
#include <stdio.h>
#include <stdio.h>
void
plist_new_
plis
t
(
plist_t
*
plist
)
void
plist_new_
dic
t
(
plist_t
*
plist
)
{
{
if
(
*
plist
!=
NULL
)
if
(
*
plist
!=
NULL
)
return
;
return
;
...
@@ -38,7 +38,16 @@ void plist_new_plist(plist_t * plist)
...
@@ -38,7 +38,16 @@ void plist_new_plist(plist_t * plist)
*
plist
=
g_node_new
(
data
);
*
plist
=
g_node_new
(
data
);
}
}
void
plist_new_dict_in_plist
(
plist_t
plist
,
dict_t
*
dict
)
void
plist_new_array
(
plist_t
*
plist
)
{
if
(
*
plist
!=
NULL
)
return
;
struct
plist_data
*
data
=
(
struct
plist_data
*
)
calloc
(
sizeof
(
struct
plist_data
),
1
);
data
->
type
=
PLIST_ARRAY
;
*
plist
=
g_node_new
(
data
);
}
void
plist_new_dict_in_plist
(
plist_t
plist
,
plist_t
*
dict
)
{
{
if
(
!
plist
||
*
dict
)
if
(
!
plist
||
*
dict
)
return
;
return
;
...
@@ -49,9 +58,6 @@ void plist_new_dict_in_plist(plist_t plist, dict_t * dict)
...
@@ -49,9 +58,6 @@ void plist_new_dict_in_plist(plist_t plist, dict_t * dict)
g_node_append
(
plist
,
*
dict
);
g_node_append
(
plist
,
*
dict
);
}
}
void
plist_new_array_in_plist
(
plist_t
plist
,
int
length
,
plist_type
type
,
void
**
values
,
array_t
*
array
)
{
}
/** Adds a new key pair to a dict.
/** Adds a new key pair to a dict.
*
*
...
@@ -61,7 +67,7 @@ void plist_new_array_in_plist(plist_t plist, int length, plist_type type, void *
...
@@ -61,7 +67,7 @@ void plist_new_array_in_plist(plist_t plist, int length, plist_type type, void *
* @param value a pointer to the actual buffer containing the value. WARNING : the buffer is supposed to match the type of the value
* @param value a pointer to the actual buffer containing the value. WARNING : the buffer is supposed to match the type of the value
*
*
*/
*/
void
plist_add_dict_element
(
dic
t_t
dict
,
char
*
key
,
plist_type
type
,
void
*
value
)
void
plist_add_dict_element
(
plis
t_t
dict
,
char
*
key
,
plist_type
type
,
void
*
value
)
{
{
if
(
!
dict
||
!
key
||
!
value
)
if
(
!
dict
||
!
key
||
!
value
)
return
;
return
;
...
@@ -110,7 +116,7 @@ void plist_free(plist_t plist)
...
@@ -110,7 +116,7 @@ void plist_free(plist_t plist)
g_node_destroy
(
plist
);
g_node_destroy
(
plist
);
}
}
GNode
*
find_query_node
(
plist_t
plist
,
char
*
key
,
char
*
request
)
plist_t
find_query_node
(
plist_t
plist
,
char
*
key
,
char
*
request
)
{
{
if
(
!
plist
)
if
(
!
plist
)
return
NULL
;
return
NULL
;
...
@@ -167,7 +173,7 @@ char compare_node_value(plist_type type, struct plist_data *data, void *value)
...
@@ -167,7 +173,7 @@ char compare_node_value(plist_type type, struct plist_data *data, void *value)
return
res
;
return
res
;
}
}
GNode
*
find_node
(
plist_t
plist
,
plist_type
type
,
void
*
value
)
plist_t
find_node
(
plist_t
plist
,
plist_type
type
,
void
*
value
)
{
{
if
(
!
plist
)
if
(
!
plist
)
return
NULL
;
return
NULL
;
...
@@ -228,7 +234,10 @@ void get_type_and_value(GNode * node, plist_type * type, void *value)
...
@@ -228,7 +234,10 @@ void get_type_and_value(GNode * node, plist_type * type, void *value)
plist_type
plist_get_node_type
(
plist_t
node
)
plist_type
plist_get_node_type
(
plist_t
node
)
{
{
if
(
node
&&
node
->
data
)
return
((
struct
plist_data
*
)
node
->
data
)
->
type
;
return
((
struct
plist_data
*
)
node
->
data
)
->
type
;
else
return
PLIST_NONE
;
}
}
uint64_t
plist_get_node_uint_val
(
plist_t
node
)
uint64_t
plist_get_node_uint_val
(
plist_t
node
)
...
...
src/plist.h
View file @
9ca88730
...
@@ -30,8 +30,6 @@
...
@@ -30,8 +30,6 @@
#include <unistd.h>
#include <unistd.h>
#include <glib.h>
#include <glib.h>
char
*
format_string
(
const
char
*
buf
,
int
cols
,
int
depth
);
typedef
enum
{
typedef
enum
{
PLIST_BOOLEAN
,
PLIST_BOOLEAN
,
...
@@ -44,6 +42,7 @@ typedef enum {
...
@@ -44,6 +42,7 @@ typedef enum {
PLIST_DATE
,
PLIST_DATE
,
PLIST_DATA
,
PLIST_DATA
,
PLIST_KEY
,
PLIST_KEY
,
PLIST_NONE
}
plist_type
;
}
plist_type
;
...
@@ -63,13 +62,12 @@ struct plist_data {
...
@@ -63,13 +62,12 @@ struct plist_data {
typedef
GNode
*
plist_t
;
typedef
GNode
*
plist_t
;
typedef
GNode
*
dict_t
;
typedef
GNode
*
array_t
;
void
plist_new_plist
(
plist_t
*
plist
);
void
plist_new_dict_in_plist
(
plist_t
plist
,
dict_t
*
dict
);
void
plist_new_dict
(
plist_t
*
plist
);
void
plist_new_array_in_plist
(
plist_t
plist
,
int
length
,
plist_type
type
,
void
**
values
,
array_t
*
array
);
void
plist_new_array
(
plist_t
*
plist
);
void
plist_add_dict_element
(
dict_t
dict
,
char
*
key
,
plist_type
type
,
void
*
value
);
void
plist_new_dict_in_plist
(
plist_t
plist
,
plist_t
*
dict
);
void
plist_add_dict_element
(
plist_t
dict
,
char
*
key
,
plist_type
type
,
void
*
value
);
void
plist_free
(
plist_t
plist
);
void
plist_free
(
plist_t
plist
);
void
plist_to_xml
(
plist_t
plist
,
char
**
plist_xml
,
uint32_t
*
length
);
void
plist_to_xml
(
plist_t
plist
,
char
**
plist_xml
,
uint32_t
*
length
);
...
@@ -78,8 +76,8 @@ void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length);
...
@@ -78,8 +76,8 @@ void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length);
void
xml_to_plist
(
const
char
*
plist_xml
,
uint32_t
length
,
plist_t
*
plist
);
void
xml_to_plist
(
const
char
*
plist_xml
,
uint32_t
length
,
plist_t
*
plist
);
void
bin_to_plist
(
const
char
*
plist_bin
,
uint32_t
length
,
plist_t
*
plist
);
void
bin_to_plist
(
const
char
*
plist_bin
,
uint32_t
length
,
plist_t
*
plist
);
GNode
*
find_query_node
(
plist_t
plist
,
char
*
key
,
char
*
request
);
plist_t
find_query_node
(
plist_t
plist
,
char
*
key
,
char
*
request
);
GNode
*
find_node
(
plist_t
plist
,
plist_type
type
,
void
*
value
);
plist_t
find_node
(
plist_t
plist
,
plist_type
type
,
void
*
value
);
void
get_type_and_value
(
GNode
*
node
,
plist_type
*
type
,
void
*
value
);
void
get_type_and_value
(
plist_t
node
,
plist_type
*
type
,
void
*
value
);
#endif
#endif
src/xplist.c
View file @
9ca88730
...
@@ -89,7 +89,7 @@ struct xml_node {
...
@@ -89,7 +89,7 @@ struct xml_node {
*
*
* @return The plist XML document.
* @return The plist XML document.
*/
*/
xmlDocPtr
new_plist
()
xmlDocPtr
new_
xml_
plist
()
{
{
char
*
plist
=
strdup
(
plist_base
);
char
*
plist
=
strdup
(
plist_base
);
xmlDocPtr
plist_xml
=
xmlReadMemory
(
plist
,
strlen
(
plist
),
NULL
,
NULL
,
0
);
xmlDocPtr
plist_xml
=
xmlReadMemory
(
plist
,
strlen
(
plist
),
NULL
,
NULL
,
0
);
...
@@ -207,7 +207,7 @@ void node_to_xml(GNode * node, gpointer xml_struct)
...
@@ -207,7 +207,7 @@ void node_to_xml(GNode * node, gpointer xml_struct)
return
;
return
;
}
}
void
xml_to_node
(
xmlNodePtr
xml_node
,
GNode
*
plist_node
)
void
xml_to_node
(
xmlNodePtr
xml_node
,
plist_t
*
plist_node
)
{
{
xmlNodePtr
node
=
NULL
;
xmlNodePtr
node
=
NULL
;
...
@@ -220,7 +220,10 @@ void xml_to_node(xmlNodePtr xml_node, GNode * plist_node)
...
@@ -220,7 +220,10 @@ void xml_to_node(xmlNodePtr xml_node, GNode * plist_node)
struct
plist_data
*
data
=
(
struct
plist_data
*
)
calloc
(
sizeof
(
struct
plist_data
),
1
);
struct
plist_data
*
data
=
(
struct
plist_data
*
)
calloc
(
sizeof
(
struct
plist_data
),
1
);
GNode
*
subnode
=
g_node_new
(
data
);
GNode
*
subnode
=
g_node_new
(
data
);
g_node_append
(
plist_node
,
subnode
);
if
(
*
plist_node
)
g_node_append
(
*
plist_node
,
subnode
);
else
*
plist_node
=
subnode
;
if
(
!
xmlStrcmp
(
node
->
name
,
"true"
))
{
if
(
!
xmlStrcmp
(
node
->
name
,
"true"
))
{
data
->
boolval
=
1
;
data
->
boolval
=
1
;
...
@@ -236,7 +239,7 @@ void xml_to_node(xmlNodePtr xml_node, GNode * plist_node)
...
@@ -236,7 +239,7 @@ void xml_to_node(xmlNodePtr xml_node, GNode * plist_node)
if
(
!
xmlStrcmp
(
node
->
name
,
"integer"
))
{
if
(
!
xmlStrcmp
(
node
->
name
,
"integer"
))
{
char
*
strval
=
xmlNodeGetContent
(
node
);
char
*
strval
=
xmlNodeGetContent
(
node
);
data
->
intval
=
atoi
(
strval
);
data
->
intval
=
g_ascii_strtoull
(
strval
,
NULL
,
0
);
data
->
type
=
PLIST_UINT
;
data
->
type
=
PLIST_UINT
;
continue
;
continue
;
}
}
...
@@ -271,13 +274,13 @@ void xml_to_node(xmlNodePtr xml_node, GNode * plist_node)
...
@@ -271,13 +274,13 @@ void xml_to_node(xmlNodePtr xml_node, GNode * plist_node)
if
(
!
xmlStrcmp
(
node
->
name
,
"array"
))
{
if
(
!
xmlStrcmp
(
node
->
name
,
"array"
))
{
data
->
type
=
PLIST_ARRAY
;
data
->
type
=
PLIST_ARRAY
;
xml_to_node
(
node
,
subnode
);
xml_to_node
(
node
,
&
subnode
);
continue
;
continue
;
}
}
if
(
!
xmlStrcmp
(
node
->
name
,
"dict"
))
{
if
(
!
xmlStrcmp
(
node
->
name
,
"dict"
))
{
data
->
type
=
PLIST_DICT
;
data
->
type
=
PLIST_DICT
;
xml_to_node
(
node
,
subnode
);
xml_to_node
(
node
,
&
subnode
);
continue
;
continue
;
}
}
}
}
...
@@ -287,10 +290,12 @@ void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length)
...
@@ -287,10 +290,12 @@ void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length)
{
{
if
(
!
plist
||
!
plist_xml
||
*
plist_xml
)
if
(
!
plist
||
!
plist_xml
||
*
plist_xml
)
return
;
return
;
xmlDocPtr
plist_doc
=
new_plist
();
xmlDocPtr
plist_doc
=
new_
xml_
plist
();
xmlNodePtr
root_node
=
xmlDocGetRootElement
(
plist_doc
);
xmlNodePtr
root_node
=
xmlDocGetRootElement
(
plist_doc
);
struct
xml_node
root
=
{
root_node
,
0
};
struct
xml_node
root
=
{
root_node
,
0
};
g_node_children_foreach
(
plist
,
G_TRAVERSE_ALL
,
node_to_xml
,
&
root
);
node_to_xml
(
plist
,
&
root
);
xmlDocDumpMemory
(
plist_doc
,
(
xmlChar
**
)
plist_xml
,
length
);
xmlDocDumpMemory
(
plist_doc
,
(
xmlChar
**
)
plist_xml
,
length
);
}
}
...
@@ -299,8 +304,5 @@ void xml_to_plist(const char *plist_xml, uint32_t length, plist_t * plist)
...
@@ -299,8 +304,5 @@ void xml_to_plist(const char *plist_xml, uint32_t length, plist_t * plist)
xmlDocPtr
plist_doc
=
xmlReadMemory
(
plist_xml
,
length
,
NULL
,
NULL
,
0
);
xmlDocPtr
plist_doc
=
xmlReadMemory
(
plist_xml
,
length
,
NULL
,
NULL
,
0
);
xmlNodePtr
root_node
=
xmlDocGetRootElement
(
plist_doc
);
xmlNodePtr
root_node
=
xmlDocGetRootElement
(
plist_doc
);
struct
plist_data
*
data
=
(
struct
plist_data
*
)
calloc
(
sizeof
(
struct
plist_data
),
1
);
xml_to_node
(
root_node
,
plist
);
*
plist
=
g_node_new
(
data
);
data
->
type
=
PLIST_DICT
;
xml_to_node
(
root_node
,
*
plist
);
}
}
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