summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac18
-rw-r--r--src/stat.c3
-rw-r--r--src/sync.c18
-rwxr-xr-xtests/misc/wc-parallel.sh4
4 files changed, 34 insertions, 9 deletions
diff --git a/configure.ac b/configure.ac
index c1599831c..a50992d04 100644
--- a/configure.ac
+++ b/configure.ac
@@ -454,8 +454,17 @@ if test $gl_cv_list_mounted_fs = yes && test $gl_cv_fs_space = yes; then
gl_ADD_PROG([optional_bin_progs], [df])
fi
-AC_MSG_CHECKING([whether this is system supports stdbuf])
-AC_COMPILE_IFELSE(
+ac_save_CFLAGS=$CFLAGS
+ac_save_LDFLAGS=$LDFLAGS
+# Detect warnings about ignored "constructor" attributes.
+gl_WARN_ADD([-Werror], [CFLAGS])
+gl_WARN_ADD([-errwarn], [CFLAGS])
+# Put this message here, after gl_WARN_ADD's chatter.
+AC_MSG_CHECKING([whether this system supports stdbuf])
+CFLAGS="-fPIC $CFLAGS"
+LDFLAGS="-shared $LDFLAGS"
+stdbuf_supported=no
+AC_LINK_IFELSE(
[AC_LANG_PROGRAM([[
static int stdbuf = 0;
@@ -470,12 +479,13 @@ AC_COMPILE_IFELSE(
}]],[[
return !(stdbuf == 1);]])
],
- [stdbuf_supported=yes],
- [stdbuf_supported=no])
+ [stdbuf_supported=yes])
AC_MSG_RESULT([$stdbuf_supported])
if test "$stdbuf_supported" = "yes" && test -z "$EXEEXT"; then
gl_ADD_PROG([optional_bin_progs], [stdbuf])
fi
+CFLAGS=$ac_save_CFLAGS
+LDFLAGS=$ac_save_LDFLAGS
############################################################################
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));
diff --git a/tests/misc/wc-parallel.sh b/tests/misc/wc-parallel.sh
index 2d1e9f405..98c36b9fa 100755
--- a/tests/misc/wc-parallel.sh
+++ b/tests/misc/wc-parallel.sh
@@ -20,6 +20,10 @@
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
print_ver_ wc
+if xargs -P2 </dev/null >/dev/null 2>&1
+ skip_ 'xargs -P is required'
+fi
+
(mkdir tmp && cd tmp && seq 2000 | xargs touch)
# This will output at least 16KiB per process