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 LOGI("statBuf dev id: %{public}lu", static_cast<unsigned long>(statBuf.st_dev));
167 return statBuf.st_dev;
168 }
169
GetCtrlPath() const170 string MountArgument::GetCtrlPath() const
171 {
172 auto dst = GetFullDst();
173 auto res = MocklispHash(dst);
174
175 stringstream ss;
176 ss << SYSFS_HMDFS_PATH << res << "/cmd";
177 return ss.str();
178 }
179
GetMountPointPrefix() const180 string MountArgument::GetMountPointPrefix() const
181 {
182 stringstream ss;
183 ss << DATA_POINT << userId_ << "/hmdfs";
184 return ss.str();
185 }
186
GetSandboxPath() const187 std::string MountArgument::GetSandboxPath() const
188 {
189 stringstream ss;
190 ss << SANDBOX_PATH << userId_;
191 return ss.str();
192 }
193
OptionsToString() const194 string MountArgument::OptionsToString() const
195 {
196 stringstream ss;
197 ss << "local_dst=" << GetFullDst() << ",user_id=" << userId_;
198 ss << ",ra_pages=512";
199 if (useCache_) {
200 ss << ",cache_dir=" << GetCachePath();
201 }
202 if (useCloudDir_) {
203 ss << ",cloud_dir=" << GetFullMediaCloud();
204 }
205 if (caseSensitive_) {
206 ss << ",sensitive";
207 }
208 if (enableMergeView_) {
209 ss << ",merge";
210 }
211 if (enableCloudDisk_) {
212 ss << ",cloud_disk";
213 }
214 if (!enableOfflineStash_) {
215 ss << ",no_offline_stash";
216 }
217 return ss.str();
218 }
219
GetMediaDocsPath() const220 string MountArgument::GetMediaDocsPath() const
221 {
222 stringstream ss;
223 ss << COMM_DATA_POINT << userId_ << LOCAL_FILE_DOCS_PATH;
224 return ss.str();
225 }
226
GetNoSharefsAppdataPath() const227 string MountArgument::GetNoSharefsAppdataPath() const
228 {
229 stringstream ss;
230 ss << MNT_USER_PATH << userId_ << NOSHAREFS_APPDATA_PATH;
231 return ss.str();
232 }
233
GetNoSharefsDocPath() const234 string MountArgument::GetNoSharefsDocPath() const
235 {
236 stringstream ss;
237 ss << MNT_USER_PATH << userId_ << NOSHAREFS_DOC_PATH;
238 return ss.str();
239 }
240
GetNoSharefsDocCurPath() const241 string MountArgument::GetNoSharefsDocCurPath() const
242 {
243 stringstream ss;
244 ss << MNT_USER_PATH << userId_ << NOSHAREFS_DOC_CUR_PATH;
245 return ss.str();
246 }
247
GetSharefsDocPath() const248 string MountArgument::GetSharefsDocPath() const
249 {
250 stringstream ss;
251 ss << MNT_USER_PATH << userId_ << SHAREFS_DOC_PATH;
252 return ss.str();
253 }
254
GetSharefsDocCurPath() const255 string MountArgument::GetSharefsDocCurPath() const
256 {
257 stringstream ss;
258 ss << MNT_USER_PATH << userId_ << SHAREFS_DOC_CUR_PATH;
259 return ss.str();
260 }
261
GetCurOtherAppdataPath() const262 string MountArgument::GetCurOtherAppdataPath() const
263 {
264 stringstream ss;
265 ss << MNT_USER_PATH << userId_ << CUR_OTHER_APPDATA_PATH;
266 return ss.str();
267 }
268
GetMntUserPath() const269 string MountArgument::GetMntUserPath() const
270 {
271 stringstream ss;
272 ss << MNT_USER_PATH << userId_;
273 return ss.str();
274 }
275
GetCurOtherPath() const276 string MountArgument::GetCurOtherPath() const
277 {
278 stringstream ss;
279 ss << MNT_USER_PATH << userId_ << CUR_OTHER_PATH;
280 return ss.str();
281 }
282
GetCurFileMgrPath() const283 string MountArgument::GetCurFileMgrPath() const
284 {
285 stringstream ss;
286 ss << MNT_USER_PATH << userId_ << CUR_FILEMGR_PATH;
287 return ss.str();
288 }
289
GetCurFileMgrAppdataPath() const290 string MountArgument::GetCurFileMgrAppdataPath() const
291 {
292 stringstream ss;
293 ss << MNT_USER_PATH << userId_ << CUR_FILEMGR_APPDATA_PATH;
294 return ss.str();
295 }
296
GetFlags() const297 unsigned long MountArgument::GetFlags() const
298 {
299 return MS_NODEV;
300 }
301
302 #ifdef STORAGE_SERVICE_MEDIA_FUSE
GetFullMediaFuse() const303 string MountArgument::GetFullMediaFuse() const
304 {
305 stringstream ss;
306 ss << TMPFS_MNT_DATA << userId_ << "/" << "media_fuse";
307 return ss.str();
308 }
309 #endif
310
Alpha(int userId,string relativePath)311 MountArgument MountArgumentDescriptors::Alpha(int userId, string relativePath)
312 {
313 MountArgument mountArgument = {
314 .userId_ = userId,
315 .needInitDir_ = true,
316 .useCache_ = true,
317 .useCloudDir_ = true,
318 .enableMergeView_ = true,
319 .enableCloudDisk_ = false,
320 .enableFixupOwnerShip_ = false,
321 .enableOfflineStash_ = true,
322 .relativePath_ = relativePath,
323 };
324 return mountArgument;
325 }
326 } // namespace Utils
327 } // namespace StorageDaemon
328 } // namespace OHOS
329