mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-25 03:32:12 +01:00
Merge branch '1400-g_file_attribute_unix_is_mountpoint-is-false-for-root' into 'master'
Resolve "G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT is False for /" Closes #1400 See merge request GNOME/glib!51
This commit is contained in:
commit
be43436435
@ -644,7 +644,8 @@ typedef struct _GFileInfoClass GFileInfoClass;
|
|||||||
*
|
*
|
||||||
* A key in the "unix" namespace for checking if the file represents a
|
* A key in the "unix" namespace for checking if the file represents a
|
||||||
* UNIX mount point. This attribute is %TRUE if the file is a UNIX mount
|
* UNIX mount point. This attribute is %TRUE if the file is a UNIX mount
|
||||||
* point. This attribute is only available for UNIX file systems.
|
* point. Since 2.58, `/` is considered to be a mount point.
|
||||||
|
* This attribute is only available for UNIX file systems.
|
||||||
* Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN.
|
* Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN.
|
||||||
**/
|
**/
|
||||||
#define G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT "unix::is-mountpoint" /* boolean */
|
#define G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT "unix::is-mountpoint" /* boolean */
|
||||||
|
@ -821,6 +821,7 @@ _g_local_file_info_get_parent_info (const char *dir,
|
|||||||
parent_info->is_sticky = FALSE;
|
parent_info->is_sticky = FALSE;
|
||||||
parent_info->has_trash_dir = FALSE;
|
parent_info->has_trash_dir = FALSE;
|
||||||
parent_info->device = 0;
|
parent_info->device = 0;
|
||||||
|
parent_info->inode = 0;
|
||||||
|
|
||||||
if (_g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_RENAME) ||
|
if (_g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_RENAME) ||
|
||||||
_g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_DELETE) ||
|
_g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_DELETE) ||
|
||||||
@ -850,6 +851,7 @@ _g_local_file_info_get_parent_info (const char *dir,
|
|||||||
#endif
|
#endif
|
||||||
parent_info->owner = statbuf.st_uid;
|
parent_info->owner = statbuf.st_uid;
|
||||||
parent_info->device = statbuf.st_dev;
|
parent_info->device = statbuf.st_dev;
|
||||||
|
parent_info->inode = statbuf.st_ino;
|
||||||
/* No need to find trash dir if it's not writable anyway */
|
/* No need to find trash dir if it's not writable anyway */
|
||||||
if (parent_info->writable &&
|
if (parent_info->writable &&
|
||||||
_g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_TRASH))
|
_g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_TRASH))
|
||||||
@ -1965,7 +1967,7 @@ _g_local_file_info_get (const char *basename,
|
|||||||
|
|
||||||
if (stat_ok && parent_info && parent_info->device != 0 &&
|
if (stat_ok && parent_info && parent_info->device != 0 &&
|
||||||
_g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_UNIX_IS_MOUNTPOINT) &&
|
_g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_UNIX_IS_MOUNTPOINT) &&
|
||||||
statbuf.st_dev != parent_info->device)
|
(statbuf.st_dev != parent_info->device || statbuf.st_ino == parent_info->inode))
|
||||||
_g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_UNIX_IS_MOUNTPOINT, TRUE);
|
_g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_UNIX_IS_MOUNTPOINT, TRUE);
|
||||||
|
|
||||||
if (stat_ok)
|
if (stat_ok)
|
||||||
|
@ -36,6 +36,7 @@ typedef struct
|
|||||||
gboolean has_trash_dir;
|
gboolean has_trash_dir;
|
||||||
int owner;
|
int owner;
|
||||||
dev_t device;
|
dev_t device;
|
||||||
|
ino_t inode;
|
||||||
gpointer extra_data;
|
gpointer extra_data;
|
||||||
GDestroyNotify free_extra_data;
|
GDestroyNotify free_extra_data;
|
||||||
} GLocalParentFileInfo;
|
} GLocalParentFileInfo;
|
||||||
|
@ -417,6 +417,15 @@ test_attributes (struct StructureItem item, GFileInfo * info)
|
|||||||
G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN);
|
G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN);
|
||||||
g_assert_cmpint (is_hidden, ==, TRUE);
|
g_assert_cmpint (is_hidden, ==, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* unix::is-mountpoint */
|
||||||
|
if (posix_compat)
|
||||||
|
{
|
||||||
|
gboolean is_mountpoint =
|
||||||
|
g_file_info_get_attribute_boolean (info,
|
||||||
|
G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT);
|
||||||
|
g_assert_false (is_mountpoint);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -853,6 +862,33 @@ test_copy_move (gconstpointer test_data)
|
|||||||
g_object_unref (root);
|
g_object_unref (root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test that G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT is TRUE for / and for another
|
||||||
|
* known mountpoint. The FALSE case is tested for many directories and files by
|
||||||
|
* test_initial_structure(), via test_attributes().
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
test_unix_is_mountpoint (gconstpointer data)
|
||||||
|
{
|
||||||
|
const gchar *path = data;
|
||||||
|
GFile *file = g_file_new_for_path (path);
|
||||||
|
GFileInfo *info;
|
||||||
|
gboolean is_mountpoint;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
info = g_file_query_info (file, G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT,
|
||||||
|
G_FILE_QUERY_INFO_NONE, NULL, &error);
|
||||||
|
g_assert_no_error (error);
|
||||||
|
g_assert_nonnull (info);
|
||||||
|
|
||||||
|
is_mountpoint =
|
||||||
|
g_file_info_get_attribute_boolean (info,
|
||||||
|
G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT);
|
||||||
|
g_assert_true (is_mountpoint);
|
||||||
|
|
||||||
|
g_clear_object (&info);
|
||||||
|
g_clear_object (&file);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
test_create (gconstpointer test_data)
|
test_create (gconstpointer test_data)
|
||||||
{
|
{
|
||||||
@ -1342,6 +1378,18 @@ main (int argc, char *argv[])
|
|||||||
if (!only_create_struct)
|
if (!only_create_struct)
|
||||||
g_test_add_data_func ("/live-g-file/test_open", target_path, test_open);
|
g_test_add_data_func ("/live-g-file/test_open", target_path, test_open);
|
||||||
|
|
||||||
|
if (posix_compat)
|
||||||
|
{
|
||||||
|
g_test_add_data_func ("/live-g-file/test_unix_is_mountpoint/sysroot",
|
||||||
|
"/",
|
||||||
|
test_unix_is_mountpoint);
|
||||||
|
#ifdef __linux__
|
||||||
|
g_test_add_data_func ("/live-g-file/test_unix_is_mountpoint/proc",
|
||||||
|
"/proc",
|
||||||
|
test_unix_is_mountpoint);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/* Write test - create */
|
/* Write test - create */
|
||||||
if (write_test && (!only_create_struct))
|
if (write_test && (!only_create_struct))
|
||||||
g_test_add_data_func ("/live-g-file/test_create", target_path,
|
g_test_add_data_func ("/live-g-file/test_create", target_path,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user