31 lines
631 B
C
31 lines
631 B
C
#include <errno.h>
|
|
#include <fs/context.h>
|
|
#include <fs/file.h>
|
|
#include <fs/status.h>
|
|
|
|
extern kern_status_t fs_msg_read(
|
|
xpc_context_t *xpc,
|
|
xpc_endpoint_t *sender,
|
|
size_t count,
|
|
int *out_err,
|
|
size_t *out_nr_read,
|
|
xpc_buffer_t *out_data,
|
|
void *arg)
|
|
{
|
|
struct fs_context *ctx = arg;
|
|
struct fs_file *f = fs_context_get_file(ctx, sender->e_port);
|
|
if (!f) {
|
|
*out_err = EBADF;
|
|
return KERN_OK;
|
|
}
|
|
|
|
size_t start = fs_file_get_cursor(f);
|
|
enum fs_status status = fs_file_read(f, out_data, count);
|
|
size_t end = fs_file_get_cursor(f);
|
|
|
|
*out_err = fs_status_to_errno(status);
|
|
*out_nr_read = end - start;
|
|
|
|
return KERN_OK;
|
|
}
|