| 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.
|
| 13 | struct 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 |
|
| 21 | struct 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.
|
| 34 | void 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.
|
| 46 | void fanos_recv(int sock_fd, int* fd_out, struct FanosResult* result_out,
|
| 47 | struct FanosError* err);
|
| 48 |
|
| 49 | #endif // FANOS_SHARED_H
|