service: add various accessors.
[oweals/dinit.git] / src / tests / test-includes / baseproc-sys.h
1 #ifndef BPSYS_INCLUDED
2 #define BPSYS_INCLUDED
3
4 #include <string>
5 #include <sys/types.h>
6 #include <unistd.h>
7
8 // Mock system functions for testing.
9
10 namespace bp_sys {
11
12 // implementations elsewhere:
13 int pipe2(int pipefd[2], int flags);
14 int close(int fd);
15 int kill(pid_t pid, int sig);
16
17 inline int fcntl(int fd, int cmd, ...)
18 {
19     // This is used for setting the CLOEXEC flag, we can just return 0:
20     return 0;
21 }
22
23 inline pid_t getpgid(pid_t pid)
24 {
25     return pid;
26 }
27
28 inline int tcsetpgrp(int fd, pid_t pgid)
29 {
30     return 0;
31 }
32
33 inline pid_t getpgrp()
34 {
35     return getpid();
36 }
37
38 class exit_status
39 {
40     friend pid_t waitpid(pid_t, exit_status *, int);
41
42     bool did_exit_v;
43     bool was_signalled_v;
44     int status;
45
46     public:
47     exit_status() : did_exit_v(true), was_signalled_v(false), status(0) { }
48
49     // status_p is either the exit status or termination signal:
50     exit_status(bool did_exit_p, bool was_signalled_p, int status_p)
51         : did_exit_v(did_exit_p), was_signalled_v(was_signalled_p), status(status_p)
52     { }
53
54     explicit exit_status(int status_p)
55     {
56         throw std::string("initalised exit_status with integer argument");
57     }
58
59     bool did_exit()
60     {
61         return did_exit_v;
62     }
63
64     bool did_exit_clean()
65     {
66         return did_exit_v && status == 0;
67     }
68
69     bool was_signalled()
70     {
71         return was_signalled_v;
72     }
73
74     int get_exit_status()
75     {
76         return status;
77     }
78
79     int get_term_sig()
80     {
81         return status;
82     }
83
84     int as_int()
85     {
86         return -1;
87     }
88 };
89
90 inline pid_t waitpid(pid_t p, exit_status *statusp, int flags)
91 {
92     throw std::string("not implemented");
93 }
94
95 }
96
97 #endif