summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/stat.c3
-rw-r--r--src/sync.c18
2 files changed, 16 insertions, 5 deletions
diff --git a/src/stat.c b/src/stat.c
index 4b5aff71f..6d2366539 100644
--- a/src/stat.c
+++ b/src/stat.c
@@ -74,15 +74,16 @@
#include "xvasprintf.h"
#if USE_STATVFS
-# define STRUCT_STATVFS struct statvfs
# define STRUCT_STATXFS_F_FSID_IS_INTEGER STRUCT_STATVFS_F_FSID_IS_INTEGER
# define HAVE_STRUCT_STATXFS_F_TYPE HAVE_STRUCT_STATVFS_F_TYPE
# if HAVE_STRUCT_STATVFS_F_NAMEMAX
# define SB_F_NAMEMAX(S) ((S)->f_namemax)
# endif
# if ! STAT_STATVFS && STAT_STATVFS64
+# define STRUCT_STATVFS struct statvfs64
# define STATFS statvfs64
# else
+# define STRUCT_STATVFS struct statvfs
# define STATFS statvfs
# endif
# define STATFS_FRSIZE(S) ((S)->f_frsize)
diff --git a/src/sync.c b/src/sync.c
index 85d77c092..5e1dbb8c6 100644
--- a/src/sync.c
+++ b/src/sync.c
@@ -91,24 +91,34 @@ static bool
sync_arg (enum sync_mode mode, char const *file)
{
bool ret = true;
+ int open_flags = O_RDONLY | O_NONBLOCK;
int fd;
+#ifdef _AIX
+ /* AIX 7.1 fsync requires write access to file. */
+ if (mode == MODE_FILE)
+ open_flags = O_WRONLY | O_NONBLOCK;
+#endif
+
/* Note O_PATH might be supported with syncfs(),
though as of Linux 3.18 is not. */
- if ((fd = open (file, O_RDONLY | O_NONBLOCK)) < 0)
+ fd = open (file, open_flags);
+ if (fd < 0)
{
/* Use the O_RDONLY errno, which is significant
with directories for example. */
int rd_errno = errno;
- if ((fd = open (file, O_WRONLY | O_NONBLOCK)) < 0)
+ if (open_flags != (O_WRONLY | O_NONBLOCK))
+ fd = open (file, O_WRONLY | O_NONBLOCK);
+ if (fd < 0)
error (0, rd_errno, _("error opening %s"), quote (file));
return false;
}
/* We used O_NONBLOCK above to not hang with fifos,
so reset that here. */
- int fdflags;
- if ((fdflags = fcntl (fd, F_GETFL)) == -1
+ int fdflags = fcntl (fd, F_GETFL);
+ if (fdflags == -1
|| fcntl (fd, F_SETFL, fdflags & ~O_NONBLOCK) < 0)
{
error (0, errno, _("couldn't reset non-blocking mode %s"), quote (file));