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