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
f1d587b7
Commit
f1d587b7
authored
Jan 29, 2009
by
Jonathan Beck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add setter and getter for Date and Unicode types.
parent
296a3850
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
80 additions
and
10 deletions
+80
-10
plist.h
include/plist/plist.h
+5
-1
bplist.c
src/bplist.c
+10
-0
plist.c
src/plist.c
+65
-9
No files found.
include/plist/plist.h
View file @
f1d587b7
...
@@ -60,7 +60,8 @@ void plist_add_sub_bool_el(plist_t node, uint8_t val);
...
@@ -60,7 +60,8 @@ 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_uint_el
(
plist_t
node
,
uint64_t
val
);
void
plist_add_sub_real_el
(
plist_t
node
,
double
val
);
void
plist_add_sub_real_el
(
plist_t
node
,
double
val
);
void
plist_add_sub_data_el
(
plist_t
node
,
const
char
*
val
,
uint64_t
length
);
void
plist_add_sub_data_el
(
plist_t
node
,
const
char
*
val
,
uint64_t
length
);
void
plist_add_sub_unicode_el
(
plist_t
node
,
const
char
*
val
);
void
plist_add_sub_date_el
(
plist_t
node
,
int32_t
sec
,
int32_t
usec
);
//plist free
//plist free
void
plist_free
(
plist_t
plist
);
void
plist_free
(
plist_t
plist
);
...
@@ -83,6 +84,9 @@ void plist_get_bool_val(plist_t node, uint8_t* val);
...
@@ -83,6 +84,9 @@ 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_uint_val
(
plist_t
node
,
uint64_t
*
val
);
void
plist_get_real_val
(
plist_t
node
,
double
*
val
);
void
plist_get_real_val
(
plist_t
node
,
double
*
val
);
void
plist_get_data_val
(
plist_t
node
,
char
**
val
,
uint64_t
*
length
);
void
plist_get_data_val
(
plist_t
node
,
char
**
val
,
uint64_t
*
length
);
void
plist_get_unicode_val
(
plist_t
node
,
char
**
val
);
void
plist_get_date_val
(
plist_t
node
,
int32_t
*
sec
,
int32_t
*
usec
);
//import and export functions
//import and export functions
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
);
...
...
src/bplist.c
View file @
f1d587b7
...
@@ -332,6 +332,9 @@ static gpointer copy_plist_data(gconstpointer src, gpointer data)
...
@@ -332,6 +332,9 @@ static gpointer copy_plist_data(gconstpointer src, gpointer data)
dstdata
->
intval
=
srcdata
->
intval
;
dstdata
->
intval
=
srcdata
->
intval
;
break
;
break
;
case
PLIST_DATE
:
case
PLIST_DATE
:
dstdata
->
timeval
.
tv_sec
=
srcdata
->
timeval
.
tv_sec
;
dstdata
->
timeval
.
tv_usec
=
srcdata
->
timeval
.
tv_usec
;
break
;
case
PLIST_REAL
:
case
PLIST_REAL
:
dstdata
->
realval
=
srcdata
->
realval
;
dstdata
->
realval
=
srcdata
->
realval
;
break
;
break
;
...
@@ -495,6 +498,9 @@ static guint plist_data_hash(gconstpointer key)
...
@@ -495,6 +498,9 @@ static guint plist_data_hash(gconstpointer key)
size
=
sizeof
(
gconstpointer
);
size
=
sizeof
(
gconstpointer
);
break
;
break
;
case
PLIST_DATE
:
case
PLIST_DATE
:
buff
=
(
char
*
)
&
(
data
->
timeval
);
size
=
data
->
length
;
break
;
default:
default:
break
;
break
;
}
}
...
@@ -551,6 +557,10 @@ static gboolean plist_data_compare(gconstpointer a, gconstpointer b)
...
@@ -551,6 +557,10 @@ static gboolean plist_data_compare(gconstpointer a, gconstpointer b)
return
FALSE
;
return
FALSE
;
break
;
break
;
case
PLIST_DATE
:
case
PLIST_DATE
:
if
(
!
memcmp
(
&
(
val_a
->
timeval
),
&
(
val_b
->
timeval
),
sizeof
(
GTimeVal
)))
return
TRUE
;
else
return
FALSE
;
default:
default:
break
;
break
;
}
}
...
...
src/plist.c
View file @
f1d587b7
...
@@ -82,6 +82,11 @@ static plist_t plist_add_sub_element(plist_t node, plist_type type, const void *
...
@@ -82,6 +82,11 @@ static plist_t plist_add_sub_element(plist_t node, plist_type type, const void *
data
->
type
=
type
;
data
->
type
=
type
;
data
->
length
=
length
;
data
->
length
=
length
;
glong
len
=
0
;
glong
items_read
=
0
;
glong
items_written
=
0
;
GError
*
error
=
NULL
;
switch
(
type
)
{
switch
(
type
)
{
case
PLIST_BOOLEAN
:
case
PLIST_BOOLEAN
:
data
->
boolval
=
*
((
char
*
)
value
);
data
->
boolval
=
*
((
char
*
)
value
);
...
@@ -97,15 +102,19 @@ static plist_t plist_add_sub_element(plist_t node, plist_type type, const void *
...
@@ -97,15 +102,19 @@ static plist_t plist_add_sub_element(plist_t node, plist_type type, const void *
data
->
strval
=
strdup
((
char
*
)
value
);
data
->
strval
=
strdup
((
char
*
)
value
);
break
;
break
;
case
PLIST_UNICODE
:
case
PLIST_UNICODE
:
data
->
unicodeval
=
(
gunichar2
*
)
malloc
(
length
*
sizeof
(
gunichar2
));
len
=
strlen
((
char
*
)
value
);
memcpy
(
data
->
unicodeval
,
value
,
length
*
sizeof
(
gunichar2
));
data
->
unicodeval
=
g_utf8_to_utf16
((
char
*
)
value
,
len
,
&
items_read
,
&
items_written
,
&
error
);
data
->
length
=
items_written
;
break
;
break
;
case
PLIST_DATA
:
case
PLIST_DATA
:
memcpy
(
data
->
buff
,
value
,
length
);
memcpy
(
data
->
buff
,
value
,
length
);
break
;
break
;
case
PLIST_DATE
:
data
->
timeval
.
tv_sec
=
((
GTimeVal
*
)
value
)
->
tv_sec
;
data
->
timeval
.
tv_usec
=
((
GTimeVal
*
)
value
)
->
tv_usec
;
break
;
case
PLIST_ARRAY
:
case
PLIST_ARRAY
:
case
PLIST_DICT
:
case
PLIST_DICT
:
case
PLIST_DATE
:
default:
default:
break
;
break
;
}
}
...
@@ -161,11 +170,13 @@ static char compare_node_value(plist_type type, plist_data_t data, const void *v
...
@@ -161,11 +170,13 @@ static char compare_node_value(plist_type type, plist_data_t data, const void *v
res
=
!
memcpy
(
data
->
unicodeval
,
value
,
length
);
res
=
!
memcpy
(
data
->
unicodeval
,
value
,
length
);
break
;
break
;
case
PLIST_DATA
:
case
PLIST_DATA
:
res
=
memcmp
(
data
->
buff
,
(
char
*
)
value
,
length
);
res
=
!
memcmp
(
data
->
buff
,
(
char
*
)
value
,
length
);
break
;
case
PLIST_DATE
:
res
=
!
memcmp
(
&
(
data
->
timeval
),
value
,
sizeof
(
GTimeVal
));
break
;
break
;
case
PLIST_ARRAY
:
case
PLIST_ARRAY
:
case
PLIST_DICT
:
case
PLIST_DICT
:
case
PLIST_DATE
:
default:
default:
break
;
break
;
}
}
...
@@ -209,6 +220,12 @@ static void plist_get_type_and_value(plist_t node, plist_type * type, void *valu
...
@@ -209,6 +220,12 @@ static void plist_get_type_and_value(plist_t node, plist_type * type, void *valu
if
(
!
node
)
if
(
!
node
)
return
;
return
;
//for unicode
glong
len
=
0
;
glong
items_read
=
0
;
glong
items_written
=
0
;
GError
*
error
=
NULL
;
plist_data_t
data
=
plist_get_data
(
node
);
plist_data_t
data
=
plist_get_data
(
node
);
*
type
=
data
->
type
;
*
type
=
data
->
type
;
...
@@ -229,13 +246,20 @@ static void plist_get_type_and_value(plist_t node, plist_type * type, void *valu
...
@@ -229,13 +246,20 @@ static void plist_get_type_and_value(plist_t node, plist_type * type, void *valu
*
((
char
**
)
value
)
=
strdup
(
data
->
strval
);
*
((
char
**
)
value
)
=
strdup
(
data
->
strval
);
break
;
break
;
case
PLIST_UNICODE
:
case
PLIST_UNICODE
:
*
((
gunichar2
**
)
value
)
=
malloc
(
*
length
*
sizeof
(
gunichar2
))
;
len
=
data
->
length
;
memcpy
(
*
((
gunichar2
**
)
value
),
data
->
unicodeval
,
*
length
*
sizeof
(
gunichar2
)
);
*
((
char
**
)
value
)
=
g_utf16_to_utf8
(
data
->
unicodeval
,
len
,
&
items_read
,
&
items_written
,
&
error
);
break
;
break
;
case
PLIST_DATA
:
case
PLIST_DATA
:
*
((
uint8_t
**
)
value
)
=
(
uint8_t
*
)
malloc
(
*
length
*
sizeof
(
uint8_t
));
memcpy
(
value
,
data
->
buff
,
*
length
*
sizeof
(
uint8_t
));
break
;
case
PLIST_DATE
:
//exception : here we use memory on the stack since it is just a temporary buffer
(
*
((
GTimeVal
**
)
value
))
->
tv_sec
=
data
->
timeval
.
tv_sec
;
(
*
((
GTimeVal
**
)
value
))
->
tv_usec
=
data
->
timeval
.
tv_usec
;
break
;
case
PLIST_ARRAY
:
case
PLIST_ARRAY
:
case
PLIST_DICT
:
case
PLIST_DICT
:
case
PLIST_DATE
:
default:
default:
break
;
break
;
}
}
...
@@ -290,6 +314,17 @@ void plist_add_sub_data_el(plist_t node, const char *val, uint64_t length)
...
@@ -290,6 +314,17 @@ void plist_add_sub_data_el(plist_t node, const char *val, uint64_t length)
plist_add_sub_element
(
node
,
PLIST_DATA
,
val
,
length
);
plist_add_sub_element
(
node
,
PLIST_DATA
,
val
,
length
);
}
}
void
plist_add_sub_unicode_el
(
plist_t
node
,
const
char
*
val
)
{
plist_add_sub_element
(
node
,
PLIST_UNICODE
,
val
,
strlen
(
val
));
}
void
plist_add_sub_date_el
(
plist_t
node
,
int32_t
sec
,
int32_t
usec
)
{
GTimeVal
val
=
{
sec
,
usec
};
plist_add_sub_element
(
node
,
PLIST_UNICODE
,
&
val
,
sizeof
(
GTimeVal
));
}
void
plist_get_key_val
(
plist_t
node
,
char
**
val
)
void
plist_get_key_val
(
plist_t
node
,
char
**
val
)
{
{
plist_type
type
=
plist_get_node_type
(
node
);
plist_type
type
=
plist_get_node_type
(
node
);
...
@@ -338,6 +373,27 @@ void plist_get_real_val(plist_t node, double *val)
...
@@ -338,6 +373,27 @@ void plist_get_real_val(plist_t node, double *val)
void
plist_get_data_val
(
plist_t
node
,
char
**
val
,
uint64_t
*
length
)
void
plist_get_data_val
(
plist_t
node
,
char
**
val
,
uint64_t
*
length
)
{
{
plist_type
type
=
plist_get_node_type
(
node
);
plist_type
type
=
plist_get_node_type
(
node
);
if
(
PLIST_
UINT
==
type
)
if
(
PLIST_
DATA
==
type
)
plist_get_type_and_value
(
node
,
&
type
,
(
void
*
)
val
,
length
);
plist_get_type_and_value
(
node
,
&
type
,
(
void
*
)
val
,
length
);
}
}
void
plist_get_unicode_val
(
plist_t
node
,
char
**
val
)
{
plist_type
type
=
plist_get_node_type
(
node
);
uint64_t
length
=
0
;
if
(
PLIST_UNICODE
==
type
)
plist_get_type_and_value
(
node
,
&
type
,
(
void
*
)
val
,
&
length
);
assert
(
length
==
strlen
(
*
val
));
}
void
plist_get_date_val
(
plist_t
node
,
int32_t
*
sec
,
int32_t
*
usec
)
{
plist_type
type
=
plist_get_node_type
(
node
);
uint64_t
length
=
0
;
GTimeVal
val
=
{
0
,
0
};
if
(
PLIST_DATE
==
type
)
plist_get_type_and_value
(
node
,
&
type
,
(
void
*
)
&
val
,
&
length
);
assert
(
length
==
sizeof
(
GTimeVal
));
*
sec
=
val
.
tv_sec
;
*
usec
=
val
.
tv_usec
;
}
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