diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/stat.c | 3 | ||||
-rw-r--r-- | src/sync.c | 18 |
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)); |