MOS Source Code
Loading...
Searching...
No Matches
ipc_io.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2// io_t wrapper for IPC channels
3
4#include "mos/ipc/ipc_io.hpp"
5
6#include "mos/io/io.hpp"
7#include "mos/ipc/ipc.hpp"
8#include "mos/misc/panic.hpp"
9
10#include <mos/allocator.hpp>
11#include <mos_stdlib.hpp>
12
18
19static void ipc_control_io_close(io_t *io)
20{
21 if (io->type != IO_IPC)
22 mos_panic("ipc_control_io_close: io->type != IO_IPC"); // handle error cases in io_close
23
24 // we only deannounce the server, we don't free it
25 ipc_server_io_t *server_io = container_of(io, ipc_server_io_t, control_io);
26 ipc_server_close(server_io->server);
27 delete server_io;
28}
29
30static const io_op_t ipc_control_io_op = {
31 .close = ipc_control_io_close,
32};
33
34static size_t ipc_client_io_write(io_t *io, const void *buf, size_t size)
35{
37 return ipc_client_write(conn->ipc, buf, size);
38}
39
40static size_t ipc_client_io_read(io_t *io, void *buf, size_t size)
41{
43 return ipc_client_read(conn->ipc, buf, size);
44}
45
46static void ipc_client_io_close(io_t *io)
47{
48 if (io->type != IO_IPC)
49 mos_panic("ipc_client_io_close: io->type != IO_IPC"); // handle error cases in io_close
50
53 delete conn;
54}
55
56static size_t ipc_server_io_write(io_t *io, const void *buf, size_t size)
57{
59 return ipc_server_write(conn->ipc, buf, size);
60}
61
62static size_t ipc_server_io_read(io_t *io, void *buf, size_t size)
63{
65 return ipc_server_read(conn->ipc, buf, size);
66}
67
68static void ipc_server_io_close(io_t *io)
69{
70 if (io->type != IO_IPC)
71 mos_panic("ipc_server_io_close: io->type != IO_IPC"); // handle error cases in io_close
72
75 delete conn;
76}
77
78static const io_op_t ipc_client_io_op = {
79 .read = ipc_client_io_read,
80 .write = ipc_client_io_write,
81 .close = ipc_client_io_close,
82};
83
84static const io_op_t ipc_server_io_op = {
85 .read = ipc_server_io_read,
86 .write = ipc_server_io_write,
87 .close = ipc_server_io_close,
88};
89
91{
93 if (io == nullptr)
94 return -ENOMEM;
95
96 io->ipc = ipc;
98 return io;
99}
100
101PtrResult<io_t> ipc_create(const char *name, size_t max_pending_connections)
102{
103 auto server = ipc_server_create(name, max_pending_connections);
104 if (server.isErr())
105 return server.getErr();
106
108 if (io == nullptr)
109 {
110 ipc_server_close(server.get());
111 return -ENOMEM;
112 }
113
114 io->server = server.get();
116 return &io->control_io;
117}
118
120{
121 if (server->type != IO_IPC)
122 return -EBADF; // not an ipc server
123
124 ipc_server_io_t *ipc_server = container_of(server, ipc_server_io_t, control_io);
125 auto ipc = ipc_server_accept(ipc_server->server);
126 if (ipc.isErr())
127 return ipc.getErr();
128
129 auto io = ipc_conn_io_create(ipc.get(), true);
130 if (io.isErr())
131 return io.getErr();
132
133 return &io->io;
134}
135
136PtrResult<io_t> ipc_connect(const char *name, size_t buffer_size)
137{
138 auto ipc = ipc_connect_to_server(name, buffer_size);
139 if (ipc.isErr())
140 return ipc.getErr();
141
142 auto connio = ipc_conn_io_create(ipc.get(), false);
143 if (connio.isErr())
144 return connio.getErr();
145
146 return &connio->io;
147}
void io_init(io_t *io, io_type_t type, io_flags_t flags, const io_op_t *ops)
Definition io.cpp:45
@ IO_READABLE
Definition io.hpp:27
@ IO_WRITABLE
Definition io.hpp:28
@ IO_NONE
Definition io.hpp:26
@ IO_IPC
Definition io.hpp:19
void ipc_server_close(IPCServer *server)
Definition ipc.cpp:88
void ipc_server_close_channel(IPCDescriptor *ipc)
Definition ipc.cpp:167
void ipc_client_close_channel(IPCDescriptor *ipc)
Definition ipc.cpp:153
size_t ipc_server_read(IPCDescriptor *ipc, void *buffer, size_t size)
Definition ipc.cpp:143
PtrResult< IPCDescriptor > ipc_server_accept(IPCServer *server)
Definition ipc.cpp:236
PtrResult< IPCDescriptor > ipc_connect_to_server(mos::string_view name, size_t buffer_size)
Definition ipc.cpp:305
size_t ipc_server_write(IPCDescriptor *ipc, const void *buffer, size_t size)
Definition ipc.cpp:148
size_t ipc_client_read(IPCDescriptor *ipc, void *buffer, size_t size)
Definition ipc.cpp:133
PtrResult< IPCServer > ipc_server_create(mos::string_view name, size_t max_pending_connections)
Definition ipc.cpp:188
size_t ipc_client_write(IPCDescriptor *ipc, const void *buffer, size_t size)
Definition ipc.cpp:138
static const io_op_t ipc_control_io_op
Definition ipc_io.cpp:30
static const io_op_t ipc_client_io_op
Definition ipc_io.cpp:78
static size_t ipc_server_io_write(io_t *io, const void *buf, size_t size)
Definition ipc_io.cpp:56
static const io_op_t ipc_server_io_op
Definition ipc_io.cpp:84
static void ipc_control_io_close(io_t *io)
Definition ipc_io.cpp:19
static size_t ipc_server_io_read(io_t *io, void *buf, size_t size)
Definition ipc_io.cpp:62
PtrResult< io_t > ipc_connect(const char *name, size_t buffer_size)
Connect to an IPC servers.
Definition ipc_io.cpp:136
static void ipc_server_io_close(io_t *io)
Definition ipc_io.cpp:68
static size_t ipc_client_io_write(io_t *io, const void *buf, size_t size)
Definition ipc_io.cpp:34
static void ipc_client_io_close(io_t *io)
Definition ipc_io.cpp:46
static size_t ipc_client_io_read(io_t *io, void *buf, size_t size)
Definition ipc_io.cpp:40
PtrResult< ipc_conn_io_t > ipc_conn_io_create(IPCDescriptor *ipc, bool is_server_side)
Create a new IPC connection io descriptor.
Definition ipc_io.cpp:90
PtrResult< io_t > ipc_create(const char *name, size_t max_pending_connections)
Create a new IPC server.
Definition ipc_io.cpp:101
PtrResult< io_t > ipc_accept(io_t *server)
Accept a new connection on an IPC server.
Definition ipc_io.cpp:119
T * create(Args &&...args)
Definition allocator.hpp:10
#define mos_panic(fmt,...)
Definition panic.hpp:51
size_t size
Definition slab.cpp:34
const char * name
Definition slab.cpp:35
Definition io.hpp:37
Definition io.hpp:48
io_type_t type
Definition io.hpp:52
IPCDescriptor * ipc
Definition ipc_io.hpp:13
IPCServer * server
Definition ipc_io.cpp:16
#define container_of(ptr, type, member)
Definition types.hpp:31