1// SPDX-License-Identifier: GPL-3.0-or-later
2
3#include "blockdev.h"
4#include "ext4fs.hpp"
5#include "mos/proto/fs_server.h"
6#include "proto/blockdev.services.h"
7#include "proto/userfs-manager.services.h"
8
9#include <iostream>
10
11#define DEBUG 1
12
13std::unique_ptr<UserFSManagerStub> userfs_manager;
14std::unique_ptr<BlockdevManagerStub> blockdev_manager;
15
16int main(int argc, char **)
17{
18 std::cout << "EXT2/3/4 File System Driver for MOS" << std::endl;
19
20 if (argc > 1)
21 std::cerr << "Too many arguments" << std::endl, exit(status: 1);
22
23 blockdev_manager = std::make_unique<BlockdevManagerStub>(BLOCKDEV_MANAGER_RPC_SERVER_NAME);
24 userfs_manager = std::make_unique<UserFSManagerStub>(USERFS_SERVER_RPC_NAME);
25
26 const auto server_name = "fs.ext4"s;
27
28#if DEBUG
29 ext4_dmask_set(DEBUG_ALL);
30#endif
31
32 mosrpc_userfs_register_request req{
33 .fs = { .name = strdup(string: "ext4") },
34 .rpc_server_name = strdup(string: server_name.c_str()),
35 };
36 mosrpc_userfs_register_response resp;
37 const auto reg_result = userfs_manager->register_filesystem(request: &req, response: &resp);
38 if (reg_result != RPC_RESULT_OK || !resp.result.success)
39 {
40 std::cerr << "Failed to register filesystem" << std::endl;
41 if (resp.result.error)
42 std::cerr << "Error: " << resp.result.error << std::endl;
43 return 1;
44 }
45
46 pb_release(fields: &mosrpc_userfs_register_request_msg, dest_struct: &req);
47 pb_release(fields: &mosrpc_userfs_register_response_msg, dest_struct: &resp);
48
49 Ext4UserFS ext4_userfs(server_name);
50 ext4_userfs.run();
51 return 0;
52}
53