#include #include #include xpc_status_t xpc_string_read( const xpc_string_t *s, char *out, size_t max, size_t *nr_read) { if ((s->s_flags & (XPC_STRING_F_IN | XPC_STRING_F_REMOTE)) != (XPC_STRING_F_IN | XPC_STRING_F_REMOTE)) { return KERN_BAD_STATE; } size_t to_read = max - 1; if (to_read > s->s_len) { to_read = s->s_len; } kern_status_t status = xpc_msg_read(s->s_origin, s->s_offset, out, to_read); if (status != KERN_OK) { return status; } out[to_read] = '\0'; /* TODO */ *nr_read = to_read; return KERN_OK; } xpc_status_t xpc_string_write( xpc_string_t *s, const char *in, size_t len, size_t *nr_written) { if ((s->s_flags & (XPC_STRING_F_OUT | XPC_STRING_F_REMOTE)) != (XPC_STRING_F_IN | XPC_STRING_F_REMOTE)) { return KERN_BAD_STATE; } size_t to_write = len; if (to_write > s->s_max - 1) { to_write = s->s_max - 1; } kern_status_t status = xpc_msg_write(s->s_origin, s->s_offset, in, to_write); if (status != KERN_OK) { return status; } /* TODO */ *nr_written = to_write; return KERN_OK; }