summaryrefslogtreecommitdiffstats
path: root/syscall/handles.h
blob: 5b6e395067c3e6571b5faf759a26c0844806b927 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#ifndef _JOVE_SYSCALL_HANDLES_H
#define _JOVE_SYSCALL_HANDLES_H 1

#include "object.h"
#include <stddef.h>

#define SYSCALL_PAYLOAD_TAKEL(p, at, val, type) \
    if(sizeof(type) + at >= KO_MESSAGE_BYTES) return -KE_BADMSG; \
    val = *((type*)(&p[at])); \
    at += sizeof(type)

#define SYSCALL_PAYLOAD_TAKEP(p, at, val, type) \
    if(sizeof(type) + at >= KO_MESSAGE_BYTES) return -KE_BADMSG; \
    val = ((type*)(&p[at])); \
    at += sizeof(type)

#define SYSCALL_PAYLOAD_TAKEOBJ(p, at, w, o) \
    SYSCALL_PAYLOAD_TAKEL(p, at, w, size_t); \
    if(w + payload_at >= KO_MESSAGE_BYTES) return -KE_BADMSG; \
    o = objdir_seek(root_dir, &p[at], w); \
    at += w

int syscall_handle_invoke_objdir(objdir_t *root_dir, objdir_entry_t *target,  uint8_t *payload, size_t payload_at);
int syscall_handle_invoke_untyped(objdir_t *root_dir, objdir_entry_t *target, uint8_t *payload, size_t payload_at);
int syscall_handle_invoke_mapping(objdir_t *root_dir, objdir_entry_t *target, uint8_t *payload, size_t payload_at);

#endif