diff --git a/gio/gfileinfo-priv.h b/gio/gfileinfo-priv.h index 201b8c946..e2bdaa33d 100644 --- a/gio/gfileinfo-priv.h +++ b/gio/gfileinfo-priv.h @@ -85,6 +85,8 @@ #define G_FILE_ATTRIBUTE_ID_UNIX_IS_MOUNTPOINT (7340032 + 10) #define G_FILE_ATTRIBUTE_ID_DOS_IS_ARCHIVE (8388608 + 1) #define G_FILE_ATTRIBUTE_ID_DOS_IS_SYSTEM (8388608 + 2) +#define G_FILE_ATTRIBUTE_ID_DOS_IS_MOUNTPOINT (8388608 + 3) +#define G_FILE_ATTRIBUTE_ID_DOS_REPARSE_POINT_TAG (8388608 + 4) #define G_FILE_ATTRIBUTE_ID_OWNER_USER (9437184 + 1) #define G_FILE_ATTRIBUTE_ID_OWNER_USER_REAL (9437184 + 2) #define G_FILE_ATTRIBUTE_ID_OWNER_GROUP (9437184 + 3) diff --git a/gio/gfileinfo.c b/gio/gfileinfo.c index a595c6f4a..fa53a9c49 100644 --- a/gio/gfileinfo.c +++ b/gio/gfileinfo.c @@ -245,6 +245,8 @@ ensure_attribute_hash (void) REGISTER_ATTRIBUTE (UNIX_IS_MOUNTPOINT); REGISTER_ATTRIBUTE (DOS_IS_ARCHIVE); REGISTER_ATTRIBUTE (DOS_IS_SYSTEM); + REGISTER_ATTRIBUTE (DOS_IS_MOUNTPOINT); + REGISTER_ATTRIBUTE (DOS_REPARSE_POINT_TAG); REGISTER_ATTRIBUTE (OWNER_USER); REGISTER_ATTRIBUTE (OWNER_USER_REAL); REGISTER_ATTRIBUTE (OWNER_GROUP); diff --git a/gio/gfileinfo.h b/gio/gfileinfo.h index 8416b4fad..2ca623c3a 100644 --- a/gio/gfileinfo.h +++ b/gio/gfileinfo.h @@ -672,6 +672,33 @@ typedef struct _GFileInfoClass GFileInfoClass; **/ #define G_FILE_ATTRIBUTE_DOS_IS_SYSTEM "dos::is-system" /* boolean */ +/** + * G_FILE_ATTRIBUTE_DOS_IS_MOUNTPOINT: + * + * A key in the "dos" namespace for checking if the file is a NTFS mount point + * (a volume mount or a junction point). + * This attribute is %TRUE if file is a reparse point of type + * [IO_REPARSE_TAG_MOUNT_POINT](https://msdn.microsoft.com/en-us/library/dd541667.aspx). + * This attribute is only available for DOS file systems. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + * + * Since: 2.60 + **/ +#define G_FILE_ATTRIBUTE_DOS_IS_MOUNTPOINT "dos::is-mountpoint" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_DOS_REPARSE_POINT_TAG: + * + * A key in the "dos" namespace for getting the file NTFS reparse tag. + * This value is 0 for files that are not reparse points. + * See the [Reparse Tags](https://msdn.microsoft.com/en-us/library/dd541667.aspx) + * page for possible reparse tag values. Corresponding #GFileAttributeType + * is %G_FILE_ATTRIBUTE_TYPE_UINT32. + * + * Since: 2.60 + **/ +#define G_FILE_ATTRIBUTE_DOS_REPARSE_POINT_TAG "dos::reparse-point-tag" /* uint32 */ + /* Owner attributes */ /** diff --git a/gio/glocalfileinfo.c b/gio/glocalfileinfo.c index 58802fd43..ed7e99400 100644 --- a/gio/glocalfileinfo.c +++ b/gio/glocalfileinfo.c @@ -1867,6 +1867,12 @@ _g_local_file_info_get (const char *basename, if (statbuf.attributes & FILE_ATTRIBUTE_SYSTEM) _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_DOS_IS_SYSTEM, TRUE); + + if (statbuf.reparse_tag == IO_REPARSE_TAG_MOUNT_POINT) + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_DOS_IS_MOUNTPOINT, TRUE); + + if (statbuf.reparse_tag != 0) + _g_file_info_set_attribute_uint32_by_id (info, G_FILE_ATTRIBUTE_ID_DOS_REPARSE_POINT_TAG, statbuf.reparse_tag); #endif symlink_target = NULL;