lib: xpc: implement writing to local buffers
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
#include <mango/status.h>
|
#include <mango/status.h>
|
||||||
|
#include <string.h>
|
||||||
#include <xpc/buffer.h>
|
#include <xpc/buffer.h>
|
||||||
#include <xpc/msg.h>
|
#include <xpc/msg.h>
|
||||||
|
|
||||||
@@ -36,8 +37,7 @@ kern_status_t xpc_buffer_write(
|
|||||||
size_t len,
|
size_t len,
|
||||||
size_t *nr_written)
|
size_t *nr_written)
|
||||||
{
|
{
|
||||||
if ((buf->buf_flags & (XPC_BUFFER_F_OUT | XPC_BUFFER_F_REMOTE))
|
if (!(buf->buf_flags & XPC_BUFFER_F_OUT)) {
|
||||||
!= (XPC_BUFFER_F_OUT | XPC_BUFFER_F_REMOTE)) {
|
|
||||||
return KERN_BAD_STATE;
|
return KERN_BAD_STATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,6 +46,12 @@ kern_status_t xpc_buffer_write(
|
|||||||
to_write = buf->buf_max;
|
to_write = buf->buf_max;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(buf->buf_flags & XPC_BUFFER_F_REMOTE)) {
|
||||||
|
memcpy(buf->buf_ptr, in, to_write);
|
||||||
|
*nr_written = to_write;
|
||||||
|
return KERN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
kern_status_t status
|
kern_status_t status
|
||||||
= xpc_msg_write(buf->buf_origin, buf->buf_offset, in, to_write);
|
= xpc_msg_write(buf->buf_origin, buf->buf_offset, in, to_write);
|
||||||
if (status != KERN_OK) {
|
if (status != KERN_OK) {
|
||||||
|
|||||||
@@ -18,6 +18,13 @@
|
|||||||
.buf_offset = (offset), \
|
.buf_offset = (offset), \
|
||||||
.buf_len = (size), \
|
.buf_len = (size), \
|
||||||
}
|
}
|
||||||
|
#define XPC_LOCAL_BUFFER_OUT(ptr, size) \
|
||||||
|
{ \
|
||||||
|
.buf_flags = XPC_BUFFER_F_OUT, \
|
||||||
|
.buf_ptr = (ptr), \
|
||||||
|
.buf_max = (size), \
|
||||||
|
.buf_len = (size), \
|
||||||
|
}
|
||||||
|
|
||||||
struct xpc_msg;
|
struct xpc_msg;
|
||||||
|
|
||||||
@@ -49,7 +56,7 @@ typedef struct xpc_buffer {
|
|||||||
/* only valid if F_OUT is set.
|
/* only valid if F_OUT is set.
|
||||||
* if F_FREE_ON_DISCARD is set, must be either NULL or
|
* if F_FREE_ON_DISCARD is set, must be either NULL or
|
||||||
* allocated via xpc_context_alloc */
|
* allocated via xpc_context_alloc */
|
||||||
const char *buf_ptr;
|
void *buf_ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* fields that are only valid if F_IN is set */
|
/* fields that are only valid if F_IN is set */
|
||||||
|
|||||||
Reference in New Issue
Block a user