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
21d5d4ac
Commit
21d5d4ac
authored
Aug 19, 2008
by
Jonathan Beck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
migrate lockdown.c
parent
89050631
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
69 additions
and
65 deletions
+69
-65
lockdown.c
src/lockdown.c
+57
-54
lockdown.h
src/lockdown.h
+12
-11
No files found.
src/lockdown.c
View file @
21d5d4ac
...
@@ -74,9 +74,9 @@ char *lockdownd_generate_hostid() {
...
@@ -74,9 +74,9 @@ char *lockdownd_generate_hostid() {
*
*
* @return The lockdownd client.
* @return The lockdownd client.
*/
*/
lockdownd_client
*
new_lockdownd_client
(
iPhone
*
phone
)
{
iphone_lckd_client_t
new_lockdownd_client
(
iphone_device_t
phone
)
{
if
(
!
phone
)
return
NULL
;
if
(
!
phone
)
return
NULL
;
lockdownd_client
*
control
=
(
lockdownd_client
*
)
malloc
(
sizeof
(
lockdownd_clie
nt
));
iphone_lckd_client_t
control
=
(
iphone_lckd_client_t
)
malloc
(
sizeof
(
struct
iphone_lckd_client_i
nt
));
control
->
connection
=
mux_connect
(
phone
,
0x0a00
,
0xf27e
);
control
->
connection
=
mux_connect
(
phone
,
0x0a00
,
0xf27e
);
if
(
!
control
->
connection
)
{
if
(
!
control
->
connection
)
{
free
(
control
);
free
(
control
);
...
@@ -94,15 +94,15 @@ lockdownd_client *new_lockdownd_client(iPhone *phone) {
...
@@ -94,15 +94,15 @@ lockdownd_client *new_lockdownd_client(iPhone *phone) {
*
*
* @param control The lockdown client
* @param control The lockdown client
*/
*/
void
lockdownd_close
(
lockdownd_client
*
control
)
{
void
iphone_lckd_free_client
(
iphone_lckd_client_t
client
)
{
if
(
!
c
ontrol
)
return
;
if
(
!
c
lient
)
return
;
if
(
c
ontrol
->
connection
)
{
if
(
c
lient
->
connection
)
{
mux_close_connection
(
c
ontrol
->
connection
);
mux_close_connection
(
c
lient
->
connection
);
}
}
if
(
c
ontrol
->
ssl_session
)
gnutls_deinit
(
*
control
->
ssl_session
);
if
(
c
lient
->
ssl_session
)
gnutls_deinit
(
*
control
->
ssl_session
);
free
(
c
ontrol
->
ssl_session
);
free
(
c
lient
->
ssl_session
);
free
(
c
ontrol
);
free
(
c
lient
);
}
}
/** Polls the iPhone for lockdownd data.
/** Polls the iPhone for lockdownd data.
...
@@ -113,18 +113,18 @@ void lockdownd_close(lockdownd_client *control) {
...
@@ -113,18 +113,18 @@ void lockdownd_close(lockdownd_client *control) {
*
*
* @return The number of bytes received
* @return The number of bytes received
*/
*/
int
lockdownd_recv
(
lockdownd_client
*
control
,
char
**
dump_data
)
{
int
iphone_lckd_recv
(
iphone_lckd_client_t
client
,
char
**
dump_data
)
{
if
(
!
c
ontrol
)
return
0
;
if
(
!
c
lient
)
return
0
;
char
*
receive
;
char
*
receive
;
uint32
datalen
=
0
,
bytes
=
0
;
uint32
datalen
=
0
,
bytes
=
0
;
if
(
!
c
ontrol
->
in_SSL
)
bytes
=
mux_recv
(
control
->
connection
,
(
char
*
)
&
datalen
,
sizeof
(
datalen
));
if
(
!
c
lient
->
in_SSL
)
bytes
=
mux_recv
(
client
->
connection
,
(
char
*
)
&
datalen
,
sizeof
(
datalen
));
else
bytes
=
gnutls_record_recv
(
*
c
ontrol
->
ssl_session
,
&
datalen
,
sizeof
(
datalen
));
else
bytes
=
gnutls_record_recv
(
*
c
lient
->
ssl_session
,
&
datalen
,
sizeof
(
datalen
));
datalen
=
ntohl
(
datalen
);
datalen
=
ntohl
(
datalen
);
receive
=
(
char
*
)
malloc
(
sizeof
(
char
)
*
datalen
);
receive
=
(
char
*
)
malloc
(
sizeof
(
char
)
*
datalen
);
if
(
!
c
ontrol
->
in_SSL
)
bytes
=
mux_recv
(
control
->
connection
,
receive
,
datalen
);
if
(
!
c
lient
->
in_SSL
)
bytes
=
mux_recv
(
client
->
connection
,
receive
,
datalen
);
else
bytes
=
gnutls_record_recv
(
*
c
ontrol
->
ssl_session
,
receive
,
datalen
);
else
bytes
=
gnutls_record_recv
(
*
c
lient
->
ssl_session
,
receive
,
datalen
);
*
dump_data
=
receive
;
*
dump_data
=
receive
;
return
bytes
;
return
bytes
;
}
}
...
@@ -140,8 +140,8 @@ int lockdownd_recv(lockdownd_client *control, char **dump_data) {
...
@@ -140,8 +140,8 @@ int lockdownd_recv(lockdownd_client *control, char **dump_data) {
*
*
* @return The number of bytes sent
* @return The number of bytes sent
*/
*/
int
lockdownd_send
(
lockdownd_client
*
control
,
char
*
raw_data
,
uint32
length
)
{
int
iphone_lckd_send
(
iphone_lckd_client_t
client
,
char
*
raw_data
,
uint32_t
length
)
{
if
(
!
c
ontrol
)
return
0
;
if
(
!
c
lient
)
return
0
;
char
*
real_query
;
char
*
real_query
;
int
bytes
;
int
bytes
;
...
@@ -157,8 +157,8 @@ int lockdownd_send(lockdownd_client *control, char *raw_data, uint32 length) {
...
@@ -157,8 +157,8 @@ int lockdownd_send(lockdownd_client *control, char *raw_data, uint32 length) {
packet
=
NULL
;
packet
=
NULL
;
}
}
if
(
!
c
ontrol
->
in_SSL
)
bytes
=
mux_send
(
control
->
connection
,
real_query
,
ntohl
(
length
)
+
sizeof
(
length
));
if
(
!
c
lient
->
in_SSL
)
bytes
=
mux_send
(
client
->
connection
,
real_query
,
ntohl
(
length
)
+
sizeof
(
length
));
else
gnutls_record_send
(
*
c
ontrol
->
ssl_session
,
real_query
,
ntohl
(
length
)
+
sizeof
(
length
));
else
gnutls_record_send
(
*
c
lient
->
ssl_session
,
real_query
,
ntohl
(
length
)
+
sizeof
(
length
));
if
(
debug
)
printf
(
"lockdownd_send(): sent it!
\n
"
);
if
(
debug
)
printf
(
"lockdownd_send(): sent it!
\n
"
);
free
(
real_query
);
free
(
real_query
);
return
bytes
;
return
bytes
;
...
@@ -172,7 +172,7 @@ int lockdownd_send(lockdownd_client *control, char *raw_data, uint32 length) {
...
@@ -172,7 +172,7 @@ int lockdownd_send(lockdownd_client *control, char *raw_data, uint32 length) {
*
*
* @return 1 on success and 0 on failure.
* @return 1 on success and 0 on failure.
*/
*/
int
lockdownd_hello
(
lockdownd_client
*
control
)
{
int
lockdownd_hello
(
iphone_lckd_client_t
control
)
{
if
(
!
control
)
return
0
;
if
(
!
control
)
return
0
;
xmlDocPtr
plist
=
new_plist
();
xmlDocPtr
plist
=
new_plist
();
xmlNode
*
dict
,
*
key
;
xmlNode
*
dict
,
*
key
;
...
@@ -223,7 +223,7 @@ int lockdownd_hello(lockdownd_client *control) {
...
@@ -223,7 +223,7 @@ int lockdownd_hello(lockdownd_client *control) {
*
*
* @return 1 on success and 0 on failure.
* @return 1 on success and 0 on failure.
*/
*/
int
lockdownd_generic_get_value
(
lockdownd_client
*
control
,
char
*
req_key
,
char
**
value
)
int
lockdownd_generic_get_value
(
iphone_lckd_client_t
control
,
char
*
req_key
,
char
**
value
)
{
{
xmlDocPtr
plist
=
new_plist
();
xmlDocPtr
plist
=
new_plist
();
xmlNode
*
dict
=
NULL
;
xmlNode
*
dict
=
NULL
;
...
@@ -284,7 +284,7 @@ int lockdownd_generic_get_value(lockdownd_client *control, char *req_key, char *
...
@@ -284,7 +284,7 @@ int lockdownd_generic_get_value(lockdownd_client *control, char *req_key, char *
*
*
* @return 1 on success and 0 on failure.
* @return 1 on success and 0 on failure.
*/
*/
int
lockdownd_get_device_uid
(
lockdownd_client
*
control
,
char
**
uid
)
int
lockdownd_get_device_uid
(
lockdownd_client
_t
control
,
char
**
uid
)
{
{
return
lockdownd_generic_get_value
(
control
,
"UniqueDeviceID"
,
uid
);
return
lockdownd_generic_get_value
(
control
,
"UniqueDeviceID"
,
uid
);
}
}
...
@@ -295,7 +295,7 @@ int lockdownd_get_device_uid(lockdownd_client *control, char **uid)
...
@@ -295,7 +295,7 @@ int lockdownd_get_device_uid(lockdownd_client *control, char **uid)
*
*
* @return 1 on success and 0 on failure.
* @return 1 on success and 0 on failure.
*/
*/
int
lockdownd_get_device_public_key
(
lockdownd_client
*
control
,
char
**
public_key
)
int
lockdownd_get_device_public_key
(
lockdownd_client
_t
control
,
char
**
public_key
)
{
{
return
lockdownd_generic_get_value
(
control
,
"DevicePublicKey"
,
public_key
);
return
lockdownd_generic_get_value
(
control
,
"DevicePublicKey"
,
public_key
);
}
}
...
@@ -307,42 +307,45 @@ int lockdownd_get_device_public_key(lockdownd_client *control, char **public_key
...
@@ -307,42 +307,45 @@ int lockdownd_get_device_public_key(lockdownd_client *control, char **public_key
*
*
* @return 1 on success and 0 on failure
* @return 1 on success and 0 on failure
*/
*/
int
lockdownd_init
(
iPhone_t
phone
,
lockdownd_client_t
*
control
)
int
iphone_lckd_new_client
(
iphone_device_t
device
,
iphone_lckd_client_t
*
client
)
{
{
int
ret
=
0
;
if
(
!
device
||
!
client
||
(
client
&&
*
client
)
)
return
IPHONE_E_INVALID_ARG
;
int
ret
=
IPHONE_E_SUCCESS
;
char
*
host_id
=
NULL
;
char
*
host_id
=
NULL
;
if
(
!
phone
)
iphone_lckd_client_t
client_loc
=
new_lockdownd_client
(
device
);
return
0
;
if
(
!
lockdownd_hello
(
client_loc
)){
lockdownd_client
*
control_loc
=
new_lockdownd_client
(
(
iPhone
*
)
phone
);
if
(
!
lockdownd_hello
(
control_loc
)){
fprintf
(
stderr
,
"Hello failed in the lockdownd client.
\n
"
);
fprintf
(
stderr
,
"Hello failed in the lockdownd client.
\n
"
);
ret
=
IPHONE_E_NOT_ENOUGH_DATA
;
}
}
char
*
uid
=
NULL
;
char
*
uid
=
NULL
;
if
(
!
lockdownd_get_device_uid
(
control_loc
,
&
uid
)){
if
(
IPHONE_E_SUCCESS
==
ret
&&
!
lockdownd_get_device_uid
(
control_loc
,
&
uid
)){
fprintf
(
stderr
,
"Device refused to send public key.
\n
"
);
fprintf
(
stderr
,
"Device refused to send uid.
\n
"
);
ret
=
IPHONE_E_NOT_ENOUGH_DATA
;
}
}
host_id
=
get_host_id
();
host_id
=
get_host_id
();
if
(
IPHONE_E_SUCCESS
==
ret
&&
!
host_id
){
fprintf
(
stderr
,
"No HostID found, run libiphone-initconf.
\n
"
);
ret
=
IPHONE_E_INVALID_CONF
;
}
if
(
!
is_device_known
(
uid
))
if
(
IPHONE_E_SUCCESS
==
ret
&&
!
is_device_known
(
uid
))
ret
=
lockdownd_pair_device
(
*
control
,
uid
,
host_id
);
ret
=
lockdownd_pair_device
(
*
control
,
uid
,
host_id
);
else
ret
=
1
;
if
(
uid
)
{
if
(
uid
)
{
free
(
uid
);
free
(
uid
);
uid
=
NULL
;
uid
=
NULL
;
}
}
if
(
ret
&&
host_id
&&
lockdownd_start_SSL_session
(
control
_loc
,
host_id
))
{
if
(
IPHONE_E_SUCCESS
==
ret
&&
!
lockdownd_start_SSL_session
(
client
_loc
,
host_id
))
{
ret
=
1
;
ret
=
IPHONE_E_SUCCESS
;
}
else
{
}
else
{
ret
=
0
;
ret
=
IPHONE_E_SSL_ERROR
;
fprintf
(
stderr
,
"
lockdownd_init: SSL Session opening failed, has libiphone-initconf been run?
\n
"
);
fprintf
(
stderr
,
"
SSL Session opening failed.
\n
"
);
}
}
if
(
host_id
)
{
if
(
host_id
)
{
...
@@ -350,8 +353,8 @@ int lockdownd_init(iPhone_t phone, lockdownd_client_t *control)
...
@@ -350,8 +353,8 @@ int lockdownd_init(iPhone_t phone, lockdownd_client_t *control)
host_id
=
NULL
;
host_id
=
NULL
;
}
}
*
control
=
(
lockdownd_client_t
)
control_loc
;
if
(
IPHONE_E_SUCCESS
==
ret
)
*
client
=
client_loc
;
return
ret
;
return
ret
;
}
}
...
@@ -362,7 +365,7 @@ int lockdownd_init(iPhone_t phone, lockdownd_client_t *control)
...
@@ -362,7 +365,7 @@ int lockdownd_init(iPhone_t phone, lockdownd_client_t *control)
*
*
* @return 1 on success and 0 on failure
* @return 1 on success and 0 on failure
*/
*/
int
lockdownd_pair_device
(
lockdownd_client
*
control
,
char
*
uid
,
char
*
host_id
)
int
lockdownd_pair_device
(
iphone_lckd_client_t
control
,
char
*
uid
,
char
*
host_id
)
{
{
int
ret
=
0
;
int
ret
=
0
;
xmlDocPtr
plist
=
new_plist
();
xmlDocPtr
plist
=
new_plist
();
...
@@ -596,7 +599,7 @@ int lockdownd_gen_pair_cert(char *public_key_b64, char **device_cert_b64, char *
...
@@ -596,7 +599,7 @@ int lockdownd_gen_pair_cert(char *public_key_b64, char **device_cert_b64, char *
*
*
* @return 1 on success and 0 on failure
* @return 1 on success and 0 on failure
*/
*/
int
lockdownd_start_SSL_session
(
lockdownd_client
*
control
,
const
char
*
HostID
)
{
int
lockdownd_start_SSL_session
(
iphone_lckd_client_t
control
,
const
char
*
HostID
)
{
xmlDocPtr
plist
=
new_plist
();
xmlDocPtr
plist
=
new_plist
();
xmlNode
*
dict
=
add_child_to_plist
(
plist
,
"dict"
,
"
\n
"
,
NULL
,
0
);
xmlNode
*
dict
=
add_child_to_plist
(
plist
,
"dict"
,
"
\n
"
,
NULL
,
0
);
xmlNode
*
key
;
xmlNode
*
key
;
...
@@ -714,8 +717,8 @@ int lockdownd_start_SSL_session(lockdownd_client *control, const char *HostID) {
...
@@ -714,8 +717,8 @@ int lockdownd_start_SSL_session(lockdownd_client *control, const char *HostID) {
*/
*/
ssize_t
lockdownd_secuwrite
(
gnutls_transport_ptr_t
transport
,
char
*
buffer
,
size_t
length
)
{
ssize_t
lockdownd_secuwrite
(
gnutls_transport_ptr_t
transport
,
char
*
buffer
,
size_t
length
)
{
int
bytes
=
0
;
int
bytes
=
0
;
lockdownd_client
*
control
;
iphone_lckd_client_t
control
;
control
=
(
lockdownd_client
*
)
transport
;
control
=
(
iphone_lckd_client_t
)
transport
;
if
(
debug
)
printf
(
"lockdownd_secuwrite() called
\n
"
);
if
(
debug
)
printf
(
"lockdownd_secuwrite() called
\n
"
);
if
(
debug
)
printf
(
"pre-send
\n
length = %zi
\n
"
,
length
);
if
(
debug
)
printf
(
"pre-send
\n
length = %zi
\n
"
,
length
);
bytes
=
mux_send
(
control
->
connection
,
buffer
,
length
);
bytes
=
mux_send
(
control
->
connection
,
buffer
,
length
);
...
@@ -742,8 +745,8 @@ ssize_t lockdownd_secuwrite(gnutls_transport_ptr_t transport, char *buffer, size
...
@@ -742,8 +745,8 @@ ssize_t lockdownd_secuwrite(gnutls_transport_ptr_t transport, char *buffer, size
ssize_t
lockdownd_securead
(
gnutls_transport_ptr_t
transport
,
char
*
buffer
,
size_t
length
)
{
ssize_t
lockdownd_securead
(
gnutls_transport_ptr_t
transport
,
char
*
buffer
,
size_t
length
)
{
int
bytes
=
0
,
pos_start_fill
=
0
;
int
bytes
=
0
,
pos_start_fill
=
0
;
char
*
hackhackhack
=
NULL
;
char
*
hackhackhack
=
NULL
;
lockdownd_client
*
control
;
iphone_lckd_client_t
control
;
control
=
(
lockdownd_client
*
)
transport
;
control
=
(
iphone_lckd_client_t
)
transport
;
if
(
debug
)
printf
(
"lockdownd_securead() called
\n
length = %zi
\n
"
,
length
);
if
(
debug
)
printf
(
"lockdownd_securead() called
\n
length = %zi
\n
"
,
length
);
// Buffering hack! Throw what we've got in our "buffer" into the stream first, then get more.
// Buffering hack! Throw what we've got in our "buffer" into the stream first, then get more.
if
(
control
->
gtls_buffer_hack_len
>
0
)
{
if
(
control
->
gtls_buffer_hack_len
>
0
)
{
...
@@ -812,11 +815,11 @@ ssize_t lockdownd_securead(gnutls_transport_ptr_t transport, char *buffer, size_
...
@@ -812,11 +815,11 @@ ssize_t lockdownd_securead(gnutls_transport_ptr_t transport, char *buffer, size_
*
*
* @return The port number the service was started on or 0 on failure.
* @return The port number the service was started on or 0 on failure.
*/
*/
int
lockdownd_start_service
(
lockdownd_client
*
control
,
const
char
*
service
)
{
int
iphone_lckd_start_service
(
iphone_lckd_client_t
client
,
const
char
*
service
)
{
if
(
!
c
ontrol
)
return
0
;
if
(
!
c
lient
)
return
0
;
char
*
host_id
=
get_host_id
();
char
*
host_id
=
get_host_id
();
if
(
host_id
&&
!
c
ontrol
->
in_SSL
&&
!
lockdownd_start_SSL_session
(
control
,
host_id
))
return
0
;
if
(
host_id
&&
!
c
lient
->
in_SSL
&&
!
lockdownd_start_SSL_session
(
client
,
host_id
))
return
0
;
char
*
XML_query
,
**
dictionary
;
char
*
XML_query
,
**
dictionary
;
uint32
length
,
i
=
0
,
port
=
0
;
uint32
length
,
i
=
0
,
port
=
0
;
...
@@ -835,10 +838,10 @@ int lockdownd_start_service(lockdownd_client *control, const char *service) {
...
@@ -835,10 +838,10 @@ int lockdownd_start_service(lockdownd_client *control, const char *service) {
xmlDocDumpMemory
(
plist
,
(
xmlChar
**
)
&
XML_query
,
&
length
);
xmlDocDumpMemory
(
plist
,
(
xmlChar
**
)
&
XML_query
,
&
length
);
lockdownd_send
(
c
ontrol
,
XML_query
,
length
);
lockdownd_send
(
c
lient
,
XML_query
,
length
);
free
(
XML_query
);
free
(
XML_query
);
length
=
lockdownd_recv
(
c
ontrol
,
&
XML_query
);
length
=
lockdownd_recv
(
c
lient
,
&
XML_query
);
xmlFreeDoc
(
plist
);
xmlFreeDoc
(
plist
);
...
...
src/lockdown.h
View file @
21d5d4ac
...
@@ -32,29 +32,30 @@
...
@@ -32,29 +32,30 @@
typedef
struct
lockdownd_client_s
{
struct
iphone_lckd_client_int
{
usbmux_connection
*
connection
;
usbmux_connection
*
connection
;
gnutls_session_t
*
ssl_session
;
gnutls_session_t
*
ssl_session
;
int
in_SSL
;
int
in_SSL
;
char
*
gtls_buffer_hack
;
char
*
gtls_buffer_hack
;
int
gtls_buffer_hack_len
;
int
gtls_buffer_hack_len
;
}
lockdownd_client
;
};
char
*
lockdownd_generate_hostid
();
char
*
lockdownd_generate_hostid
();
lockdownd_client
*
new_lockdownd_client
(
iPhone
*
phone
);
iphone_lckd_client_t
new_lockdownd_client
(
iphone_device_t
phone
);
int
lockdownd_hello
(
lockdownd_client
*
control
);
int
lockdownd_hello
(
iphone_lckd_client_t
control
);
int
lockdownd_get_device_uid
(
lockdownd_client
*
control
,
char
**
uid
);
int
lockdownd_get_device_uid
(
iphone_lckd_client_t
control
,
char
**
uid
);
int
lockdownd_get_device_public_key
(
lockdownd_client
*
control
,
char
**
public_key
);
int
lockdownd_get_device_public_key
(
iphone_lckd_client_t
control
,
char
**
public_key
);
int
lockdownd_gen_pair_cert
(
char
*
public_key_b64
,
char
**
device_cert_b64
,
char
**
host_cert_b64
,
char
**
root_cert_b64
);
int
lockdownd_gen_pair_cert
(
char
*
public_key_b64
,
char
**
device_cert_b64
,
char
**
host_cert_b64
,
char
**
root_cert_b64
);
int
lockdownd_pair_device
(
lockdownd_client
*
control
,
char
*
uid
,
char
*
host_id
);
int
lockdownd_pair_device
(
iphone_lckd_client_t
control
,
char
*
public_key
,
char
*
host_id
);
int
lockdownd_recv
(
lockdownd_client
*
control
,
char
**
dump_data
);
int
lockdownd_recv
(
iphone_lckd_client_t
control
,
char
**
dump_data
);
int
lockdownd_send
(
lockdownd_client
*
control
,
char
*
raw_data
,
uint32
length
);
int
lockdownd_send
(
iphone_lckd_client_t
control
,
char
*
raw_data
,
uint32
length
);
void
lockdownd_close
(
lockdownd_client
*
control
);
void
lockdownd_close
(
iphone_lckd_client_t
control
);
// SSL functions
// SSL functions
int
lockdownd_start_SSL_session
(
lockdownd_client
*
control
,
const
char
*
HostID
);
int
lockdownd_start_SSL_session
(
iphone_lckd_client_t
control
,
const
char
*
HostID
);
ssize_t
lockdownd_securead
(
gnutls_transport_ptr_t
transport
,
char
*
buffer
,
size_t
length
);
ssize_t
lockdownd_securead
(
gnutls_transport_ptr_t
transport
,
char
*
buffer
,
size_t
length
);
ssize_t
lockdownd_secuwrite
(
gnutls_transport_ptr_t
transport
,
char
*
buffer
,
size_t
length
);
ssize_t
lockdownd_secuwrite
(
gnutls_transport_ptr_t
transport
,
char
*
buffer
,
size_t
length
);
...
...
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