The Pedigree Project 0.1
child-wait-contract-test/contract.h
1#ifndef CHILD_WAIT_CONTRACT_H
2#define CHILD_WAIT_CONTRACT_H
3
4#include <errno.h>
5#include <pthread.h>
6#include <signal.h>
7#include <stdatomic.h>
8#include <stddef.h>
9#include <stdint.h>
10#include <stdio.h>
11
12#include <sys/resource.h>
13#include <sys/types.h>
14#include <sys/wait.h>
15
16#define CW_RUSAGE_BYTES 144
17_Static_assert(offsetof(struct rusage, __reserved) == CW_RUSAGE_BYTES,
18 "musl amd64 rusage kernel prefix changed");
19
20#define CHECK(condition) \
21 do { \
22 if (!(condition)) { \
23 fprintf(stderr, "%s:%d: %s (errno=%d)\n", __FILE__, __LINE__, #condition, errno); \
24 failed = 1; \
25 goto out; \
26 } \
27 } while (0)
28
29struct cw_child {
30 pid_t pid;
31 int command, report;
32};
33#define CW_CHILD_INIT {.pid = -1, .command = -1, .report = -1}
34extern size_t cw_page;
35int64_t cw_now(void);
36int cw_read(int fd, void* data, size_t size);
37int cw_write(int fd, const void* data, size_t size);
38int cw_send(int fd, char value);
39int cw_receive(int fd, char value);
40int cw_atomic_wait(atomic_uint* value, unsigned expected);
41int cw_spawn(struct cw_child*, pid_t group, uid_t uid, int exit_code);
42void cw_cleanup(struct cw_child*);
43int cw_reap(pid_t pid, int milliseconds);
44int cw_info(const siginfo_t*, pid_t, uid_t, int code, int status);
45int cw_empty_info(const siginfo_t*);
46int cw_usage(const struct rusage*);
47int cw_bytes(const void*, size_t, unsigned char);
48long cw_raw_waitid(idtype_t, id_t, void*, int, struct rusage*);
49int cw_selectors(void);
50int cw_events(void);
51int cw_lifetime(void);
52int cw_copyout(void);
53int cw_errors(void);
54int cw_interruption(void);
55#endif