1 /*
2 * Copyright (c) 2021-2025 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 "utils/mount_argument_utils.h"
17
18 #include <sstream>
19 #include <sys/mount.h>
20 #include <sys/stat.h>
21
22 #include "storage_service_log.h"
23
24 namespace OHOS {
25 namespace StorageDaemon {
26 namespace Utils {
27 using namespace std;
28 namespace {
29 constexpr const char *DATA_POINT = "/data/service/el2/";
30 constexpr const char *BASE_MOUNT_POINT = "/mnt/hmdfs/";
31 constexpr const char *SYSFS_HMDFS_PATH = "/sys/fs/hmdfs/";
32 constexpr const char *COMM_DATA_POINT = "/storage/media/";
33 constexpr const char *COMM_CLOUD_POINT = "/storage/cloud/";
34 constexpr const char *RELATIVE_DOCS_PATH = "/files/Docs";
35 constexpr const char *SHAREFS_DATA_POINT = "/data/service/el2/";
36 constexpr const char *SHAREFS_BASE_MOUNT_POINT = "/mnt/share/";
37 constexpr const char *TMPFS_MNT_DATA = "/mnt/data/";
38 constexpr const char *HMDFS_DEVICE_VIEW_LOCAL_DOCS_PATH = "/device_view/local/files/Docs";
39 constexpr const char *SANDBOX_PATH = "/mnt/sandbox/";
40 constexpr const char *MNT_USER_PATH = "/mnt/user/";
41 constexpr const char *NOSHAREFS_DOC_PATH = "/nosharefs/docs";
42 constexpr const char *SHAREFS_DOC_PATH = "/sharefs/docs";
43 constexpr const char *NOSHAREFS_DOC_CUR_PATH = "/nosharefs/docs/currentUser";
44 constexpr const char *SHAREFS_DOC_CUR_PATH = "/sharefs/docs/currentUser";
45 constexpr const char *LOCAL_FILE_DOCS_PATH = "/local/files/Docs";
46 constexpr const char *CUR_OTHER_PATH = "/currentUser/other";
47 constexpr const char *CUR_OTHER_APPDATA_PATH = "/currentUser/other/appdata";
48 constexpr const char *CUR_FILEMGR_PATH = "/currentUser/filemgr";
49 constexpr const char *CUR_FILEMGR_APPDATA_PATH = "/currentUser/filemgr/appdata";
50 constexpr const char *NOSHAREFS_APPDATA_PATH = "/nosharefs/appdata";
51 } // namespace
52
GetFullSrc() const53 string MountArgument::GetFullSrc() const
54 {
55 stringstream ss;
56 ss << DATA_POINT << userId_ << "/hmdfs/" << relativePath_;
57
58 return ss.str();
59 }
60
GetFullDst() const61 string MountArgument::GetFullDst() const
62 {
63 stringstream ss;
64 ss << BASE_MOUNT_POINT << userId_ << "/" << relativePath_;
65
66 return ss.str();
67 }
68
GetFullMediaCloud() const69 string MountArgument::GetFullMediaCloud() const
70 {
71 stringstream ss;
72 ss << TMPFS_MNT_DATA << userId_ << "/" << "cloud";
73
74 return ss.str();
75 }
76
GetFullCloud() const77 string MountArgument::GetFullCloud() const
78 {
79 stringstream ss;
80 ss << TMPFS_MNT_DATA << userId_ << "/" << "cloud_fuse";
81
82 return ss.str();
83 }
84
GetShareSrc() const85 string MountArgument::GetShareSrc() const
86 {
87 stringstream ss;
88 ss << SHAREFS_DATA_POINT << userId_ << "/share";
89
90 return ss.str();
91 }
92
GetUserIdPara() const93 string MountArgument::GetUserIdPara() const
94 {
95 stringstream ss;
96 ss << "user_id=" << userId_;
97
98 return ss.str();
99 }
100
GetHmUserIdPara() const101 string MountArgument::GetHmUserIdPara() const
102 {
103 stringstream ss;
104 ss << "override_support_delete,user_id=" << userId_;
105 return ss.str();
106 }
107
GetShareDst() const108 string MountArgument::GetShareDst() const
109 {
110 stringstream ss;
111 ss << SHAREFS_BASE_MOUNT_POINT << userId_;
112
113 return ss.str();
114 }
115
GetCommFullPath() const116 string MountArgument::GetCommFullPath() const
117 {
118 stringstream ss;
119 ss << COMM_DATA_POINT << userId_ << "/";
120
121 return ss.str();
122 }
123
GetCloudFullPath() const124 string MountArgument::GetCloudFullPath() const
125 {
126 stringstream ss;
127 ss << COMM_CLOUD_POINT << userId_ << "/";
128
129 return ss.str();
130 }
131
GetCloudDocsPath() const132 string MountArgument::GetCloudDocsPath() const
133 {
134 stringstream ss;
135 ss << COMM_CLOUD_POINT << userId_ << RELATIVE_DOCS_PATH;
136
137 return ss.str();
138 }
139
GetLocalDocsPath() const140 string MountArgument::GetLocalDocsPath() const
141 {
142 stringstream ss;
143 ss << BASE_MOUNT_POINT << userId_ << "/" << relativePath_ << HMDFS_DEVICE_VIEW_LOCAL_DOCS_PATH;
144
145 return ss.str();
146 }
147
GetCachePath() const148 string MountArgument::GetCachePath() const
149 {
150 stringstream ss;
151 if (enableCloudDisk_) {
152 ss << DATA_POINT << userId_ << "/hmdfs/cloud/";
153 } else {
154 ss << DATA_POINT << userId_ << "/hmdfs/cache/" << relativePath_ << "_cache/";
155 }
156 return ss.str();
157 }
158
MocklispHash(const string & str)159 static uint64_t MocklispHash(const string &str)
160 {
161 struct stat statBuf;
162 auto err = stat(str.c_str(), &statBuf);
163 if (err != 0) {
164 LOGE("stat failed err: %{public}d", err);
165 }
166 return statBuf.st_dev;
167 }
168
GetCtrlPath() const169 string MountArgument::GetCtrlPath() const
170 {
171 auto dst = GetFullDst();
172 auto res = MocklispHash(dst);
173
174 stringstream ss;
175 ss << SYSFS_HMDFS_PATH << res << "/cmd";
176 return ss.str();
177 }
178
GetMountPointPrefix() const179 string MountArgument::GetMountPointPrefix() const
180 {
181 stringstream ss;
182 ss << DATA_POINT << userId_ << "/hmdfs";
183 return ss.str();
184 }
185
GetSandboxPath() const186 std::string MountArgument::GetSandboxPath() const
187 {
188 stringstream ss;
189 ss << SANDBOX_PATH << userId_;
190 return ss.str();
191 }
192
OptionsToString() const193 string MountArgument::OptionsToString() const
194 {
195 stringstream ss;
196 ss << "local_dst=" << GetFullDst() << ",user_id=" << userId_;
197 ss << ",ra_pages=512";
198 if (useCache_) {
199 ss << ",cache_dir=" << GetCachePath();
200 }
201 if (useCloudDir_) {
202 ss << ",cloud_dir=" << GetFullMediaCloud();
203 }
204 if (caseSensitive_) {
205 ss << ",sensitive";
206 }
207 if (enableMergeView_) {
208 ss << ",merge";
209 }
210 if (enableCloudDisk_) {
211 ss << ",cloud_disk";
212 }
213 if (!enableOfflineStash_) {
214 ss << ",no_offline_stash";
215 }
216 return ss.str();
217 }
218
GetMediaDocsPath() const219 string MountArgument::GetMediaDocsPath() const
220 {
221 stringstream ss;
222 ss << COMM_DATA_POINT << userId_ << LOCAL_FILE_DOCS_PATH;
223 return ss.str();
224 }
225
GetNoSharefsAppdataPath() const226 string MountArgument::GetNoSharefsAppdataPath() const
227 {
228 stringstream ss;
229 ss << MNT_USER_PATH << userId_ << NOSHAREFS_APPDATA_PATH;
230 return ss.str();
231 }
232
GetNoSharefsDocPath() const233 string MountArgument::GetNoSharefsDocPath() const
234 {
235 stringstream ss;
236 ss << MNT_USER_PATH << userId_ << NOSHAREFS_DOC_PATH;
237 return ss.str();
238 }
239
GetNoSharefsDocCurPath() const240 string MountArgument::GetNoSharefsDocCurPath() const
241 {
242 stringstream ss;
243 ss << MNT_USER_PATH << userId_ << NOSHAREFS_DOC_CUR_PATH;
244 return ss.str();
245 }
246
GetSharefsDocPath() const247 string MountArgument::GetSharefsDocPath() const
248 {
249 stringstream ss;
250 ss << MNT_USER_PATH << userId_ << SHAREFS_DOC_PATH;
251 return ss.str();
252 }
253
GetSharefsDocCurPath() const254 string MountArgument::GetSharefsDocCurPath() const
255 {
256 stringstream ss;
257 ss << MNT_USER_PATH << userId_ << SHAREFS_DOC_CUR_PATH;
258 return ss.str();
259 }
260
GetCurOtherAppdataPath() const261 string MountArgument::GetCurOtherAppdataPath() const
262 {
263 stringstream ss;
264 ss << MNT_USER_PATH << userId_ << CUR_OTHER_APPDATA_PATH;
265 return ss.str();
266 }
267
GetMntUserPath() const268 string MountArgument::GetMntUserPath() const
269 {
270 stringstream ss;
271 ss << MNT_USER_PATH << userId_;
272 return ss.str();
273 }
274
GetCurOtherPath() const275 string MountArgument::GetCurOtherPath() const
276 {
277 stringstream ss;
278 ss << MNT_USER_PATH << userId_ << CUR_OTHER_PATH;
279 return ss.str();
280 }
281
GetCurFileMgrPath() const282 string MountArgument::GetCurFileMgrPath() const
283 {
284 stringstream ss;
285 ss << MNT_USER_PATH << userId_ << CUR_FILEMGR_PATH;
286 return ss.str();
287 }
288
GetCurFileMgrAppdataPath() const289 string MountArgument::GetCurFileMgrAppdataPath() const
290 {
291 stringstream ss;
292 ss << MNT_USER_PATH << userId_ << CUR_FILEMGR_APPDATA_PATH;
293 return ss.str();
294 }
295
GetFlags() const296 unsigned long MountArgument::GetFlags() const
297 {
298 return MS_NODEV;
299 }
300
301 #ifdef STORAGE_SERVICE_MEDIA_FUSE
GetFullMediaFuse() const302 string MountArgument::GetFullMediaFuse() const
303 {
304 stringstream ss;
305 ss << TMPFS_MNT_DATA << userId_ << "/" << "media_fuse";
306 return ss.str();
307 }
308 #endif
309
Alpha(int userId,string relativePath)310 MountArgument MountArgumentDescriptors::Alpha(int userId, string relativePath)
311 {
312 MountArgument mountArgument = {
313 .userId_ = userId,
314 .needInitDir_ = true,
315 .useCache_ = true,
316 .useCloudDir_ = true,
317 .enableMergeView_ = true,
318 .enableCloudDisk_ = false,
319 .enableFixupOwnerShip_ = false,
320 .enableOfflineStash_ = true,
321 .relativePath_ = relativePath,
322 };
323 return mountArgument;
324 }
325 } // namespace Utils
326 } // namespace StorageDaemon
327 } // namespace OHOS
328