1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <js_native_api.h>
17 #include <js_native_api_types.h>
18 #include <node_api.h>
19 #include <sys/mount.h>
20 #include <sys/stat.h>
21 #include <unistd.h>
22 
23 #define PARAM_0 0
24 #define PARAM_0777 0777
25 #define MPARAM_1 (-1)
26 
27 static const char *TEMP_DIR1 = "/data/storage/el2/base/files/tmpdir1";
28 static const char *TEMP_DIR2 = "/data/storage/el2/base/files/tmpdir2";
29 
Mount(napi_env env, napi_callback_info info)30 static napi_value Mount(napi_env env, napi_callback_info info)
31 {
32     int ret = MPARAM_1;
33     do {
34         ret = mkdir(TEMP_DIR1, PARAM_0777);
35         if (ret == MPARAM_1) {
36             break;
37         }
38         ret = mkdir(TEMP_DIR2, PARAM_0777);
39         if (ret == MPARAM_1) {
40             break;
41         }
42         ret = mount(TEMP_DIR1, TEMP_DIR2, "", MS_BIND, "");
43         if (ret == MPARAM_1) {
44             break;
45         }
46         umount(TEMP_DIR1);
47     } while (PARAM_0);
48     rmdir(TEMP_DIR1);
49     rmdir(TEMP_DIR2);
50     napi_value result = nullptr;
51     napi_create_int32(env, ret, &result);
52     return result;
53 }
Umount(napi_env env, napi_callback_info info)54 static napi_value Umount(napi_env env, napi_callback_info info)
55 {
56     int ret = MPARAM_1;
57     do {
58         ret = mkdir(TEMP_DIR1, PARAM_0777);
59         if (ret == MPARAM_1) {
60             break;
61         }
62         ret = mkdir(TEMP_DIR2, PARAM_0777);
63         if (ret == MPARAM_1) {
64             break;
65         }
66         ret = mount(TEMP_DIR1, TEMP_DIR2, "", PARAM_0, "");
67         if (ret == MPARAM_1) {
68             break;
69         }
70         ret = umount(TEMP_DIR2);
71         if (ret == MPARAM_1) {
72             break;
73         }
74     } while (PARAM_0);
75     rmdir(TEMP_DIR1);
76     rmdir(TEMP_DIR2);
77     napi_value result = nullptr;
78     napi_create_int32(env, ret, &result);
79     return result;
80 }
Umount2(napi_env env, napi_callback_info info)81 static napi_value Umount2(napi_env env, napi_callback_info info)
82 {
83     int ret = MPARAM_1;
84     do {
85         ret = mkdir(TEMP_DIR1, PARAM_0777);
86         if (ret == MPARAM_1) {
87             break;
88         }
89         ret = mkdir(TEMP_DIR2, PARAM_0777);
90         if (ret == MPARAM_1) {
91             break;
92         }
93         ret = mount(TEMP_DIR1, TEMP_DIR2, "", PARAM_0, "");
94         if (ret == MPARAM_1) {
95             break;
96         }
97         ret = umount2(TEMP_DIR2, PARAM_0);
98         if (ret == MPARAM_1) {
99             break;
100         }
101     } while (PARAM_0);
102     rmdir(TEMP_DIR1);
103     rmdir(TEMP_DIR2);
104     napi_value result = nullptr;
105     napi_create_int32(env, ret, &result);
106     return result;
107 }
108 
109 EXTERN_C_START
Init(napi_env env, napi_value exports)110 static napi_value Init(napi_env env, napi_value exports)
111 {
112     napi_property_descriptor desc[] = {
113         {"mount", nullptr, Mount, nullptr, nullptr, nullptr, napi_default, nullptr},
114         {"umount", nullptr, Umount, nullptr, nullptr, nullptr, napi_default, nullptr},
115         {"umount2", nullptr, Umount2, nullptr, nullptr, nullptr, napi_default, nullptr},
116     };
117     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
118     return exports;
119 }
120 EXTERN_C_END
121 
122 static napi_module demoModule = {
123     .nm_version = 1,
124     .nm_flags = 0,
125     .nm_filename = nullptr,
126     .nm_register_func = Init,
127     .nm_modname = "mount1",
128     .nm_priv = ((void *)0),
129     .reserved = {0},
130 };
131 
RegisterModule(void)132 extern "C" __attribute__((constructor)) void RegisterModule(void) { napi_module_register(&demoModule); }
133