1/*
2 This file is part of the KDE libraries
3 SPDX-FileCopyrightText: 2003 Waldo Bastian <bastian@kde.org>
4 SPDX-FileCopyrightText: 2007 David Faure <faure@kde.org>
5
6 SPDX-License-Identifier: LGPL-2.0-only
7*/
8
9#ifndef KMOUNTPOINT_H
10#define KMOUNTPOINT_H
11
12#include "kiocore_export.h"
13
14#include <QExplicitlySharedDataPointer>
15#include <QStringList>
16
17#include <memory>
18#include <sys/types.h> // dev_t among other definitions
19
20class KMountPointPrivate;
21
22/**
23 * @class KMountPoint kmountpoint.h <KMountPoint>
24 *
25 * The KMountPoint class provides information about mounted and unmounted disks.
26 * It provides a system independent interface to fstab.
27 *
28 * @author Waldo Bastian <bastian@kde.org>
29 */
30class KIOCORE_EXPORT KMountPoint : public QSharedData
31{
32public:
33 using Ptr = QExplicitlySharedDataPointer<KMountPoint>;
34
35 /**
36 * List of mount points.
37 */
38 class KIOCORE_EXPORT List : public QList<Ptr>
39 {
40 public:
41 List();
42 /**
43 * Find the mountpoint on which resides @p path
44 * For instance if /home is a separate partition, findByPath("/home/user/blah")
45 * will return /home
46 * @param path the path to check
47 * @return the mount point of the given file
48 */
49 Ptr findByPath(const QString &path) const;
50
51 /**
52 * Returns the mount point associated with @p device,
53 * i.e. the one where mountedFrom() == @p device
54 * (after symlink resolution).
55 * @return the mountpoint, or @c nullptr if this device doesn't exist or isn't mounted
56 */
57 Ptr findByDevice(const QString &device) const;
58 };
59
60public:
61 /**
62 * Flags that specify which additional details should be fetched for each mountpoint.
63 * @see DetailsNeededFlags
64 */
65 enum DetailsNeededFlag {
66 /**
67 * Only the basic details: mountedFrom, mountPoint, mountType.
68 */
69 BasicInfoNeeded = 0,
70 /**
71 * Also fetch the options used when mounting, see KMountPoint::mountOptions().
72 */
73 NeedMountOptions = 1,
74 /**
75 * Also fetch the device name (with symlinks resolved), see KMountPoint::realDeviceName().
76 */
77 NeedRealDeviceName = 2,
78 };
79 /**
80 * Stores a combination of #DetailsNeededFlag values.
81 */
82 Q_DECLARE_FLAGS(DetailsNeededFlags, DetailsNeededFlag)
83
84 /**
85 * This function gives a list of all possible mountpoints. (fstab)
86 * @param infoNeeded Flags that specify which additional information
87 * should be fetched.
88 */
89 static List possibleMountPoints(DetailsNeededFlags infoNeeded = BasicInfoNeeded);
90
91 /**
92 * Returns a list of all current mountpoints.
93 *
94 * @param infoNeeded Flags that specify which additional information
95 * should be fetched.
96 *
97 * @note This method will return an empty list on @c Android
98 */
99 static List currentMountPoints(DetailsNeededFlags infoNeeded = BasicInfoNeeded);
100
101 /**
102 * Where this filesystem gets mounted from.
103 * This can refer to a device, a remote server or something else.
104 */
105 QString mountedFrom() const;
106
107 /**
108 * Returns @c true if this mount point represents a network filesystem (e.g.\ NFS,
109 * CIFS, etc.), otherwise returns @c false.
110 *
111 * @since 5.86
112 */
113 bool isOnNetwork() const;
114
115 /**
116 * Returns the device ID (dev_t, major, minor) of this mount point. This
117 * ID is unique per device (including network mounts).
118 *
119 * @since 5.86
120 */
121 dev_t deviceId() const;
122
123 /**
124 * Canonical name of the device where the filesystem got mounted from.
125 * (Or empty, if not a device)
126 * Only available when the NeedRealDeviceName flag was set.
127 */
128 QString realDeviceName() const;
129
130 /**
131 * Path where the filesystem is mounted (if you used @ref currentMountPoints()),
132 * or can be mounted (if you used @ref possibleMountPoints()).
133 */
134 QString mountPoint() const;
135
136 /**
137 * Type of filesystem
138 */
139 QString mountType() const;
140
141 /**
142 * Options used to mount the filesystem.
143 * Only available if the @ref NeedMountOptions flag was set.
144 */
145 QStringList mountOptions() const;
146
147 /**
148 * Returns @c true if the filesystem is "probably" slow, e.g.\ a network mount,
149 * @c false otherwise.
150 */
151 bool probablySlow() const;
152
153 enum FileSystemFlag {
154 SupportsChmod,
155 SupportsChown,
156 SupportsUTime,
157 SupportsSymlinks,
158 CaseInsensitive,
159 };
160
161 /**
162 * Checks the capabilities of the filesystem.
163 * @param flag the flag to check
164 * @return true if the filesystem has that flag, false if not
165 *
166 * The available flags are:
167 * @li SupportsChmod: returns true if the filesystem supports chmod
168 * (e.g. msdos filesystems return false)
169 * @li SupportsChown: returns true if the filesystem supports chown
170 * (e.g. msdos filesystems return false)
171 * @li SupportsUtime: returns true if the filesystems supports utime
172 * (e.g. msdos filesystems return false)
173 * @li SupportsSymlinks: returns true if the filesystems supports symlinks
174 * (e.g. msdos filesystems return false)
175 * @li CaseInsensitive: returns true if the filesystem treats
176 * "foo" and "FOO" as being the same file (true for msdos filesystems)
177 *
178 */
179 bool testFileSystemFlag(FileSystemFlag flag) const;
180
181 /**
182 * Destructor
183 */
184 ~KMountPoint();
185
186private:
187 /**
188 * Constructor
189 */
190 KIOCORE_NO_EXPORT KMountPoint();
191
192 friend KIOCORE_EXPORT QDebug operator<<(QDebug debug, const Ptr &mp);
193
194 friend KMountPointPrivate;
195 std::unique_ptr<KMountPointPrivate> d;
196};
197
198KIOCORE_EXPORT QDebug operator<<(QDebug debug, const KMountPoint::Ptr &mp);
199
200Q_DECLARE_OPERATORS_FOR_FLAGS(KMountPoint::DetailsNeededFlags)
201
202#endif // KMOUNTPOINT_H
203

source code of kio/src/core/kmountpoint.h