-
Notifications
You must be signed in to change notification settings - Fork 1
/
external_filedesc.H
61 lines (41 loc) · 1.28 KB
/
external_filedesc.H
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
** Copyright 2022 Double Precision, Inc.
** See COPYING for distribution information.
*/
#ifndef external_filedesc_h
#define external_filedesc_h
#include <unistd.h>
#include <memory>
#include <string>
#include <string_view>
//! An externally-supplied file descriptor
//! It gets automatically closed when no longer needed.
struct external_filedescObj {
const int fd;
external_filedescObj(int fd) : fd{fd}
{
}
~external_filedescObj();
external_filedescObj(const external_filedescObj &)=delete;
void write_all(std::string_view msg);
private:
std::string buffer;
public:
std::string readln();
bool ready();
};
typedef std::shared_ptr<external_filedescObj> external_filedesc;
/*! forward output from a container to the requester's stdout
A start/stop/restart/reload command creates a pipe and shoves one end of the
pipe into the container.
The command then reads the other end of the pipe and copies it to stdout.
forward_carbon_copy() constantly reads from the pipe until it's closed (the
command is done), buffering the read contents, if necessary, if it can't
be written. The other end of the pipe comes from pid 1, don't want to block
it. It's better to block this pid, then pid 1.
*/
bool forward_carbon_copy(
const external_filedesc &from,
int stdout_fd
);
#endif