• 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     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