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
5
#include "
mos/filesystem/dentry.hpp
"
6
#include "
mos/filesystem/vfs_types.hpp
"
7
#include "
mos/ipc/ipc.hpp
"
8
#include "
mos/ipc/ipc_io.hpp
"
9
#include "
mos/platform/platform.hpp
"
10
#include "
mos/tasks/process.hpp
"
11
12
#include <
mos/allocator.hpp
>
13
#include <
mos_stdlib.hpp
>
14
#include <
mos_string.hpp
>
15
16
struct
ipc_vfs_private_t
:
mos::NamedType
<"IPC_VFS_Private">
17
{
18
bool
server_control_file
;
19
IPCServer
*
server
;
20
IPCDescriptor
*
client_ipc
;
21
};
22
23
static
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
47
ipc_vfs_private_t
*priv =
mos::create<ipc_vfs_private_t>
();
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
56
static
ssize_t
vfs_ipc_file_read
(
const
file_t
*file,
void
*buf,
size_t
size
,
off_t
offset)
57
{
58
MOS_UNUSED
(offset);
59
60
ipc_vfs_private_t
*priv = (
ipc_vfs_private_t
*) file->
private_data
;
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
75
const
fd_t
fd =
process_attach_ref_fd
(
current_process
, &connio->io,
FD_FLAGS_NONE
);
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
89
static
ssize_t
vfs_ipc_file_write
(
const
file_t
*file,
const
void
*buf,
size_t
size
,
off_t
offset)
90
{
91
MOS_UNUSED
(offset);
92
ipc_vfs_private_t
*priv = (
ipc_vfs_private_t
*) file->
private_data
;
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
99
static
void
vfs_ipc_file_release
(
file_t
*file)
100
{
101
ipc_vfs_private_t
*priv = (
ipc_vfs_private_t
*) file->
private_data
;
102
if
(priv->
server_control_file
)
103
{
104
ipc_server_close
(priv->
server
);
105
dentry_detach
(file->
dentry
);
106
}
107
else
108
ipc_client_close_channel
(priv->
client_ipc
);
109
delete
priv;
110
}
111
112
const
file_ops_t
ipc_sysfs_file_ops
= {
113
.open =
vfs_open_ipc
,
114
.read =
vfs_ipc_file_read
,
115
.write =
vfs_ipc_file_write
,
116
.release =
vfs_ipc_file_release
,
117
};
allocator.hpp
MOS_ASSERT
#define MOS_ASSERT(cond)
Definition
assert.hpp:14
MOS_PAGE_SIZE
#define MOS_PAGE_SIZE
Definition
autoconf.h:6
dentry.hpp
FD_FLAGS_NONE
@ FD_FLAGS_NONE
Definition
fs_types.h:48
dentry_detach
void dentry_detach(dentry_t *d)
Detach the inode from a dentry.
Definition
dentry.cpp:319
ipc.hpp
ipc_server_close
void ipc_server_close(IPCServer *server)
Definition
ipc.cpp:88
ipc_client_close_channel
void ipc_client_close_channel(IPCDescriptor *ipc)
Definition
ipc.cpp:153
ipc_get_server
PtrResult< IPCServer > ipc_get_server(mos::string_view name)
Definition
ipc.cpp:224
ipc_server_accept
PtrResult< IPCDescriptor > ipc_server_accept(IPCServer *server)
Definition
ipc.cpp:236
ipc_connect_to_server
PtrResult< IPCDescriptor > ipc_connect_to_server(mos::string_view name, size_t buffer_size)
Definition
ipc.cpp:305
ipc_client_read
size_t ipc_client_read(IPCDescriptor *ipc, void *buffer, size_t size)
Definition
ipc.cpp:133
ipc_sysfs_file_ops
const file_ops_t ipc_sysfs_file_ops
Definition
ipc_sysfs.cpp:112
ipc_client_write
size_t ipc_client_write(IPCDescriptor *ipc, const void *buffer, size_t size)
Definition
ipc.cpp:138
ipc_io.hpp
ipc_conn_io_create
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
vfs_ipc_file_write
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
vfs_ipc_file_release
static void vfs_ipc_file_release(file_t *file)
Definition
ipc_sysfs.cpp:99
vfs_ipc_file_read
static ssize_t vfs_ipc_file_read(const file_t *file, void *buf, size_t size, off_t offset)
Definition
ipc_sysfs.cpp:56
vfs_open_ipc
static bool vfs_open_ipc(inode_t *ino, file_t *file, bool created)
Definition
ipc_sysfs.cpp:23
MOS_UNUSED
#define MOS_UNUSED(x)
Definition
mos_global.h:65
IS_ERR_VALUE
#define IS_ERR_VALUE(x)
Definition
mos_global.h:137
mos_stdlib.hpp
mos_string.hpp
mos::create
T * create(Args &&...args)
Definition
allocator.hpp:10
memcpy
static void * memcpy(void *s1, const void *s2, size_t n)
Definition
pb_syshdr.h:90
NULL
#define NULL
Definition
pb_syshdr.h:46
platform.hpp
current_process
#define current_process
Definition
platform.hpp:33
process.hpp
process_attach_ref_fd
fd_t process_attach_ref_fd(Process *process, io_t *file, fd_flags_t flags)
Definition
process.cpp:172
size
size_t size
Definition
slab.cpp:34
IPCDescriptor
Definition
ipc.cpp:30
IPCServer
Definition
ipc.cpp:55
dentry_t::name
mos::string name
Definition
vfs_types.hpp:119
file_ops_t
Definition
vfs_types.hpp:90
file_t
Definition
vfs_types.hpp:199
file_t::private_data
void * private_data
Definition
vfs_types.hpp:204
file_t::dentry
dentry_t * dentry
Definition
vfs_types.hpp:201
inode_t
Definition
vfs_types.hpp:157
ipc_vfs_private_t
Definition
ipc_sysfs.cpp:17
ipc_vfs_private_t::client_ipc
IPCDescriptor * client_ipc
Definition
ipc_sysfs.cpp:20
ipc_vfs_private_t::server_control_file
bool server_control_file
Definition
ipc_sysfs.cpp:18
ipc_vfs_private_t::server
IPCServer * server
Definition
ipc_sysfs.cpp:19
mos::NamedType
Definition
type_utils.hpp:24
off_t
ssize_t off_t
Definition
types.h:80
fd_t
s32 fd_t
Definition
types.h:77
ssize_t
signed long ssize_t
Definition
types.h:79
vfs_types.hpp
kernel
ipc
ipc_sysfs.cpp
Generated on Tue Feb 18 2025 16:41:40 for MOS Source Code by
1.13.2