diff --git a/ChangeLog b/ChangeLog index 6ab079f8c..dddc60d18 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2016-07-13 Riccardo Mottola + + * Source/NSWorkspace.m + * Headers/Additions/GNUstepGUI/config.h.in + * configure.ac + Check explicitely for f_owner and use f_owner and f_flag if checked. + 2016-07-13 Fred Kiefer * Headers/AppKit/NSDocumentController.h, diff --git a/Headers/Additions/GNUstepGUI/config.h.in b/Headers/Additions/GNUstepGUI/config.h.in index 36c3b8ed7..01bdb97dd 100644 --- a/Headers/Additions/GNUstepGUI/config.h.in +++ b/Headers/Additions/GNUstepGUI/config.h.in @@ -105,9 +105,15 @@ /* Define to 1 if `f_flags' is a member of `struct statfs'. */ #undef HAVE_STRUCT_STATFS_F_FLAGS +/* Define to 1 if `f_owner' is a member of `struct statfs'. */ +#undef HAVE_STRUCT_STATFS_F_OWNER + /* Define to 1 if `f_flag' is a member of `struct statvfs'. */ #undef HAVE_STRUCT_STATVFS_F_FLAG +/* Define to 1 if `f_owner' is a member of `struct statvfs'. */ +#undef HAVE_STRUCT_STATVFS_F_OWNER + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MNTENT_H diff --git a/Source/NSWorkspace.m b/Source/NSWorkspace.m index 0f8bfa174..226fa7c6a 100644 --- a/Source/NSWorkspace.m +++ b/Source/NSWorkspace.m @@ -1213,32 +1213,52 @@ inFileViewerRootedAtPath: (NSString*)rootFullpath non-standard f_basetype field, which provides the name of the underlying file system type. */ -#if !defined(HAVE_STATVFS) -#define statvfs statfs -#define f_flag f_flags -#endif uid_t uid; - struct statvfs m; + BOOL isRootFS; + BOOL hasOwnership; +#if defined(HAVE_STATVFS) + #define USING_STATVFS 1 + struct statvfs m; if (statvfs([fullPath fileSystemRepresentation], &m)) return NO; - +#elif defined (HAVE_STATFS) + #define USING_STATFS 1 + struct statfs m; + if (statfs([fullPath fileSystemRepresentation], &m)) + return NO; +#endif uid = geteuid(); *writableFlag = 1; -#if defined(HAVE_STRUCT_STATFS_F_FLAGS) || defined(HAVE_STRUCT_STATVFS_F_FLAG) +#if defined(HAVE_STRUCT_STATVFS_F_FLAG) *writableFlag = (m.f_flag & ST_RDONLY) == 0; -#endif - *unmountableFlag = NO; - -#if defined(ST_ROOTFS) // new NetBSD - *unmountableFlag = - (m.f_flag & ST_ROOTFS) == 0 && (uid == 0 || uid == m.f_owner); -#elif defined (MNT_ROOTFS) // FreeBSD - *unmountableFlag = - (m.f_flag & MNT_ROOTFS) == 0; +#elif defined(HAVE_STRUCT_STATFS_F_FLAGS) + *writableFlag = (m.f_flags & ST_RDONLY) == 0; #endif + + isRootFS = NO; +#if defined(ST_ROOTFS) + isRootFS = (m.f_flag & ST_ROOTFS); +#elif defined (MNT_ROOTFS) + isRootFS = (m.f_flag & MNT_ROOTFS); +#endif + + hasOwnership = NO; +#if (defined(USING_STATFS) && defined(HAVE_STRUCT_STATFS_F_OWNER)) || (defined(USING_STATVFS) && defined(HAVE_STRUCT_STATVFS_F_OWNER)) + if (uid == 0 || uid == m.f_owner) + hasOwnership = YES; +#elif (defined(USING_STATVFS) && !defined(USING_STATFS) && defined (HAVE_STATFS) && defined(HAVE_STRUCT_STATFS_F_OWNER)) + // FreeBSD only? + struct statfs m2; + statfs([fullPath fileSystemRepresentation], &m2); + if (uid == 0 || uid == m2.f_owner) + hasOwnership = YES; +#endif + + *unmountableFlag = !isRootFS && hasOwnership; + *description = @"filesystem"; // FIXME *fileSystemType = nil; @@ -2064,8 +2084,12 @@ launchIdentifiers: (NSArray **)identifiers #elif defined (HAVE_GETMNTINFO) NSFileManager *mgr = [NSFileManager defaultManager]; unsigned int i, n; +#if defined(HAVE_STATVFS) && defined (__NetBSD__) + struct statvfs *m; +#else struct statfs *m; - +#endif + n = getmntinfo(&m, MNT_NOWAIT); names = [NSMutableArray arrayWithCapacity: n]; for (i = 0; i < n; i++) diff --git a/configure b/configure index 9cb39a2fd..a35dc2110 100755 --- a/configure +++ b/configure @@ -4103,6 +4103,27 @@ cat >>confdefs.h <<_ACEOF _ACEOF +fi +ac_fn_c_check_member "$LINENO" "struct statfs" "f_owner" "ac_cv_member_struct_statfs_f_owner" " +#if defined(HAVE_GETMNTINFO) +#include +#include +#endif +#if defined (HAVE_SYS_STATVFS_H) +#include +#endif +#if defined (HAVE_SYS_VFS_H) +#include +#endif + +" +if test "x$ac_cv_member_struct_statfs_f_owner" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STATFS_F_OWNER 1 +_ACEOF + + fi ac_fn_c_check_member "$LINENO" "struct statvfs" "f_flag" "ac_cv_member_struct_statvfs_f_flag" " @@ -4118,6 +4139,20 @@ cat >>confdefs.h <<_ACEOF _ACEOF +fi +ac_fn_c_check_member "$LINENO" "struct statvfs" "f_owner" "ac_cv_member_struct_statvfs_f_owner" " +#if defined (HAVE_SYS_STATVFS_H) +#include +#endif + +" +if test "x$ac_cv_member_struct_statvfs_f_owner" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STATVFS_F_OWNER 1 +_ACEOF + + fi diff --git a/configure.ac b/configure.ac index 487420e54..2e144749e 100644 --- a/configure.ac +++ b/configure.ac @@ -160,7 +160,7 @@ AC_CHECK_FUNCS(statvfs) AC_CHECK_HEADERS(sys/statvfs.h) AC_CHECK_HEADERS(sys/vfs.h) -AC_CHECK_MEMBERS([struct statfs.f_flags],[],[],[ +AC_CHECK_MEMBERS([struct statfs.f_flags, struct statfs.f_owner],[],[],[ #if defined(HAVE_GETMNTINFO) #include #include @@ -172,7 +172,7 @@ AC_CHECK_MEMBERS([struct statfs.f_flags],[],[],[ #include #endif ]) -AC_CHECK_MEMBERS([struct statvfs.f_flag],[],[],[ +AC_CHECK_MEMBERS([struct statvfs.f_flag, struct statvfs.f_owner],[],[],[ #if defined (HAVE_SYS_STATVFS_H) #include #endif