Check explicitely for f_owner and use f_owner and f_flag if checked

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@39991 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
rmottola 2016-07-12 23:27:31 +00:00
parent ece9e1c763
commit cc3188997b
5 changed files with 91 additions and 19 deletions

View file

@ -1,3 +1,10 @@
2016-07-13 Riccardo Mottola <rm@gnu.org>
* 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 <FredKiefer@gmx.de>
* Headers/AppKit/NSDocumentController.h,

View file

@ -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 <sys/mntent.h> header file. */
#undef HAVE_SYS_MNTENT_H

View file

@ -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++)

35
configure vendored
View file

@ -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 <sys/param.h>
#include <sys/mount.h>
#endif
#if defined (HAVE_SYS_STATVFS_H)
#include <sys/statvfs.h>
#endif
#if defined (HAVE_SYS_VFS_H)
#include <sys/vfs.h>
#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 <sys/statvfs.h>
#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

View file

@ -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 <sys/param.h>
#include <sys/mount.h>
@ -172,7 +172,7 @@ AC_CHECK_MEMBERS([struct statfs.f_flags],[],[],[
#include <sys/vfs.h>
#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 <sys/statvfs.h>
#endif