MOS Source Code
Loading...
Searching...
No Matches
ipc_sysfs.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2
3// ! /sys/ipc/<server_name> operations to connect to an IPC server
4
7#include "mos/ipc/ipc.hpp"
8#include "mos/ipc/ipc_io.hpp"
10#include "mos/tasks/process.hpp"
11
12#include <mos/allocator.hpp>
13#include <mos_stdlib.hpp>
14#include <mos_string.hpp>
15
22
23static bool vfs_open_ipc(inode_t *ino, file_t *file, bool created)
24{
25 MOS_UNUSED(ino);
26
27 IPCDescriptor *ipc = NULL;
28 IPCServer *server = NULL;
29
30 if (created)
31 {
32 const auto result = ipc_get_server(file->dentry->name);
33 if (result.isErr())
34 return false;
35 server = result.get();
36 MOS_ASSERT(server);
37 }
38 else
39 {
40 const auto result = ipc_connect_to_server(file->dentry->name, MOS_PAGE_SIZE);
41 if (result.isErr())
42 return false;
43 ipc = result.get();
44 MOS_ASSERT(ipc);
45 }
46
48 priv->server_control_file = created;
49 priv->client_ipc = ipc;
50 priv->server = server;
51
52 file->private_data = priv;
53 return true;
54}
55
56static ssize_t vfs_ipc_file_read(const file_t *file, void *buf, size_t size, off_t offset)
57{
58 MOS_UNUSED(offset);
59
61 if (priv->server_control_file)
62 {
63 // reading from the server's control file accepts and returns a new connection, as a fd
64 if (size < sizeof(fd_t))
65 return -EINVAL;
66
67 auto ipc = ipc_server_accept(priv->server);
68 if (ipc.isErr())
69 return ipc.getErr();
70
71 auto connio = ipc_conn_io_create(ipc.get(), true);
72 if (connio.isErr())
73 return connio.getErr();
74
76 if (IS_ERR_VALUE(fd))
77 return fd;
78
79 // return the fd to the client
80 memcpy(buf, &fd, sizeof(fd_t));
81 return sizeof(fd_t);
82 }
83 else
84 {
85 return ipc_client_read(priv->client_ipc, buf, size);
86 }
87}
88
89static ssize_t vfs_ipc_file_write(const file_t *file, const void *buf, size_t size, off_t offset)
90{
91 MOS_UNUSED(offset);
93 if (priv->server_control_file)
94 return -EBADF; // writing to the server's control file is not supported
95
96 return ipc_client_write(priv->client_ipc, buf, size);
97}
98
99static void vfs_ipc_file_release(file_t *file)
100{
102 if (priv->server_control_file)
103 {
105 dentry_detach(file->dentry);
106 }
107 else
109 delete priv;
110}
111
113 .open = vfs_open_ipc,
114 .read = vfs_ipc_file_read,
115 .write = vfs_ipc_file_write,
116 .release = vfs_ipc_file_release,
117};
#define MOS_ASSERT(cond)
Definition assert.hpp:14
#define MOS_PAGE_SIZE
Definition autoconf.h:6
@ FD_FLAGS_NONE
Definition fs_types.h:48
void dentry_detach(dentry_t *d)
Detach the inode from a dentry.
Definition dentry.cpp:319
void ipc_server_close(IPCServer *server)
Definition ipc.cpp:88
void ipc_client_close_channel(IPCDescriptor *ipc)
Definition ipc.cpp:153
PtrResult< IPCServer > ipc_get_server(mos::string_view name)
Definition ipc.cpp:224
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_client_read(IPCDescriptor *ipc, void *buffer, size_t size)
Definition ipc.cpp:133
const file_ops_t ipc_sysfs_file_ops
size_t ipc_client_write(IPCDescriptor *ipc, const void *buffer, size_t size)
Definition ipc.cpp:138
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
static ssize_t vfs_ipc_file_write(const file_t *file, const void *buf, size_t size, off_t offset)
Definition ipc_sysfs.cpp:89
static void vfs_ipc_file_release(file_t *file)
Definition ipc_sysfs.cpp:99
static ssize_t vfs_ipc_file_read(const file_t *file, void *buf, size_t size, off_t offset)
Definition ipc_sysfs.cpp:56
static bool vfs_open_ipc(inode_t *ino, file_t *file, bool created)
Definition ipc_sysfs.cpp:23
#define MOS_UNUSED(x)
Definition mos_global.h:65
#define IS_ERR_VALUE(x)
Definition mos_global.h:137
T * create(Args &&...args)
Definition allocator.hpp:10
static void * memcpy(void *s1, const void *s2, size_t n)
Definition pb_syshdr.h:90
#define NULL
Definition pb_syshdr.h:46
#define current_process
Definition platform.hpp:33
fd_t process_attach_ref_fd(Process *process, io_t *file, fd_flags_t flags)
Definition process.cpp:172
size_t size
Definition slab.cpp:34
mos::string name
void * private_data
dentry_t * dentry
IPCDescriptor * client_ipc
Definition ipc_sysfs.cpp:20
IPCServer * server
Definition ipc_sysfs.cpp:19
ssize_t off_t
Definition types.h:80
s32 fd_t
Definition types.h:77
signed long ssize_t
Definition types.h:79