• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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