OILS / cpp / fanos_shared.h View on Github | oilshell.org

49 lines, 18 significant
1#ifndef FANOS_SHARED_H
2#define FANOS_SHARED_H
3
4// FANOS: File descriptors And Netstrings Over Sockets.
5//
6// This library is shared between cpp/ and pyext/.
7
8// Callers should initialize
9// FanosError to { 0, NULL }, and
10// FanosResult to { NULL, FANOS_INVALID_LEN }
11
12// Callers should check for BOTH I/O errors and protocol errors.
13struct FanosError {
14 int err_code; // errno for IOError
15 char const* value_err; // caller must not free; it's global
16};
17
18#define FANOS_INVALID_LEN -1
19#define FANOS_EOF -2
20
21struct FanosResult {
22 char* data; // caller must free if non-NULL
23 int len;
24};
25
26// We send or receive 3 file descriptors at a time (for stdin, stdout, stderr)
27
28#define FANOS_NUM_FDS 3
29
30// Send a byte string and optional FDs to a Unix socket.
31//
32// Upon failure `err` may be populated with an error message. The caller does
33// NOT have to free the message.
34void fanos_send(int sock_fd, char* blob, int blob_len, const int* fds,
35 struct FanosError* err);
36
37// Receive a byte string and possibly FDs from a Unix socket.
38//
39// If a message is received, result_out->data is set to a malloc()'d buffer.
40// The caller must fre() it.
41//
42// If there are no more messages, then the result_out->len is set to FANOS_EOF.
43//
44// Upon failure `err` may be populated with an error message. The caller does
45// NOT have to free the message.
46void fanos_recv(int sock_fd, int* fd_out, struct FanosResult* result_out,
47 struct FanosError* err);
48
49#endif // FANOS_SHARED_H