[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#751394: busybox: please provide a way to disable buffering in STDOUT



Package: busybox
Version: 1:1.22.0-6
Severity: wishlist

Dear Maintainer,

In udebs, it is common to redirect the standard output of a command to
a fifo, and use that to display progress bars in the installer.

    trap 'kill $pid' EXIT
    /path/to/command >"$fifo" &

    while read -u 7 n; do
      db_progress SET $n
    done 7< "$fifo"

    rm -f "$fifo"
    trap - EXIT

However, if the command buffers its standard output, which for instance
is what cryptsetup(8) does, and/or if the standard output needs to be
piped through sed(1) (which also buffers its standard streams), it's
hard to make sense of the progress bar, which suddenly jumps from 0% to
100% while nothing happens in the meantime.

    cryptsetup -q --key-file="$keyfile" luksFormat "$device" | \
    sed -nr 's/^Generating key \(([0-9]+)% done\)\.$/\1/p' > "$fifo" &

It'd be convenient to provide a way to disable buffering in STDOUT, in
the fashion of stdbuf(1) from GNU coreutils [1].  If the full blown
stdbuf(1) is overkill, it might still be desirable to add a strip down
version disabling buffering only, as found in [2]:

    :/lib/stdbuf.c
    #include <stdio.h>

    __attribute__ ((constructor)) void
    QLqxcKVd20zweBii () {
        setvbuf (stdout, NULL, _IOLBF, 0);
    }


    $ gcc -Wall -x c -s /lib/stdbuf.c -fPIC -shared -o /lib/stdbuf.so
    :/bin/stdbuf
    #!/bin/sh
    LD_PRELOAD=/lib/stdbuf.so "$@"

Then buffering of STDOUT could be disabled as follows:

    stdbuf cryptsetup -q --key-file="$keyfile" luksFormat "$device" | \
    stdbuf sed -nr 's/^Generating key \(([0-9]+)% done\)\.$/\1/p' > "$fifo" &

Thanks!
Cheers,
-- 
Guilhem.

[1] http://git.savannah.gnu.org/gitweb/?p=coreutils.git;a=blob;f=src/stdbuf.c
[2] https://lists.gnu.org/archive/html/bug-coreutils/2008-11/msg00138.html


-- System Information:
Debian Release: jessie/sid
  APT prefers unstable
  APT policy: (990, 'unstable'), (800, 'testing'), (700, 'stable'), (1, 'experimental')
Architecture: i386 (i686)

Kernel: Linux 3.14-1-686-pae (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.utf8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages busybox depends on:
ii  libc6  2.19-1

busybox recommends no packages.

busybox suggests no packages.

-- no debconf information

Attachment: signature.asc
Description: Digital signature


Reply to: