mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-24 14:36:13 +01:00
gio: Add API for identifying system FS types and device paths
This is needed by gnome-control-center and gnome-settings-daemon; it makes existing checks from gunixmounts.c public. Signed-off-by: Philip Withnall <withnall@endlessm.com> https://bugzilla.gnome.org/show_bug.cgi?id=788927
This commit is contained in:
parent
f43babfea3
commit
1e4221a3f7
@ -1571,6 +1571,8 @@ g_unix_mount_monitor_get
|
|||||||
g_unix_mount_monitor_new
|
g_unix_mount_monitor_new
|
||||||
g_unix_mount_monitor_set_rate_limit
|
g_unix_mount_monitor_set_rate_limit
|
||||||
g_unix_is_mount_path_system_internal
|
g_unix_is_mount_path_system_internal
|
||||||
|
g_unix_is_system_fs_type
|
||||||
|
g_unix_is_system_device_path
|
||||||
<SUBSECTION Standard>
|
<SUBSECTION Standard>
|
||||||
GUnixMountMonitorClass
|
GUnixMountMonitorClass
|
||||||
G_UNIX_MOUNT_MONITOR
|
G_UNIX_MOUNT_MONITOR
|
||||||
|
@ -281,10 +281,23 @@ g_unix_is_mount_path_system_internal (const char *mount_path)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
/**
|
||||||
guess_system_internal (const char *mountpoint,
|
* g_unix_is_system_fs_type:
|
||||||
const char *fs,
|
* @fs_type: a file system type, e.g. `procfs` or `tmpfs`
|
||||||
const char *device)
|
*
|
||||||
|
* Determines if @fs_type is considered a type of file system which is only
|
||||||
|
* used in implementation of the OS. This is primarily used for hiding
|
||||||
|
* mounted volumes that are intended as APIs for programs to read, and system
|
||||||
|
* administrators at a shell; rather than something that should, for example,
|
||||||
|
* appear in a GUI. For example, the Linux `/proc` filesystem.
|
||||||
|
*
|
||||||
|
* The list of file system types considered ‘system’ ones may change over time.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if @fs_type is considered an implementation detail of the OS.
|
||||||
|
* Since: 2.56
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
g_unix_is_system_fs_type (const char *fs_type)
|
||||||
{
|
{
|
||||||
const char *ignore_fs[] = {
|
const char *ignore_fs[] = {
|
||||||
"adfs",
|
"adfs",
|
||||||
@ -336,6 +349,31 @@ guess_system_internal (const char *mountpoint,
|
|||||||
"zfs",
|
"zfs",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
g_return_val_if_fail (fs_type != NULL && *fs_type != '\0', FALSE);
|
||||||
|
|
||||||
|
return is_in (fs_type, ignore_fs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_unix_is_system_device_path:
|
||||||
|
* @fs_type: a device path, e.g. `/dev/loop0` or `nfsd`
|
||||||
|
*
|
||||||
|
* Determines if @device_path is considered a block device path which is only
|
||||||
|
* used in implementation of the OS. This is primarily used for hiding
|
||||||
|
* mounted volumes that are intended as APIs for programs to read, and system
|
||||||
|
* administrators at a shell; rather than something that should, for example,
|
||||||
|
* appear in a GUI. For example, the Linux `/proc` filesystem.
|
||||||
|
*
|
||||||
|
* The list of device paths considered ‘system’ ones may change over time.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if @device_path is considered an implementation detail of
|
||||||
|
* the OS.
|
||||||
|
* Since: 2.56
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
g_unix_is_system_device_path (const char *device_path)
|
||||||
|
{
|
||||||
const char *ignore_devices[] = {
|
const char *ignore_devices[] = {
|
||||||
"none",
|
"none",
|
||||||
"sunrpc",
|
"sunrpc",
|
||||||
@ -345,11 +383,21 @@ guess_system_internal (const char *mountpoint,
|
|||||||
"/dev/vn",
|
"/dev/vn",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
if (is_in (fs, ignore_fs))
|
g_return_val_if_fail (device_path != NULL && *device_path != '\0', FALSE);
|
||||||
|
|
||||||
|
return is_in (device_path, ignore_devices);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
guess_system_internal (const char *mountpoint,
|
||||||
|
const char *fs,
|
||||||
|
const char *device)
|
||||||
|
{
|
||||||
|
if (g_unix_is_system_fs_type (fs))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
if (is_in (device, ignore_devices))
|
if (g_unix_is_system_device_path (device))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
if (g_unix_is_mount_path_system_internal (mountpoint))
|
if (g_unix_is_mount_path_system_internal (mountpoint))
|
||||||
@ -2105,9 +2153,14 @@ g_unix_mount_is_readonly (GUnixMountEntry *mount_entry)
|
|||||||
/**
|
/**
|
||||||
* g_unix_mount_is_system_internal:
|
* g_unix_mount_is_system_internal:
|
||||||
* @mount_entry: a #GUnixMount.
|
* @mount_entry: a #GUnixMount.
|
||||||
|
*
|
||||||
|
* Checks if a Unix mount is a system mount. This is the Boolean OR of
|
||||||
|
* g_unix_is_system_fs_type(), g_unix_is_system_device_path() and
|
||||||
|
* g_unix_is_mount_path_system_internal() on @mount_entry’s properties.
|
||||||
*
|
*
|
||||||
* Checks if a unix mount is a system path.
|
* The definition of what a ‘system’ mount entry is may change over time as new
|
||||||
*
|
* file system types and device paths are ignored.
|
||||||
|
*
|
||||||
* Returns: %TRUE if the unix mount is for a system path.
|
* Returns: %TRUE if the unix mount is for a system path.
|
||||||
*/
|
*/
|
||||||
gboolean
|
gboolean
|
||||||
|
@ -151,6 +151,10 @@ void g_unix_mount_monitor_set_rate_limit (GUnixMountMonitor *mount
|
|||||||
|
|
||||||
GLIB_AVAILABLE_IN_ALL
|
GLIB_AVAILABLE_IN_ALL
|
||||||
gboolean g_unix_is_mount_path_system_internal (const char *mount_path);
|
gboolean g_unix_is_mount_path_system_internal (const char *mount_path);
|
||||||
|
GLIB_AVAILABLE_IN_2_56
|
||||||
|
gboolean g_unix_is_system_fs_type (const char *fs_type);
|
||||||
|
GLIB_AVAILABLE_IN_2_56
|
||||||
|
gboolean g_unix_is_system_device_path (const char *device_path);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
@ -266,6 +266,7 @@ test_programs += \
|
|||||||
socket-address \
|
socket-address \
|
||||||
stream-rw_all \
|
stream-rw_all \
|
||||||
unix-fd \
|
unix-fd \
|
||||||
|
unix-mounts \
|
||||||
unix-streams \
|
unix-streams \
|
||||||
g-file-info-filesystem-readonly \
|
g-file-info-filesystem-readonly \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
@ -113,6 +113,7 @@ if host_machine.system() != 'windows'
|
|||||||
'socket-address',
|
'socket-address',
|
||||||
'stream-rw_all',
|
'stream-rw_all',
|
||||||
'unix-fd',
|
'unix-fd',
|
||||||
|
'unix-mounts',
|
||||||
'unix-streams',
|
'unix-streams',
|
||||||
'g-file-info-filesystem-readonly',
|
'g-file-info-filesystem-readonly',
|
||||||
'gschema-compile',
|
'gschema-compile',
|
||||||
|
57
gio/tests/unix-mounts.c
Normal file
57
gio/tests/unix-mounts.c
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/* GLib testing framework examples and tests
|
||||||
|
*
|
||||||
|
* Copyright © 2017 Endless Mobile, Inc.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General
|
||||||
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
|
#ifndef G_OS_UNIX
|
||||||
|
#error This is a Unix-specific test
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <locale.h>
|
||||||
|
#include <glib/gstdio.h>
|
||||||
|
#include <gio/gio.h>
|
||||||
|
#include <gio/gunixmounts.h>
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_is_system_fs_type (void)
|
||||||
|
{
|
||||||
|
g_assert_true (g_unix_is_system_fs_type ("tmpfs"));
|
||||||
|
g_assert_false (g_unix_is_system_fs_type ("ext4"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_is_system_device_path (void)
|
||||||
|
{
|
||||||
|
g_assert_true (g_unix_is_system_device_path ("devpts"));
|
||||||
|
g_assert_false (g_unix_is_system_device_path ("/"));
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc,
|
||||||
|
char *argv[])
|
||||||
|
{
|
||||||
|
setlocale (LC_ALL, "");
|
||||||
|
|
||||||
|
g_test_init (&argc, &argv, NULL);
|
||||||
|
|
||||||
|
g_test_add_func ("/unix-mounts/is-system-fs-type", test_is_system_fs_type);
|
||||||
|
g_test_add_func ("/unix-mounts/is-system-device-path", test_is_system_device_path);
|
||||||
|
|
||||||
|
return g_test_run ();
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user