12#include <sys/socket.h>
14#include <netinet/in.h>
15#define CLOSESOCKET close
16#define INVALID_SOCKET -1
22#define CLOSESOCKET closesocket
23#define UNLINK DeleteFileA
39 WSAStartup(MAKEWORD(2,2), &wsadata);
47 Wsa_guard& operator=(Wsa_guard&&) =
delete;
60 auto reader = std::make_unique<Ipc_frame_reader>();
64 reader->listen_fd = socket(AF_UNIX, SOCK_STREAM, 0);
70 memset(&addr, 0,
sizeof(addr));
71 addr.sun_family = AF_UNIX;
72 strncpy(addr.sun_path, path,
sizeof(addr.sun_path));
73 addr.sun_path[
sizeof(addr.sun_path) - 1] =
'\0';
77 ret = bind(reader->listen_fd, (
const sockaddr *) &addr,
sizeof(addr.sun_path));
83 ret = listen(reader->listen_fd, 5);
89 return reader.release();
104 size_t bytes_read = 0;
106 while(bytes_read < size){
107 int read_now = recv(fd, dst + bytes_read, size - bytes_read, 0);
111 bytes_read += read_now;
129 int ret = select(fd + 1, &fds,
nullptr,
nullptr, &tv);
192 auto writer = std::make_unique<Ipc_frame_writer>();
196 memset(&addr, 0,
sizeof(addr));
197 addr.sun_family = AF_UNIX;
198 strncpy(addr.sun_path, path,
sizeof(addr.sun_path));
199 addr.sun_path[
sizeof(addr.sun_path) - 1] =
'\0';
201 writer->data_fd = socket(AF_UNIX, SOCK_STREAM, 0);
203 perror(
"ipc_frame_writer_new socket");
207 int ret = connect(
writer->data_fd, (
const struct sockaddr *) &addr,
sizeof(addr));
209 perror(
"ipc_frame_writer_new connect");
226void block_write(
fd_t fd,
void *buf,
size_t size){
228 char *src =
static_cast<char *
>(buf);
230 while(written < size){
231 int ret = send(fd, src + written, size - written,
MSG_NOSIGNAL);
241 std::array<char, IPC_FRAME_HEADER_LEN> header;
246 block_write(
writer->data_fd, header.data(), header.size());
static void * writer(void *arg)
bool ipc_frame_parse_header(Ipc_frame_header *hdr, const char *buf)
void ipc_frame_write_header(const struct Ipc_frame_header *hdr, char *dst)
bool ipc_frame_reserve(Ipc_frame *frame, size_t size)
#define IPC_FRAME_HEADER_LEN
void ipc_frame_reader_wait_connect(struct Ipc_frame_reader *reader)
bool ipc_frame_reader_has_frame(struct Ipc_frame_reader *reader)
bool ipc_frame_writer_write(struct Ipc_frame_writer *writer, const struct Ipc_frame *f)
void ipc_frame_reader_free(struct Ipc_frame_reader *reader)
Ipc_frame_reader * ipc_frame_reader_new(const char *path)
bool ipc_frame_reader_is_connected(struct Ipc_frame_reader *reader)
bool ipc_frame_reader_read(Ipc_frame_reader *reader, Ipc_frame *dst)
static bool do_frame_read(Ipc_frame_reader *reader, Ipc_frame *dst)
static size_t blocking_read(fd_t fd, char *dst, size_t size)
static bool try_accept(struct Ipc_frame_reader *reader)
static bool socket_read_avail(fd_t fd)
void ipc_frame_writer_free(struct Ipc_frame_writer *writer)
Ipc_frame_writer * ipc_frame_writer_new(const char *path)