TL;DR: Attached: Patch to allow split to write into FIFOs.


Currently, split fails when its output files are FIFOs because
FIFOs cannot be ftruncate()d.  Split exits with this error message:

  split: xaa: error truncating: Invalid argument

The attached patch causes split to only attempt the ftruncate when its
output is a regular file.
--- coreutils-8.29/src/split.c.orig	2017-09-20 01:17:21.000000000 +0000
+++ coreutils-8.29/src/split.c	2018-12-15 07:37:31.000000000 +0000
@@ -470,7 +470,7 @@
       if (SAME_INODE (in_stat_buf, out_stat_buf))
         die (EXIT_FAILURE, 0, _("%s would overwrite input; aborting"),
              quoteaf (name));
-      if (ftruncate (fd, 0) != 0)
+      if (S_ISREG(out_stat_buf.st_mode) && ftruncate (fd, 0) != 0)
         die (EXIT_FAILURE, errno, _("%s: error truncating"), quotef (name));
 
       return fd;
--- coreutils-8.29/Makefile.in.orig	2017-12-27 18:25:58.000000000 +0000
+++ coreutils-8.29/Makefile.in	2018-12-15 07:03:11.000000000 +0000
@@ -5491,6 +5491,7 @@
   tests/split/additional-suffix.sh		\
   tests/split/b-chunk.sh			\
   tests/split/fail.sh				\
+  tests/split/fifo.sh				\
   tests/split/lines.sh				\
   tests/split/line-bytes.sh			\
   tests/split/l-chunk.sh			\
--- /dev/null	2018-08-27 15:55:28.530128552 +0000
+++ coreutils-8.29/tests/split/fifo.sh	2018-12-15 07:36:50.000000000 +0000
@@ -0,0 +1,47 @@
+#!/bin/sh
+# Verify that output can be written to FIFOs
+
+# Copyright (C) 2002-2017 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
+print_ver_ split
+
+printf '1\n2\n3\n' > in || framework_failure_
+
+cat <<\EOF > exp-1
+1
+2
+EOF
+cat <<\EOF > exp-2
+3
+EOF
+
+mkfifo xaa xab || framework_failure_
+
+split --lines=2 in > out &
+split_pid=$!
+
+for f in xaa xab;do
+  timeout 10 cat "$f" > "$f-data"
+done
+
+wait "$split_pid" || fail=1
+
+compare exp-1 xaa-data || fail=1
+compare exp-2 xab-data || fail=1
+test -f xac && fail=1
+
+Exit $fail

Reply via email to