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