11 // Mock system functions for testing.
18 virtual ssize_t write(int fd, const void *buf, size_t count) = 0;
19 virtual ~write_handler() { }
22 class default_write_handler : public write_handler
25 std::vector<char> data;
27 virtual ssize_t write(int fd, const void *buf, size_t count)
29 data.insert(data.end(), (char *)buf, (char *)buf + count);
34 // Test helper functions:
38 // allocate a file descriptor
40 int allocfd(write_handler *hndlr);
42 void supply_read_data(int fd, std::vector<char> &data);
43 void supply_read_data(int fd, std::vector<char> &&data);
44 void set_blocking(int fd);
45 void extract_written_data(int fd, std::vector<char> &data);
49 // implementations elsewhere:
50 int pipe2(int pipefd[2], int flags);
52 int kill(pid_t pid, int sig);
54 inline int fcntl(int fd, int cmd, ...)
56 // This is used for setting the CLOEXEC flag, we can just return 0:
60 inline pid_t getpgid(pid_t pid)
65 inline int tcsetpgrp(int fd, pid_t pgid)
70 inline pid_t getpgrp()
77 friend pid_t waitpid(pid_t, exit_status *, int);
84 exit_status() : did_exit_v(true), was_signalled_v(false), status(0) { }
86 // status_p is either the exit status or termination signal:
87 exit_status(bool did_exit_p, bool was_signalled_p, int status_p)
88 : did_exit_v(did_exit_p), was_signalled_v(was_signalled_p), status(status_p)
91 explicit exit_status(int status_p)
93 throw std::string("initalised exit_status with integer argument");
101 bool did_exit_clean()
103 return did_exit_v && status == 0;
108 return was_signalled_v;
111 int get_exit_status()
127 inline pid_t waitpid(pid_t p, exit_status *statusp, int flags)
129 throw std::string("not implemented");
132 ssize_t read(int fd, void *buf, size_t count);
133 ssize_t write(int fd, const void *buf, size_t count);
134 ssize_t writev (int fd, const struct iovec *iovec, int count);