1// SPDX-License-Identifier: GPL-3.0-or-later
2
3#include "mos/filesystem/userfs/userfs.hpp"
4#include "mos/filesystem/vfs.hpp"
5#include "mos/misc/setup.hpp"
6#include "mos/syslog/printk.hpp"
7#include "mos/tasks/kthread.hpp"
8#include "proto/userfs-manager.services.h"
9
10#include <librpc/rpc.h>
11#include <librpc/rpc_server.h>
12#include <mos/proto/fs_server.h>
13#include <mos_stdio.hpp>
14#include <pb_decode.h>
15#include <pb_encode.h>
16
17MOS_RPC_USERFS_MANAGER_SERVER(userfs_manager)
18
19static rpc_result_code_t userfs_manager_register_filesystem(rpc_context_t *, mosrpc_userfs_register_request *req, mosrpc_userfs_register_response *resp)
20{
21 userfs_t *userfs = mos::create<userfs_t>();
22 if (!userfs)
23 return RPC_RESULT_SERVER_INTERNAL_ERROR;
24
25 linked_list_init(list_node(&userfs->fs));
26
27 userfs->fs.name = mos::string("userfs.") + req->fs.name;
28 userfs->rpc_server_name = req->rpc_server_name;
29
30 resp->result.success = true;
31
32 userfs->fs.mount = userfs_fsop_mount;
33 vfs_register_filesystem(fs: &userfs->fs);
34 return RPC_RESULT_OK;
35}
36
37static void userfs_manager_server_exec(void *arg)
38{
39 MOS_UNUSED(arg);
40 rpc_server_t *fs_server = rpc_server_create(USERFS_SERVER_RPC_NAME, NULL);
41 rpc_server_register_functions(server: fs_server, functions: userfs_manager_functions, count: MOS_ARRAY_SIZE(userfs_manager_functions));
42 rpc_server_exec(server: fs_server);
43 pr_emerg("fs_rpc_execute_server exited");
44}
45
46static void userfs_manager_rpc_init()
47{
48 kthread_create(entry: userfs_manager_server_exec, NULL, name: "fs_rpc_server");
49}
50
51MOS_INIT(KTHREAD, userfs_manager_rpc_init);
52