+int Server::getPipe() const {
+ return pipe;
+}
+
+string &Server::drain() {
+ if (pipe != -1) {
+ again:
+ char read_buf[1<<12];
+ auto read_len = read(pipe, read_buf, sizeof(read_buf));
+
+ if (read_len > 0) {
+ output.append(read_buf, read_len);
+ goto again;
+ }
+ if (read_len == -1) {
+ switch (errno) {
+ case EINTR:
+ goto again;
+ default:
+ perror("Server::drain read()");
+ [[fallthrough]];
+ case EAGAIN:
+#if EWOULDBLOCK != EAGAIN
+ case EWOULDBLOCK:
+#endif
+ break;
+ }
+ }
+ }
+ return output;
+}