lib: xpc: implement writing to local buffers

This commit is contained in:
2026-03-15 09:43:00 +00:00
parent c9ccebacfc
commit ea2b0d3986
2 changed files with 16 additions and 3 deletions

View File

@@ -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) {

View File

@@ -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 */