Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
173de4fafd | ||
|
|
ae81f83e9b | ||
|
|
9f07a28065 | ||
|
|
60913618be | ||
|
|
43dc9d6469 | ||
|
|
6cff3c1c2a | ||
|
|
caf7d6ff18 | ||
|
|
d343669f45 | ||
|
|
ecaa5ce6cd | ||
|
|
e5b5e67e57 | ||
|
|
1efe1d60b5 | ||
|
|
f83927e451 | ||
|
|
678f655116 | ||
|
|
7794df7182 | ||
|
|
923ef47056 | ||
|
|
0a509fb535 | ||
|
|
1927e88350 | ||
|
|
760ee403fe | ||
|
|
6ecf31b5ee | ||
|
|
8051f5808c | ||
|
|
0518357560 | ||
|
|
e0856df8ef | ||
|
|
d4590e1f3b | ||
|
|
99c5e0988c | ||
|
|
6a24d75022 | ||
|
|
82aa30c306 | ||
|
|
4fa3331f88 | ||
|
|
fd0850f1ab | ||
|
|
cecc8649c2 | ||
|
|
c39e97ec5a | ||
|
|
909355619b | ||
|
|
b086ddf599 | ||
|
|
a0e5d5e9e7 | ||
|
|
dbcae4a9ae | ||
|
|
4ba1343c20 | ||
|
|
ee3c02fd7f | ||
|
|
c7e0bb727e | ||
|
|
80e3f791c4 | ||
|
|
74325282e7 | ||
|
|
ab20f9406f | ||
|
|
e94600d7a4 | ||
|
|
9783f7ebef | ||
|
|
b6d1f62979 | ||
|
|
cab177814a | ||
|
|
2303da77db | ||
|
|
264e3a5879 | ||
|
|
5f6f418cfd | ||
|
|
3b2e274907 | ||
|
|
a24342a072 | ||
|
|
101294195b | ||
|
|
5cf5eda406 | ||
|
|
8c284d863d | ||
|
|
7448c7f320 | ||
|
|
b923afc385 | ||
|
|
88dd09393c | ||
|
|
29124c585e | ||
|
|
65828899ea | ||
|
|
853190d36d | ||
|
|
f13f5e70c1 | ||
|
|
4e2ab087e5 | ||
|
|
242c19e4f6 | ||
|
|
3003f46313 | ||
|
|
c718a00e2c | ||
|
|
01f627b2de | ||
|
|
461486ec4f | ||
|
|
fd46c9b1f6 | ||
|
|
001dfb71c2 | ||
|
|
bcb33ce2aa | ||
|
|
c8090806f9 | ||
|
|
3403ebd857 | ||
|
|
4fddf40436 | ||
|
|
62b5ac26df | ||
|
|
e8c0b6717f | ||
|
|
2bf76577dd | ||
|
|
90d9638488 | ||
|
|
f6d0135cc6 | ||
|
|
56adce8edf | ||
|
|
008ee74a98 | ||
|
|
fa8aa85248 | ||
|
|
442a298c38 | ||
|
|
bb0c5bdfca | ||
|
|
29908cff6c | ||
|
|
456ab7cebb | ||
|
|
0d1d5b77ec | ||
|
|
ff5efbe3eb | ||
|
|
81d008a325 | ||
|
|
288dd633d7 | ||
|
|
9dce037cdc | ||
|
|
6ae07496d2 | ||
|
|
cd60822380 | ||
|
|
0fdd9f0787 | ||
|
|
0d520172ac | ||
|
|
04ea58f786 | ||
|
|
94a9f658e1 | ||
|
|
0ec9e208df | ||
|
|
4c84060940 | ||
|
|
8fb3aecde5 | ||
|
|
e228b3397d | ||
|
|
d1d1999334 | ||
|
|
685c91a1cb | ||
|
|
50c0b329c9 | ||
|
|
5c8e2707a4 | ||
|
|
5768166460 | ||
|
|
6bdb951af4 | ||
|
|
06824aee2d | ||
|
|
c5cd932fb0 | ||
|
|
a6ecf60ad1 | ||
|
|
b0cad6d3e3 | ||
|
|
a9cef81657 | ||
|
|
cc95aa67a3 | ||
|
|
b78e58ab87 | ||
|
|
12d22b5ab0 | ||
|
|
3255f72f39 | ||
|
|
c79eb8540a | ||
|
|
0ca8ef5187 | ||
|
|
386e3ac5fa | ||
|
|
6e24924a23 | ||
|
|
b0720194e1 | ||
|
|
613642ba3d | ||
|
|
103df51a59 |
@@ -0,0 +1 @@
|
||||
github: a-j-wood
|
||||
@@ -1,265 +0,0 @@
|
||||
Introduction
|
||||
************
|
||||
|
||||
This is the README for `pv' ("Pipe Viewer"), a terminal-based tool for
|
||||
monitoring the progress of data through a pipeline. It can be inserted into
|
||||
any normal pipeline between two processes to give a visual indication of how
|
||||
quickly data is passing through, how long it has taken, how near to
|
||||
completion it is, and an estimate of how long it will be until completion.
|
||||
|
||||
|
||||
Documentation
|
||||
*************
|
||||
|
||||
A manual page is included in this distribution. See `man ./doc/quickref.1',
|
||||
or `man pv' after installation.
|
||||
|
||||
|
||||
Compilation
|
||||
***********
|
||||
|
||||
If this is not a packaged release, first run "./generate.sh".
|
||||
|
||||
To compile the package, type "sh ./configure", which should generate a
|
||||
Makefile for your system. You may then type "make" to build everything.
|
||||
Note that GNU `make' is required; this may be installed as `gmake' on some
|
||||
systems, so if typing "make" gives an error, try "gmake" instead.
|
||||
|
||||
See the file `doc/INSTALL' for more about the `configure' script.
|
||||
|
||||
Developers note that you can do "./configure --enable-debugging" to cause
|
||||
debugging support to be built in, and "--enable-profiling" builds in
|
||||
profiling support (see "man gprof"). Also note that doing "make index" will
|
||||
generate an HTML code index (using "ctags" and "cproto"); this index lists
|
||||
all files used, all functions defined, and all TODOs marked in the code.
|
||||
|
||||
|
||||
Author and acknowledgements
|
||||
***************************
|
||||
|
||||
This package is copyright 2021 Andrew Wood, and is being distributed under
|
||||
the terms of the Artistic License 2.0. For more details of this license,
|
||||
see the file `doc/COPYING'.
|
||||
|
||||
Report bugs in `pv' using the contact form linked from the home page.
|
||||
|
||||
The `pv' home page is at:
|
||||
|
||||
http://www.ivarch.com/programs/pv.shtml
|
||||
|
||||
The latest version can always be found here.
|
||||
|
||||
Credit is also due to:
|
||||
|
||||
Jakub Hrozek <jhrozek@redhat.com>
|
||||
- Fedora package maintainer
|
||||
|
||||
Antoine Beaupré <anarcat@debian.org>
|
||||
- Debian package maintainer
|
||||
|
||||
Kevin Coyner <kcoyner@debian.org>
|
||||
Cédric Delfosse <cedric@debian.org>
|
||||
- previous Debian package maintainers
|
||||
|
||||
Eduardo Aguiar <eduardo.oliveira@sondabrasil.com.br>
|
||||
- provided Portuguese (Brazilian) translation
|
||||
|
||||
Stéphane Lacasse <stephane@gorfou.ca>
|
||||
- provided French translation
|
||||
|
||||
Marcos Kreinacke <public@kreinacke.com>
|
||||
- provided German translation
|
||||
|
||||
Bartosz Feñski <fenio@o2.pl> <http://skawina.eu.org/>
|
||||
- provided Polish translation along with Krystian Zubel
|
||||
|
||||
Joshua Jensen
|
||||
- reported RPM installation bug
|
||||
|
||||
Boris Folgmann <http://www.folgmann.com/en/>
|
||||
- reported cursor handling bug
|
||||
|
||||
Mathias Gumz
|
||||
- reported NLS bug
|
||||
|
||||
Daniel Roethlisberger
|
||||
- submitted patch to use lockfiles for -c if terminal locking fails
|
||||
|
||||
Adam Buchbinder
|
||||
- lots of help with a Cygwin port of -c
|
||||
|
||||
Mark Tomich <http://metuchen.dyndns.org>
|
||||
- suggested -B option
|
||||
|
||||
Gert Menke
|
||||
- reported bug when piping to dd with a large input buffer size
|
||||
|
||||
Ville Herva <Ville.Herva@iki.fi>
|
||||
- informative bug report about rate limiting performance
|
||||
|
||||
Elias Pipping
|
||||
- patch to compile properly on Darwin 9; potential NULL deref report
|
||||
|
||||
Patrick Collison
|
||||
- similar patch for OS X
|
||||
|
||||
Boris Lohner
|
||||
- reported problem that "-L" does not complain if given non-numeric value
|
||||
|
||||
Sebastian Kayser
|
||||
- supplied testing for SIGPIPE, demonstrated internationalisation problem
|
||||
|
||||
Laszlo Ersek <http://phptest11.atw.hu/>
|
||||
- reported shared memory leak on SIGINT with -c
|
||||
|
||||
Phil Rutschman <http://bandgap.rsnsoft.com/>
|
||||
- provided a patch for fully restoring terminal state on exit
|
||||
|
||||
Henry Precheur <http://henry.precheur.org/>
|
||||
- reporting and suggestions for --rate-limit bug when rate is under 10
|
||||
|
||||
E. Rosten <http://mi.eng.cam.ac.uk/~er258/>
|
||||
- supplied patch for block buffering in line mode
|
||||
|
||||
Kjetil Torgrim Homme
|
||||
- reported compilation error with default CFLAGS on non-GCC compilers
|
||||
|
||||
Alexandre de Verteuil
|
||||
- reported bug in OS X build and supplied test environment to fix in
|
||||
|
||||
Martin Baum
|
||||
- supplied patch to return nonzero exit status if terminated by signal
|
||||
|
||||
Sam Nelson <http://www.siliconfuture.net/>
|
||||
- supplied patch to fix trailing slash on DESTDIR
|
||||
|
||||
Daniel Pape
|
||||
- reported Cygwin installation problem due to DESTDIR
|
||||
|
||||
Philipp Beckers
|
||||
- ported to the Syabas PopcornHour A-100 series
|
||||
|
||||
Henry Gebhard <hsggebhardt@googlemail.com>
|
||||
- supplied patches to improve SI prefixes and add --average-rate
|
||||
|
||||
Vladimir Kokarev, Alexander Leo
|
||||
- reported that exit status did not reflect file errors
|
||||
|
||||
Thomas Rachel
|
||||
- submitted patches for IEEE1541 (MiB suffixes), 1+e03 bug
|
||||
|
||||
Guillaume Marcais
|
||||
- submitted speedup patch for line mode
|
||||
|
||||
Moritz Barsnick
|
||||
- submitted patch for compile warning in size calculation
|
||||
|
||||
Pawel Piatek
|
||||
- submitted RPM and patches for AIX
|
||||
|
||||
Sami Liedes
|
||||
- submitted patch for --timer and --bytes with --numeric
|
||||
|
||||
Steven Willis
|
||||
- reported problem with "-R" killing non-PV remote processes
|
||||
|
||||
Vladimir Pal, Vladimir Ermakov
|
||||
- submitted patch which led to development of --format option
|
||||
|
||||
Peter Samuelson <peter@p12n.org>
|
||||
- submitted patch to calculate size if stdout is a block device
|
||||
|
||||
Miguel Diaz
|
||||
- much Cygwin help (and packaging), found narrow-terminal bug
|
||||
|
||||
Jim Salter <http://ubuntuwiki.net>
|
||||
- commissioned work on the --skip-errors option
|
||||
|
||||
Wouter Pronk
|
||||
- reported build problem on SCO
|
||||
|
||||
Bryan Dongray <http://www.dongrays.com>
|
||||
- provided patches for test scripts failing on older Red Hats
|
||||
|
||||
Zev Weiss <www.bewilderbeest.net>
|
||||
- provided patch to fix splice() not using stdin
|
||||
|
||||
Zing Shishak
|
||||
- provided patch for --null / -0 (count null terminated lines)
|
||||
|
||||
Jacek Wielemborek <http://deetah.jogger.pl/kategorie/english>
|
||||
- implemented fdwatch in Python, suggested PV port
|
||||
- reported bug with "-l" and ETA / size
|
||||
- suggested common switches
|
||||
|
||||
Kim Krecht
|
||||
- suggested buffer fill status and last bytes output display options
|
||||
|
||||
Cristian Ciupitu <http://ciupicri.github.io>, Josh Stone
|
||||
- pointed out file descriptor leak with helpful suggestions
|
||||
(Josh Stone initially noticed the missing close)
|
||||
|
||||
Jan Seda
|
||||
- found issue with splice() and SPLICE_F_NONBLOCK causing slowdown
|
||||
|
||||
André Stapf
|
||||
- pointed out formatting problem e.g. 13GB -> 13.1GB which should be
|
||||
shown 13.0GB -> 13.1GB; highlighted on-startup row swapping in -c
|
||||
|
||||
Damon Harper <http://www.usrbin.ca/>
|
||||
- suggested "-D" / "--delay-start" option
|
||||
|
||||
Ganaël Laplanche <http://www.martymac.org>
|
||||
- provided patch for lstat64 on systems that do not support it
|
||||
|
||||
Peter Korsgaard <http://www.buildroot.net/>
|
||||
- provided similar patch for lstat64, specifically for uClibc support
|
||||
- provided AIX cross-compilation patch to fix bug in -lc128 check
|
||||
|
||||
Ralf Ramsauer <https://blog.ramses-pyramidenbau.de/>
|
||||
- reported bug which dropped transfer rate on terminal resize
|
||||
|
||||
Michiel Van Herwegen
|
||||
- reported and discussed bug with "-l" and ETA / size
|
||||
|
||||
Erkki Seppälä <http://www.inside.org/~flux/>
|
||||
- provided patch implementing "-I"
|
||||
|
||||
Eric A. Borisch
|
||||
- provided details of compatibility fix for "%Lu" in watchpid code
|
||||
|
||||
Jan Venekamp
|
||||
- reported MacOS buffer size interactions with pipes
|
||||
|
||||
Matt <https://github.com/lemonsqueeze/pv>
|
||||
- provided "rate-window" patches for rate calculation
|
||||
|
||||
Filippo Valsorda
|
||||
- provided patch for stat64 issue on Apple Silicon
|
||||
|
||||
Matt Koscica, William Dillon
|
||||
- also reported stat64 issue on Apple Silicon
|
||||
|
||||
Norman Rasmussen
|
||||
- suggested -c with -d PID:FD, reject -N with -d PID
|
||||
|
||||
Andriy Gapon, Jonathan Elchison
|
||||
- reported bug where "pv /dev/zero >/dev/null &" stops immediately
|
||||
|
||||
Marcelo Chiesa
|
||||
- reported unused-result warnings when compiling PV 1.6.6
|
||||
|
||||
Jered Floyd
|
||||
- provided patches to improve --rate-limit
|
||||
|
||||
Christoph Biedl
|
||||
- provided ETA and dynamic interval patches
|
||||
|
||||
Richard Fonfara
|
||||
- provided German translations for "pv --help"
|
||||
|
||||
Johannes Gerer <http://johannesgerer.com>
|
||||
- suggested that "-B" should enable "-C"
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
@@ -0,0 +1,58 @@
|
||||
Introduction
|
||||
------------
|
||||
|
||||
This is the README for **pv** ("Pipe Viewer"), a terminal-based tool for
|
||||
monitoring the progress of data through a pipeline. It can be inserted into
|
||||
any normal pipeline between two processes to give a visual indication of how
|
||||
quickly data is passing through, how long it has taken, how near to
|
||||
completion it is, and an estimate of how long it will be until completion.
|
||||
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
A manual page is included in this distribution. See "`man ./doc/quickref.1`",
|
||||
or "`man pv`" after installation.
|
||||
|
||||
Changes are listed in "[doc/NEWS.md](./doc/NEWS.md)". The to-do list is "[doc/TODO.md](./doc/TODO.md)".
|
||||
|
||||
|
||||
Compilation
|
||||
-----------
|
||||
|
||||
If this is not a packaged release, first run "`./generate.sh`".
|
||||
|
||||
To compile the package, type "`sh ./configure`", which should generate a
|
||||
Makefile for your system. You may then type "`make`" to build everything.
|
||||
Note that GNU _make_ is required; this may be installed as _gmake_ on some
|
||||
systems, so if typing "`make`" gives an error, try "`gmake`" instead.
|
||||
|
||||
See the file "[doc/INSTALL](./doc/INSTALL)" for more about the _configure_ script.
|
||||
|
||||
Developers note that you can run "`./configure --enable-debugging`" to cause
|
||||
debugging support to be built in, and the `--enable-profiling` option builds
|
||||
in profiling support (see "`man gprof`"). Also note that running
|
||||
"`make index`" will generate an HTML code index (using _ctags_ and
|
||||
_cproto_); this index lists all files used, all functions defined, and all
|
||||
TODOs marked in the code.
|
||||
|
||||
|
||||
Author and acknowledgements
|
||||
---------------------------
|
||||
|
||||
This package is copyright 2023 Andrew Wood, and is being distributed under
|
||||
the terms of the Artistic License 2.0. For more details of this license,
|
||||
see the file "[doc/COPYING](./doc/COPYING)".
|
||||
|
||||
Report bugs in **pv** using the contact form linked from the home page, or
|
||||
though the [project issue tracker](https://github.com/a-j-wood/pv/issues).
|
||||
|
||||
The **pv** home page is at:
|
||||
|
||||
[http://www.ivarch.com/programs/pv.shtml](http://www.ivarch.com/programs/pv.shtml)
|
||||
|
||||
The latest version can always be found here.
|
||||
|
||||
**Please see "[doc/ACKNOWLEDGEMENTS.md](./doc/ACKNOWLEDGEMENTS.md)" for a list of contributors.**
|
||||
|
||||
---
|
||||
@@ -3,12 +3,12 @@
|
||||
#
|
||||
# package.mk # package name and distribution details
|
||||
# vars.mk # compilation, shell and linking variables
|
||||
# filelist.mk~ # lists of files
|
||||
# filelist.mk~ # lists of files (generated by "makemake.sh")
|
||||
# unreal.mk # phony targets
|
||||
# modules.mk~ # module linking rules
|
||||
# modules.mk~ # module linking rules (generated by "makemake.sh")
|
||||
# rules.mk # compilation rules
|
||||
# link.mk # real top-level targets
|
||||
# depend.mk~ # dependencies
|
||||
# depend.mk~ # dependencies (generated by "makemake.sh")
|
||||
#
|
||||
#
|
||||
|
||||
|
||||
+50
-65
@@ -1,53 +1,64 @@
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_INIT(src/main/version.c)
|
||||
|
||||
dnl We're using C.
|
||||
dnl
|
||||
AC_LANG_C
|
||||
|
||||
dnl Output a header file.
|
||||
dnl Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
dnl
|
||||
AC_CONFIG_HEADER(src/include/config.h:autoconf/header.in)
|
||||
dnl Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
|
||||
dnl Set directory to check for Configure scripts in.
|
||||
dnl
|
||||
dnl Supported languages
|
||||
ALL_LINGUAS="de fr pl pt"
|
||||
|
||||
AC_INIT
|
||||
AC_CONFIG_SRCDIR([src/main/version.c])
|
||||
AC_CONFIG_AUX_DIR(autoconf/scripts)
|
||||
AC_CONFIG_HEADERS([src/include/config.h:autoconf/header.in])
|
||||
AH_BOTTOM([#include "config-aux.h"])
|
||||
|
||||
dnl Read in package details.
|
||||
dnl
|
||||
dnl Package identity
|
||||
PACKAGE=`cat $srcdir/doc/PACKAGE`
|
||||
VERSION=`cat $srcdir/doc/VERSION`
|
||||
UCPACKAGE=`tr a-z A-Z < $srcdir/doc/PACKAGE`
|
||||
AC_SUBST(PACKAGE)
|
||||
AC_SUBST(VERSION)
|
||||
AC_SUBST(UCPACKAGE)
|
||||
AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
|
||||
AC_DEFINE_UNQUOTED(PROGRAM_NAME, "$PACKAGE")
|
||||
AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
|
||||
AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Package name])
|
||||
AC_DEFINE_UNQUOTED([PROGRAM_NAME], ["$PACKAGE"], [Name of this program])
|
||||
AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version of this program])
|
||||
AC_DEFINE([COPYRIGHT_YEAR], [_("2023")], [Copyright year])
|
||||
AC_DEFINE([COPYRIGHT_HOLDER], [_("Andrew Wood <andrew.wood@ivarch.com>")], [Copyright holder])
|
||||
AC_DEFINE([PROJECT_HOMEPAGE], ["http://www.ivarch.com/programs/" PROGRAM_NAME ".shtml"], [Project homepage])
|
||||
AC_DEFINE([BUG_REPORTS_TO], [_("<pv@ivarch.com>")], [Bug reporting email address])
|
||||
|
||||
AC_LANG(C)
|
||||
CFLAGS=${CFLAGS:-"-O"}
|
||||
AC_PROG_CC
|
||||
AC_PROG_INSTALL
|
||||
AC_USE_SYSTEM_EXTENSIONS
|
||||
AC_C_CONST
|
||||
AC_HEADER_STDBOOL
|
||||
AC_SYS_LARGEFILE
|
||||
AC_HEADER_TIOCGWINSZ
|
||||
AC_CHECK_FUNCS(getopt_long getopt)
|
||||
AC_CHECK_HEADERS(getopt.h)
|
||||
AC_CHECK_FUNCS(memcpy basename vsnprintf strlcat)
|
||||
AC_CHECK_FUNCS(fdatasync)
|
||||
AC_CHECK_FUNCS(fpathconf sysconf posix_memalign)
|
||||
AC_CHECK_HEADERS(limits.h)
|
||||
|
||||
dnl Check for compile-time options.
|
||||
dnl
|
||||
AC_ARG_ENABLE(debugging,
|
||||
[ --enable-debugging compile with debugging support],
|
||||
if test "$enable_debugging" = "yes"; then
|
||||
CFLAGS="-g -Wall"
|
||||
AC_DEFINE(ENABLE_DEBUGGING)
|
||||
CFLAGS="$CFLAGS -g -Wall"
|
||||
AC_DEFINE([ENABLE_DEBUGGING], [1], [Debugging support enabled])
|
||||
fi
|
||||
)
|
||||
|
||||
AC_ARG_ENABLE(profiling,
|
||||
[ --enable-profiling compile with profiling support],
|
||||
if test "$enable_profiling" = "yes"; then
|
||||
CFLAGS="-pg $CFLAGS"
|
||||
fi
|
||||
)
|
||||
LFS_SUPPORT="no"
|
||||
AC_ARG_ENABLE(lfs, [ --disable-lfs disable LFS support],
|
||||
if test "$enable_lfs" = "yes"; then
|
||||
LFS_SUPPORT="yes"
|
||||
fi,
|
||||
LFS_SUPPORT="yes"
|
||||
)
|
||||
|
||||
STATIC_NLS="no"
|
||||
AC_ARG_ENABLE(static-nls, [ --enable-static-nls hardcode NLS with no support files],
|
||||
if test "$enable_static_nls" = "yes"; then
|
||||
@@ -55,6 +66,7 @@ AC_ARG_ENABLE(static-nls, [ --enable-static-nls hardcode NLS with no suppor
|
||||
fi,
|
||||
STATIC_NLS="no"
|
||||
)
|
||||
|
||||
NLS_SUPPORT="no"
|
||||
AC_ARG_ENABLE(nls, [ --disable-nls do not use Native Language Support],
|
||||
if test "$enable_nls" = "yes"; then
|
||||
@@ -62,6 +74,7 @@ AC_ARG_ENABLE(nls, [ --disable-nls do not use Native Language Support
|
||||
fi,
|
||||
NLS_SUPPORT="yes"
|
||||
)
|
||||
|
||||
SPLICE_SUPPORT="no"
|
||||
AC_ARG_ENABLE(splice, [ --disable-splice do not use splice system call],
|
||||
if test "$enable_splice" = "yes"; then
|
||||
@@ -69,6 +82,7 @@ AC_ARG_ENABLE(splice, [ --disable-splice do not use splice system call],
|
||||
fi,
|
||||
SPLICE_SUPPORT="yes"
|
||||
)
|
||||
|
||||
IPC_SUPPORT="no"
|
||||
AC_ARG_ENABLE(ipc, [ --disable-ipc turn off IPC messaging],
|
||||
if test "$enable_ipc" = "yes"; then
|
||||
@@ -77,25 +91,15 @@ AC_ARG_ENABLE(ipc, [ --disable-ipc turn off IPC messaging],
|
||||
IPC_SUPPORT="yes"
|
||||
)
|
||||
|
||||
dnl Check for various programs.
|
||||
dnl
|
||||
CFLAGS=${CFLAGS:-"-O"}
|
||||
AC_PROG_CC
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_MAKE_SET
|
||||
|
||||
dnl AIX needs -lc128
|
||||
dnl
|
||||
AC_EGREP_CPP([^yes$], [#ifdef _AIX
|
||||
yes
|
||||
#endif
|
||||
], [LIBS="$LIBS -lc128"])
|
||||
|
||||
dnl NLS stuff.
|
||||
dnl
|
||||
ALL_LINGUAS="de fr pl pt"
|
||||
dnl Native Language Suppot
|
||||
if test "$NLS_SUPPORT" = "yes"; then
|
||||
AC_DEFINE(ENABLE_NLS)
|
||||
AC_DEFINE([ENABLE_NLS], [1], [Enable native language support])
|
||||
AC_PATH_PROG(MSGFMT, msgfmt, NOMSGFMT)
|
||||
AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
|
||||
AC_PATH_PROG(XGETTEXT, xgettext, xgettext)
|
||||
@@ -121,7 +125,7 @@ if test "$NLS_SUPPORT" = "yes"; then
|
||||
CATALOGS=""
|
||||
else
|
||||
AC_CHECK_FUNC(gettext,
|
||||
[AC_DEFINE(HAVE_GETTEXT)
|
||||
[AC_DEFINE([HAVE_GETTEXT], [1], [The gettext function is available])
|
||||
NLSOBJ=""
|
||||
], [CATALOGS=""; NLSOBJ="src/nls/table.o"
|
||||
]
|
||||
@@ -140,25 +144,6 @@ AC_SUBST(POFILES)
|
||||
AC_SUBST(CATALOGS)
|
||||
AC_SUBST(NLSOBJ)
|
||||
|
||||
dnl Getopt checks.
|
||||
dnl
|
||||
AC_CHECK_FUNCS(getopt_long getopt)
|
||||
AC_CHECK_HEADERS(getopt.h)
|
||||
|
||||
dnl LFS checks.
|
||||
dnl
|
||||
if test "$LFS_SUPPORT" = "yes"; then
|
||||
AC_CHECK_FUNCS(open64, AC_DEFINE(ENABLE_LARGEFILE))
|
||||
fi
|
||||
|
||||
dnl Check for various header files and set various other macros.
|
||||
dnl
|
||||
AC_DEFINE(HAVE_CONFIG_H)
|
||||
AC_HEADER_STDC
|
||||
AC_HEADER_STDBOOL
|
||||
AC_CHECK_FUNCS(memcpy basename snprintf stat64)
|
||||
AC_CHECK_HEADERS(limits.h)
|
||||
|
||||
if test "$IPC_SUPPORT" = "yes"; then
|
||||
AC_CHECK_HEADERS(sys/ipc.h sys/param.h libgen.h)
|
||||
fi
|
||||
@@ -167,8 +152,8 @@ if test "$SPLICE_SUPPORT" = "yes"; then
|
||||
AC_CHECK_FUNCS(splice)
|
||||
fi
|
||||
|
||||
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
|
||||
AC_SUBST(INSTALL_DATA)
|
||||
dnl This must go after all the compiler based tests above.
|
||||
AC_LANG_WERROR
|
||||
|
||||
dnl Fudging for separate build directories.
|
||||
dnl
|
||||
@@ -187,14 +172,14 @@ done
|
||||
|
||||
dnl Output files (and create build directory structure too).
|
||||
dnl
|
||||
AC_OUTPUT(Makefile:$mk_segments doc/lsm:doc/lsm.in
|
||||
AC_CONFIG_FILES([Makefile:$mk_segments doc/lsm:doc/lsm.in
|
||||
doc/quickref.1:doc/quickref.1.in
|
||||
doc/$PACKAGE.spec:doc/spec.in
|
||||
src/.dummy:doc/NEWS,
|
||||
rm -f src/.dummy
|
||||
src/.dummy:doc/NEWS.md])
|
||||
AC_CONFIG_COMMANDS([default],[rm -f src/.dummy
|
||||
for i in $subdirs; do
|
||||
test -d $i || mkdir $i
|
||||
done
|
||||
, subdirs="$subdirs")
|
||||
],[subdirs="$subdirs"])
|
||||
AC_OUTPUT
|
||||
|
||||
dnl EOF
|
||||
|
||||
+249
-108
@@ -1,114 +1,255 @@
|
||||
/*!NOINDEX*/
|
||||
/* Define if you have standard C headers. */
|
||||
#undef STDC_HEADERS
|
||||
/* autoconf/header.in. Generated from autoconf/configure.in by autoheader. */
|
||||
|
||||
/* Define if you have "config.h" (yes, you have). */
|
||||
#undef HAVE_CONFIG_H
|
||||
/* Bug reporting email address */
|
||||
#undef BUG_REPORTS_TO
|
||||
|
||||
/* Various other header files. */
|
||||
#undef HAVE_GETOPT_H
|
||||
#undef HAVE_LIMITS_H
|
||||
#undef HAVE_SYS_IPC_H
|
||||
#undef HAVE_SYS_PARAM_H
|
||||
#undef HAVE_LIBGEN_H
|
||||
/* Copyright holder */
|
||||
#undef COPYRIGHT_HOLDER
|
||||
|
||||
/* Functions. */
|
||||
#undef HAVE_GETOPT
|
||||
#undef HAVE_GETOPT_LONG
|
||||
#undef HAVE_MEMCPY
|
||||
#undef HAVE_BASENAME
|
||||
#undef HAVE_SNPRINTF
|
||||
#undef HAVE_STAT64
|
||||
/* Copyright year */
|
||||
#undef COPYRIGHT_YEAR
|
||||
|
||||
#undef HAVE_SPLICE
|
||||
#ifdef HAVE_SPLICE
|
||||
# define _GNU_SOURCE 1
|
||||
#endif
|
||||
/* NB the above must come before NLS, as NLS includes other system headers. */
|
||||
|
||||
/* NLS stuff. */
|
||||
#undef ENABLE_NLS
|
||||
#undef HAVE_LIBINTL_H
|
||||
#undef HAVE_LOCALE_H
|
||||
#undef HAVE_GETTEXT
|
||||
#ifdef ENABLE_NLS
|
||||
# include "library/gettext.h"
|
||||
#else
|
||||
# define _(String) (String)
|
||||
# define N_(String) (String)
|
||||
#endif
|
||||
|
||||
/* The name of the program. */
|
||||
#define PROGRAM_NAME "progname"
|
||||
|
||||
/* The name of the package. */
|
||||
#define PACKAGE ""
|
||||
|
||||
/* The current package version. */
|
||||
#define VERSION "0.0.0"
|
||||
|
||||
/* Various identification and legal stuff. */
|
||||
#define COPYRIGHT_YEAR _("2015")
|
||||
#define COPYRIGHT_HOLDER _("Andrew Wood <andrew.wood@ivarch.com>")
|
||||
#define PROJECT_HOMEPAGE "http://www.ivarch.com/programs/" PROGRAM_NAME ".shtml"
|
||||
#define BUG_REPORTS_TO _("<pv@ivarch.com>")
|
||||
|
||||
/* LFS support. */
|
||||
#undef ENABLE_LARGEFILE
|
||||
#ifdef ENABLE_LARGEFILE
|
||||
# define __USE_LARGEFILE64 1
|
||||
# define _LARGEFILE64_SOURCE 1
|
||||
#else
|
||||
/*
|
||||
* Some Macs have stat64 despite not having open64 while others don't have
|
||||
* either, so here even if we don't have open64 or LFS is disabled, we have
|
||||
* to check whether stat64 exists and only redefine it if it doesn't
|
||||
* otherwise some Macs fail to compile.
|
||||
*/
|
||||
# ifdef __APPLE__
|
||||
# ifndef HAVE_STAT64
|
||||
# define stat64 stat
|
||||
# define fstat64 fstat
|
||||
# define lstat64 lstat
|
||||
# endif
|
||||
# else
|
||||
# define stat64 stat
|
||||
# define fstat64 fstat
|
||||
# define lstat64 lstat
|
||||
# endif
|
||||
# define open64 open
|
||||
# define lseek64 lseek
|
||||
#endif
|
||||
|
||||
#undef HAVE_IPC
|
||||
#ifdef HAVE_SYS_IPC_H
|
||||
#define HAVE_IPC 1
|
||||
#endif
|
||||
|
||||
#undef CURSOR_ANSWERBACK_BYTE_BY_BYTE
|
||||
#ifndef _AIX
|
||||
#define CURSOR_ANSWERBACK_BYTE_BY_BYTE 1
|
||||
#endif
|
||||
|
||||
/* Boolean type support. */
|
||||
#undef HAVE_STDBOOL_H
|
||||
#ifdef HAVE_STDBOOL_H
|
||||
# include <stdbool.h>
|
||||
#else
|
||||
# ifndef HAVE__BOOL
|
||||
# ifdef __cplusplus
|
||||
typedef bool _Bool;
|
||||
# else
|
||||
# define _Bool signed char
|
||||
# endif
|
||||
# endif
|
||||
# define bool _Bool
|
||||
# define false 0
|
||||
# define true 1
|
||||
# define __bool_true_false_are_defined 1
|
||||
#endif
|
||||
|
||||
/* Support for debugging output. */
|
||||
/* Debugging support enabled */
|
||||
#undef ENABLE_DEBUGGING
|
||||
|
||||
/* EOF */
|
||||
/* Enable native language support */
|
||||
#undef ENABLE_NLS
|
||||
|
||||
/* Define to 1 if `TIOCGWINSZ' requires <sys/ioctl.h>. */
|
||||
#undef GWINSZ_IN_SYS_IOCTL
|
||||
|
||||
/* Define to 1 if you have the `basename' function. */
|
||||
#undef HAVE_BASENAME
|
||||
|
||||
/* Define to 1 if you have the `fdatasync' function. */
|
||||
#undef HAVE_FDATASYNC
|
||||
|
||||
/* Define to 1 if you have the `fpathconf' function. */
|
||||
#undef HAVE_FPATHCONF
|
||||
|
||||
/* Define to 1 if you have the `getopt' function. */
|
||||
#undef HAVE_GETOPT
|
||||
|
||||
/* Define to 1 if you have the <getopt.h> header file. */
|
||||
#undef HAVE_GETOPT_H
|
||||
|
||||
/* Define to 1 if you have the `getopt_long' function. */
|
||||
#undef HAVE_GETOPT_LONG
|
||||
|
||||
/* The gettext function is available */
|
||||
#undef HAVE_GETTEXT
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#undef HAVE_INTTYPES_H
|
||||
|
||||
/* Define to 1 if you have the <libgen.h> header file. */
|
||||
#undef HAVE_LIBGEN_H
|
||||
|
||||
/* Define to 1 if you have the `i' library (-li). */
|
||||
#undef HAVE_LIBI
|
||||
|
||||
/* Define to 1 if you have the `intl' library (-lintl). */
|
||||
#undef HAVE_LIBINTL
|
||||
|
||||
/* Define to 1 if you have the <libintl.h> header file. */
|
||||
#undef HAVE_LIBINTL_H
|
||||
|
||||
/* Define to 1 if you have the <limits.h> header file. */
|
||||
#undef HAVE_LIMITS_H
|
||||
|
||||
/* Define to 1 if you have the <locale.h> header file. */
|
||||
#undef HAVE_LOCALE_H
|
||||
|
||||
/* Define to 1 if you have the `memcpy' function. */
|
||||
#undef HAVE_MEMCPY
|
||||
|
||||
/* Define to 1 if you have the <minix/config.h> header file. */
|
||||
#undef HAVE_MINIX_CONFIG_H
|
||||
|
||||
/* Define to 1 if you have the `posix_memalign' function. */
|
||||
#undef HAVE_POSIX_MEMALIGN
|
||||
|
||||
/* Define to 1 if you have the `splice' function. */
|
||||
#undef HAVE_SPLICE
|
||||
|
||||
/* Define to 1 if stdbool.h conforms to C99. */
|
||||
#undef HAVE_STDBOOL_H
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#undef HAVE_STDINT_H
|
||||
|
||||
/* Define to 1 if you have the <stdio.h> header file. */
|
||||
#undef HAVE_STDIO_H
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#undef HAVE_STDLIB_H
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#undef HAVE_STRINGS_H
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#undef HAVE_STRING_H
|
||||
|
||||
/* Define to 1 if you have the `strlcat' function. */
|
||||
#undef HAVE_STRLCAT
|
||||
|
||||
/* Define to 1 if you have the `sysconf' function. */
|
||||
#undef HAVE_SYSCONF
|
||||
|
||||
/* Define to 1 if you have the <sys/ipc.h> header file. */
|
||||
#undef HAVE_SYS_IPC_H
|
||||
|
||||
/* Define to 1 if you have the <sys/param.h> header file. */
|
||||
#undef HAVE_SYS_PARAM_H
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#undef HAVE_SYS_STAT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#undef HAVE_SYS_TYPES_H
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#undef HAVE_UNISTD_H
|
||||
|
||||
/* Define to 1 if you have the `vsnprintf' function. */
|
||||
#undef HAVE_VSNPRINTF
|
||||
|
||||
/* Define to 1 if you have the <wchar.h> header file. */
|
||||
#undef HAVE_WCHAR_H
|
||||
|
||||
/* Define to 1 if the system has the type `_Bool'. */
|
||||
#undef HAVE__BOOL
|
||||
|
||||
/* Package name */
|
||||
#undef PACKAGE
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#undef PACKAGE_BUGREPORT
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#undef PACKAGE_NAME
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#undef PACKAGE_STRING
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#undef PACKAGE_TARNAME
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#undef PACKAGE_URL
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#undef PACKAGE_VERSION
|
||||
|
||||
/* Name of this program */
|
||||
#undef PROGRAM_NAME
|
||||
|
||||
/* Project homepage */
|
||||
#undef PROJECT_HOMEPAGE
|
||||
|
||||
/* Define to 1 if all of the C90 standard headers exist (not just the ones
|
||||
required in a freestanding environment). This macro is provided for
|
||||
backward compatibility; new code need not use it. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Enable extensions on AIX 3, Interix. */
|
||||
#ifndef _ALL_SOURCE
|
||||
# undef _ALL_SOURCE
|
||||
#endif
|
||||
/* Enable general extensions on macOS. */
|
||||
#ifndef _DARWIN_C_SOURCE
|
||||
# undef _DARWIN_C_SOURCE
|
||||
#endif
|
||||
/* Enable general extensions on Solaris. */
|
||||
#ifndef __EXTENSIONS__
|
||||
# undef __EXTENSIONS__
|
||||
#endif
|
||||
/* Enable GNU extensions on systems that have them. */
|
||||
#ifndef _GNU_SOURCE
|
||||
# undef _GNU_SOURCE
|
||||
#endif
|
||||
/* Enable X/Open compliant socket functions that do not require linking
|
||||
with -lxnet on HP-UX 11.11. */
|
||||
#ifndef _HPUX_ALT_XOPEN_SOCKET_API
|
||||
# undef _HPUX_ALT_XOPEN_SOCKET_API
|
||||
#endif
|
||||
/* Identify the host operating system as Minix.
|
||||
This macro does not affect the system headers' behavior.
|
||||
A future release of Autoconf may stop defining this macro. */
|
||||
#ifndef _MINIX
|
||||
# undef _MINIX
|
||||
#endif
|
||||
/* Enable general extensions on NetBSD.
|
||||
Enable NetBSD compatibility extensions on Minix. */
|
||||
#ifndef _NETBSD_SOURCE
|
||||
# undef _NETBSD_SOURCE
|
||||
#endif
|
||||
/* Enable OpenBSD compatibility extensions on NetBSD.
|
||||
Oddly enough, this does nothing on OpenBSD. */
|
||||
#ifndef _OPENBSD_SOURCE
|
||||
# undef _OPENBSD_SOURCE
|
||||
#endif
|
||||
/* Define to 1 if needed for POSIX-compatible behavior. */
|
||||
#ifndef _POSIX_SOURCE
|
||||
# undef _POSIX_SOURCE
|
||||
#endif
|
||||
/* Define to 2 if needed for POSIX-compatible behavior. */
|
||||
#ifndef _POSIX_1_SOURCE
|
||||
# undef _POSIX_1_SOURCE
|
||||
#endif
|
||||
/* Enable POSIX-compatible threading on Solaris. */
|
||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
||||
# undef _POSIX_PTHREAD_SEMANTICS
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */
|
||||
#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
|
||||
# undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */
|
||||
#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
|
||||
# undef __STDC_WANT_IEC_60559_BFP_EXT__
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */
|
||||
#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
|
||||
# undef __STDC_WANT_IEC_60559_DFP_EXT__
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */
|
||||
#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
|
||||
# undef __STDC_WANT_IEC_60559_FUNCS_EXT__
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-3:2015. */
|
||||
#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
|
||||
# undef __STDC_WANT_IEC_60559_TYPES_EXT__
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */
|
||||
#ifndef __STDC_WANT_LIB_EXT2__
|
||||
# undef __STDC_WANT_LIB_EXT2__
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC 24747:2009. */
|
||||
#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
|
||||
# undef __STDC_WANT_MATH_SPEC_FUNCS__
|
||||
#endif
|
||||
/* Enable extensions on HP NonStop. */
|
||||
#ifndef _TANDEM_SOURCE
|
||||
# undef _TANDEM_SOURCE
|
||||
#endif
|
||||
/* Enable X/Open extensions. Define to 500 only if necessary
|
||||
to make mbstate_t available. */
|
||||
#ifndef _XOPEN_SOURCE
|
||||
# undef _XOPEN_SOURCE
|
||||
#endif
|
||||
|
||||
|
||||
/* Version of this program */
|
||||
#undef VERSION
|
||||
|
||||
/* Number of bits in a file offset, on hosts where this is settable. */
|
||||
#undef _FILE_OFFSET_BITS
|
||||
|
||||
/* Define for large files, on AIX-style hosts. */
|
||||
#undef _LARGE_FILES
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
#undef const
|
||||
|
||||
#include "config-aux.h"
|
||||
|
||||
@@ -7,7 +7,7 @@ version = @VERSION@
|
||||
PACKAGE = @PACKAGE@
|
||||
|
||||
distfiles = \
|
||||
$(srcdir)/README \
|
||||
$(srcdir)/README.md \
|
||||
$(srcdir)/autoconf \
|
||||
$(srcdir)/configure \
|
||||
$(srcdir)/doc \
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
$(CC) $< $(<:%.c=%) $(srcdir) $(CFLAGS) $(CPPFLAGS) > $@
|
||||
|
||||
#
|
||||
# NLS stuff
|
||||
# Native language support
|
||||
#
|
||||
|
||||
%.mo: %.po
|
||||
|
||||
+4
-22
@@ -6,8 +6,7 @@
|
||||
clean depclean indentclean distclean cvsclean svnclean \
|
||||
index manhtml indent update-po \
|
||||
doc dist release \
|
||||
install uninstall \
|
||||
rpm srpm
|
||||
install uninstall
|
||||
|
||||
all: $(alltarg) $(CATALOGS)
|
||||
|
||||
@@ -35,9 +34,7 @@ help:
|
||||
@echo ' update-po update the .po files'
|
||||
@echo
|
||||
@echo ' dist create a source tarball for distribution'
|
||||
@echo ' rpm build a binary RPM (passes $$RPMFLAGS to RPM)'
|
||||
@echo ' srpm build a source RPM (passes $$RPMFLAGS to RPM)'
|
||||
@echo ' release dist+rpm+srpm'
|
||||
@echo ' release create and sign tar.gz and tar.bz2'
|
||||
@echo
|
||||
|
||||
make:
|
||||
@@ -83,13 +80,12 @@ update-po: $(srcdir)/src/nls/$(PACKAGE).pot
|
||||
|
||||
distclean: clean depclean
|
||||
rm -f $(alltarg) src/include/config.h
|
||||
rm -rf $(package)-$(version).tar* $(package)-$(version) $(package)-$(version)-*.rpm
|
||||
rm -rf $(package)-$(version).tar* $(package)-$(version)
|
||||
rm -f *.html config.*
|
||||
rm Makefile
|
||||
|
||||
cvsclean svnclean: distclean
|
||||
rm -f doc/lsm
|
||||
rm -f doc/$(package).spec
|
||||
rm -f doc/quickref.1
|
||||
rm -f configure
|
||||
rm -f src/nls/*.gmo src/nls/*.mo
|
||||
@@ -123,7 +119,6 @@ dist: doc update-po
|
||||
cp -dprf Makefile $(distfiles) $(package)-$(version)
|
||||
cd $(package)-$(version); $(MAKE) distclean
|
||||
cp -dpf doc/lsm $(package)-$(version)/doc/
|
||||
cp -dpf doc/$(package).spec $(package)-$(version)/doc/
|
||||
chmod 644 `find $(package)-$(version) -type f -print`
|
||||
chmod 755 `find $(package)-$(version) -type d -print`
|
||||
chmod 755 `find $(package)-$(version)/autoconf/scripts`
|
||||
@@ -181,21 +176,8 @@ uninstall:
|
||||
done; \
|
||||
fi
|
||||
|
||||
rpm:
|
||||
test -e $(package)-$(version).tar.gz || $(MAKE) dist
|
||||
rpmbuild $(RPMFLAGS) --define="%_topdir `pwd`/rpm" -tb $(package)-$(version).tar.gz
|
||||
mv rpm/RPMS/*/$(package)-*.rpm .
|
||||
rm -rf rpm
|
||||
|
||||
srpm:
|
||||
test -e $(package)-$(version).tar.gz || $(MAKE) dist
|
||||
rpmbuild $(RPMFLAGS) --define="%_topdir `pwd`/rpm" -ts $(package)-$(version).tar.gz
|
||||
mv rpm/SRPMS/*$(package)-*.rpm .
|
||||
rm -rf rpm
|
||||
|
||||
release: dist rpm srpm
|
||||
release: dist
|
||||
zcat $(package)-$(version).tar.gz | bzip2 > $(package)-$(version).tar.bz2
|
||||
-grep -Fq '%_gpg_name' ~/.rpmmacros 2>/dev/null && rpm --addsign *.rpm
|
||||
-gpg --list-secret-keys 2>&1 | grep -Fq 'uid' && gpg -ab *.tar.gz && rename .asc .txt *.tar.gz.asc
|
||||
-gpg --list-secret-keys 2>&1 | grep -Fq 'uid' && gpg -ab *.tar.bz2 && rename .asc .txt *.tar.bz2.asc
|
||||
chmod 644 $(package)-$(version)*
|
||||
|
||||
@@ -11,6 +11,7 @@ infodir = @infodir@
|
||||
mandir = @mandir@
|
||||
etcdir = @prefix@/etc
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
sbindir = @sbindir@
|
||||
|
||||
VPATH = $(srcdir)
|
||||
@@ -27,7 +28,6 @@ MSGMERGE = msgmerge
|
||||
CATOBJEXT = @CATOBJEXT@
|
||||
INSTOBJEXT = @INSTOBJEXT@
|
||||
|
||||
@SET_MAKE@
|
||||
SHELL = /bin/sh
|
||||
CC = @CC@
|
||||
INSTALL = @INSTALL@
|
||||
|
||||
@@ -5,15 +5,15 @@
|
||||
# time, as suggested by Ville Herva <Ville.Herva@iki.fi>.
|
||||
#
|
||||
|
||||
test_input=`mktemp /tmp/pvbench1XXXXXX`
|
||||
strace_output=`mktemp /tmp/pvbench2XXXXXX`
|
||||
test_input=$(mktemp /tmp/pvbench1XXXXXX)
|
||||
strace_output=$(mktemp /tmp/pvbench2XXXXXX)
|
||||
|
||||
trap "rm -f ${test_input} ${strace_output}" 0
|
||||
trap 'rm -f ${test_input} ${strace_output}' EXIT
|
||||
|
||||
pv=${pv:-./pv}
|
||||
test -x ${pv} || pv=pv
|
||||
test -x "${pv}" || pv="pv"
|
||||
|
||||
dd if=/dev/zero of=${test_input} bs=1k count=1k >/dev/null 2>&1
|
||||
dd if=/dev/zero of="${test_input}" bs=1k count=1k >/dev/null 2>&1
|
||||
|
||||
echo -e "Buf(k)\tRate(k)\tReads\tRsize\tWrites\tWsize"
|
||||
|
||||
@@ -21,16 +21,16 @@ for ((buffer=100; buffer<=1000; buffer+=100)); do
|
||||
for ((rate=0; rate<=1000; rate+=100)); do
|
||||
rateparm="-L ${rate}k"
|
||||
test ${rate} -eq 0 && rateparm=""
|
||||
strace -tt -o ${strace_output} \
|
||||
${pv} ${rateparm} -B ${buffer}k \
|
||||
-f < ${test_input} > /dev/null 2>&1
|
||||
strace -tt -o "${strace_output}" \
|
||||
"${pv}" "${rateparm}" -B "${buffer}k" \
|
||||
-f < "${test_input}" > /dev/null 2>&1
|
||||
rdata=$(
|
||||
awk '$2~/^read\(0,/{c++;t+=$NF}END{print c "\t" t/c}' \
|
||||
${strace_output}
|
||||
"${strace_output}"
|
||||
)
|
||||
wdata=$(
|
||||
awk '$2~/^write\(1,/{c++;t+=$NF}END{print c "\t" t/c}' \
|
||||
${strace_output}
|
||||
"${strace_output}"
|
||||
)
|
||||
echo -e "${buffer}\t${rate}\t${rdata}\t${wdata}"
|
||||
done
|
||||
|
||||
+15
-12
@@ -3,25 +3,28 @@
|
||||
# Generate dependencies for a C source file.
|
||||
#
|
||||
|
||||
CC=$1
|
||||
CC="$1"
|
||||
shift
|
||||
file=$1
|
||||
file="$1"
|
||||
shift
|
||||
stem=$1
|
||||
stem="$1"
|
||||
shift
|
||||
srcdir=$1
|
||||
abssrc=`echo $srcdir | sed ':1
|
||||
srcdir="$1"
|
||||
abssrc=$(echo "$srcdir" | sed ':1
|
||||
s,^\./,,g
|
||||
t1'`
|
||||
t1')
|
||||
shift
|
||||
|
||||
abssrc=`echo "$abssrc" | sed 's,\\.,\\\\.,g'`
|
||||
srcdir=`echo "$srcdir" | sed 's,\\.,\\\\.,g'`
|
||||
abssrc=$(echo "$abssrc" | sed 's,\.,\\.,g')
|
||||
srcdir=$(echo "$srcdir" | sed 's,\.,\\.,g')
|
||||
|
||||
$CC -M -MG $* $file \
|
||||
| sed -e 's, /[^ ]*,,g' -e "s,^.*\.o:,${stem}.d ${stem}.o:," \
|
||||
-e '/^ \\$/d' -e 's/ \\$//' \
|
||||
-e 's,'"$srcdir"'/,,g' -e 's,'"$abssrc"'/,,g' \
|
||||
$CC -M -MG "$@" "$file" \
|
||||
| sed \
|
||||
-e "s,^.*\.o:,${stem}.d ${stem}.o:," \
|
||||
-e 's,'"$srcdir"'/,,g' \
|
||||
-e 's,'"$abssrc"'/,,g' \
|
||||
-e 's, /[^ ]*,,g' \
|
||||
-e '/^ \\$/d' -e 's/ \\$//' \
|
||||
| tr '\n' ' ' \
|
||||
| tr -s ' '
|
||||
|
||||
|
||||
+75
-55
@@ -15,8 +15,15 @@
|
||||
# Requires ctags and cproto.
|
||||
#
|
||||
|
||||
OFFS=$1
|
||||
command -v "ctags" >/dev/null 2>&1 || { echo "${0##*/}: ctags: command not found" 1>&2; exit 1; }
|
||||
command -v "cproto" >/dev/null 2>&1 || { echo "${0##*/}: cproto: command not found" 1>&2; exit 1; }
|
||||
|
||||
linkPrefix=$1
|
||||
test -n "${linkPrefix}" || linkPrefix="."
|
||||
|
||||
# Add "/" to the link prefix, and empty it entirely if it ends up just "./".
|
||||
linkPrefix=$(echo "${linkPrefix}" | sed 's,/*$,,')
|
||||
test "$linkPrefix" = "." && linkPrefix="" || linkPrefix="${linkPrefix}/"
|
||||
|
||||
# Convert the given string to HTML-escaped values (<, >, & escaped) on
|
||||
# stdout.
|
||||
@@ -35,14 +42,18 @@ html_safebr () {
|
||||
| sed -e 's|&|\&|g;s|<|\<|g;s|>|\>|g;s/$/<BR>/'
|
||||
}
|
||||
|
||||
ALLFILES=`find . -name '*~' -prune -o -type f -name '*.c' \
|
||||
-exec grep -FL '!NOINDEX' /dev/null '{}' ';'`
|
||||
allEligibleFiles=$(
|
||||
find . -name '*~' -prune -o -type f -name '*.c' \
|
||||
-exec grep -FL '!NOINDEX' /dev/null '{}' ';'
|
||||
)
|
||||
|
||||
CTAGDATA=`echo "$ALLFILES" \
|
||||
| ctags -nRf- -L- --c-types=f \
|
||||
| sed 's/ .\// /;s/;" .*$//'`
|
||||
ctagsOutput=$(
|
||||
echo "${allEligibleFiles}" \
|
||||
| ctags -nRf- -L- --c-types=f \
|
||||
| sed 's/ .\// /;s/;" .*$//'
|
||||
)
|
||||
|
||||
FILELIST=`echo "$CTAGDATA" | cut -d ' ' -f 2 | sort | uniq`
|
||||
sourceFiles=$(echo "${ctagsOutput}" | cut -d ' ' -f 2 | sort | uniq)
|
||||
|
||||
echo '<HTML><HEAD>'
|
||||
echo '<TITLE>Source Code Index</TITLE>'
|
||||
@@ -56,39 +67,43 @@ echo '</UL></P>'
|
||||
|
||||
echo '<H2><A NAME="files">File Listing</A></H2>'
|
||||
echo '<P><UL>'
|
||||
echo "$FILELIST" \
|
||||
echo "${sourceFiles}" \
|
||||
| sed -e \
|
||||
's|^.*$|<LI><CODE CLASS="filename"><A HREF="#file-\0">\0</A></CODE></LI>|'
|
||||
echo '</UL></P>'
|
||||
|
||||
for FILE in $FILELIST; do
|
||||
for sourceFile in ${sourceFiles}; do
|
||||
|
||||
DIR=`dirname $FILE`
|
||||
FUNCDEFS=`cproto -f1 -I. -Isrc/include -I$DIR $FILE 2>/dev/null \
|
||||
| sed -n 's/^.*[ *]\([^ *(]*\)(.*$/\1/p'`
|
||||
FILEHEAD="`sed -n -e \
|
||||
'1,/\*\//{/\/\*/,/\*\//{s/^[\/ *]//;s/^\*[\/]*//;p;};}' \
|
||||
< $FILE`"
|
||||
FILESHORTDESC=`echo "$FILEHEAD" | sed -n '1,/^ *$/{/^ *[^ ]*/p;}'`
|
||||
FILELONGDESC=`echo "$FILEHEAD" | sed '1,/^ *$/d'`
|
||||
sourceDir="${sourceFile##*/}"
|
||||
test "${sourceDir}" = "${sourceFile}" && sourceDir="."
|
||||
functionPrototypes=$(
|
||||
cproto -f1 -I. -Isrc/include -I"${sourceDir}" "${sourceFile}" 2>/dev/null \
|
||||
| sed -n 's/^.*[ *]\([^ *(]*\)(.*$/\1/p'
|
||||
)
|
||||
fileHeaderComment=$(
|
||||
sed -n -e '1,/\*\//{/\/\*/,/\*\//{s/^[\/ *]//;s/^\*[\/]*//;p;};}' \
|
||||
< "${sourceFile}"
|
||||
)
|
||||
fileShortDescription=$(echo "${fileHeaderComment}" | sed -n '1,/^ *$/{/^ *[^ ]*/p;}')
|
||||
fileLongDescription=$(echo "${fileHeaderComment}" | sed '1,/^ *$/d')
|
||||
|
||||
echo '<P><HR WIDTH="100%"></P>'
|
||||
echo '<P><TABLE BORDER="0"><TR>'
|
||||
echo '<TD VALIGN="TOP"><CODE CLASS="filename">'
|
||||
echo '<A NAME="file-'"$FILE"'">'"$FILE"'</A></CODE></TD>'
|
||||
echo '<A NAME="file-'"${sourceFile}"'">'"${sourceFile}"'</A></CODE></TD>'
|
||||
echo '<TD VALIGN="TOP"> - </TD>'
|
||||
echo '<TD VALIGN="TOP">'`html_safe "$FILESHORTDESC"`'</TD>'
|
||||
echo '<TD VALIGN="TOP">'"$(html_safe "${fileShortDescription}")"'</TD>'
|
||||
echo '</TR></TABLE></P>'
|
||||
echo '<P><SMALL>[<A HREF="'"$OFFS/$FILE"'">View File</A>]</SMALL></P>'
|
||||
echo '<P><SMALL>[<A HREF="'"${linkPrefix}${sourceFile}"'">View File</A>]</SMALL></P>'
|
||||
echo '<P><BLOCKQUOTE>'
|
||||
echo "`html_safebr "$FILELONGDESC"`"
|
||||
html_safebr "${fileLongDescription}"
|
||||
echo '</BLOCKQUOTE></P>'
|
||||
|
||||
if [ -n "$FUNCDEFS" ]; then
|
||||
if [ -n "${functionPrototypes}" ]; then
|
||||
echo '<P>Functions defined:</P>'
|
||||
echo '<P><UL>'
|
||||
echo "$FUNCDEFS" \
|
||||
| sed 's|^.*$|<A HREF="#func-\0---'"$FILE"'">\0</A>|' \
|
||||
echo "${functionPrototypes}" \
|
||||
| sed 's|^.*$|<A HREF="#func-\0---'"${sourceFile}"'">\0</A>|' \
|
||||
| sed 's/^/<LI><CODE CLASS="funcname">/;s|$|</CODE></LI>|'
|
||||
echo '</UL></P>'
|
||||
fi
|
||||
@@ -101,40 +116,45 @@ done
|
||||
|
||||
echo '<H2><A NAME="funcs">Function Listing</A></H2>'
|
||||
echo '<P><UL>'
|
||||
echo "$CTAGDATA" | while read FUNC FILE LINENUM REST; do
|
||||
echo -n '<LI><CODE CLASS="funcname">'
|
||||
echo -n '<A HREF="#func-'"$FUNC"'---'"$FILE"'">'"$FUNC"'</A></CODE> '
|
||||
echo '[<CODE CLASS="filename">'"$FILE"'</CODE>]</LI>'
|
||||
|
||||
echo "${ctagsOutput}" | while read -r functionName sourceFile sourceLineNo restOfLine; do
|
||||
echo '<LI><CODE CLASS="funcname"><A' \
|
||||
'HREF="#func-'"${functionName}"'---'"${sourceFile}"'">'"${functionName}"'</A></CODE>' \
|
||||
'[<CODE CLASS="filename">'"${sourceFile}"'</CODE>]</LI>'
|
||||
done
|
||||
echo '</UL></P>'
|
||||
|
||||
echo "$CTAGDATA" | while read FUNC FILE LINENUM REST; do
|
||||
# shellcheck disable=SC2034
|
||||
echo "${ctagsOutput}" | while read -r functionName sourceFile sourceLineNo restOfLine; do
|
||||
|
||||
FUNCDEF=`sed -n "$LINENUM,/{/p" < $FILE \
|
||||
| tr '\n' ' ' \
|
||||
| tr -d '{'`
|
||||
functionPrototype=$(
|
||||
sed -n "${sourceLineNo},/{/p" < "${sourceFile}" \
|
||||
| tr '\n' ' ' \
|
||||
| tr -d '{'
|
||||
)
|
||||
|
||||
LASTCOMLINE=`sed -n '1,'"$LINENUM"'{/\/\*/=;}' < $FILE | sed -n '$p'`
|
||||
[ -z "$LASTCOMLINE" ] && LASTCOMLINE=1
|
||||
LASTENDFUNCLINE=`sed -n '1,'"$LINENUM"'{/}/=;}' < $FILE | sed -n '$p'`
|
||||
[ -z "$LASTENDFUNCLINE" ] && LASTENDFUNCLINE=1
|
||||
FUNCHEAD="`sed -n -e \
|
||||
"$LASTCOMLINE,"'/\*\//{h;s/^[\/ *]//;s/^\*[\/]*//;p;x;/\*\//q;}' \
|
||||
< $FILE`"
|
||||
[ "$LASTCOMLINE" -le "$LASTENDFUNCLINE" ] && FUNCHEAD=""
|
||||
lastCommentOpenLineNo=$(sed -n '1,'"${sourceLineNo}"'{/\/\*/=;}' < "${sourceFile}" | sed -n '$p')
|
||||
test -n "${lastCommentOpenLineNo}" || lastCommentOpenLineNo=1
|
||||
lastCommentCloseLineNo=$(sed -n '1,'"${sourceLineNo}"'{/}/=;}' < "${sourceFile}" | sed -n '$p')
|
||||
test -n "${lastCommentCloseLineNo}" || lastCommentCloseLineNo=1
|
||||
functionHeaderComment=$(
|
||||
sed -n -e \
|
||||
"${lastCommentOpenLineNo},"'/\*\//{h;s/^[\/ *]//;s/^\*[\/]*//;p;x;/\*\//q;}' \
|
||||
< "${sourceFile}"
|
||||
)
|
||||
test "${lastCommentOpenLineNo}" -le "${lastCommentCloseLineNo}" && functionHeaderComment=""
|
||||
|
||||
echo '<P><HR WIDTH="100%"></P>'
|
||||
echo '<P ALIGN="LEFT">'
|
||||
echo -n '<CODE CLASS="funcname"><A NAME="func-'"$FUNC"'---'"$FILE"'">'
|
||||
echo -n "$FUNC"'</A></CODE> '
|
||||
echo -n '[<CODE CLASS="filename"><A HREF="#file-'"$FILE"'">'
|
||||
echo "$FILE"'</A></CODE>]'
|
||||
echo '<CODE CLASS="funcname"><A' \
|
||||
'NAME="func-'"${functionName}"'---'"${sourceFile}"'">'"${functionName}"'</A></CODE>' \
|
||||
'[<CODE CLASS="filename"><A HREF="#file-'"${sourceFile}"'">'"${sourceFile}"'</A></CODE>]'
|
||||
echo '</P>'
|
||||
|
||||
echo '<P><CODE CLASS="funcdef">'"`html_safe "$FUNCDEF"`"'</CODE></P>'
|
||||
echo '<P><CODE CLASS="funcdef">'"$(html_safe "${functionPrototype}")"'</CODE></P>'
|
||||
|
||||
echo '<P><BLOCKQUOTE>'
|
||||
echo "`html_safebr "$FUNCHEAD"`"
|
||||
html_safebr "${functionHeaderComment}"
|
||||
echo '</BLOCKQUOTE></P>'
|
||||
|
||||
echo '<P ALIGN="RIGHT"><SMALL CLASS="navbar">['
|
||||
@@ -145,22 +165,22 @@ done
|
||||
|
||||
echo '<H2><A NAME="todo">To Do Listing</A></H2>'
|
||||
echo '<P><UL>'
|
||||
for FILE in $FILELIST; do
|
||||
for sourceFile in ${sourceFiles}; do
|
||||
|
||||
TODOLINES=`sed -n \
|
||||
todoLineNumbers=$(sed -n \
|
||||
-e '/\/\*.*\*\//!{/\/\*/,/\*\//{/TODO:/{=;};};}' \
|
||||
-e '/\/\*.*\*\//{/TODO:/{=;};}' \
|
||||
< $FILE`
|
||||
< "${sourceFile}")
|
||||
|
||||
[ -z "$TODOLINES" ] && continue
|
||||
test -n "${todoLineNumbers}" || continue
|
||||
|
||||
echo -n '<LI><CODE CLASS="filename">'
|
||||
echo '<A HREF="#file-'"$FILE"'">'"$FILE"'</A></CODE>'
|
||||
echo '<LI><CODE CLASS="filename"><A' \
|
||||
'HREF="#file-'"${sourceFile}"'">'"${sourceFile}"'</A></CODE>'
|
||||
echo '<UL>'
|
||||
|
||||
for NUM in $TODOLINES; do
|
||||
TODO=`sed -n "$NUM"'{s/^.*TODO://;s/\*\/.*$//;p;}' < $FILE`
|
||||
echo "<LI>[<B>$NUM</B>] `html_safe "$TODO"`</LI>"
|
||||
for todoLineNo in ${todoLineNumbers}; do
|
||||
todoNote=$(sed -n "${todoLineNo}"'{s/^.*TODO://;s/\*\/.*$//;p;}' < "${sourceFile}")
|
||||
echo "<LI>[<B>${todoLineNo}</B>] $(html_safe "${todoNote}")</LI>"
|
||||
done
|
||||
|
||||
echo '</UL></LI>'
|
||||
|
||||
Executable
+541
@@ -0,0 +1,541 @@
|
||||
#!/bin/sh
|
||||
# install - install a program, script, or datafile
|
||||
|
||||
scriptversion=2020-11-14.01; # UTC
|
||||
|
||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||
# following copyright and license.
|
||||
#
|
||||
# Copyright (C) 1994 X Consortium
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to
|
||||
# deal in the Software without restriction, including without limitation the
|
||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
# sell copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
# Except as contained in this notice, the name of the X Consortium shall not
|
||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||
# ings in this Software without prior written authorization from the X Consor-
|
||||
# tium.
|
||||
#
|
||||
#
|
||||
# FSF changes to this file are in the public domain.
|
||||
#
|
||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||
# 'make' implicit rules from creating a file called install from it
|
||||
# when there is no Makefile.
|
||||
#
|
||||
# This script is compatible with the BSD install script, but was written
|
||||
# from scratch.
|
||||
|
||||
tab=' '
|
||||
nl='
|
||||
'
|
||||
IFS=" $tab$nl"
|
||||
|
||||
# Set DOITPROG to "echo" to test this script.
|
||||
|
||||
doit=${DOITPROG-}
|
||||
doit_exec=${doit:-exec}
|
||||
|
||||
# Put in absolute file names if you don't have them in your path;
|
||||
# or use environment vars.
|
||||
|
||||
chgrpprog=${CHGRPPROG-chgrp}
|
||||
chmodprog=${CHMODPROG-chmod}
|
||||
chownprog=${CHOWNPROG-chown}
|
||||
cmpprog=${CMPPROG-cmp}
|
||||
cpprog=${CPPROG-cp}
|
||||
mkdirprog=${MKDIRPROG-mkdir}
|
||||
mvprog=${MVPROG-mv}
|
||||
rmprog=${RMPROG-rm}
|
||||
stripprog=${STRIPPROG-strip}
|
||||
|
||||
posix_mkdir=
|
||||
|
||||
# Desired mode of installed file.
|
||||
mode=0755
|
||||
|
||||
# Create dirs (including intermediate dirs) using mode 755.
|
||||
# This is like GNU 'install' as of coreutils 8.32 (2020).
|
||||
mkdir_umask=22
|
||||
|
||||
backupsuffix=
|
||||
chgrpcmd=
|
||||
chmodcmd=$chmodprog
|
||||
chowncmd=
|
||||
mvcmd=$mvprog
|
||||
rmcmd="$rmprog -f"
|
||||
stripcmd=
|
||||
|
||||
src=
|
||||
dst=
|
||||
dir_arg=
|
||||
dst_arg=
|
||||
|
||||
copy_on_change=false
|
||||
is_target_a_directory=possibly
|
||||
|
||||
usage="\
|
||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||
or: $0 [OPTION]... -d DIRECTORIES...
|
||||
|
||||
In the 1st form, copy SRCFILE to DSTFILE.
|
||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||
In the 4th, create DIRECTORIES.
|
||||
|
||||
Options:
|
||||
--help display this help and exit.
|
||||
--version display version info and exit.
|
||||
|
||||
-c (ignored)
|
||||
-C install only if different (preserve data modification time)
|
||||
-d create directories instead of installing files.
|
||||
-g GROUP $chgrpprog installed files to GROUP.
|
||||
-m MODE $chmodprog installed files to MODE.
|
||||
-o USER $chownprog installed files to USER.
|
||||
-p pass -p to $cpprog.
|
||||
-s $stripprog installed files.
|
||||
-S SUFFIX attempt to back up existing files, with suffix SUFFIX.
|
||||
-t DIRECTORY install into DIRECTORY.
|
||||
-T report an error if DSTFILE is a directory.
|
||||
|
||||
Environment variables override the default commands:
|
||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||
RMPROG STRIPPROG
|
||||
|
||||
By default, rm is invoked with -f; when overridden with RMPROG,
|
||||
it's up to you to specify -f if you want it.
|
||||
|
||||
If -S is not specified, no backups are attempted.
|
||||
|
||||
Email bug reports to bug-automake@gnu.org.
|
||||
Automake home page: https://www.gnu.org/software/automake/
|
||||
"
|
||||
|
||||
while test $# -ne 0; do
|
||||
case $1 in
|
||||
-c) ;;
|
||||
|
||||
-C) copy_on_change=true;;
|
||||
|
||||
-d) dir_arg=true;;
|
||||
|
||||
-g) chgrpcmd="$chgrpprog $2"
|
||||
shift;;
|
||||
|
||||
--help) echo "$usage"; exit $?;;
|
||||
|
||||
-m) mode=$2
|
||||
case $mode in
|
||||
*' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
|
||||
echo "$0: invalid mode: $mode" >&2
|
||||
exit 1;;
|
||||
esac
|
||||
shift;;
|
||||
|
||||
-o) chowncmd="$chownprog $2"
|
||||
shift;;
|
||||
|
||||
-p) cpprog="$cpprog -p";;
|
||||
|
||||
-s) stripcmd=$stripprog;;
|
||||
|
||||
-S) backupsuffix="$2"
|
||||
shift;;
|
||||
|
||||
-t)
|
||||
is_target_a_directory=always
|
||||
dst_arg=$2
|
||||
# Protect names problematic for 'test' and other utilities.
|
||||
case $dst_arg in
|
||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||
esac
|
||||
shift;;
|
||||
|
||||
-T) is_target_a_directory=never;;
|
||||
|
||||
--version) echo "$0 $scriptversion"; exit $?;;
|
||||
|
||||
--) shift
|
||||
break;;
|
||||
|
||||
-*) echo "$0: invalid option: $1" >&2
|
||||
exit 1;;
|
||||
|
||||
*) break;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# We allow the use of options -d and -T together, by making -d
|
||||
# take the precedence; this is for compatibility with GNU install.
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
if test -n "$dst_arg"; then
|
||||
echo "$0: target directory not allowed when installing a directory." >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||
# When -d is used, all remaining arguments are directories to create.
|
||||
# When -t is used, the destination is already specified.
|
||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||
for arg
|
||||
do
|
||||
if test -n "$dst_arg"; then
|
||||
# $@ is not empty: it contains at least $arg.
|
||||
set fnord "$@" "$dst_arg"
|
||||
shift # fnord
|
||||
fi
|
||||
shift # arg
|
||||
dst_arg=$arg
|
||||
# Protect names problematic for 'test' and other utilities.
|
||||
case $dst_arg in
|
||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
if test $# -eq 0; then
|
||||
if test -z "$dir_arg"; then
|
||||
echo "$0: no input file specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
# It's OK to call 'install-sh -d' without argument.
|
||||
# This can happen when creating conditional directories.
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if test -z "$dir_arg"; then
|
||||
if test $# -gt 1 || test "$is_target_a_directory" = always; then
|
||||
if test ! -d "$dst_arg"; then
|
||||
echo "$0: $dst_arg: Is not a directory." >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test -z "$dir_arg"; then
|
||||
do_exit='(exit $ret); exit $ret'
|
||||
trap "ret=129; $do_exit" 1
|
||||
trap "ret=130; $do_exit" 2
|
||||
trap "ret=141; $do_exit" 13
|
||||
trap "ret=143; $do_exit" 15
|
||||
|
||||
# Set umask so as not to create temps with too-generous modes.
|
||||
# However, 'strip' requires both read and write access to temps.
|
||||
case $mode in
|
||||
# Optimize common cases.
|
||||
*644) cp_umask=133;;
|
||||
*755) cp_umask=22;;
|
||||
|
||||
*[0-7])
|
||||
if test -z "$stripcmd"; then
|
||||
u_plus_rw=
|
||||
else
|
||||
u_plus_rw='% 200'
|
||||
fi
|
||||
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
||||
*)
|
||||
if test -z "$stripcmd"; then
|
||||
u_plus_rw=
|
||||
else
|
||||
u_plus_rw=,u+rw
|
||||
fi
|
||||
cp_umask=$mode$u_plus_rw;;
|
||||
esac
|
||||
fi
|
||||
|
||||
for src
|
||||
do
|
||||
# Protect names problematic for 'test' and other utilities.
|
||||
case $src in
|
||||
-* | [=\(\)!]) src=./$src;;
|
||||
esac
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
dst=$src
|
||||
dstdir=$dst
|
||||
test -d "$dstdir"
|
||||
dstdir_status=$?
|
||||
# Don't chown directories that already exist.
|
||||
if test $dstdir_status = 0; then
|
||||
chowncmd=""
|
||||
fi
|
||||
else
|
||||
|
||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||
# might cause directories to be created, which would be especially bad
|
||||
# if $src (and thus $dsttmp) contains '*'.
|
||||
if test ! -f "$src" && test ! -d "$src"; then
|
||||
echo "$0: $src does not exist." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -z "$dst_arg"; then
|
||||
echo "$0: no destination specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
dst=$dst_arg
|
||||
|
||||
# If destination is a directory, append the input filename.
|
||||
if test -d "$dst"; then
|
||||
if test "$is_target_a_directory" = never; then
|
||||
echo "$0: $dst_arg: Is a directory" >&2
|
||||
exit 1
|
||||
fi
|
||||
dstdir=$dst
|
||||
dstbase=`basename "$src"`
|
||||
case $dst in
|
||||
*/) dst=$dst$dstbase;;
|
||||
*) dst=$dst/$dstbase;;
|
||||
esac
|
||||
dstdir_status=0
|
||||
else
|
||||
dstdir=`dirname "$dst"`
|
||||
test -d "$dstdir"
|
||||
dstdir_status=$?
|
||||
fi
|
||||
fi
|
||||
|
||||
case $dstdir in
|
||||
*/) dstdirslash=$dstdir;;
|
||||
*) dstdirslash=$dstdir/;;
|
||||
esac
|
||||
|
||||
obsolete_mkdir_used=false
|
||||
|
||||
if test $dstdir_status != 0; then
|
||||
case $posix_mkdir in
|
||||
'')
|
||||
# With -d, create the new directory with the user-specified mode.
|
||||
# Otherwise, rely on $mkdir_umask.
|
||||
if test -n "$dir_arg"; then
|
||||
mkdir_mode=-m$mode
|
||||
else
|
||||
mkdir_mode=
|
||||
fi
|
||||
|
||||
posix_mkdir=false
|
||||
# The $RANDOM variable is not portable (e.g., dash). Use it
|
||||
# here however when possible just to lower collision chance.
|
||||
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||
|
||||
trap '
|
||||
ret=$?
|
||||
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
|
||||
exit $ret
|
||||
' 0
|
||||
|
||||
# Because "mkdir -p" follows existing symlinks and we likely work
|
||||
# directly in world-writeable /tmp, make sure that the '$tmpdir'
|
||||
# directory is successfully created first before we actually test
|
||||
# 'mkdir -p'.
|
||||
if (umask $mkdir_umask &&
|
||||
$mkdirprog $mkdir_mode "$tmpdir" &&
|
||||
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
|
||||
then
|
||||
if test -z "$dir_arg" || {
|
||||
# Check for POSIX incompatibilities with -m.
|
||||
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||
# other-writable bit of parent directory when it shouldn't.
|
||||
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||
test_tmpdir="$tmpdir/a"
|
||||
ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
|
||||
case $ls_ld_tmpdir in
|
||||
d????-?r-*) different_mode=700;;
|
||||
d????-?--*) different_mode=755;;
|
||||
*) false;;
|
||||
esac &&
|
||||
$mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
|
||||
ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
|
||||
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||
}
|
||||
}
|
||||
then posix_mkdir=:
|
||||
fi
|
||||
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
|
||||
else
|
||||
# Remove any dirs left behind by ancient mkdir implementations.
|
||||
rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
|
||||
fi
|
||||
trap '' 0;;
|
||||
esac
|
||||
|
||||
if
|
||||
$posix_mkdir && (
|
||||
umask $mkdir_umask &&
|
||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
||||
)
|
||||
then :
|
||||
else
|
||||
|
||||
# mkdir does not conform to POSIX,
|
||||
# or it failed possibly due to a race condition. Create the
|
||||
# directory the slow way, step by step, checking for races as we go.
|
||||
|
||||
case $dstdir in
|
||||
/*) prefix='/';;
|
||||
[-=\(\)!]*) prefix='./';;
|
||||
*) prefix='';;
|
||||
esac
|
||||
|
||||
oIFS=$IFS
|
||||
IFS=/
|
||||
set -f
|
||||
set fnord $dstdir
|
||||
shift
|
||||
set +f
|
||||
IFS=$oIFS
|
||||
|
||||
prefixes=
|
||||
|
||||
for d
|
||||
do
|
||||
test X"$d" = X && continue
|
||||
|
||||
prefix=$prefix$d
|
||||
if test -d "$prefix"; then
|
||||
prefixes=
|
||||
else
|
||||
if $posix_mkdir; then
|
||||
(umask $mkdir_umask &&
|
||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
||||
# Don't fail if two instances are running concurrently.
|
||||
test -d "$prefix" || exit 1
|
||||
else
|
||||
case $prefix in
|
||||
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
||||
*) qprefix=$prefix;;
|
||||
esac
|
||||
prefixes="$prefixes '$qprefix'"
|
||||
fi
|
||||
fi
|
||||
prefix=$prefix/
|
||||
done
|
||||
|
||||
if test -n "$prefixes"; then
|
||||
# Don't fail if two instances are running concurrently.
|
||||
(umask $mkdir_umask &&
|
||||
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
||||
test -d "$dstdir" || exit 1
|
||||
obsolete_mkdir_used=true
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
||||
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
||||
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
||||
else
|
||||
|
||||
# Make a couple of temp file names in the proper directory.
|
||||
dsttmp=${dstdirslash}_inst.$$_
|
||||
rmtmp=${dstdirslash}_rm.$$_
|
||||
|
||||
# Trap to clean up those temp files at exit.
|
||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||
|
||||
# Copy the file name to the temp name.
|
||||
(umask $cp_umask &&
|
||||
{ test -z "$stripcmd" || {
|
||||
# Create $dsttmp read-write so that cp doesn't create it read-only,
|
||||
# which would cause strip to fail.
|
||||
if test -z "$doit"; then
|
||||
: >"$dsttmp" # No need to fork-exec 'touch'.
|
||||
else
|
||||
$doit touch "$dsttmp"
|
||||
fi
|
||||
}
|
||||
} &&
|
||||
$doit_exec $cpprog "$src" "$dsttmp") &&
|
||||
|
||||
# and set any options; do chmod last to preserve setuid bits.
|
||||
#
|
||||
# If any of these fail, we abort the whole thing. If we want to
|
||||
# ignore errors from any of these, just make sure not to ignore
|
||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||
#
|
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
||||
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
||||
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
||||
|
||||
# If -C, don't bother to copy if it wouldn't change the file.
|
||||
if $copy_on_change &&
|
||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||
set -f &&
|
||||
set X $old && old=:$2:$4:$5:$6 &&
|
||||
set X $new && new=:$2:$4:$5:$6 &&
|
||||
set +f &&
|
||||
test "$old" = "$new" &&
|
||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||
then
|
||||
rm -f "$dsttmp"
|
||||
else
|
||||
# If $backupsuffix is set, and the file being installed
|
||||
# already exists, attempt a backup. Don't worry if it fails,
|
||||
# e.g., if mv doesn't support -f.
|
||||
if test -n "$backupsuffix" && test -f "$dst"; then
|
||||
$doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
|
||||
fi
|
||||
|
||||
# Rename the file to the real destination.
|
||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||
|
||||
# The rename failed, perhaps because mv can't rename something else
|
||||
# to itself, or perhaps because mv is so ancient that it does not
|
||||
# support -f.
|
||||
{
|
||||
# Now remove or move aside any old file at destination location.
|
||||
# We try this two ways since rm can't unlink itself on some
|
||||
# systems and the destination file might be busy for other
|
||||
# reasons. In this case, the final cleanup might fail but the new
|
||||
# file should still install successfully.
|
||||
{
|
||||
test ! -f "$dst" ||
|
||||
$doit $rmcmd "$dst" 2>/dev/null ||
|
||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||
{ $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
|
||||
} ||
|
||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||
(exit 1); exit 1
|
||||
}
|
||||
} &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
$doit $mvcmd "$dsttmp" "$dst"
|
||||
}
|
||||
fi || exit 1
|
||||
|
||||
trap '' 0
|
||||
fi
|
||||
done
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC0"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
@@ -1,250 +0,0 @@
|
||||
#! /bin/sh
|
||||
#
|
||||
# install - install a program, script, or datafile
|
||||
# This comes from X11R5 (mit/util/scripts/install.sh).
|
||||
#
|
||||
# Copyright 1991 by the Massachusetts Institute of Technology
|
||||
#
|
||||
# Permission to use, copy, modify, distribute, and sell this software and its
|
||||
# documentation for any purpose is hereby granted without fee, provided that
|
||||
# the above copyright notice appear in all copies and that both that
|
||||
# copyright notice and this permission notice appear in supporting
|
||||
# documentation, and that the name of M.I.T. not be used in advertising or
|
||||
# publicity pertaining to distribution of the software without specific,
|
||||
# written prior permission. M.I.T. makes no representations about the
|
||||
# suitability of this software for any purpose. It is provided "as is"
|
||||
# without express or implied warranty.
|
||||
#
|
||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||
# `make' implicit rules from creating a file called install from it
|
||||
# when there is no Makefile.
|
||||
#
|
||||
# This script is compatible with the BSD install script, but was written
|
||||
# from scratch. It can only install one file at a time, a restriction
|
||||
# shared with many OS's install programs.
|
||||
|
||||
|
||||
# set DOITPROG to echo to test this script
|
||||
|
||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||
doit="${DOITPROG-}"
|
||||
|
||||
|
||||
# put in absolute paths if you don't have them in your path; or use env. vars.
|
||||
|
||||
mvprog="${MVPROG-mv}"
|
||||
cpprog="${CPPROG-cp}"
|
||||
chmodprog="${CHMODPROG-chmod}"
|
||||
chownprog="${CHOWNPROG-chown}"
|
||||
chgrpprog="${CHGRPPROG-chgrp}"
|
||||
stripprog="${STRIPPROG-strip}"
|
||||
rmprog="${RMPROG-rm}"
|
||||
mkdirprog="${MKDIRPROG-mkdir}"
|
||||
|
||||
transformbasename=""
|
||||
transform_arg=""
|
||||
instcmd="$mvprog"
|
||||
chmodcmd="$chmodprog 0755"
|
||||
chowncmd=""
|
||||
chgrpcmd=""
|
||||
stripcmd=""
|
||||
rmcmd="$rmprog -f"
|
||||
mvcmd="$mvprog"
|
||||
src=""
|
||||
dst=""
|
||||
dir_arg=""
|
||||
|
||||
while [ x"$1" != x ]; do
|
||||
case $1 in
|
||||
-c) instcmd="$cpprog"
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-d) dir_arg=true
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-m) chmodcmd="$chmodprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-o) chowncmd="$chownprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-g) chgrpcmd="$chgrpprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-s) stripcmd="$stripprog"
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-t=*) transformarg=`echo $1 | sed 's/-t=//'`
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
|
||||
shift
|
||||
continue;;
|
||||
|
||||
*) if [ x"$src" = x ]
|
||||
then
|
||||
src=$1
|
||||
else
|
||||
# this colon is to work around a 386BSD /bin/sh bug
|
||||
:
|
||||
dst=$1
|
||||
fi
|
||||
shift
|
||||
continue;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ x"$src" = x ]
|
||||
then
|
||||
echo "install: no input file specified"
|
||||
exit 1
|
||||
else
|
||||
true
|
||||
fi
|
||||
|
||||
if [ x"$dir_arg" != x ]; then
|
||||
dst=$src
|
||||
src=""
|
||||
|
||||
if [ -d $dst ]; then
|
||||
instcmd=:
|
||||
else
|
||||
instcmd=mkdir
|
||||
fi
|
||||
else
|
||||
|
||||
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
|
||||
# might cause directories to be created, which would be especially bad
|
||||
# if $src (and thus $dsttmp) contains '*'.
|
||||
|
||||
if [ -f $src -o -d $src ]
|
||||
then
|
||||
true
|
||||
else
|
||||
echo "install: $src does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ x"$dst" = x ]
|
||||
then
|
||||
echo "install: no destination specified"
|
||||
exit 1
|
||||
else
|
||||
true
|
||||
fi
|
||||
|
||||
# If destination is a directory, append the input filename; if your system
|
||||
# does not like double slashes in filenames, you may need to add some logic
|
||||
|
||||
if [ -d $dst ]
|
||||
then
|
||||
dst="$dst"/`basename $src`
|
||||
else
|
||||
true
|
||||
fi
|
||||
fi
|
||||
|
||||
## this sed command emulates the dirname command
|
||||
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
|
||||
|
||||
# Make sure that the destination directory exists.
|
||||
# this part is taken from Noah Friedman's mkinstalldirs script
|
||||
|
||||
# Skip lots of stat calls in the usual case.
|
||||
if [ ! -d "$dstdir" ]; then
|
||||
defaultIFS='
|
||||
'
|
||||
IFS="${IFS-${defaultIFS}}"
|
||||
|
||||
oIFS="${IFS}"
|
||||
# Some sh's can't handle IFS=/ for some reason.
|
||||
IFS='%'
|
||||
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
|
||||
IFS="${oIFS}"
|
||||
|
||||
pathcomp=''
|
||||
|
||||
while [ $# -ne 0 ] ; do
|
||||
pathcomp="${pathcomp}${1}"
|
||||
shift
|
||||
|
||||
if [ ! -d "${pathcomp}" ] ;
|
||||
then
|
||||
$mkdirprog "${pathcomp}"
|
||||
else
|
||||
true
|
||||
fi
|
||||
|
||||
pathcomp="${pathcomp}/"
|
||||
done
|
||||
fi
|
||||
|
||||
if [ x"$dir_arg" != x ]
|
||||
then
|
||||
$doit $instcmd $dst &&
|
||||
|
||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
|
||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
|
||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
|
||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
|
||||
else
|
||||
|
||||
# If we're going to rename the final executable, determine the name now.
|
||||
|
||||
if [ x"$transformarg" = x ]
|
||||
then
|
||||
dstfile=`basename $dst`
|
||||
else
|
||||
dstfile=`basename $dst $transformbasename |
|
||||
sed $transformarg`$transformbasename
|
||||
fi
|
||||
|
||||
# don't allow the sed command to completely eliminate the filename
|
||||
|
||||
if [ x"$dstfile" = x ]
|
||||
then
|
||||
dstfile=`basename $dst`
|
||||
else
|
||||
true
|
||||
fi
|
||||
|
||||
# Make a temp file name in the proper directory.
|
||||
|
||||
dsttmp=$dstdir/#inst.$$#
|
||||
|
||||
# Move or copy the file name to the temp name
|
||||
|
||||
$doit $instcmd $src $dsttmp &&
|
||||
|
||||
trap "rm -f ${dsttmp}" 0 &&
|
||||
|
||||
# and set any options; do chmod last to preserve setuid bits
|
||||
|
||||
# If any of these fail, we abort the whole thing. If we want to
|
||||
# ignore errors from any of these, just make sure not to ignore
|
||||
# errors from the above "$doit $instcmd $src $dsttmp" command.
|
||||
|
||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
|
||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
|
||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
|
||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
|
||||
$doit $rmcmd -f $dstdir/$dstfile &&
|
||||
$doit $mvcmd $dsttmp $dstdir/$dstfile
|
||||
|
||||
fi &&
|
||||
|
||||
|
||||
exit 0
|
||||
@@ -1,8 +1,9 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Generate Makefile dependencies inclusion and module target file "depend.mk~"
|
||||
# by scanning the directory "src" for files ending in ".c" and ".d", and for
|
||||
# subdirectories not starting with "_".
|
||||
# Generate Makefile components "filelist.mk~" (list source, object, and
|
||||
# dependency files) and "modules.mk~" (linking rules for each directory's
|
||||
# overall object file) by scanning the directory "src" for files ending in
|
||||
# ".c", and for subdirectories not starting with "_".
|
||||
#
|
||||
# Modules live inside subdirectories called [^_]* - i.e. a directory "foo" will
|
||||
# have a rule created which links all code inside it to "foo.o".
|
||||
@@ -11,103 +12,114 @@
|
||||
# directories.
|
||||
#
|
||||
|
||||
outlist=$1
|
||||
outlink=$2
|
||||
listingsFile="$1"
|
||||
linkingRulesFile="$2"
|
||||
|
||||
FIND=find
|
||||
GREP=grep
|
||||
which gfind 2>/dev/null | grep /gfind >/dev/null && FIND=gfind
|
||||
which ggrep 2>/dev/null | grep /ggrep >/dev/null && GREP=ggrep
|
||||
FIND="find"
|
||||
GREP="grep"
|
||||
command -v gfind 2>/dev/null | grep /gfind >/dev/null && FIND="gfind"
|
||||
command -v which ggrep 2>/dev/null | grep /ggrep >/dev/null && GREP="ggrep"
|
||||
|
||||
echo '# Automatically generated file listings' > $outlist
|
||||
echo '#' >> $outlist
|
||||
echo "# Creation time: `date`" >> $outlist
|
||||
echo >> $outlist
|
||||
{
|
||||
echo '# Automatically generated file listings'
|
||||
echo '#'
|
||||
echo "# Creation time: $(date)"
|
||||
echo
|
||||
} > "${listingsFile}"
|
||||
|
||||
echo '# Automatically generated module linking rules' > $outlink
|
||||
echo '#' >> $outlink
|
||||
echo "# Creation time: `date`" >> $outlink
|
||||
echo >> $outlink
|
||||
{
|
||||
echo '# Automatically generated module linking rules'
|
||||
echo '#'
|
||||
echo "# Creation time: $(date)"
|
||||
echo
|
||||
} > "${linkingRulesFile}"
|
||||
|
||||
echo -n "Scanning for source files: "
|
||||
printf "%s" "Scanning for source files: "
|
||||
|
||||
allsrc=`$FIND src -type f -name "*.c" -print`
|
||||
allobj=`echo $allsrc | tr ' ' '\n' | sed 's/\.c$/.o/'`
|
||||
alldep=`echo $allsrc | tr ' ' '\n' | sed 's/\.c$/.d/'`
|
||||
allsrc=$("${FIND}" src -type f -name "*.c" -print)
|
||||
allobj=$(echo "${allsrc}" | tr ' ' '\n' | sed 's/\.c$/.o/')
|
||||
alldep=$(echo "${allsrc}" | tr ' ' '\n' | sed 's/\.c$/.d/')
|
||||
|
||||
echo `echo $allsrc | wc -w | tr -d ' '` found
|
||||
echo "$(echo "${allsrc}" | wc -w | tr -d ' ') found"
|
||||
|
||||
echo -n "Scanning for modules: "
|
||||
printf "%s" "Scanning for modules: "
|
||||
|
||||
modules=`$FIND src -type d -print \
|
||||
| $GREP -v '^src$' \
|
||||
| $GREP -v '/_' \
|
||||
| $GREP -v '^src/include' \
|
||||
| $GREP -v 'CVS' \
|
||||
| $GREP -v '.svn' \
|
||||
| while read DIR; do \
|
||||
CONTENT=\$(/bin/ls -d \$DIR/* \
|
||||
| $GREP -v '.po$' \
|
||||
| $GREP -v '.gmo$' \
|
||||
| $GREP -v '.mo$' \
|
||||
| $GREP -v '.h$' \
|
||||
modules=$("${FIND}" src -type d -print \
|
||||
| "${GREP}" -v '^src$' \
|
||||
| "${GREP}" -v '/_' \
|
||||
| "${GREP}" -v '^src/include' \
|
||||
| "${GREP}" -v 'CVS' \
|
||||
| "${GREP}" -v '.svn' \
|
||||
| while read -r DIR; do \
|
||||
CONTENT=$(/bin/ls -d "${DIR}"/* \
|
||||
| "${GREP}" -v '.po$' \
|
||||
| "${GREP}" -v '.gmo$' \
|
||||
| "${GREP}" -v '.mo$' \
|
||||
| "${GREP}" -v '.h$' \
|
||||
| sed -n '$p'); \
|
||||
[ -n "\$CONTENT" ] || continue; \
|
||||
echo \$DIR; \
|
||||
[ -n "$CONTENT" ] || continue; \
|
||||
echo "${DIR}"; \
|
||||
done
|
||||
`
|
||||
)
|
||||
|
||||
echo up to `echo $modules | wc -w | tr -d ' '` found
|
||||
echo "up to $(echo "${modules}" | wc -w | tr -d ' ') found"
|
||||
|
||||
echo "Writing module linking rules"
|
||||
|
||||
echo -n [
|
||||
for i in $modules; do echo -n ' '; done
|
||||
echo -n -e ']\r['
|
||||
printf "%s" "["
|
||||
for i in ${modules}; do printf "%s" " "; done
|
||||
printf "%s\r%s" "]" "["
|
||||
|
||||
for i in $modules; do
|
||||
echo -n '.'
|
||||
allobj="$allobj $i.o"
|
||||
for i in ${modules}; do
|
||||
printf "%s" "."
|
||||
allobj="${allobj} ${i}.o"
|
||||
deps=""
|
||||
for j in $i/*.c; do
|
||||
[ -f $j ] || continue
|
||||
newobj=`echo $j | sed -e 's@\.c$@.o@'`
|
||||
for j in "${i}"/*.c; do
|
||||
[ -f "$j" ] || continue
|
||||
newobj=$(echo "$j" | sed -e 's@\.c$@.o@')
|
||||
deps="$deps $newobj"
|
||||
done
|
||||
for j in $i/*; do
|
||||
for j in "${i}"/*; do
|
||||
[ -d "$j" ] || continue
|
||||
[ `basename $j` = "CVS" ] && continue
|
||||
[ `basename $j` = ".svn" ] && continue
|
||||
CONTENT=`/bin/ls -d $j/* \
|
||||
| $GREP -v '.po$' \
|
||||
| $GREP -v '.gmo$' \
|
||||
| $GREP -v '.mo$' \
|
||||
| $GREP -v '.h$' \
|
||||
| sed -n '$p'`
|
||||
[ "$(basename "$j")" = "CVS" ] && continue
|
||||
[ "$(basename "$j")" = ".svn" ] && continue
|
||||
CONTENT=$(/bin/ls -d "$j"/* \
|
||||
| "${GREP}" -v '.po$' \
|
||||
| "${GREP}" -v '.gmo$' \
|
||||
| "${GREP}" -v '.mo$' \
|
||||
| "${GREP}" -v '.h$' \
|
||||
| sed -n '$p')
|
||||
[ -n "$CONTENT" ] || continue
|
||||
deps="$deps $j.o"
|
||||
done
|
||||
[ -n "$deps" ] || continue
|
||||
echo "$i.o: $deps" >> $outlink
|
||||
echo ' $(LD) $(LDFLAGS) -o $@' "$deps" >> $outlink
|
||||
echo >> $outlink
|
||||
{
|
||||
echo "$i.o: $deps"
|
||||
echo " \$(LD) \$(LDFLAGS) -o \$@ $deps"
|
||||
echo
|
||||
} >> "${linkingRulesFile}"
|
||||
done
|
||||
|
||||
echo ']'
|
||||
|
||||
echo "Listing source, object and dependency files"
|
||||
|
||||
echo -n "allsrc = " >> $outlist
|
||||
echo $allsrc | sed 's,src/nls/cat-id-tbl.c,,' | sed -e 's/ / \\!/g'\
|
||||
| tr '!' '\n' >> $outlist
|
||||
echo >> $outlist
|
||||
echo -n "allobj = " >> $outlist
|
||||
echo $allobj | sed -e 's/ / \\!/g' | tr '!' '\n' >> $outlist
|
||||
echo >> $outlist
|
||||
echo -n "alldep = " >> $outlist
|
||||
echo $alldep | sed -e 's/ / \\!/g' | tr '!' '\n' >> $outlist
|
||||
{
|
||||
printf "%s" "allsrc = "
|
||||
echo "$allsrc" | tr '\n' ' ' | sed 's,src/nls/cat-id-tbl.c,,' | sed -e 's/ $//;s/ / \\!/g' \
|
||||
| tr '!' '\n'
|
||||
echo
|
||||
echo
|
||||
printf "%s" "allobj = "
|
||||
echo "$allobj" | tr '\n' ' ' | sed -e 's/ $//;s/ / \\!/g' | tr '!' '\n'
|
||||
echo
|
||||
echo
|
||||
printf "%s" "alldep = "
|
||||
echo "$alldep" | tr '\n' ' ' | sed -e 's/ $//;s/ / \\!/g' | tr '!' '\n'
|
||||
echo
|
||||
echo
|
||||
} >> "${listingsFile}"
|
||||
|
||||
echo >> $outlist
|
||||
echo >> $outlink
|
||||
echo >> "${linkingRulesFile}"
|
||||
|
||||
# EOF
|
||||
|
||||
@@ -8,9 +8,7 @@ cat <<EOF
|
||||
* Translation table - automatically generated by po2table.sh.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
struct msgtable_s {
|
||||
@@ -26,8 +24,8 @@ struct msgtable_s *minigettext__gettable(char *lang)
|
||||
|
||||
EOF
|
||||
|
||||
for POFILE in $*; do
|
||||
LANG=`basename "$POFILE" | sed 's/.po$//'`
|
||||
for POFILE in "$@"; do
|
||||
LANG=$(basename "$POFILE" | sed 's/.po$//')
|
||||
echo " if (strncmp(lang, \"$LANG\", 2) == 0) {"
|
||||
echo " static struct msgtable_s data[] = {";
|
||||
|
||||
|
||||
+195
-30
@@ -1,45 +1,210 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Run a test. Parameters are program name and source directory; if
|
||||
# additional parameters are given, they are the tests to run, otherwise all
|
||||
# tests are run.
|
||||
# Parameters: testSubject sourcePath [testScript...]
|
||||
#
|
||||
# Run one or more test scripts. The ${testSubject} is the path of the test
|
||||
# subject program, and the ${sourcePath} is the path to the top level of the
|
||||
# source directory. If any ${testScript} parameters are given, they are the
|
||||
# tests to run (each one being either the full path to a script, or the base
|
||||
# filename of the script in the test directory). If no test scripts are
|
||||
# listed, then all tests directly under "${sourcePath}/tests/" are run.
|
||||
#
|
||||
# Test scripts should be written to exit 0 if the test passed, 2 if the test
|
||||
# is to be skipped, or any other exit status to indicate failure. They are
|
||||
# run via "sh -e", so any command exiting non-zero will cause the test
|
||||
# script to exit early.
|
||||
#
|
||||
# The test scripts can rely on the environment variables "testSubject",
|
||||
# "sourcePath", "workFile1", "workFile2", "workFile3", and "workFile4" being
|
||||
# populated, and should use those work files - which will be present and
|
||||
# empty - for scratch space. They should not delete those files.
|
||||
#
|
||||
# When the test scripts are called, LANG and LC_ALL are set to "C".
|
||||
#
|
||||
# Anything output by a test script on stdout or stderr is captured and shown
|
||||
# after the "OK" / "FAILED" / "skipped" result description.
|
||||
#
|
||||
# The exit status of this script will be 1 if any test failed, 0 otherwise.
|
||||
# A skipped test is not counted as a failure.
|
||||
#
|
||||
|
||||
PROG="$1"
|
||||
SRCDIR="$2"
|
||||
# Parameters.
|
||||
testSubject="$1"
|
||||
sourcePath="$2"
|
||||
shift
|
||||
shift
|
||||
TESTS="$*"
|
||||
selectedTests="$*"
|
||||
|
||||
# Temporary working files
|
||||
# Constants.
|
||||
formatCodesPass="setaf 2;bold" # terminal capabilities for "pass" formatting
|
||||
formatCodesFail="setaf 1;bold" # terminal capabilities for "fail" formatting
|
||||
formatCodesSkip="setaf 3" # terminal capabilities for "skip" formatting
|
||||
formatCodesZero="setaf 4" # terminal capabilities for zero result
|
||||
|
||||
# Temporary working files, for the test scripts to use.
|
||||
workFile1=$(mktemp 2>/dev/null) || workFile1="./.tmp1"
|
||||
workFile2=$(mktemp 2>/dev/null) || workFile2="./.tmp2"
|
||||
workFile3=$(mktemp 2>/dev/null) || workFile3="./.tmp3"
|
||||
workFile4=$(mktemp 2>/dev/null) || workFile4="./.tmp4"
|
||||
|
||||
# Clean up the temporary files on exit, in case we are interrupted.
|
||||
trap 'rm -f "${workFile1}" "${workFile2}" "${workFile3}" "${workFile4}"' EXIT
|
||||
|
||||
# Variables used by the test scripts.
|
||||
export testSubject sourcePath workFile1 workFile2 workFile3 workFile4
|
||||
|
||||
# Set everything to the "C" locale.
|
||||
LANG=C
|
||||
LC_ALL=C
|
||||
export LANG LC_ALL
|
||||
|
||||
# If no tests were specified, list all test scripts under the source path.
|
||||
test -n "${selectedTests}" || selectedTests=$(find "${sourcePath}/tests" -maxdepth 1 -type f | sort -n)
|
||||
|
||||
# Initial pass to count the number of tests and find the length of the
|
||||
# longest test name, to use when formatting the output.
|
||||
#
|
||||
TMP1=`mktemp 2>/dev/null` || TMP1=.tmp1
|
||||
TMP2=`mktemp 2>/dev/null` || TMP2=.tmp2
|
||||
TMP3=`mktemp 2>/dev/null` || TMP3=.tmp3
|
||||
TMP4=`mktemp 2>/dev/null` || TMP4=.tmp4
|
||||
numberOfTests=0
|
||||
maxTestNameLength=0
|
||||
for testScript in ${selectedTests}; do
|
||||
# Find the test script, make sure it exists.
|
||||
test -f "${testScript}" || testScript="${sourcePath}/tests/${testScript}"
|
||||
test -f "${testScript}" || testScript=$(find "${sourcePath}/tests" -maxdepth 1 -type f -name "${testScript##*/}*" | sed -n '1p')
|
||||
test -f "${testScript}" || continue
|
||||
|
||||
export PROG TMP1 TMP2 TMP3 TMP4 # variables used by test scripts
|
||||
numberOfTests=$((1+numberOfTests))
|
||||
|
||||
FAIL=0
|
||||
|
||||
test -n "$TESTS" || TESTS=`ls "$SRCDIR/tests" | sort -n`
|
||||
|
||||
for SCRIPT in $TESTS; do
|
||||
test -f "$SCRIPT" || SCRIPT="$SRCDIR/tests/$SCRIPT"
|
||||
test -f "$SCRIPT" || SCRIPT=`ls "$SRCDIR/tests/$SCRIPT"*`
|
||||
test -f "$SCRIPT" || continue
|
||||
|
||||
echo `basename "$SCRIPT"`: " " | cut -b1-20 | sed 's/-/ - /' | tr "\n" ' '
|
||||
|
||||
STATUS=0
|
||||
sh -e "$SCRIPT" || STATUS=1
|
||||
test $STATUS -eq 1 && FAIL=1
|
||||
|
||||
test $STATUS -eq 1 && echo "FAILED" || echo "OK"
|
||||
testScriptLeaf="${testScript##*/}"
|
||||
testName="$(echo "${testScriptLeaf%.sh}" | tr '_' ' ' | sed 's/ - /: /')"
|
||||
testNameLength=${#testName}
|
||||
test "${testNameLength}" -gt "${maxTestNameLength}" && maxTestNameLength="${testNameLength}"
|
||||
done
|
||||
|
||||
rm -f $TMP1 $TMP2 $TMP3 $TMP4
|
||||
# Set a minimum and maximum test name length.
|
||||
test "${maxTestNameLength}" -lt 10 && maxTestNameLength=10
|
||||
test "${maxTestNameLength}" -gt 60 && maxTestNameLength=60
|
||||
|
||||
exit $FAIL
|
||||
# Count the number of digits in the number of tests so we know how wide the
|
||||
# column for the test count should be.
|
||||
testCountWidth=${#numberOfTests}
|
||||
|
||||
# Get the terminal width, for later display formatting calculations.
|
||||
#
|
||||
# We have to fiddle with `stty' because $COLUMNS is only in `bash', `resize`
|
||||
# is not available everywhere, and `stty' itself varies in its output format
|
||||
# between "columns 158" and "158 cols".
|
||||
#
|
||||
terminalWidth=80
|
||||
test -t 1 && terminalWidth=$(stty -a 2>/dev/null | tr ';' '\n' | grep -e cols -e columns | tr ' ' '\n' | grep '[0-9]' | sed -n 1p)
|
||||
test -n "${terminalWidth}" || terminalWidth=80
|
||||
|
||||
# Remaining space left on each line after the result description.
|
||||
colsUsed=$((testCountWidth + 1 + testCountWidth + 2 + maxTestNameLength + 2 + 8 + 2))
|
||||
colsRemaining=0
|
||||
test "${colsUsed}" -lt "${terminalWidth}" && colsRemaining=$((terminalWidth - colsUsed))
|
||||
|
||||
# Run all of the selected test scripts, formatting the output.
|
||||
#
|
||||
testPassCount=0
|
||||
testFailCount=0
|
||||
testSkipCount=0
|
||||
testNumber=0
|
||||
for testScript in ${selectedTests}; do
|
||||
# Find the test script, make sure it exists.
|
||||
test -f "${testScript}" || testScript="${sourcePath}/tests/${testScript}"
|
||||
test -f "${testScript}" || testScript=$(find "${sourcePath}/tests" -maxdepth 1 -type f -name "${testScript##*/}*" | sed -n '1p')
|
||||
test -f "${testScript}" || continue
|
||||
|
||||
testNumber=$((1+testNumber))
|
||||
|
||||
testScriptLeaf="${testScript##*/}"
|
||||
testName="$(echo "${testScriptLeaf%.sh}" | tr '_' ' ' | sed 's/ - /: /')"
|
||||
printf "%${testCountWidth}d/%d: %-${maxTestNameLength}.${maxTestNameLength}s " "${testNumber}" "${numberOfTests}" "${testName}"
|
||||
|
||||
# Run the test script, capturing the output and the exit status.
|
||||
testExitStatus=0
|
||||
testOutput=""
|
||||
if test -s "${testScript}"; then
|
||||
true > "${workFile1}"
|
||||
true > "${workFile2}"
|
||||
true > "${workFile3}"
|
||||
true > "${workFile4}"
|
||||
testOutput=$(sh -e "${testScript}" 2>&1)
|
||||
testExitStatus=$?
|
||||
else
|
||||
testOutput="test script has not yet been written"
|
||||
testExitStatus=2
|
||||
fi
|
||||
|
||||
# Work out what we're going to say about this test result.
|
||||
testResultDescription=""
|
||||
resultFormatCodes=""
|
||||
if test ${testExitStatus} -eq 0; then
|
||||
resultFormatCodes="${formatCodesPass}"
|
||||
testResultDescription="OK"
|
||||
testPassCount=$((1+testPassCount))
|
||||
elif test ${testExitStatus} -eq 2; then
|
||||
resultFormatCodes="${formatCodesSkip}"
|
||||
testResultDescription="skipped"
|
||||
testSkipCount=$((1+testSkipCount))
|
||||
else
|
||||
resultFormatCodes="${formatCodesFail}"
|
||||
testResultDescription="FAILED"
|
||||
testFailCount=$((1+testFailCount))
|
||||
fi
|
||||
|
||||
# If stdout is not a terminal, don't use terminal format codes.
|
||||
test -t 1 || resultFormatCodes=""
|
||||
|
||||
# Show the description of the test result, and start a new line.
|
||||
test -n "${resultFormatCodes}" && command -v tput >/dev/null 2>&1 && echo "${resultFormatCodes}" | tr ';' '\n' | tput -S 2>/dev/null
|
||||
printf "%s" "${testResultDescription}"
|
||||
|
||||
# If there was any output from the test, display it - either on the
|
||||
# current line, if there's space, or the next line, with each line
|
||||
# prefixed with the test number.
|
||||
if test -n "${testOutput}"; then
|
||||
if test "${#testOutput}" -lt "${colsRemaining}" && ! test "$(echo "${testOutput}" | wc -l | tr -dc '0-9')" -gt 1 2>/dev/null; then
|
||||
printf " - %s" "${testOutput}"
|
||||
else
|
||||
printf "\n%s" "$(echo "${testOutput}" | sed "s,^,$(printf "%${testCountWidth}d/%d: - " "${testNumber}" "${numberOfTests}"),")"
|
||||
fi
|
||||
fi
|
||||
printf "\n"
|
||||
|
||||
test -n "${resultFormatCodes}" && command -v tput >/dev/null 2>&1 && tput sgr0 2>/dev/null
|
||||
done
|
||||
|
||||
# Clean up.
|
||||
rm -f "${workFile1}" "${workFile2}" "${workFile3}" "${workFile4}"
|
||||
trap '' EXIT
|
||||
|
||||
# Report the totals.
|
||||
printf "\n"
|
||||
printf "%s: " "Tests passed"
|
||||
numberFormatting="${formatCodesPass}"
|
||||
test "${testPassCount}" -gt 0 || numberFormatting="${formatCodesZero}"
|
||||
test -t 1 && command -v tput >/dev/null 2>&1 && echo "${numberFormatting}" | tr ';' '\n' | tput -S 2>/dev/null
|
||||
printf "%d" "${testPassCount}"
|
||||
test -t 1 && command -v tput >/dev/null 2>&1 && tput sgr0 2>/dev/null
|
||||
|
||||
printf " %s: " "Tests failed"
|
||||
numberFormatting="${formatCodesFail}"
|
||||
test "${testFailCount}" -gt 0 || numberFormatting="${formatCodesZero}"
|
||||
test -t 1 && command -v tput >/dev/null 2>&1 && echo "${numberFormatting}" | tr ';' '\n' | tput -S 2>/dev/null
|
||||
printf "%d" "${testFailCount}"
|
||||
test -t 1 && command -v tput >/dev/null 2>&1 && tput sgr0 2>/dev/null
|
||||
|
||||
printf " %s: " "Tests skipped"
|
||||
numberFormatting="${formatCodesSkip}"
|
||||
test "${testSkipCount}" -gt 0 || numberFormatting="${formatCodesZero}"
|
||||
test -t 1 && command -v tput >/dev/null 2>&1 && echo "${numberFormatting}" | tr ';' '\n' | tput -S 2>/dev/null
|
||||
printf "%d" "${testSkipCount}"
|
||||
test -t 1 && command -v tput >/dev/null 2>&1 && tput sgr0 2>/dev/null
|
||||
printf "\n"
|
||||
|
||||
# Exit with status 1 if any test failed outright, 0 otherwise.
|
||||
test "${testFailCount}" -eq 0 || exit 1
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
The following people have contributed to this project, and their assistance
|
||||
is acknowledged and greatly appreciated:
|
||||
|
||||
* Antoine Beaupré <anarcat@debian.org> - Debian package maintainer
|
||||
* Kevin Coyner <kcoyner@debian.org> - previous Debian package maintainer
|
||||
* Cédric Delfosse <cedric@debian.org> - previous Debian package maintainer
|
||||
* Jakub Hrozek <jhrozek@redhat.com> - Fedora package maintainer
|
||||
* Eduardo Aguiar <eduardo.oliveira@sondabrasil.com.br> - provided Portuguese (Brazilian) translation
|
||||
* Stéphane Lacasse <stephane@gorfou.ca> - provided French translation
|
||||
* Marcos Kreinacke <public@kreinacke.com> - provided German translation
|
||||
* Bartosz Feński <fenio@o2.pl> <http://skawina.eu.org/> - provided Polish translation along with Krystian Zubel
|
||||
* Joshua Jensen - reported RPM installation bug
|
||||
* Boris Folgmann <http://www.folgmann.com/en/> - reported cursor handling bug
|
||||
* Mathias Gumz - reported NLS bug
|
||||
* Daniel Roethlisberger - submitted patch to use lockfiles for "`-c`" if terminal locking fails
|
||||
* Adam Buchbinder - lots of help with a Cygwin port of "`-c`"
|
||||
* Mark Tomich <http://metuchen.dyndns.org> - suggested "`-B`" option
|
||||
* Gert Menke - reported bug when piping to `dd` with a large input buffer size
|
||||
* Ville Herva <Ville.Herva@iki.fi> - informative bug report about rate limiting performance
|
||||
* Elias Pipping - patch to compile properly on Darwin 9; potential NULL deref report
|
||||
* Patrick Collison - similar patch for OS X
|
||||
* Boris Lohner - reported problem that "`-L`" does not complain if given non-numeric value
|
||||
* Sebastian Kayser - supplied testing for *SIGPIPE*, demonstrated internationalisation problem
|
||||
* Laszlo Ersek <http://phptest11.atw.hu/> - reported shared memory leak on *SIGINT* with "`-c`"
|
||||
* Phil Rutschman <http://bandgap.rsnsoft.com/> - provided a patch for fully restoring terminal state on exit
|
||||
* Henry Precheur <http://henry.precheur.org/> - reporting and suggestions for "`--rate-limit`" bug when rate is under 10
|
||||
* E. Rosten <http://mi.eng.cam.ac.uk/~er258/> - supplied patch for block buffering in line mode
|
||||
* Kjetil Torgrim Homme - reported compilation error with default *CFLAGS* on non-GCC compilers
|
||||
* Alexandre de Verteuil - reported bug in OS X build and supplied test environment to fix in
|
||||
* Martin Baum - supplied patch to return nonzero exit status if terminated by signal
|
||||
* Sam Nelson <http://www.siliconfuture.net/> - supplied patch to fix trailing slash on *DESTDIR*
|
||||
* Daniel Pape - reported Cygwin installation problem due to *DESTDIR*
|
||||
* Philipp Beckers - ported to the Syabas PopcornHour A-100 series
|
||||
* Henry Gebhard <hsggebhardt@googlemail.com> - supplied patches to improve SI prefixes and add "`--average-rate`"
|
||||
* Vladimir Kokarev, Alexander Leo - reported that exit status did not reflect file errors
|
||||
* Thomas Rachel - submitted patches for IEEE1541 (MiB suffixes), 1+e03 bug
|
||||
* Guillaume Marcais - submitted speedup patch for line mode
|
||||
* Moritz Barsnick - submitted patch for compile warning in size calculation
|
||||
* Pawel Piatek - submitted RPM and patches for AIX
|
||||
* Sami Liedes - submitted patch for "`--timer`" and "`--bytes`" with "`--numeric`"
|
||||
* Steven Willis - reported problem with "`-R`" killing non-PV remote processes
|
||||
* Vladimir Pal, Vladimir Ermakov - submitted patch which led to development of "`--format`" option
|
||||
* Peter Samuelson <peter@p12n.org> - submitted patch to calculate size if stdout is a block device
|
||||
* Miguel Diaz - much Cygwin help (and packaging), found narrow-terminal bug
|
||||
* Jim Salter <http://ubuntuwiki.net> - commissioned work on the "`--skip-errors`" option
|
||||
* Wouter Pronk - reported build problem on SCO
|
||||
* Bryan Dongray <http://www.dongrays.com> - provided patches for test scripts failing on older Red Hats
|
||||
* Zev Weiss <www.bewilderbeest.net> - provided patch to fix `splice()` not using stdin
|
||||
* Zing Shishak - provided patch for "`--null`" / "`-0`" (count null terminated lines)
|
||||
* Jacek Wielemborek <http://deetah.jogger.pl/kategorie/english> - implemented fdwatch in Python, suggested PV port; reported bug with "`-l`" and ETA / size; many other contributions
|
||||
* Kim Krecht - suggested buffer fill status and last bytes output display options
|
||||
* Cristian Ciupitu <http://ciupicri.github.io>, Josh Stone - pointed out file descriptor leak with helpful suggestions (Josh Stone initially noticed the missing close)
|
||||
* Jan Seda - found issue with `splice()` and *SPLICE_F_NONBLOCK* causing slowdown
|
||||
* André Stapf - pointed out formatting problem e.g. 13GB -> 13.1GB which should be shown 13.0GB -> 13.1GB; highlighted on-startup row swapping in "`-c`"
|
||||
* Damon Harper <http://www.usrbin.ca/> - suggested "`-D`" / "`--delay-start`" option
|
||||
* Ganaël Laplanche <http://www.martymac.org> - provided patch for `lstat64()` on systems that do not support it
|
||||
* Peter Korsgaard <http://www.buildroot.net/> - provided similar patch for `lstat64()`, specifically for uClibc support; provided AIX cross-compilation patch to fix bug in "`-lc128`" check
|
||||
* Ralf Ramsauer <https://blog.ramses-pyramidenbau.de/> - reported bug which dropped transfer rate on terminal resize
|
||||
* Michiel Van Herwegen - reported and discussed bug with "`-l`" and ETA / size
|
||||
* Erkki Seppälä <http://www.inside.org/~flux/> - provided patch implementing "`-I`"
|
||||
* Eric A. Borisch - provided details of compatibility fix for "`%Lu`" in watchpid code
|
||||
* Jan Venekamp - reported MacOS buffer size interactions with pipes
|
||||
* Matt <https://github.com/lemonsqueeze/pv> - provided "rate-window" patches for rate calculation
|
||||
* [Filippo Valsorda](https://github.com/FiloSottile) - provided patch for stat64 issue on Apple Silicon
|
||||
* Matt Koscica, William Dillon - also reported stat64 issue on Apple Silicon
|
||||
* [Demitri Muna](https://github.com/demitri) - assisted with stat64 patch on Apple Silicon
|
||||
* Norman Rasmussen - suggested "`-c`" with "`-d PID:FD`", reject "`-N`" with "`-d PID`"
|
||||
* Andriy Gapon, Jonathan Elchison - reported bug where "`pv /dev/zero >/dev/null &`" stops immediately
|
||||
* Marcelo Chiesa - reported unused-result warnings when compiling PV 1.6.6
|
||||
* Jered Floyd - provided patches to improve "`--rate-limit`"
|
||||
* Christoph Biedl - provided ETA and dynamic interval patches
|
||||
* Richard Fonfara - provided German translations for "`pv --help`"
|
||||
* Johannes Gerer <http://johannesgerer.com> - suggested that "`-B`" should enable "`-C`"
|
||||
* Sam James - provided fix for number.c build issue caused by missing stddef.h
|
||||
* Jakub Wilk <jwilk@jwilk.net> - corrected README encoding
|
||||
* Frederik Eaton - reported issue with `<()` shell constructs
|
||||
* [gray](https://github.com/gray) - reported issue with "`--force`" and terminal process groups, and proposed a patch
|
||||
* [Luc Gommans](https://github.com/lgommans) / https://lgms.nl/ - provided a "momentary ETA" patch
|
||||
* [ikasty](https://github.com/ikasty) - added relative filename display to "`--watchfd`"
|
||||
* [Michael Weiß](https://github.com/quitschbo) - corrected behaviour when not attached to a terminal
|
||||
* [christoph-zededa](https://github.com/christoph-zededa) - provided OS X support for "`--watchfd`"
|
||||
* [Dave Beckett](https://github.com/dajobe) - added "`@filename`" syntax to "`--size`", and corrected an autoconf problem with stat64 on OS X
|
||||
* [Volodymyr Bychkovyak](https://github.com/vbychkoviak) - provided fix for rate limit behaviour with bursty traffic
|
||||
* [Nick Black](https://nick-black.com) - added "`--bits`" option
|
||||
|
||||
---
|
||||
@@ -1,336 +0,0 @@
|
||||
1.6.19 - 5 September 2021
|
||||
- fix: starting pv in the background no longer immediately stops unless
|
||||
the transfer is to/from the terminal (Andriy Gapon, Jonathan Elchison)
|
||||
- fix: using -B, -A, or -T now switches on -C implicitly
|
||||
(Johannes Gerer, André Stapf)
|
||||
- fix: AIX build fixes (Peter Korsgaard)
|
||||
- i18n: updated German "--help" translations (Richard Fonfara)
|
||||
- i18n: switched to UTF-8 encoding, added missing translations (de,fr,pt)
|
||||
- docs: new "common switches" manual section (Jacek Wielemborek)
|
||||
- docs: use placeholder instead of /dev/sda in the manual (Pranav Peshwe)
|
||||
- docs: mention MacOS pipes and "-B 1024" in the manual (Jan Venekamp)
|
||||
- docs: correct shell in autoconf/scripts/index.sh (Juan Picca)
|
||||
- cleanup: various compiler warnings cleaned up
|
||||
|
||||
Full changelog is below:
|
||||
- (r181) added common switches section to manual (Jacek Wielemborek)
|
||||
- (r184) use placeholder instead of /dev/sda in the manual (Pranav Peshwe)
|
||||
- (r185) replace ash with sh in autoconf/scripts/index.sh (Juan Picca)
|
||||
- (r185) added note to manual about "-B 1024" in MacOS pipes (Jan Venekamp)
|
||||
- (r185) fix AIX config check when the CWD contains "yes" (Peter Korsgaard)
|
||||
- (r189) (#1556) updated German "--help" translations (Richard Fonfara)
|
||||
- (r189) updated missing German translations and changed to UTF-8 encoding
|
||||
- (r191) updated missing French translations and changed to UTF-8 encoding
|
||||
- (r193) updated missing Portuguese translations, changed to UTF-8 encoding
|
||||
- (r196) (#1563) using -B, -A, or -T now switches on -C implicitly
|
||||
(Johannes Gerer, André Stapf)
|
||||
- (r199) fixed numerous compiler warnings in newer GCC versions
|
||||
- (r200,205) fixed bug where "pv /dev/zero >/dev/null &" stopped
|
||||
immediately (Jonathan Elchison, Andriy Gapon)
|
||||
- (r203,205) marked unused arguments with GCC unused attribute, started
|
||||
using boolean data type for flags, corrected more compiler warnings
|
||||
|
||||
1.6.6 - 30 June 2017
|
||||
- (r161) use %llu instead of %Lu for better compatibility (Eric A. Borisch)
|
||||
- (r162) (#1532) fix target buffer size (-B) being ignored (AndCycle, Ilya
|
||||
Basin, Antoine Beaupré)
|
||||
- (r164) cap read/write sizes, and check elapsed time during read/write
|
||||
cycles, to avoid display hangs with large buffers or slow media; also
|
||||
remove select() call from repeated_write function as it slows the
|
||||
transfer down and the wrapping alarm() means it is unnecessary
|
||||
- (r169) (#1477) use alternate form for transfer counter, such that 13GB
|
||||
is shown as 13.0GB so it's the same width as 13.1GB (André Stapf)
|
||||
- (r171) cleanup: units corrections in man page, of the form kb -> KiB
|
||||
- (r175) report error in "-d" if process fd directory is unreadable, or if
|
||||
process disappears before we start the main loop (Jacek Wielemborek)
|
||||
|
||||
1.6.0 - 15 March 2015
|
||||
- fix lstat64 support when unavailable - separate patches supplied by
|
||||
Ganael Laplanche and Peter Korsgaard
|
||||
- (#1506) new option "-D" / "--delay-start" to only show bar after N
|
||||
seconds (Damon Harper)
|
||||
- new option "--fineta" / "-I" to show ETA as time of day rather than time
|
||||
remaining - patch supplied by Erkki Seppälä (r147)
|
||||
- (#1509) change ETA (--eta / -e) so that days are given if the hours
|
||||
remaining are 24 or more (Jacek Wielemborek)
|
||||
- (#1499) repeat read and write attempts on partial buffer fill/empty to
|
||||
work around post-signal transfer rate drop reported by Ralf Ramsauer
|
||||
- (#1507) do not try to calculate total size in line mode, due to bug
|
||||
reported by Jacek Wielemborek and Michiel Van Herwegen
|
||||
- cleanup: removed defunct RATS comments and unnecessary copyright notices
|
||||
- clean up displayed lines when using --watchfd PID, when PID exits
|
||||
- output errors on a new line to avoid overwriting transfer bar
|
||||
|
||||
1.5.7 - 26 August 2014
|
||||
- show KiB instead of incorrect kiB (Debian bug #706175)
|
||||
- (#1284) do not gzip man page, for non-Linux OSes (Bob Friesenhahn)
|
||||
- work around "awk" bug in tests/016-numeric-timer in decimal "," locales
|
||||
- fix "make rpm" and "make srpm", extend "make release" to sign releases
|
||||
|
||||
1.5.3 - 4 May 2014
|
||||
- remove SPLICE_F_NONBLOCK to fix problem with slow splice() (Jan Seda)
|
||||
|
||||
1.5.2 - 10 February 2014
|
||||
- allow "--watchfd" to look at block devices
|
||||
- let "--watchfd PID:FD" work with "--size N"
|
||||
- moved contributors out of the manual as the list was too long
|
||||
(NB everyone is still listed in the README and always will be)
|
||||
|
||||
1.5.1 - 23 January 2014
|
||||
- new option "--watchfd" - suggested by Jacek Wielemborek and "fdwatch"
|
||||
- use non-block flag with splice()
|
||||
- new display option "--buffer-percent", suggested by Kim Krecht
|
||||
- new display option "--last-written", suggested by Kim Krecht
|
||||
- new transfer option "--no-splice"
|
||||
- fix for minor bug which dropped display elements after one empty one
|
||||
- fix for single fd leak on exit (Cristian Ciupitu)
|
||||
|
||||
1.4.12 - 5 August 2013
|
||||
- new option "--null" - patch supplied by Zing Shishak
|
||||
- AIX build fix (add "-lc128") - with help from Pawel Piatek
|
||||
- AIX "-c" fixes - with help from Pawel Piatek
|
||||
- SCO build fix (po2table.sh) - reported by Wouter Pronk
|
||||
- test scripts fix for older distributions - patch from Bryan Dongray
|
||||
- fix for splice() not using stdin - patch from Zev Weiss
|
||||
|
||||
1.4.6 - 22 January 2013
|
||||
- added patch from Pawel Piatek to omit O_NOFOLLOW in AIX
|
||||
|
||||
1.4.5 - 10 January 2013
|
||||
- updated manual page to show known problem with "-R" on Cygwin
|
||||
|
||||
1.4.4 - 11 December 2012
|
||||
- added debugging, see `pv -h' when configure run with "--enable-debugging"
|
||||
- rewrote cursor positioning code used when IPC is unavailable (Cygwin)
|
||||
- fixed cursor positioning cursor read answerback problem (Cygwin/Solaris)
|
||||
- fixed bug causing crash when progress displayed with too-small terminal
|
||||
|
||||
1.4.0 - 6 December 2012
|
||||
- new option "--skip-errors" commissioned by Jim Salter
|
||||
- if stdout is a block device, and we don't know the total size, use the
|
||||
size of that block device as the total (Peter Samuelson)
|
||||
- new option "--stop-at-size" to stop after "--size" bytes
|
||||
- report correct filename on read errors
|
||||
- fix use-after-free bug in remote PID cleanup code
|
||||
- refactored large chunks of code to make it more readable and to replace
|
||||
most static variables with a state structure
|
||||
|
||||
1.3.9 - 5 November 2012
|
||||
- allow "--format" parameters to be sent with "--remote"
|
||||
- configure option "--disable-ipc"
|
||||
- added tests for --numeric with --timer and --bytes
|
||||
- added tests for --remote
|
||||
|
||||
1.3.8 - 29 October 2012
|
||||
- new "--pidfile" option to save process ID to a file
|
||||
- integrated patch for --numeric with --timer and --bytes (Sami Liedes)
|
||||
- removed signalling from --remote to prevent accidental process kills
|
||||
- new "--format" option (originally Vladimir Pal / Vladimir Ermakov)
|
||||
|
||||
1.3.4 - 27 June 2012
|
||||
- new "--disable-splice" configure script option
|
||||
- fixed line mode size count with multiple files (Moritz Barsnick)
|
||||
- fixes for AIX core dumps (Pawel Piatek)
|
||||
|
||||
1.3.1 - 9 June 2012
|
||||
- do not use splice() if the write buffer is not empty (Thomas Rachel)
|
||||
- added test 15 (pipe transfers), and new test script
|
||||
|
||||
1.3.0 - 5 June 2012
|
||||
- added Tiger build patch from Olle Jonsson
|
||||
- fix 1024-boundary display garble (Debian bug #586763)
|
||||
- use splice(2) where available (Debian bug #601683)
|
||||
- added known bugs section of the manual page
|
||||
- fixed average rate test, 12 (Andrew Macheret)
|
||||
- use IEEE1541 units (Thomas Rachel)
|
||||
- bug with rate limit under 10 fixed (Henry Precheur)
|
||||
- speed up PV line mode (patch: Guillaume Marcais)
|
||||
- remove LD=ld from vars.mk to fix cross-compilation (paintitgray/PV#1291)
|
||||
|
||||
1.2.0 - 14 December 2010
|
||||
- integrated improved SI prefixes and --average-rate (Henry Gebhardt)
|
||||
- return nonzero if exiting due to SIGTERM (Martin Baum)
|
||||
- patch from Phil Rutschman to restore terminal properly on exit
|
||||
- fix i18n especially for --help (Sebastian Kayser)
|
||||
- refactored pv_display
|
||||
- we now have a coherent, documented, exit status
|
||||
- modified pipe test and new cksum test from Sebastian Kayser
|
||||
- default CFLAGS to just "-O" for non-GCC (Kjetil Torgrim Homme)
|
||||
- LFS compile fix for OS X 10.4 (Alexandre de Verteuil)
|
||||
- remove DESTDIR / suffix (Sam Nelson, Daniel Pape)
|
||||
- fixed potential NULL deref in transfer (Elias Pipping / LLVM/Clang)
|
||||
|
||||
1.1.4 - 6 March 2008
|
||||
- patch from Elias Pipping correcting compilation failure on Darwin 9
|
||||
- patch from Patrick Collison correcting similar problems on OS X
|
||||
- trap SIGINT/SIGHUP/SIGTERM so we clean up IPCs on exit (Laszlo Ersek)
|
||||
- abort if numeric option, eg -L, has non-numeric value (Boris Lohner)
|
||||
|
||||
1.1.0 - 30 August 2007
|
||||
- new option --remote (-R) to control an already-running process
|
||||
- new option --line-mode (-l) to count lines instead of bytes
|
||||
- fix for "-L" to be less resource intensive
|
||||
- fix for input/output equivalence check on Mac OS X
|
||||
- fix for size calculation in pipelines on Mac OS X
|
||||
- fixed "make uninstall"
|
||||
- removed /debian directory at request of new Debian maintainer
|
||||
|
||||
1.0.1 - 4 August 2007
|
||||
- licensing change from Artistic to Artistic 2.0
|
||||
- removed the "-l" / "--license" option
|
||||
|
||||
1.0.0 - 2 August 2007
|
||||
- act more like "cat" - just skip unreadable files, don't abort
|
||||
- removed text version of manual page, and obsolete Info file generation
|
||||
- code cleanup and separation of PV internals from CLI front-end
|
||||
|
||||
0.9.9 - 5 February 2007
|
||||
- new option --buffer-size (-B) suggested by Mark Tomich
|
||||
- build fix: HP/UX largefile compile fix from Timo Savinen
|
||||
- maintain better buffer filling during transfers
|
||||
- workaround: pv /dev/zero | dd bs=1M count=1k bug (reported by Gert Menke)
|
||||
- dropped support for the Texinfo manual
|
||||
|
||||
0.9.6 - 27 February 2006
|
||||
- bugfix: key_t incompatibility with Cygwin
|
||||
- bugfix: interval (-i) parameter parses numbers after decimal point
|
||||
- build fix: use static NLS if msgfmt is unavailable
|
||||
- on the final update, blank out the now-zero ETA
|
||||
|
||||
0.9.2 - 1 September 2005
|
||||
- Daniel Roethlisberger patch: use lockfiles if terminal locking fails
|
||||
|
||||
0.9.1 - 16 June 2005
|
||||
- minor RPM spec file fix for Fedora Core 4
|
||||
|
||||
0.9.0 - 15 November 2004
|
||||
- minor NLS bugfix
|
||||
|
||||
0.8.9 - 6 November 2004
|
||||
- decimal values now accepted for rate and size, eg "-L 1.23M"
|
||||
- code cleanup
|
||||
- developers: "make help" now lists Makefile targets
|
||||
|
||||
0.8.6 - 29 June 2004
|
||||
- use uu_lock() for terminal locking on FreeBSD
|
||||
|
||||
0.8.5 - 2 May 2004
|
||||
- cursor positioning (-c) reliability improved on systems with IPC
|
||||
- minor fix: made test 005 more reliable
|
||||
- new option --height (-H)
|
||||
|
||||
0.8.2 - 24 April 2004
|
||||
- allow k,m,g,t suffixes on numbers
|
||||
- added "srpm" and "release" Makefile targets
|
||||
|
||||
0.8.1 - 19 April 2004
|
||||
- bugfix in cursor positioning (-c)
|
||||
|
||||
0.8.0 - 12 February 2004
|
||||
- replaced GNU getopt with my library code
|
||||
- replaced GNU gettext with my very minimal replacement
|
||||
- use DESTDIR instead of RPM_BUILD_ROOT for optional installation prefix
|
||||
- looked for flaws using RATS, cleaned up code
|
||||
|
||||
0.7.0 - 8 February 2004
|
||||
- display buffer management fixes (thanks Cédric Delfosse)
|
||||
- replaced --enable-debug with --enable-debugging and --enable-profiling
|
||||
|
||||
0.6.4 - 14 January 2004
|
||||
- fixed minor bug in RPM installation
|
||||
- bugfix in "make index" (only of interest to developers)
|
||||
|
||||
0.6.3 - 22 December 2003
|
||||
- fixed transient bug that reported "resource unavailable" occasionally
|
||||
|
||||
0.6.2 - 6 August 2003
|
||||
- block devices now have their size read correctly, so pv /dev/hda1 works
|
||||
- minor code cleanups (mainly removal of CVS "Id" tags)
|
||||
|
||||
0.6.0 - 3 August 2003
|
||||
- doing ^Z then "bg" then "fg" now continues displaying
|
||||
|
||||
0.5.9 - 23 July 2003
|
||||
- fix for test 007 when not in C locale
|
||||
- fix for build process to use CPPFLAGS
|
||||
- fix for build process to use correct i18n libraries
|
||||
- fix for build process - more portable sed in dependency generator
|
||||
- fix for install process - remember to mkinstalldirs before installing
|
||||
- fixes for building on Mac OS X
|
||||
|
||||
0.5.3 - 4 May 2003
|
||||
- added Polish translation thanks to Bartosz Feñski
|
||||
<fenio@o2.pl> <http://skawina.eu.org/> and Krystian Zubel
|
||||
- moved doc/debian to ./debian at insistence of common sense
|
||||
- minor Solaris 8 compatibility fixes
|
||||
- seems to compile and test OK on Mac OS X
|
||||
|
||||
0.5.0 - 15 April 2003
|
||||
- added French translation thanks to Stéphane Lacasse
|
||||
<stephane@gorfou.ca>
|
||||
- added German translation thanks to Marcos Kreinacke
|
||||
<public@kreinacke.com>
|
||||
- switched LGPL reference from "Library" to "Lesser"
|
||||
|
||||
0.4.9 - 18 February 2003
|
||||
- support for >2GB files added where available (Debian bug #180986)
|
||||
- added doc/debian dir (from Cédric Delfosse)
|
||||
- added "make rpm" and "make deb" targets to build RPM and Debian packages
|
||||
- added a "make pv-static" rule to build a statically linked version
|
||||
|
||||
0.4.5 - 13 December 2002
|
||||
- added Portuguese (Brazilian) translation thanks to Eduardo Aguiar
|
||||
|
||||
0.4.4 - 7 December 2002
|
||||
- pause/resume support - don't count time while stopped
|
||||
- stop output when resumed in the background
|
||||
- terminal size change support
|
||||
- bugfix: <=> indicator no longer sticks at right hand edge
|
||||
|
||||
0.4.0 - 27 November 2002
|
||||
- allow decimal interval values, eg 0.1, 0.5, etc
|
||||
- some simple tests added (`make check')
|
||||
- smoother throughput limiting (--rate-limit), now done in 0.1sec chunks
|
||||
- bounds-check interval values (-i) - max update interval now 10 minutes
|
||||
- more reliable non-blocking output to keep display updated
|
||||
- no longer rely on atoll()
|
||||
- don't output final blank line if --numeric
|
||||
- use fcntl() instead of flock() for Solaris compatibility
|
||||
|
||||
0.3.0 - 25 November 2002
|
||||
- handle broken output pipe gracefully
|
||||
- continue updating display even when output pipe is blocking
|
||||
|
||||
0.2.6 - 21 October 2002
|
||||
- we now ignore EINTR on select()
|
||||
- variable-size buffer (still need to add code to change size)
|
||||
- added (tentative) support for internationalisation
|
||||
- removed superfluous --no-progress, etc options
|
||||
- optimised transfer by using bigger buffers, based on st_blksize
|
||||
- added --wait option to wait until transfer begins before showing progress
|
||||
- added --rate-limit option to limit rate to a maximum throughput
|
||||
- added --quiet option (no output at all) to be used with --rate-limit
|
||||
|
||||
0.2.5 - 23 July 2002
|
||||
- added [FILE]... arguments, like `cat'
|
||||
- function separation in code
|
||||
- some bug fixes related to numeric overflow
|
||||
|
||||
0.2.3 - 19 July 2002
|
||||
- Texinfo manual written, man page updated
|
||||
- byte counter added
|
||||
|
||||
0.2.0 - 18 July 2002
|
||||
- ETA counter added
|
||||
- screen width estimation added
|
||||
- progress bar added
|
||||
|
||||
0.1.0 - 17 July 2002
|
||||
- main loop created
|
||||
- rate counter added
|
||||
- elapsed time counter added
|
||||
- percentage calculation added
|
||||
|
||||
0.0.1 - 16 July 2002
|
||||
- package created
|
||||
- first draft of man page written
|
||||
+357
@@ -0,0 +1,357 @@
|
||||
1.7.17 - 27 July 2023
|
||||
* feature: new "`--sync`" option to flush cache to disk after every write (related to [GH#6](https://github.com/a-j-wood/pv/issues/6), to improve accuracy when writing to slow disks)
|
||||
* feature: new "`--direct-io`" option to bypass cache - implements [GH#29 "Option to enable *O_DIRECT*"](https://github.com/a-j-wood/pv/issues/29) - requested by Romain Kang, Jacek Wielemborek
|
||||
* fix: correct byte prefix size to 2 spaces in rate display, so progress display size remains constant at low transfer rates
|
||||
* cleanup: rewrote `configure.in` as per suggestions in newer "`autoconf`" manuals
|
||||
* cleanup: replaced `header.in` with one generated by "`autoheader`", moving custom logic to a separate header file "`config-aux.h`"
|
||||
* cleanup: added copyright notice to all source files as per GNU standards
|
||||
* cleanup: changed "`--version`" output to conform to GNU standards
|
||||
* cleanup: replaced backticks with `$()` in all shell scripts that did not come from elsewhere, as backticks are deprecated and harder to read
|
||||
* cleanup: improved the output formatting of "`make test`"
|
||||
* cleanup: extended the "`make test`" mechanism to allow certain tests to be skipped on platforms that cannot support them
|
||||
* cleanup: skip the "pipe" test (for *SIGPIPE*) if GNU "`head`" is not available, so that "`make test`" on stock OpenBSD 7.3 works
|
||||
* cleanup: added a lot more tests to "`make test`"
|
||||
* cleanup: replace all calls to `sprintf()` and `snprintf()` with a new wrapper function `pv_snprintf()` to improve security and compatibility
|
||||
* cleanup: replace all calls to `strcat()` with a wrapper `pv_strlcat()` to improve security and compatibility
|
||||
* cleanup: replace all `write()` calls to the terminal with a wrapper `pv_write_retry()` for consistency
|
||||
* cleanup: tidy up and fix compilation warning in "`--watchfd`" code
|
||||
* cleanup: rewrote all local shell scripts to pass analysis by [ShellCheck](https://www.shellcheck.net)
|
||||
|
||||
1.7.0 - 17 July 2023
|
||||
* dropped: support for Red Hat Enterprise Linux and its derivatives has been dropped; removed the RPM spec file, and will no longer build binaries
|
||||
* feature: the "`--size`" option now accepts "`@filename`" to use the size of another file (pull request [#57](https://github.com/a-j-wood/pv/pull/57) supplied by [Dave Beckett](https://github.com/dajobe))
|
||||
* feature: the "`--watchfd`" option is now available on OS X (pull request [#60](https://github.com/a-j-wood/pv/pull/60) supplied by [christoph-zededa](https://github.com/christoph-zededa))
|
||||
* feature: new "`--bits`" option to show bit count instead of byte count (adapted from pull request [#63](https://github.com/a-j-wood/pv/pull/63) supplied by [Nick Black](https://nick-black.com))
|
||||
* feature: new "`--average-rate-window`" option, to set the window over which the average rate is calculated, also used for ETA (modified from pull request [#65](https://github.com/a-j-wood/pv/pull/65) supplied by [lemonsqueeze](https://github.com/lemonsqueeze))
|
||||
* feature: the "`--watchfd`" option will now show relative filenames, if they are under the current directory (pull request [#66](https://github.com/a-j-wood/pv/pull/66) supplied by [ikasty](https://github.com/ikasty))
|
||||
* fix: correction to `pv_in_foreground()` to behave as its comment block says it should, when not on a terminal - corrects [GH#19 "No output in Arch Linux initcpio after 1.6.6"](https://github.com/a-j-wood/pv/issues/19), [GH#31 "No output written from inside zsh <() construct"](https://github.com/a-j-wood/pv/issues/31), [GH#55 "pv Stopped Working in the Background"](https://github.com/a-j-wood/pv/issues/55) (pull request [#64](https://github.com/a-j-wood/pv/pull/64) supplied by [Michael Weiß](https://github.com/quitschbo))
|
||||
* fix: workaround for OS X 11 behaviour in configure script regarding stat64 at compile time (pull request [#57](https://github.com/a-j-wood/pv/pull/57) supplied by [Dave Beckett](https://github.com/dajobe))
|
||||
* fix: workaround for macOS equivalence of stat to stat64 - patches from [Filippo Valsorda](https://github.com/FiloSottile) and [Demitri Muna](https://github.com/demitri), correcting [GH#33 "Fix compilation problems due to `stat64()` on Apple Silicon"](https://github.com/a-j-wood/pv/issues/33)
|
||||
* fix: add burst rate limit to transfer, so rate limits are not broken by bursty traffic (pull request [#62](https://github.com/a-j-wood/pv/pull/62) supplied by [Volodymyr Bychkovyak](https://github.com/vbychkoviak))
|
||||
* fix: corrected "`--force`" option so it will still output progress when not in the same process group as the owner of the terminal - corrects [GH#23 "No output with "`-f`" when run in background after 1.6.6"](https://github.com/a-j-wood/pv/issues/23) and helps to correct [GH#31 "No output written from inside zsh <() construct"](https://github.com/a-j-wood/pv/issues/31)
|
||||
* fix: corrected elapsed time display to show as D:HH:MM:SS after 1 day, like the ETA does - corrects [GH#16 "Show days in same format in ETA as in elapsed time"](https://github.com/a-j-wood/pv/issues/16)
|
||||
* fix: corrected bug where percentages went down after 100% when in "`--numeric`" mode with a "`--size`" that was too small - corrects [GH#26 "Correct "`-n`" behaviour when going past 100% of "`-s`" size"](https://github.com/a-j-wood/pv/issues/26)
|
||||
* i18n: recoded Polish translation file to UTF-8
|
||||
* i18n: removed inaccurate fuzzy translation matches
|
||||
* docs: moved all open issues into GitHub and updated the TODO list
|
||||
* docs: renamed README to README.md and altered it to Markdown format
|
||||
* docs: moved contributors from the README to docs/ACKNOWLEDGEMENTS.md
|
||||
* docs: moved TODO to TODO.md and altered it to Markdown format
|
||||
* docs: moved NEWS to NEWS.md, converted it to UTF-8, and altered it to Markdown format
|
||||
|
||||
1.6.20 - 12 September 2021
|
||||
* fix: add missing `stddef.h` include to `number.c` (Sam James)
|
||||
|
||||
1.6.19 - 5 September 2021
|
||||
* fix: starting pv in the background no longer immediately stops unless the transfer is to/from the terminal (Andriy Gapon, Jonathan Elchison)
|
||||
* fix: using "`-B`", "`-A`", or "`-T`" now switches on "`-C`" implicitly (Johannes Gerer, André Stapf)
|
||||
* fix: AIX build fixes (Peter Korsgaard)
|
||||
* i18n: updated German "`--help`" translations (Richard Fonfara)
|
||||
* i18n: switched to UTF-8 encoding, added missing translations (de,fr,pt)
|
||||
* docs: new "common switches" manual section (Jacek Wielemborek)
|
||||
* docs: use placeholder instead of `/dev/sda` in the manual (Pranav Peshwe)
|
||||
* docs: mention MacOS pipes and "`-B 1024`" in the manual (Jan Venekamp)
|
||||
* docs: correct shell in `autoconf/scripts/index.sh` (Juan Picca)
|
||||
* cleanup: various compiler warnings cleaned up
|
||||
|
||||
Full changelog is below:
|
||||
* (r181) added common switches section to manual (Jacek Wielemborek)
|
||||
* (r184) use placeholder instead of /dev/sda in the manual (Pranav Peshwe)
|
||||
* (r185) replace ash with sh in autoconf/scripts/index.sh (Juan Picca)
|
||||
* (r185) added note to manual about "`-B 1024`" in MacOS pipes (Jan Venekamp)
|
||||
* (r185) fix AIX config check when the CWD contains "yes" (Peter Korsgaard)
|
||||
* (r189) (#1556) updated German "`--help`" translations (Richard Fonfara)
|
||||
* (r189) updated missing German translations and changed to UTF-8 encoding
|
||||
* (r191) updated missing French translations and changed to UTF-8 encoding
|
||||
* (r193) updated missing Portuguese translations, changed to UTF-8 encoding
|
||||
* (r196) (#1563) using "`-B`", "`-A`", or "`-T`" now switches on "`-C`" implicitly (Johannes Gerer, André Stapf)
|
||||
* (r199) fixed numerous compiler warnings in newer GCC versions
|
||||
* (r200,205) fixed bug where "`pv /dev/zero >/dev/null &`" stopped immediately (Jonathan Elchison, Andriy Gapon)
|
||||
* (r203,205) marked unused arguments with GCC unused attribute, started using boolean data type for flags, corrected more compiler warnings
|
||||
|
||||
1.6.6 - 30 June 2017
|
||||
* (r161) use `%llu` instead of `%Lu` for better compatibility (Eric A. Borisch)
|
||||
* (r162) (#1532) fix target buffer size ("`-B`") being ignored (AndCycle, Ilya Basin, Antoine Beaupré)
|
||||
* (r164) cap read/write sizes, and check elapsed time during read/write cycles, to avoid display hangs with large buffers or slow media; also remove `select()` call from repeated_write function as it slows the transfer down and the wrapping `alarm()` means it is unnecessary
|
||||
* (r169) (#1477) use alternate form for transfer counter, such that 13GB is shown as 13.0GB so it's the same width as 13.1GB (André Stapf)
|
||||
* (r171) cleanup: units corrections in man page, of the form kb -> KiB
|
||||
* (r175) report error in "`-d`" if process fd directory is unreadable, or if process disappears before we start the main loop (Jacek Wielemborek)
|
||||
|
||||
1.6.0 - 15 March 2015
|
||||
* fix lstat64 support when unavailable - separate patches supplied by Ganael Laplanche and Peter Korsgaard
|
||||
* (#1506) new option "`-D`" / "`--delay-start`" to only show bar after N seconds (Damon Harper)
|
||||
* new option "`--fineta`" / "`-I`" to show ETA as time of day rather than time remaining - patch supplied by Erkki Seppälä (r147)
|
||||
* (#1509) change ETA ("`--eta`" / "`-e`") so that days are given if the hours remaining are 24 or more (Jacek Wielemborek)
|
||||
* (#1499) repeat read and write attempts on partial buffer fill/empty to work around post-signal transfer rate drop reported by Ralf Ramsauer
|
||||
* (#1507) do not try to calculate total size in line mode, due to bug reported by Jacek Wielemborek and Michiel Van Herwegen
|
||||
* cleanup: removed defunct RATS comments and unnecessary copyright notices
|
||||
* clean up displayed lines when using "`--watchfd PID`", when PID exits
|
||||
* output errors on a new line to avoid overwriting transfer bar
|
||||
|
||||
1.5.7 - 26 August 2014
|
||||
* show KiB instead of incorrect kiB (Debian bug #706175)
|
||||
* (#1284) do not gzip man page, for non-Linux OSes (Bob Friesenhahn)
|
||||
* work around "awk" bug in `tests/016-numeric-timer` in decimal "," locales
|
||||
* fix "`make rpm`" and "`make srpm`", extend "`make release`" to sign releases
|
||||
|
||||
1.5.3 - 4 May 2014
|
||||
* remove *SPLICE_F_NONBLOCK* to fix problem with slow `splice()` (Jan Seda)
|
||||
|
||||
1.5.2 - 10 February 2014
|
||||
* allow "`--watchfd`" to look at block devices
|
||||
* let "`--watchfd PID:FD`" work with "`--size N`"
|
||||
* moved contributors out of the manual as the list was too long (NB everyone is still listed in the README and always will be)
|
||||
|
||||
1.5.1 - 23 January 2014
|
||||
* new option "`--watchfd`" - suggested by Jacek Wielemborek and "fdwatch"
|
||||
* use non-block flag with `splice()`
|
||||
* new display option "`--buffer-percent`", suggested by Kim Krecht
|
||||
* new display option "`--last-written`", suggested by Kim Krecht
|
||||
* new transfer option "`--no-splice`"
|
||||
* fix for minor bug which dropped display elements after one empty one
|
||||
* fix for single fd leak on exit (Cristian Ciupitu)
|
||||
|
||||
1.4.12 - 5 August 2013
|
||||
* new option "`--null`" - patch supplied by Zing Shishak
|
||||
* AIX build fix (add "`-lc128`") - with help from Pawel Piatek
|
||||
* AIX "`-c`" fixes - with help from Pawel Piatek
|
||||
* SCO build fix (`po2table.sh`) - reported by Wouter Pronk
|
||||
* test scripts fix for older distributions - patch from Bryan Dongray
|
||||
* fix for `splice()` not using stdin - patch from Zev Weiss
|
||||
|
||||
1.4.6 - 22 January 2013
|
||||
* added patch from Pawel Piatek to omit *O_NOFOLLOW* in AIX
|
||||
|
||||
1.4.5 - 10 January 2013
|
||||
* updated manual page to show known problem with "`-R`" on Cygwin
|
||||
|
||||
1.4.4 - 11 December 2012
|
||||
* added debugging, see "`pv -h`" when `configure` is run with "`--enable-debugging`"
|
||||
* rewrote cursor positioning code used when IPC is unavailable (Cygwin)
|
||||
* fixed cursor positioning cursor read answerback problem (Cygwin/Solaris)
|
||||
* fixed bug causing crash when progress displayed with too-small terminal
|
||||
|
||||
1.4.0 - 6 December 2012
|
||||
* new option "`--skip-errors`" commissioned by Jim Salter
|
||||
* if stdout is a block device, and we don't know the total size, use the size of that block device as the total (Peter Samuelson)
|
||||
* new option "`--stop-at-size`" to stop after "`--size`" bytes
|
||||
* report correct filename on read errors
|
||||
* fix use-after-free bug in remote PID cleanup code
|
||||
* refactored large chunks of code to make it more readable and to replace most static variables with a state structure
|
||||
|
||||
1.3.9 - 5 November 2012
|
||||
* allow "`--format`" parameters to be sent with "`--remote`"
|
||||
* configure option "`--disable-ipc`"
|
||||
* added tests for "`--numeric`" with "`--timer`" and "`--bytes`"
|
||||
* added tests for "`--remote`"
|
||||
|
||||
1.3.8 - 29 October 2012
|
||||
* new "`--pidfile`" option to save process ID to a file
|
||||
* integrated patch for "`--numeric`" with "`--timer`" and "`--bytes`" (Sami Liedes)
|
||||
* removed signalling from "`--remote`" to prevent accidental process kills
|
||||
* new "`--format`" option (originally Vladimir Pal / Vladimir Ermakov)
|
||||
|
||||
1.3.4 - 27 June 2012
|
||||
* new "`--disable-splice`" configure script option
|
||||
* fixed line mode size count with multiple files (Moritz Barsnick)
|
||||
* fixes for AIX core dumps (Pawel Piatek)
|
||||
|
||||
1.3.1 - 9 June 2012
|
||||
* do not use `splice()` if the write buffer is not empty (Thomas Rachel)
|
||||
* added test 15 (pipe transfers), and new test script
|
||||
|
||||
1.3.0 - 5 June 2012
|
||||
* added Tiger build patch from Olle Jonsson
|
||||
* fix 1024-boundary display garble (Debian bug #586763)
|
||||
* use `splice`(2) where available (Debian bug #601683)
|
||||
* added known bugs section of the manual page
|
||||
* fixed average rate test, 12 (Andrew Macheret)
|
||||
* use IEEE1541 units (Thomas Rachel)
|
||||
* bug with rate limit under 10 fixed (Henry Precheur)
|
||||
* speed up PV line mode (patch: Guillaume Marcais)
|
||||
* remove `LD=ld` from `vars.mk` to fix cross-compilation (paintitgray/PV#1291)
|
||||
|
||||
1.2.0 - 14 December 2010
|
||||
* integrated improved SI prefixes and "`--average-rate`" (Henry Gebhardt)
|
||||
* return nonzero if exiting due to *SIGTERM* (Martin Baum)
|
||||
* patch from Phil Rutschman to restore terminal properly on exit
|
||||
* fix i18n especially for "`--help`" (Sebastian Kayser)
|
||||
* refactored `pv_display`
|
||||
* we now have a coherent, documented, exit status
|
||||
* modified pipe test and new cksum test from Sebastian Kayser
|
||||
* default *CFLAGS* to just "`-O`" for non-GCC (Kjetil Torgrim Homme)
|
||||
* LFS compile fix for OS X 10.4 (Alexandre de Verteuil)
|
||||
* remove *DESTDIR* `/` suffix (Sam Nelson, Daniel Pape)
|
||||
* fixed potential NULL deref in transfer (Elias Pipping / LLVM/Clang)
|
||||
|
||||
1.1.4 - 6 March 2008
|
||||
* patch from Elias Pipping correcting compilation failure on Darwin 9
|
||||
* patch from Patrick Collison correcting similar problems on OS X
|
||||
* trap *SIGINT* / *SIGHUP* / *SIGTERM* so we clean up IPCs on exit (Laszlo Ersek)
|
||||
* abort if numeric option, eg "`-L`", has non-numeric value (Boris Lohner)
|
||||
|
||||
1.1.0 - 30 August 2007
|
||||
* new option "`--remote`" ("`-R`") to control an already-running process
|
||||
* new option "`--line-mode`" ("`-l`") to count lines instead of bytes
|
||||
* fix for "`-L`" to be less resource intensive
|
||||
* fix for input/output equivalence check on Mac OS X
|
||||
* fix for size calculation in pipelines on Mac OS X
|
||||
* fixed "`make uninstall`"
|
||||
* removed "`/debian`" directory at request of new Debian maintainer
|
||||
|
||||
1.0.1 - 4 August 2007
|
||||
* licensing change from Artistic to Artistic 2.0
|
||||
* removed the "`-l`" / "`--license`" option
|
||||
|
||||
1.0.0 - 2 August 2007
|
||||
* act more like "`cat`" - just skip unreadable files, don't abort
|
||||
* removed text version of manual page, and obsolete Info file generation
|
||||
* code cleanup and separation of PV internals from CLI front-end
|
||||
|
||||
0.9.9 - 5 February 2007
|
||||
* new option "`--buffer-size`" ("`-B`") suggested by Mark Tomich
|
||||
* build fix: HP/UX largefile compile fix from Timo Savinen
|
||||
* maintain better buffer filling during transfers
|
||||
* workaround: "`pv /dev/zero | dd bs=1M count=1k`" bug (reported by Gert Menke)
|
||||
* dropped support for the Texinfo manual
|
||||
|
||||
0.9.6 - 27 February 2006
|
||||
* bugfix: `key_t` incompatibility with Cygwin
|
||||
* bugfix: interval ("`-i`") parameter parses numbers after decimal point
|
||||
* build fix: use static NLS if `msgfmt` is unavailable
|
||||
* on the final update, blank out the now-zero ETA
|
||||
|
||||
0.9.2 - 1 September 2005
|
||||
* Daniel Roethlisberger patch: use lockfiles if terminal locking fails
|
||||
|
||||
0.9.1 - 16 June 2005
|
||||
* minor RPM spec file fix for Fedora Core 4
|
||||
|
||||
0.9.0 - 15 November 2004
|
||||
* minor NLS bugfix
|
||||
|
||||
0.8.9 - 6 November 2004
|
||||
* decimal values now accepted for rate and size, eg "`-L 1.23M`"
|
||||
* code cleanup
|
||||
* developers: "`make help`" now lists Makefile targets
|
||||
|
||||
0.8.6 - 29 June 2004
|
||||
* use `uu_lock()` for terminal locking on FreeBSD
|
||||
|
||||
0.8.5 - 2 May 2004
|
||||
* cursor positioning ("`-c`") reliability improved on systems with IPC
|
||||
* minor fix: made test 005 more reliable
|
||||
* new option "`--height`" ("`-H`")
|
||||
|
||||
0.8.2 - 24 April 2004
|
||||
* allow k,m,g,t suffixes on numbers
|
||||
* added "`srpm`" and "`release`" Makefile targets
|
||||
|
||||
0.8.1 - 19 April 2004
|
||||
* bugfix in cursor positioning ("`-c`")
|
||||
|
||||
0.8.0 - 12 February 2004
|
||||
* replaced GNU getopt with my library code
|
||||
* replaced GNU gettext with my very minimal replacement
|
||||
* use *DESTDIR* instead of *RPM_BUILD_ROOT* for optional installation prefix
|
||||
* looked for flaws using RATS, cleaned up code
|
||||
|
||||
0.7.0 - 8 February 2004
|
||||
* display buffer management fixes (thanks Cédric Delfosse)
|
||||
* replaced "`--enable-debug`" with "`--enable-debugging`" and "`--enable-profiling`"
|
||||
|
||||
0.6.4 - 14 January 2004
|
||||
* fixed minor bug in RPM installation
|
||||
* bugfix in "`make index`" (only of interest to developers)
|
||||
|
||||
0.6.3 - 22 December 2003
|
||||
* fixed transient bug that reported "resource unavailable" occasionally
|
||||
|
||||
0.6.2 - 6 August 2003
|
||||
* block devices now have their size read correctly, so "`pv /dev/hda1`" works
|
||||
* minor code cleanups (mainly removal of CVS "Id" tags)
|
||||
|
||||
0.6.0 - 3 August 2003
|
||||
* doing *^Z* then "`bg`" then "`fg`" now continues displaying
|
||||
|
||||
0.5.9 - 23 July 2003
|
||||
* fix for test 007 when not in C locale
|
||||
* fix for build process to use *CPPFLAGS*
|
||||
* fix for build process to use correct i18n libraries
|
||||
* fix for build process - more portable sed in dependency generator
|
||||
* fix for install process - remember to `mkinstalldirs` before installing
|
||||
* fixes for building on Mac OS X
|
||||
|
||||
0.5.3 - 4 May 2003
|
||||
* added Polish translation thanks to Bartosz Feński <fenio@o2.pl> <http://skawina.eu.org/> and Krystian Zubel
|
||||
* moved `doc/debian` to `./debian` at insistence of common sense
|
||||
* minor Solaris 8 compatibility fixes
|
||||
* seems to compile and test OK on Mac OS X
|
||||
|
||||
0.5.0 - 15 April 2003
|
||||
* added French translation thanks to Stéphane Lacasse <stephane@gorfou.ca>
|
||||
* added German translation thanks to Marcos Kreinacke <public@kreinacke.com>
|
||||
* switched LGPL reference from "Library" to "Lesser"
|
||||
|
||||
0.4.9 - 18 February 2003
|
||||
* support for >2GB files added where available (Debian bug #180986)
|
||||
* added `doc/debian` dir (from Cédric Delfosse)
|
||||
* added "`make rpm`" and "`make deb`" targets to build RPM and Debian packages
|
||||
* added a "`make pv-static`" rule to build a statically linked version
|
||||
|
||||
0.4.5 - 13 December 2002
|
||||
* added Portuguese (Brazilian) translation thanks to Eduardo Aguiar
|
||||
|
||||
0.4.4 - 7 December 2002
|
||||
* pause/resume support - don't count time while stopped
|
||||
* stop output when resumed in the background
|
||||
* terminal size change support
|
||||
* bugfix: "`<=>`" indicator no longer sticks at right hand edge
|
||||
|
||||
0.4.0 - 27 November 2002
|
||||
* allow decimal interval values, eg 0.1, 0.5, etc
|
||||
* some simple tests added ("`make check`")
|
||||
* smoother throughput limiting ("`--rate-limit`"), now done in 0.1sec chunks
|
||||
* bounds-check interval values ("`-i`") - max update interval now 10 minutes
|
||||
* more reliable non-blocking output to keep display updated
|
||||
* no longer rely on `atoll()`
|
||||
* don't output final blank line if "`--numeric`"
|
||||
* use `fcntl()` instead of `flock()` for Solaris compatibility
|
||||
|
||||
0.3.0 - 25 November 2002
|
||||
* handle broken output pipe gracefully
|
||||
* continue updating display even when output pipe is blocking
|
||||
|
||||
0.2.6 - 21 October 2002
|
||||
* we now ignore *EINTR* on `select()`
|
||||
* variable-size buffer (still need to add code to change size)
|
||||
* added (tentative) support for internationalisation
|
||||
* removed superfluous "`--no-progress`", etc options
|
||||
* optimised transfer by using bigger buffers, based on `st_blksize`
|
||||
* added "`--wait`" option to wait until transfer begins before showing progress
|
||||
* added "`--rate-limit`" option to limit rate to a maximum throughput
|
||||
* added "`--quiet`" option (no output at all) to be used with "`--rate-limit`"
|
||||
|
||||
0.2.5 - 23 July 2002
|
||||
* added *[FILE]...* arguments, like "`cat`"
|
||||
* function separation in code
|
||||
* some bug fixes related to numeric overflow
|
||||
|
||||
0.2.3 - 19 July 2002
|
||||
* Texinfo manual written, man page updated
|
||||
* byte counter added
|
||||
|
||||
0.2.0 - 18 July 2002
|
||||
* ETA counter added
|
||||
* screen width estimation added
|
||||
* progress bar added
|
||||
|
||||
0.1.0 - 17 July 2002
|
||||
* main loop created
|
||||
* rate counter added
|
||||
* elapsed time counter added
|
||||
* percentage calculation added
|
||||
|
||||
0.0.1 - 16 July 2002
|
||||
* package created
|
||||
* first draft of man page written
|
||||
@@ -1,59 +0,0 @@
|
||||
Things still to do:
|
||||
|
||||
- store terminal state in shm seg (Lars Ellenberg - Feb 2018)
|
||||
- (as above) fix race condition with multiple "pv -c" (Viktor Ashirov - Jan 2020, Lars Ellenberg)
|
||||
- (#1287) if the first pv exits, should the second become IPC leader?
|
||||
- option to show bits/sec instead of bytes (John W. O'Brien - Jan 2019)
|
||||
- option for alternate units like kB (x1000) (David Henderson [cliquesoft.org] - Dec 2018)
|
||||
- (same as above) option to make input suffixes decimal not binary (ie kb rather than KiB)
|
||||
- allow decimal values for -s, -L, -B (suggestion - Thomas Watson)
|
||||
- allow -E to take a block size argument so errors cause a skip to the
|
||||
next block (Anthony DeRobertis)
|
||||
- (#1559) momentary ETA option (Luc Gommans)
|
||||
- (#1557) use clock_gettime() in ETA calculation (Mateju Miroslav)
|
||||
- (#1561) show days in same format in ETA as in elapsed time
|
||||
- (#1562) allow -r with -l and -n to output lines/sec (Roland Kletzing)
|
||||
- document zsh <() incompatibility (frederik@ofb.net - Frederik Eaton)
|
||||
- apply patch for MacOS 11 (Apple Silicon) stat64 issue (Filippo Valsorda)
|
||||
- do not check terminal in -q/-n mode (zsh <(pv -n) fails)
|
||||
- if -w/-H was specified, ignore SIGWINCH
|
||||
- reset ETA on SIGUSR1 (Jacek Wielemborek - Jan 2019)
|
||||
- option to enable O_DIRECT (Romain Kang, Jacek Wielemborek)
|
||||
- use posix_fadvise() like cat(1) does (Jacek Wielemborek)
|
||||
- before exit, flush output (e.g. writing to USB disk), update counters during flush (Kalin KOZHUHAROV - Jun 2018)
|
||||
- permit -c with -d PID:FD, reject -N with -d PID (Norman Rasmussen)
|
||||
- (#1508) add watchfd tests
|
||||
- (#1554) allow multiple -d options (Linus Heckemann for multiple PID:FD)
|
||||
- (#1553) one-shot option (Jacek Wielemborek)
|
||||
- (#1505) option to switch rate to per minute if really slow
|
||||
- (#1510) option "--progress-from FILE", read last number and use it as bytes read:
|
||||
pv --progress-from <( while sleep 1; do du -sb somedir; done ) -s 123g
|
||||
(Jacek Wielemborek)
|
||||
- (#1476) (Debian #507682) adjustable averaging window for rate display
|
||||
- (#1286) option for process title (Martin Sarsale) as "pv - name:FooProcess -xyz - transferred: 1.3GB - 500KB/s - running: 10:15:30s"
|
||||
- (#1290) look at effect of O_SYNC or fsync on performance
|
||||
- (#1281) option (-x?) to use xterm title line for status (Joachim Haga)
|
||||
- (#1560) use Unicode for more granular progress bar (Alexander Petrossian)
|
||||
- show fd backwards reads more neatly than negative huge numbers
|
||||
- "swallow" option to discard output (André Stapf - Apr 2017)
|
||||
- differentiate "eta" from "fineta" in display (André Stapf - Apr 2017)
|
||||
- continue timer even if input or output is blocking (Martin Probst - Jun 2017)
|
||||
- incorporate ETA patch from Christoph Biedl - Jul 2017
|
||||
- incorporate dynamic interval patch from Christoph Biedl - Dec 2019
|
||||
- option "--size-file" or similar to use size of a file for "-s"
|
||||
- fix rate limit downgrade as per patch (Stephen Kitt - Jan 2018)
|
||||
- normalise progress to 100% if overrun (Andrej Gantvorg - Mar 2018)
|
||||
- incorporate average rate interval patch "rate-window"/"eta-window" (lemonsqueeze/Matt - May/Sep 2018 - https://github.com/lemonsqueeze/pv)
|
||||
- incorporate rate limit patch (Jered Floyd - Dec 2018)
|
||||
- option --sparse (with block size option) to write sparse output (Andriy Galetski - Apr 2019)
|
||||
- correct "-n" behaviour when going past 100% of "-s" size (Marcel - Nov 2018)
|
||||
- option to show speed gauge (% max speed) if progress not known (Ryan Cooley - Jun 2019)
|
||||
- look at
|
||||
https://www.reddit.com/r/unix/comments/6gxduc/how_is_gnu_yes_so_fast/diua761/
|
||||
|
||||
- add development support for http://clang-analyzer.llvm.org/
|
||||
- stats for avg/min/max/stddev throughput (Venky.N.Iyer)
|
||||
- pv-ify a command line (Will Entriken) - "pv FOO | BAR | BAZ"
|
||||
- get more translations
|
||||
|
||||
Any assistance would be appreciated.
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
Things still to do. (GH#n) indicates the Github issue tracker number.
|
||||
|
||||
Bugs
|
||||
----
|
||||
|
||||
* ([GH#5](https://github.com/a-j-wood/pv/issues/5)) Transfer IPC leadership on exit of leader
|
||||
* ([GH#13](https://github.com/a-j-wood/pv/issues/13)) Use `clock_gettime()` in ETA calculation to cope with machine suspend/resume (Mateju Miroslav)
|
||||
* ([GH#20](https://github.com/a-j-wood/pv/issues/20)) Terminal state is not restored correctly in all cases (VA)
|
||||
* ([GH#24](https://github.com/a-j-wood/pv/issues/24)) Race condition with multiple "`pv -c`" leaves terminal state inconsistent (Lars Ellenberg, Viktor Ashirov)
|
||||
* ([GH#34](https://github.com/a-j-wood/pv/issues/34)) Continue timer even if input or output is blocking (Martin Probst - Jun 2017)
|
||||
* ([GH#69](https://github.com/a-j-wood/pv/issues/69)) Configure issue for stat64
|
||||
* ([GH#70](https://github.com/a-j-wood/pv/issues/70)) New compilation warnings
|
||||
* ([GH#71](https://github.com/a-j-wood/pv/issues/71)) Debian complains about old OpenPGP signatures
|
||||
|
||||
Feature requests
|
||||
----------------
|
||||
|
||||
* ([GH#3](https://github.com/a-j-wood/pv/issues/3)) Option ("`-x`"?) to use xterm title line for status (Joachim Haga)
|
||||
* ([GH#4](https://github.com/a-j-wood/pv/issues/4)) Option for process title (Martin Sarsale) as "`pv - name:FooProcess -xyz - transferred: 1.3GB - 500KB/s - running: 10:15:30s`"
|
||||
* ([GH#6](https://github.com/a-j-wood/pv/issues/6)) Look at effect of *O_SYNC* or `fsync` on performance; update counters during buffer flush
|
||||
* ([GH#9](https://github.com/a-j-wood/pv/issues/9)) Option to switch rate to per minute if really slow
|
||||
* ([GH#10](https://github.com/a-j-wood/pv/issues/10)) Add watchfd tests
|
||||
* ([GH#11](https://github.com/a-j-wood/pv/issues/11)) Option "`--progress-from FILE`", read last number and use it as bytes read (Jacek Wielemborek)
|
||||
* ([GH#12](https://github.com/a-j-wood/pv/issues/12)) Allow multiple "`-d`" options (Linus Heckemann for multiple PID:FD; Jacek Wielemborek)
|
||||
* ([GH#15](https://github.com/a-j-wood/pv/issues/15)) Use Unicode for more granular progress bar (Alexander Petrossian)
|
||||
* ([GH#17](https://github.com/a-j-wood/pv/issues/17)) Allow "`-r`" with "`-l`" and "`-n`" to output lines/sec (Roland Kletzing)
|
||||
* ([GH#22](https://github.com/a-j-wood/pv/issues/22)) Options to skip input and seek on output (Jason A. Pfeil, Feb 2022)
|
||||
* ([GH#25](https://github.com/a-j-wood/pv/issues/25)) Normalise progress to 100% on overrun (Andrej Gantvorg)
|
||||
* ([GH#35](https://github.com/a-j-wood/pv/issues/35)) Allow decimal values for "`-s`", "`-L`", "`-B`" (Thomas Watson - Aug 2020)
|
||||
* ([GH#36](https://github.com/a-j-wood/pv/issues/36)) Ignore *SIGWINCH* (window size change) if "`-w`" / "`-H`" provided
|
||||
* ([GH#37](https://github.com/a-j-wood/pv/issues/37)) Allow "`-E`" to take a block size argument so errors cause a skip to the next block (Anthony DeRobertis - Oct 2016)
|
||||
* ([GH#38](https://github.com/a-j-wood/pv/issues/38)) Reset ETA on *SIGUSR1* (Jacek Wielemborek - Jan 2019)
|
||||
* ([GH#39](https://github.com/a-j-wood/pv/issues/39)) Use `posix_fadvise()` like `cat`(1) does (Jacek Wielemborek - Oct 2015)
|
||||
* ([GH#40](https://github.com/a-j-wood/pv/issues/40)) Permit "`-c`" with "`-d PID:FD`", reject "`-N`" with "`-d PID`" (Norman Rasmussen - Nov 2020)
|
||||
* ([GH#41](https://github.com/a-j-wood/pv/issues/41)) Improve how backwards-moving reads are shown in "`--watchfd`" (Ryan Cooley - Dec 2017)
|
||||
* ([GH#42](https://github.com/a-j-wood/pv/issues/42)) Option to discard stdin so nothing is written to stdout (André Stapf - Apr 2017)
|
||||
* ([GH#43](https://github.com/a-j-wood/pv/issues/43)) Differentiate between "`--eta`" and "`--fineta`" in display (André Stapf - Apr 2017)
|
||||
* ([GH#45](https://github.com/a-j-wood/pv/issues/45)) Option "`--sparse`" (with block size option) to write sparse output (Andriy Galetski - Apr 2019)
|
||||
* ([GH#46](https://github.com/a-j-wood/pv/issues/46)) Option to show speed gauge (% max speed) if progress not known (Ryan Cooley - Jun 2019)
|
||||
* ([GH#47](https://github.com/a-j-wood/pv/issues/47)) Analyse splice and buffer usage to improve performance
|
||||
* ([GH#48](https://github.com/a-j-wood/pv/issues/48)) Option to show multiple files with individual sizes and a cumulative total (Zach Riggle - Jul 2021)
|
||||
* ([GH#49](https://github.com/a-j-wood/pv/issues/49)) Option to provide stats for avg/min/max/stddev throughput (Venky.N.Iyer)
|
||||
* ([GH#50](https://github.com/a-j-wood/pv/issues/50)) Allow pv to report on a whole pipeline at once (Will Entriken - Feb 2011)
|
||||
* ([GH#54](https://github.com/a-j-wood/pv/issues/54)) Run command every n percent ([haarp](https://github.com/haarp))
|
||||
* ([GH#56](https://github.com/a-j-wood/pv/issues/56)) Support for backgrounding pv, and allowing it to be monitored separately ([jimbobmcgee](https://github.com/jimbobmcgee))
|
||||
* ([GH#67](https://github.com/a-j-wood/pv/issues/67)) Wrap another process to monitor its stdin & stdout ([Alex Mason](https://github.com/axman6))
|
||||
|
||||
Any assistance would be appreciated.
|
||||
+1
-1
@@ -1 +1 @@
|
||||
1.6.19
|
||||
1.7.17
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
Begin3
|
||||
Title: @PACKAGE@
|
||||
Version: @VERSION@
|
||||
Entered-date: 05SEP21
|
||||
Entered-date: 27JUL23
|
||||
Description: A tool for monitoring the progress of data through a
|
||||
pipeline. It can be inserted into any normal pipeline
|
||||
between two processes to give a visual indication of how
|
||||
|
||||
+75
-10
@@ -1,4 +1,4 @@
|
||||
.TH @UCPACKAGE@ 1 "September 2021" Linux "User Manuals"
|
||||
.TH @UCPACKAGE@ 1 "July 2023" Linux "User Manuals"
|
||||
.SH NAME
|
||||
@PACKAGE@ \- monitor the progress of data through a pipe
|
||||
.SH SYNOPSIS
|
||||
@@ -127,7 +127,7 @@ Turn the timer on. This will display the total elapsed time that
|
||||
has been running for.
|
||||
.TP
|
||||
.B \-e, \-\-eta
|
||||
Turn the ETA timer on. This will attempt to guess, based on previous
|
||||
Turn the ETA timer on. This will attempt to guess, based on current
|
||||
transfer rates and the total data size, how long it will be before
|
||||
completion. This option will have no effect if the total data size cannot
|
||||
be determined.
|
||||
@@ -142,13 +142,17 @@ Turn the rate counter on. This will display the current rate of data
|
||||
transfer.
|
||||
.TP
|
||||
.B \-a, \-\-average\-rate
|
||||
Turn the average rate counter on. This will display the average rate of
|
||||
data transfer so far.
|
||||
Turn the average rate counter on. This will display the current average
|
||||
rate of data transfer (default: last 30s, see --average-rate-window).
|
||||
.TP
|
||||
.B \-b, \-\-bytes
|
||||
Turn the total byte counter on. This will display the total amount of
|
||||
data transferred so far.
|
||||
.TP
|
||||
.B \-8, \-\-bits
|
||||
Display the total bits instead of the total bytes. The output suffix will
|
||||
be "b" instead of "B".
|
||||
.TP
|
||||
.B \-T, \-\-buffer\-percent
|
||||
Turn on the transfer buffer percentage display. This will show the
|
||||
percentage of the transfer buffer in use - but see the caveat under
|
||||
@@ -205,10 +209,16 @@ is in use, then adding
|
||||
will cause the number of bytes processed so far to be output instead of a
|
||||
percentage; if
|
||||
.B \-\-line\-mode
|
||||
is also in use, then instead of bytes or a percentage, the number of lines
|
||||
is also in use as well as
|
||||
.B \-\-bytes
|
||||
and
|
||||
.BR \-\-numeric ,
|
||||
then instead of bytes or a percentage, the number of lines
|
||||
so far is output. And finally, if
|
||||
.B \-\-timer
|
||||
is also in use, then each output line is prefixed with the elapsed time
|
||||
is added to
|
||||
.BR \-\-numeric ,
|
||||
then each output line is prefixed with the elapsed time
|
||||
so far, as a decimal number of seconds.
|
||||
.TP
|
||||
.B \-q, \-\-quiet
|
||||
@@ -243,7 +253,18 @@ etc can be used as with
|
||||
.BR -L .
|
||||
.TP
|
||||
.B ""
|
||||
Has no effect if used with
|
||||
If
|
||||
.B SIZE
|
||||
starts with
|
||||
.BR "@" ,
|
||||
the size of file whose name follows the
|
||||
.B @
|
||||
will be used.
|
||||
.TP
|
||||
.B ""
|
||||
Note that
|
||||
.B \-\-size
|
||||
has no effect if used with
|
||||
.B -d PID
|
||||
to watch all file descriptors of a process, but will work with
|
||||
.BR "-d PID:FD" .
|
||||
@@ -265,6 +286,11 @@ Wait
|
||||
seconds between updates. The default is to update every second.
|
||||
Note that this can be a decimal such as 0.1.
|
||||
.TP
|
||||
.B \-m SEC, \-\-average-rate-window SEC
|
||||
Compute current average rate over a
|
||||
.B SEC
|
||||
seconds window for average rate and ETA calculations (default 30s).
|
||||
.TP
|
||||
.B \-w WIDTH, \-\-width WIDTH
|
||||
Assume the terminal is
|
||||
.B WIDTH
|
||||
@@ -369,6 +395,24 @@ If a size was specified with
|
||||
stop transferring data once that many bytes have been written, instead of
|
||||
continuing to the end of input.
|
||||
.TP
|
||||
.B \-Y, \-\-sync
|
||||
After every write operation, synchronise the buffer caches to disk - see
|
||||
.BR fdatasync (2).
|
||||
This has no effect when the output is a pipe. Using
|
||||
.B \-Y
|
||||
may improve the accuracy of the progress bar when writing to a slow disk.
|
||||
.TP
|
||||
.B \-K, \-\-direct-io
|
||||
Set the
|
||||
.I O_DIRECT
|
||||
flag on all inputs and outputs, if it is available. This will minimise
|
||||
the effect of caches, at the cost of performance. Due to memory alignment
|
||||
requirements, it also may cause read or write failures with an error of
|
||||
"Invalid argument", especially if reading and writing files across a variety
|
||||
of filesystems in a single
|
||||
.B @PACKAGE@
|
||||
call. Use this option with caution.
|
||||
.TP
|
||||
.B \-d PID[:FD], \-\-watchfd PID[:FD]
|
||||
Instead of transferring data, watch file descriptor
|
||||
.B FD
|
||||
@@ -473,6 +517,11 @@ Bytes transferred so far (or lines if
|
||||
.B \-l
|
||||
was specified). Equivalent to
|
||||
.BR \-b .
|
||||
If
|
||||
.B \-\-bits
|
||||
was specified,
|
||||
.B %b
|
||||
shows the bits transferred so far, not bytes.
|
||||
.TP
|
||||
.B %T
|
||||
Percentage of the transfer buffer in use. Equivalent to
|
||||
@@ -565,7 +614,8 @@ A zero exit status indicates no problems.
|
||||
|
||||
.SH AUTHOR
|
||||
Written by Andrew Wood, with patches submitted by various other people.
|
||||
Please see the package README for a complete list of contributors.
|
||||
Please see the package's ACKNOWLEDGEMENTS file for a complete list of
|
||||
contributors.
|
||||
|
||||
|
||||
.SH KNOWN PROBLEMS
|
||||
@@ -573,6 +623,19 @@ The following problems are known to exist in
|
||||
.BR @PACKAGE@ :
|
||||
.TP
|
||||
.B *
|
||||
In some versions of
|
||||
.BR bash (1)
|
||||
and
|
||||
.BR zsh (1),
|
||||
the construct
|
||||
.B <(pv filename)
|
||||
will not output any progress to the terminal when run from an interactive
|
||||
shell, due to the subprocess being run in a separate process group from the
|
||||
one that owns the terminal. In these cases, use
|
||||
.BR \-\-force .
|
||||
.P
|
||||
.TP
|
||||
.B *
|
||||
The
|
||||
.B -c
|
||||
option does not work properly on Cygwin without
|
||||
@@ -609,8 +672,10 @@ home page: <http://www.ivarch.com/programs/pv.shtml>
|
||||
.SH "SEE ALSO"
|
||||
.BR cat (1),
|
||||
.BR dialog (1),
|
||||
.BR splice (2)
|
||||
|
||||
.BR splice (2),
|
||||
.BR open (2)
|
||||
(for
|
||||
.IR O_DIRECT )
|
||||
|
||||
.SH LICENSE
|
||||
This is free software, distributed under the ARTISTIC 2.0 license.
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
Before releasing a new version, go through this checklist:
|
||||
|
||||
- check for patches from http://packages.qa.debian.org/p/pv.html
|
||||
- check for patches from https://tracker.debian.org/pkg/pv
|
||||
- bump doc/VERSION
|
||||
- bump doc/lsm.in
|
||||
- check doc/NEWS is up to date
|
||||
- check doc/spec.in is up to date (changelog)
|
||||
- check doc/NEWS.md is up to date
|
||||
- check manual is up to date
|
||||
- make indent indentclean
|
||||
- make indent; make indent indentclean
|
||||
- make update-po
|
||||
- make test
|
||||
- commit to SVN
|
||||
- commit to repository
|
||||
- wipe build directory, re-run generate.sh and configure
|
||||
- make release
|
||||
- make manhtml | tidy -asxhtml | sed -e '1,/<body>/d' -e '/<\/body>/,$d'
|
||||
|
||||
-263
@@ -1,263 +0,0 @@
|
||||
Summary: Monitor the progress of data through a pipe
|
||||
Name: @PACKAGE@
|
||||
Version: @VERSION@
|
||||
Release: 1%{?dist}
|
||||
License: Artistic 2.0
|
||||
Group: Development/Tools
|
||||
Source: http://www.ivarch.com/programs/sources/@PACKAGE@-@VERSION@.tar.gz
|
||||
Url: http://www.ivarch.com/programs/pv.shtml
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||
BuildRequires: gettext
|
||||
|
||||
%description
|
||||
PV ("Pipe Viewer") is a tool for monitoring the progress of data through a
|
||||
pipeline. It can be inserted into any normal pipeline between two processes
|
||||
to give a visual indication of how quickly data is passing through, how long
|
||||
it has taken, how near to completion it is, and an estimate of how long it
|
||||
will be until completion.
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
|
||||
%build
|
||||
%configure
|
||||
make %{?_smp_mflags}
|
||||
|
||||
%install
|
||||
[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"
|
||||
mkdir -p "$RPM_BUILD_ROOT"%{_bindir}
|
||||
mkdir -p "$RPM_BUILD_ROOT"%{_mandir}/man1
|
||||
mkdir -p "$RPM_BUILD_ROOT"/usr/share/locale
|
||||
|
||||
make DESTDIR="$RPM_BUILD_ROOT" install
|
||||
%find_lang %{name}
|
||||
|
||||
%check
|
||||
make test
|
||||
|
||||
%clean
|
||||
[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"
|
||||
|
||||
%files -f %{name}.lang
|
||||
%defattr(-, root, root)
|
||||
%{_bindir}/%{name}
|
||||
%{_mandir}/man1/%{name}.1.gz
|
||||
|
||||
%doc README doc/NEWS doc/TODO doc/COPYING
|
||||
|
||||
%changelog
|
||||
* Sun Sep 5 2021 Andrew Wood <andrew.wood@ivarch.com> 1.6.19-1
|
||||
- fix: starting pv in the background no longer immediately stops unless
|
||||
- the transfer is to/from the terminal (Andriy Gapon, Jonathan Elchison)
|
||||
- fix: using -B, -A, or -T now switches on -C implicitly
|
||||
- (Johannes Gerer, André Stapf)
|
||||
- fix: AIX build fixes (Peter Korsgaard)
|
||||
- i18n: updated German "--help" translations (Richard Fonfara)
|
||||
- i18n: switched to UTF-8 encoding, added missing translations (de,fr,pt)
|
||||
- docs: new "common switches" manual section (Jacek Wielemborek)
|
||||
- docs: use placeholder instead of /dev/sda in the manual (Pranav Peshwe)
|
||||
- docs: mention MacOS pipes and "-B 1024" in the manual (Jan Venekamp)
|
||||
- docs: correct shell in autoconf/scripts/index.sh (Juan Picca)
|
||||
- cleanup: various compiler warnings cleaned up
|
||||
|
||||
* Fri Jun 30 2017 Andrew Wood <andrew.wood@ivarch.com> 1.6.6-1
|
||||
- (r161) use %llu instead of %Lu for better compatibility (Eric A. Borisch)
|
||||
- (r162) (#1532) fix target buffer size (-B) being ignored (AndCycle, Ilya
|
||||
- Basin, Antoine Beaupré)
|
||||
- (r164) cap read/write sizes, and check elapsed time during read/write
|
||||
- cycles, to avoid display hangs with large buffers or slow media; also
|
||||
- remove select() call from repeated_write function as it slows the
|
||||
- transfer down and the wrapping alarm() means it is unnecessary
|
||||
- (r169) (#1477) use alternate form for transfer counter, such that 13GB
|
||||
- is shown as 13.0GB so it's the same width as 13.1GB (André Stapf)
|
||||
- (r171) cleanup: units corrections in man page, of the form kb -> KiB
|
||||
- (r175) report error in "-d" if process fd directory is unreadable, or if
|
||||
- process disappears before we start the main loop (Jacek Wielemborek)
|
||||
|
||||
* Sun Mar 15 2015 Andrew Wood <andrew.wood@ivarch.com> 1.6.0-1
|
||||
- fix lstat64 support when unavailable - separate patches supplied by Ganael
|
||||
- Laplanche and Peter Korsgaard
|
||||
- (#1506) new option "-D" / "--delay-start" to only show bar after N seconds
|
||||
- (Damon Harper)
|
||||
- new option "--fineta" / "-I" to show ETA as time of day rather than time
|
||||
- remaining - patch supplied by Erkki Seppälä (r147)
|
||||
- (#1509) change ETA (--eta / -e) so that days are given if the hours
|
||||
- remaining are 24 or more (Jacek Wielemborek)
|
||||
- (#1499) repeat read and write attempts on partial buffer fill/empty to
|
||||
- work around post-signal transfer rate drop reported by Ralf Ramsauer
|
||||
- (#1507) do not try to calculate total size in line mode, due to bug
|
||||
- reported by Jacek Wielemborek and Michiel Van Herwegen
|
||||
- cleanup: removed defunct RATS comments and unnecessary copyright notices
|
||||
- clean up displayed lines when using --watchfd PID, when PID exits
|
||||
- output errors on a new line to avoid overwriting transfer bar
|
||||
|
||||
* Tue Aug 26 2014 Andrew Wood <andrew.wood@ivarch.com> 1.5.7-1
|
||||
- show KiB instead of incorrect kiB (Debian bug #706175)
|
||||
- (#1284) do not gzip man page, for non-Linux OSes (Bob Friesenhahn)
|
||||
- work around "awk" bug in tests/016-numeric-timer in decimal "," locales
|
||||
- fix "make rpm" and "make srpm", extend "make release" to sign releases
|
||||
|
||||
* Sun May 4 2014 Andrew Wood <andrew.wood@ivarch.com> 1.5.3-1
|
||||
- remove SPLICE_F_NONBLOCK to fix problem with slow splice() (Jan Seda)
|
||||
|
||||
* Mon Feb 10 2014 Andrew Wood <andrew.wood@ivarch.com> 1.5.2-1
|
||||
- allow "--watchfd" to look at block devices
|
||||
- let "--watchfd PID:FD" work with "--size N"
|
||||
- moved contributors out of the manual as the list was too long
|
||||
- (NB everyone is still listed in the README and always will be)
|
||||
|
||||
* Thu Jan 23 2014 Andrew Wood <andrew.wood@ivarch.com> 1.5.1-1
|
||||
- new option "--watchfd" - suggested by Jacek Wielemborek and "fdwatch"
|
||||
- use non-block flag with splice()
|
||||
- new display option "--buffer-percent", suggested by Kim Krecht
|
||||
- new display option "--last-written", suggested by Kim Krecht
|
||||
- new transfer option "--no-splice"
|
||||
- fix for minor bug which dropped display elements after one empty one
|
||||
- fix for single fd leak on exit (Cristian Ciupitu, Josh Stone)
|
||||
|
||||
* Mon Aug 5 2013 Andrew Wood <andrew.wood@ivarch.com> 1.4.12-1
|
||||
- new option "--null" - patch supplied by Zing Shishak
|
||||
- AIX build fix (add "-lc128") - with help from Pawel Piatek
|
||||
- AIX "-c" fixes - with help from Pawel Piatek
|
||||
- SCO build fix (po2table.sh) - reported by Wouter Pronk
|
||||
- test scripts fix for older distributions - patch from Bryan Dongray
|
||||
- fix for splice() not using stdin - patch from Zev Weiss
|
||||
|
||||
* Tue Jan 22 2013 Andrew Wood <andrew.wood@ivarch.com> 1.4.6-1
|
||||
- added patch from Pawel Piatek to omit O_NOFOLLOW in AIX
|
||||
|
||||
* Thu Jan 10 2013 Andrew Wood <andrew.wood@ivarch.com> 1.4.5-1
|
||||
- updated manual page to show known problem with "-R" on Cygwin
|
||||
|
||||
* Tue Dec 11 2012 Andrew Wood <andrew.wood@ivarch.com> 1.4.4-1
|
||||
- added debugging, see `pv -h' when configure run with "--enable-debugging"
|
||||
- rewrote cursor positioning code used when IPC is unavailable (Cygwin)
|
||||
- fixed cursor positioning cursor read answerback problem (Cygwin/Solaris)
|
||||
- fixed bug causing crash when progress displayed with too-small terminal
|
||||
|
||||
* Thu Dec 6 2012 Andrew Wood <andrew.wood@ivarch.com> 1.4.0-1
|
||||
- new option "--skip-errors" commissioned by Jim Salter
|
||||
- if stdout is a block device, and we don't know the total size, use the
|
||||
- size of that block device as the total (Peter Samuelson)
|
||||
- new option "--stop-at-size" to stop after "--size" bytes
|
||||
- report correct filename on read errors
|
||||
- fix use-after-free bug in remote PID cleanup code
|
||||
- refactored large chunks of code to make it more readable and to replace
|
||||
- most static variables with a state structure
|
||||
|
||||
* Mon Nov 5 2012 Andrew Wood <andrew.wood@ivarch.com> 1.3.9-1
|
||||
- allow "--format" parameters to be sent with "--remote"
|
||||
- configure option "--disable-ipc"
|
||||
- added tests for --numeric with --timer and --bytes
|
||||
- added tests for --remote
|
||||
|
||||
* Mon Oct 29 2012 Andrew Wood <andrew.wood@ivarch.com> 1.3.8-1
|
||||
- new "--pidfile" option to save process ID to a file
|
||||
- integrated patch for --numeric with --timer and --bytes (Sami Liedes)
|
||||
- removed signalling from --remote to prevent accidental process kills
|
||||
- new "--format" option (originally Vladimir Pal / Vladimir Ermakov)
|
||||
|
||||
* Wed Jun 27 2012 Andrew Wood <andrew.wood@ivarch.com> 1.3.4-1
|
||||
- new "--disable-splice" configure script option
|
||||
- fixed line mode size count with multiple files (Moritz Barsnick)
|
||||
- fixes for AIX core dumps (Pawel Piatek)
|
||||
|
||||
* Sat Jun 9 2012 Andrew Wood <andrew.wood@ivarch.com> 1.3.1-1
|
||||
- do not use splice() if the write buffer is not empty (Thomas Rachel)
|
||||
- added test 15 (pipe transfers), and new test script
|
||||
|
||||
* Tue Jun 5 2012 Andrew Wood <andrew.wood@ivarch.com> 1.3.0-1
|
||||
- added Tiger build patch from Olle Jonsson.
|
||||
- fix 1024-boundary display garble (Debian bug #586763).
|
||||
- use splice(2) where available (Debian bug #601683).
|
||||
- added known bugs section of the manual page.
|
||||
- fixed average rate test, 12 (Andrew Macheret).
|
||||
- use IEEE1541 units (Thomas Rachel).
|
||||
- bug with rate limit under 10 fixed (Henry Precheur).
|
||||
- speed up PV line mode (patch: Guillaume Marcais).
|
||||
- remove LD=ld from vars.mk to fix cross-compilation (paintitgray/PV#1291).
|
||||
|
||||
* Tue Dec 14 2010 Andrew Wood <andrew.wood@ivarch.com> 1.2.0-1
|
||||
- Integrated improved SI prefixes and --average-rate (Henry Gebhardt).
|
||||
- Return nonzero if exiting due to SIGTERM (Martin Baum).
|
||||
- Patch from Phil Rutschman to restore terminal properly on exit.
|
||||
- Fix i18n especially for --help (Sebastian Kayser).
|
||||
- Refactored pv_display.
|
||||
- We now have a coherent, documented, exit status.
|
||||
- Modified pipe test and new cksum test from Sebastian Kayser.
|
||||
- Default CFLAGS to just "-O" for non-GCC (Kjetil Torgrim Homme).
|
||||
- LFS compile fix for OS X 10.4 (Alexandre de Verteuil).
|
||||
- Remove DESTDIR / suffix (Sam Nelson, Daniel Pape).
|
||||
- Fixed potential NULL deref in transfer (Elias Pipping / LLVM/Clang).
|
||||
|
||||
* Thu Mar 6 2008 Andrew Wood <andrew.wood@ivarch.com> 1.1.4-1
|
||||
- Trap SIGINT/SIGHUP/SIGTERM so we clean up IPCs on exit (Laszlo Ersek).
|
||||
- Abort if numeric option, eg -L, has non-numeric value (Boris Lohner).
|
||||
- Compilation fixes for Darwin 9 and OS X.
|
||||
|
||||
* Thu Aug 30 2007 Andrew Wood <andrew.wood@ivarch.com> 1.1.0-1
|
||||
- New option "-R" to remotely control another @PACKAGE@ process.
|
||||
- New option "-l" to count lines instead of bytes.
|
||||
- Performance improvement for "-L" (rate) option.
|
||||
- Some Mac OS X fixes, and packaging cleanups.
|
||||
|
||||
* Sat Aug 4 2007 Andrew Wood <andrew.wood@ivarch.com> 1.0.1-1
|
||||
- Changed license from Artistic to Artistic 2.0.
|
||||
- Removed "--license" option.
|
||||
|
||||
* Thu Aug 2 2007 Andrew Wood <andrew.wood@ivarch.com> 1.0.0-1
|
||||
- We now act more like "cat" - just skip unreadable files, don't abort.
|
||||
- Various code cleanups were done.
|
||||
|
||||
* Mon Feb 5 2007 Andrew Wood <andrew.wood@ivarch.com> 0.9.9-1
|
||||
- New option "-B" to set the buffer size, and a workaround for problems
|
||||
- piping to dd(1).
|
||||
|
||||
* Mon Feb 27 2006 Andrew Wood <andrew.wood@ivarch.com>
|
||||
- Minor bugfixes, and on the final update, blank out the now-zero ETA.
|
||||
|
||||
* Thu Sep 1 2005 Andrew Wood <andrew.wood@ivarch.com>
|
||||
- Terminal locking now uses lockfiles if the terminal itself cannot be locked.
|
||||
|
||||
* Thu Jun 16 2005 Andrew Wood <andrew.wood@ivarch.com>
|
||||
- A minor problem with the spec file was fixed.
|
||||
|
||||
* Mon Nov 15 2004 Andrew Wood <andrew.wood@ivarch.com>
|
||||
- A minor bug in the NLS code was fixed.
|
||||
|
||||
* Sat Nov 6 2004 Andrew Wood <andrew.wood@ivarch.com>
|
||||
- Code cleanups and minor usability fixes.
|
||||
|
||||
* Tue Jun 29 2004 Andrew Wood <andrew.wood@ivarch.com>
|
||||
- A port of the terminal locking code to FreeBSD.
|
||||
|
||||
* Sun May 2 2004 Andrew Wood <andrew.wood@ivarch.com>
|
||||
- Major reliability improvements to the cursor positioning.
|
||||
|
||||
* Sat Apr 24 2004 Andrew Wood <andrew.wood@ivarch.com>
|
||||
- Rate and size parameters can now take suffixes such as "k", "m" etc.
|
||||
|
||||
* Mon Apr 19 2004 Andrew Wood <andrew.wood@ivarch.com>
|
||||
- A bug in the cursor positioning was fixed.
|
||||
|
||||
* Thu Feb 12 2004 Andrew Wood <andrew.wood@ivarch.com>
|
||||
- Code cleanups and portability fixes.
|
||||
|
||||
* Sun Feb 8 2004 Andrew Wood <andrew.wood@ivarch.com>
|
||||
- The display buffer is now dynamically allocated, fixing an overflow bug.
|
||||
|
||||
* Wed Jan 14 2004 Andrew Wood <andrew.wood@ivarch.com>
|
||||
- A minor bug triggered when installing the RPM was fixed.
|
||||
|
||||
* Mon Dec 22 2003 Andrew Wood <andrew.wood@ivarch.com>
|
||||
- Fixed a minor bug that occasionally reported "resource unavailable".
|
||||
|
||||
* Wed Aug 6 2003 Andrew Wood <andrew.wood@ivarch.com>
|
||||
- Block devices now have their size read correctly, so pv /dev/hda1 works
|
||||
- Minor code cleanups (mainly removal of CVS "Id" tags)
|
||||
|
||||
* Sun Aug 3 2003 Andrew Wood <andrew.wood@ivarch.com>
|
||||
- Doing ^Z then "bg" then "fg" now continues displaying
|
||||
|
||||
* Tue Jul 16 2002 Andrew Wood <andrew.wood@ivarch.com>
|
||||
- First draft of spec file created.
|
||||
+20
-8
@@ -1,32 +1,44 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Script to autogenerate the `configure' script, and rebuild the dependency
|
||||
# list.
|
||||
# Script to autogenerate the `configure' script, and the config header
|
||||
# template if `autoconf' is available, and then rebuild the dependency list.
|
||||
|
||||
set -e
|
||||
|
||||
cd `dirname $0`
|
||||
cd $(dirname $0)
|
||||
|
||||
cd autoconf
|
||||
autoconf configure.in > ../configure
|
||||
cd ..
|
||||
test -t 1 && echo "${0##*/}: running autoconf"
|
||||
autoconf autoconf/configure.in > configure
|
||||
chmod 755 configure
|
||||
|
||||
if command -v autoheader >/dev/null; then
|
||||
test -t 1 && echo "${0##*/}: running autoheader"
|
||||
autoheader autoconf/configure.in
|
||||
else
|
||||
test -t 1 && echo "${0##*/}: autoheader not found, skipping"
|
||||
fi
|
||||
|
||||
echo > autoconf/make/depend.mk~
|
||||
echo > autoconf/make/filelist.mk~
|
||||
echo > autoconf/make/modules.mk~
|
||||
|
||||
MAKE=make
|
||||
which gmake >/dev/null 2>&1 && MAKE=gmake
|
||||
command -v gmake >/dev/null 2>&1 && MAKE=gmake
|
||||
|
||||
rm -rf .gen
|
||||
mkdir .gen
|
||||
cd .gen
|
||||
|
||||
test -t 1 && echo "${0##*/}: running new \`configure' script"
|
||||
sh ../configure
|
||||
|
||||
test -t 1 && echo "${0##*/}: regenerating Makefile fragments"
|
||||
$MAKE make
|
||||
$MAKE dep
|
||||
|
||||
test -t 1 && echo "${0##*/}: cleaning up"
|
||||
cd ..
|
||||
rm -rf .gen
|
||||
rm -rf autoconf/autom4te.cache
|
||||
rm -rf autom4te.cache autoconf/autom4te.cache
|
||||
|
||||
# EOF
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Standard definitions to make use of the config.h values set by the
|
||||
* `configure' script. Include this after config.h and before anything
|
||||
* else.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#ifdef ENABLE_NLS
|
||||
# include "library/gettext.h"
|
||||
#else
|
||||
# define _(String) (String)
|
||||
# define N_(String) (String)
|
||||
#endif
|
||||
|
||||
#undef HAVE_IPC
|
||||
#ifdef HAVE_SYS_IPC_H
|
||||
#define HAVE_IPC 1
|
||||
#endif
|
||||
|
||||
#undef CURSOR_ANSWERBACK_BYTE_BY_BYTE
|
||||
#ifndef _AIX
|
||||
#define CURSOR_ANSWERBACK_BYTE_BY_BYTE 1
|
||||
#endif
|
||||
|
||||
/* Boolean type support */
|
||||
#undef HAVE_STDBOOL_H
|
||||
#ifdef HAVE_STDBOOL_H
|
||||
# include <stdbool.h>
|
||||
#else
|
||||
# ifndef HAVE__BOOL
|
||||
# ifdef __cplusplus
|
||||
typedef bool _Bool;
|
||||
# else
|
||||
# define _Bool signed char
|
||||
# endif
|
||||
# endif
|
||||
# define bool _Bool
|
||||
# define false 0
|
||||
# define true 1
|
||||
# define __bool_true_false_are_defined 1
|
||||
#endif
|
||||
|
||||
/* EOF */
|
||||
@@ -1,5 +1,9 @@
|
||||
/*
|
||||
* Replacement getopt function's header file. Include this AFTER config.h.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#ifndef _LIBRARY_GETOPT_H
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
* # define N_(String) (String)
|
||||
* #endif
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#ifndef _LIBRARY_GETTEXT_H
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
/*
|
||||
* Global program option structure and the parsing function prototype.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#ifndef _OPTIONS_H
|
||||
@@ -22,6 +26,7 @@ struct opts_s { /* structure describing run-time options */
|
||||
bool rate; /* rate counter flag */
|
||||
bool average_rate; /* average rate counter flag */
|
||||
bool bytes; /* bytes transferred flag */
|
||||
bool bits; /* report transfer size in bits */
|
||||
bool bufpercent; /* transfer buffer percentage flag */
|
||||
unsigned int lastwritten; /* show N bytes last written */
|
||||
bool force; /* force-if-not-terminal flag */
|
||||
@@ -38,10 +43,13 @@ struct opts_s { /* structure describing run-time options */
|
||||
bool no_splice; /* flag set if never to use splice */
|
||||
unsigned int skip_errors; /* skip read errors counter */
|
||||
bool stop_at_size; /* set if we stop at "size" bytes */
|
||||
bool sync_after_write; /* set if we sync after every write */
|
||||
bool direct_io; /* set if O_DIRECT is to be used */
|
||||
double interval; /* interval between updates */
|
||||
double delay_start; /* delay before first display */
|
||||
unsigned int watch_pid; /* process to watch fds of */
|
||||
int watch_fd; /* fd to watch */
|
||||
unsigned int average_rate_window; /* time window in seconds for average rate calculations */
|
||||
unsigned int width; /* screen width */
|
||||
unsigned int height; /* screen height */
|
||||
char *name; /* process name, if any */
|
||||
|
||||
+74
-30
@@ -1,18 +1,15 @@
|
||||
/*
|
||||
* Functions internal to the PV library.
|
||||
* Functions internal to the PV library. Include "config.h" first.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#ifndef _PV_INTERNAL_H
|
||||
#define _PV_INTERNAL_H 1
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#ifndef _PV_H
|
||||
#include "pv.h"
|
||||
#endif /* _PV_H */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/time.h>
|
||||
@@ -34,6 +31,7 @@ extern "C" {
|
||||
#define PV_DISPLAY_FINETA 512
|
||||
|
||||
#define RATE_GRANULARITY 100000 /* usec between -L rate chunks */
|
||||
#define RATE_BURST_WINDOW 5 /* rate burst window (multiples of rate) */
|
||||
#define REMOTE_INTERVAL 100000 /* usec between checks for -R */
|
||||
#define BUFFER_SIZE 409600 /* default transfer buffer size */
|
||||
#define BUFFER_SIZE_MAX 524288 /* max auto transfer buffer size */
|
||||
@@ -45,6 +43,33 @@ extern "C" {
|
||||
#define MAXIMISE_BUFFER_FILL 1
|
||||
|
||||
|
||||
typedef struct pvhistory {
|
||||
long long total_bytes;
|
||||
long double elapsed_sec;
|
||||
} pvhistory_t;
|
||||
|
||||
#define PV_SIZEOF_DEFAULT_FORMAT 512
|
||||
#define PV_SIZEOF_CWD 4096
|
||||
#define PV_SIZEOF_LASTOUTPUT_BUFFER 256
|
||||
#define PV_SIZEOF_STR_NAME 512
|
||||
#define PV_SIZEOF_STR_TRANSFERRED 128
|
||||
#define PV_SIZEOF_STR_BUFPERCENT 128
|
||||
#define PV_SIZEOF_STR_TIMER 128
|
||||
#define PV_SIZEOF_STR_RATE 128
|
||||
#define PV_SIZEOF_STR_AVERAGE_RATE 128
|
||||
#define PV_SIZEOF_STR_PROGRESS 1024
|
||||
#define PV_SIZEOF_STR_LASTOUTPUT 512
|
||||
#define PV_SIZEOF_STR_ETA 128
|
||||
#define PV_SIZEOF_STR_FINETA 128
|
||||
#define PV_FORMAT_ARRAY_MAX 100
|
||||
#define PV_SIZEOF_CRS_LOCK_FILE 1024
|
||||
|
||||
#define PV_SIZEOF_FILE_FDINFO 4096
|
||||
#define PV_SIZEOF_FILE_FD 4096
|
||||
#define PV_SIZEOF_FILE_FDPATH 4096
|
||||
#define PV_SIZEOF_DISPLAY_NAME 512
|
||||
|
||||
|
||||
/*
|
||||
* Structure for holding PV internal state. Opaque outside the PV library.
|
||||
*/
|
||||
@@ -63,10 +88,14 @@ struct pvstate_s {
|
||||
bool numeric; /* numeric output only */
|
||||
bool wait; /* wait for data before display */
|
||||
bool linemode; /* count lines instead of bytes */
|
||||
bool bits; /* report bits instead of bytes */
|
||||
bool null; /* lines are null-terminated */
|
||||
bool no_op; /* do nothing other than pipe data */
|
||||
unsigned int skip_errors; /* skip read errors counter */
|
||||
bool stop_at_size; /* set if we stop at "size" bytes */
|
||||
bool sync_after_write; /* set if we sync after every write */
|
||||
bool direct_io; /* set if O_DIRECT is to be used */
|
||||
bool direct_io_changed; /* set when direct_io is changed */
|
||||
bool no_splice; /* never use splice() */
|
||||
unsigned long long rate_limit; /* rate limit, in bytes per second */
|
||||
unsigned long long target_buffer_size; /* buffer size (0=default) */
|
||||
@@ -78,13 +107,14 @@ struct pvstate_s {
|
||||
unsigned int width; /* screen width */
|
||||
unsigned int height; /* screen height */
|
||||
const char *name; /* display name */
|
||||
char default_format[512]; /* default format string */
|
||||
char default_format[PV_SIZEOF_DEFAULT_FORMAT]; /* default format string */
|
||||
const char *format_string; /* output format string */
|
||||
|
||||
/******************
|
||||
* Program status *
|
||||
******************/
|
||||
const char *program_name; /* program name for error reporting */
|
||||
char cwd[PV_SIZEOF_CWD]; /* current working directory for relative path */
|
||||
const char *current_file; /* current file being read */
|
||||
int exit_status; /* exit status to give (0=OK) */
|
||||
|
||||
@@ -113,28 +143,37 @@ struct pvstate_s {
|
||||
long double prev_elapsed_sec;
|
||||
long double prev_rate;
|
||||
long double prev_trans;
|
||||
|
||||
/* Keep track of progress over last intervals to compute current average rate. */
|
||||
pvhistory_t *history; /* state at previous intervals (circular buffer) */
|
||||
int history_len; /* total size */
|
||||
int history_interval; /* seconds between each history entry */
|
||||
int history_first;
|
||||
int history_last;
|
||||
long double current_avg_rate; /* current average rate over last history intervals */
|
||||
|
||||
unsigned long long initial_offset;
|
||||
char *display_buffer;
|
||||
long display_buffer_size;
|
||||
int lastoutput_length; /* number of last-output bytes to show */
|
||||
unsigned char lastoutput_buffer[256];
|
||||
unsigned char lastoutput_buffer[PV_SIZEOF_LASTOUTPUT_BUFFER];
|
||||
int prev_width; /* screen width last time we were called */
|
||||
int prev_length; /* length of last string we output */
|
||||
char str_name[512];
|
||||
char str_transferred[128];
|
||||
char str_bufpercent[128];
|
||||
char str_timer[128];
|
||||
char str_rate[128];
|
||||
char str_average_rate[128];
|
||||
char str_progress[1024];
|
||||
char str_lastoutput[512];
|
||||
char str_eta[128];
|
||||
char str_fineta[128];
|
||||
char str_name[PV_SIZEOF_STR_NAME];
|
||||
char str_transferred[PV_SIZEOF_STR_TRANSFERRED];
|
||||
char str_bufpercent[PV_SIZEOF_STR_BUFPERCENT];
|
||||
char str_timer[PV_SIZEOF_STR_TIMER];
|
||||
char str_rate[PV_SIZEOF_STR_RATE];
|
||||
char str_average_rate[PV_SIZEOF_STR_AVERAGE_RATE];
|
||||
char str_progress[PV_SIZEOF_STR_PROGRESS];
|
||||
char str_lastoutput[PV_SIZEOF_STR_LASTOUTPUT];
|
||||
char str_eta[PV_SIZEOF_STR_ETA];
|
||||
char str_fineta[PV_SIZEOF_STR_FINETA];
|
||||
unsigned long components_used; /* bitmask of components used */
|
||||
struct {
|
||||
const char *string;
|
||||
int length;
|
||||
} format[100];
|
||||
} format[PV_FORMAT_ARRAY_MAX];
|
||||
bool display_visible; /* set once anything written to terminal */
|
||||
|
||||
/********************
|
||||
@@ -151,7 +190,7 @@ struct pvstate_s {
|
||||
bool crs_noipc; /* set if we can't use IPC */
|
||||
#endif /* HAVE_IPC */
|
||||
int crs_lock_fd; /* fd of lockfile, -1 if none open */
|
||||
char crs_lock_file[1024];
|
||||
char crs_lock_file[PV_SIZEOF_CRS_LOCK_FILE];
|
||||
int crs_y_start; /* our initial Y coordinate */
|
||||
|
||||
/*******************
|
||||
@@ -212,12 +251,15 @@ struct pvstate_s {
|
||||
struct pvwatchfd_s {
|
||||
unsigned int watch_pid; /* PID to watch */
|
||||
int watch_fd; /* fd to watch, -1 = not displayed */
|
||||
char file_fdinfo[4096]; /* path to /proc fdinfo file */
|
||||
char file_fd[4096]; /* path to /proc fd symlink */
|
||||
char file_fdpath[4096]; /* path to file that was opened */
|
||||
char display_name[512]; /* name to show on progress bar */
|
||||
struct stat64 sb_fd; /* stat of fd symlink */
|
||||
struct stat64 sb_fd_link; /* lstat of fd symlink */
|
||||
#ifdef __APPLE__
|
||||
#else
|
||||
char file_fdinfo[PV_SIZEOF_FILE_FDINFO]; /* path to /proc fdinfo file */
|
||||
char file_fd[PV_SIZEOF_FILE_FD]; /* path to /proc fd symlink */
|
||||
#endif
|
||||
char file_fdpath[PV_SIZEOF_FILE_FDPATH]; /* path to file that was opened */
|
||||
char display_name[PV_SIZEOF_DISPLAY_NAME]; /* name to show on progress bar */
|
||||
struct stat sb_fd; /* stat of fd symlink */
|
||||
struct stat sb_fd_link; /* lstat of fd symlink */
|
||||
unsigned long long size; /* size of whole file, 0 if unknown */
|
||||
long long position; /* position last seen at */
|
||||
struct timeval start_time; /* time we started watching the fd */
|
||||
@@ -232,9 +274,11 @@ long pv_transfer(pvstate_t, int, int *, int *, unsigned long long, long *);
|
||||
void pv_set_buffer_size(unsigned long long, int);
|
||||
int pv_next_file(pvstate_t, int, int);
|
||||
|
||||
void pv_write_retry(int, const char *, size_t);
|
||||
|
||||
void pv_crs_fini(pvstate_t);
|
||||
void pv_crs_init(pvstate_t);
|
||||
void pv_crs_update(pvstate_t, char *);
|
||||
void pv_crs_update(pvstate_t, const char *);
|
||||
#ifdef HAVE_IPC
|
||||
void pv_crs_needreinit(pvstate_t);
|
||||
#endif
|
||||
|
||||
+28
-1
@@ -1,10 +1,16 @@
|
||||
/*
|
||||
* Functions used across the program.
|
||||
* Functions used across the program. Include "config.h" first.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#ifndef _PV_H
|
||||
#define _PV_H 1
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -49,6 +55,23 @@ extern unsigned long long pv_getnum_ull(const char *);
|
||||
*/
|
||||
extern int pv_getnum_check(const char *, pv_numtype_t);
|
||||
|
||||
/*
|
||||
* String handling wrappers.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Wrapper for sprintf(), falling back to sprintf() on systems without that
|
||||
* function.
|
||||
*/
|
||||
extern int pv_snprintf(char *, size_t, const char *, ...);
|
||||
|
||||
/*
|
||||
* Implementation of strlcat() where it is unavailable: append a string to a
|
||||
* buffer, constraining the buffer to a particular size and ensuring
|
||||
* termination with '\0'.
|
||||
*/
|
||||
extern size_t pv_strlcat(char *, const char *, size_t);
|
||||
|
||||
/*
|
||||
* Main PV functions.
|
||||
*/
|
||||
@@ -78,10 +101,13 @@ extern void pv_state_numeric_set(pvstate_t, bool);
|
||||
extern void pv_state_wait_set(pvstate_t, bool);
|
||||
extern void pv_state_delay_start_set(pvstate_t, double);
|
||||
extern void pv_state_linemode_set(pvstate_t, bool);
|
||||
extern void pv_state_bits_set(pvstate_t, bool);
|
||||
extern void pv_state_null_set(pvstate_t, bool);
|
||||
extern void pv_state_no_op_set(pvstate_t, bool);
|
||||
extern void pv_state_skip_errors_set(pvstate_t, unsigned int);
|
||||
extern void pv_state_stop_at_size_set(pvstate_t, bool);
|
||||
extern void pv_state_sync_after_write_set(pvstate_t, bool);
|
||||
extern void pv_state_direct_io_set(pvstate_t, bool);
|
||||
extern void pv_state_rate_limit_set(pvstate_t, unsigned long long);
|
||||
extern void pv_state_target_buffer_size_set(pvstate_t, unsigned long long);
|
||||
extern void pv_state_no_splice_set(pvstate_t, bool);
|
||||
@@ -93,6 +119,7 @@ extern void pv_state_name_set(pvstate_t, const char *);
|
||||
extern void pv_state_format_string_set(pvstate_t, const char *);
|
||||
extern void pv_state_watch_pid_set(pvstate_t, unsigned int);
|
||||
extern void pv_state_watch_fd_set(pvstate_t, int);
|
||||
extern void pv_state_average_rate_window_set(pvstate_t, int);
|
||||
|
||||
extern void pv_state_inputfiles(pvstate_t, int, const char **);
|
||||
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
/*
|
||||
* Small reimplementation of getopt().
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
* returns a struct msg_table_s[] of msgid and msgstr pairs, with the end
|
||||
* of the table being marked by a NULL msgid. The po2table.sh script will do
|
||||
* this.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
+4
-2
@@ -1,10 +1,12 @@
|
||||
/*
|
||||
* Output debugging information.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#include "pv.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
+24
-16
@@ -1,18 +1,18 @@
|
||||
/*
|
||||
* Output command-line help to stdout.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "pv.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#define N_(String) (String)
|
||||
|
||||
struct optdesc_s {
|
||||
char *optshort;
|
||||
char *optlong;
|
||||
@@ -40,8 +40,13 @@ void display_help(void)
|
||||
N_("show data transfer rate counter")},
|
||||
{"-a", "--average-rate", 0,
|
||||
N_("show data transfer average rate counter")},
|
||||
{"-m", "--average-rate-window", N_("SEC"),
|
||||
N_
|
||||
("compute average rate over past SEC seconds (default 30s)")},
|
||||
{"-b", "--bytes", 0,
|
||||
N_("show number of bytes transferred")},
|
||||
{"-8", "--bits", 0,
|
||||
N_("show number of bits transferred")},
|
||||
{"-T", "--buffer-percent", 0,
|
||||
N_("show percentage of transfer buffer in use")},
|
||||
{"-A", "--last-written", _("NUM"),
|
||||
@@ -86,6 +91,10 @@ void display_help(void)
|
||||
N_("skip read errors in input")},
|
||||
{"-S", "--stop-at-size", 0,
|
||||
N_("stop after --size bytes have been transferred")},
|
||||
{"-Y", "--sync", 0,
|
||||
N_("flush cache to disk after every write")},
|
||||
{"-K", "--direct-io", 0,
|
||||
N_("use direct I/O to bypass cache")},
|
||||
#ifdef HAVE_IPC
|
||||
{"-R", "--remote", N_("PID"),
|
||||
N_("update settings of process PID")},
|
||||
@@ -105,6 +114,7 @@ void display_help(void)
|
||||
};
|
||||
unsigned int i, col1max = 0, tw = 77;
|
||||
char *optbuf;
|
||||
size_t optbuf_size;
|
||||
|
||||
printf(_("Usage: %s [OPTION] [FILE]..."), PROGRAM_NAME);
|
||||
printf("\n%s\n\n",
|
||||
@@ -134,7 +144,8 @@ void display_help(void)
|
||||
|
||||
col1max++;
|
||||
|
||||
optbuf = malloc((size_t) (col1max + 16));
|
||||
optbuf_size = 16 + col1max;
|
||||
optbuf = malloc(optbuf_size);
|
||||
if (NULL == optbuf) {
|
||||
fprintf(stderr, "%s: %s\n", PROGRAM_NAME, strerror(errno));
|
||||
exit(EXIT_FAILURE);
|
||||
@@ -158,19 +169,16 @@ void display_help(void)
|
||||
if (description)
|
||||
description = _(description);
|
||||
|
||||
#ifdef HAVE_SNPRINTF
|
||||
(void) snprintf(optbuf, (size_t) (col1max + 15),
|
||||
"%s%s%s%s%s", optlist[i].optshort,
|
||||
#else
|
||||
sprintf(optbuf, "%s%s%s%s%s", optlist[i].optshort,
|
||||
#endif
|
||||
(void) pv_snprintf(optbuf, optbuf_size, "%s%s%s%s%s",
|
||||
optlist[i].optshort,
|
||||
#ifdef HAVE_GETOPT_LONG
|
||||
optlist[i].optlong ? ", " : "",
|
||||
optlist[i].optlong ? optlist[i].optlong : "",
|
||||
optlist[i].optlong ? ", " : "",
|
||||
optlist[i].
|
||||
optlong ? optlist[i].optlong : "",
|
||||
#else
|
||||
"", "",
|
||||
"", "",
|
||||
#endif
|
||||
param ? " " : "", param ? param : "");
|
||||
param ? " " : "", param ? param : "");
|
||||
|
||||
printf(" %-*s ", (int) (col1max - 2), optbuf);
|
||||
|
||||
|
||||
+8
-2
@@ -1,11 +1,13 @@
|
||||
/*
|
||||
* Main program entry point - read the command line options, then perform
|
||||
* the appropriate actions.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#include "options.h"
|
||||
#include "pv.h"
|
||||
|
||||
@@ -195,9 +197,12 @@ int main(int argc, char **argv)
|
||||
pv_state_wait_set(state, opts->wait);
|
||||
pv_state_delay_start_set(state, opts->delay_start);
|
||||
pv_state_linemode_set(state, opts->linemode);
|
||||
pv_state_bits_set(state, opts->bits);
|
||||
pv_state_null_set(state, opts->null);
|
||||
pv_state_skip_errors_set(state, opts->skip_errors);
|
||||
pv_state_stop_at_size_set(state, opts->stop_at_size);
|
||||
pv_state_sync_after_write_set(state, opts->sync_after_write);
|
||||
pv_state_direct_io_set(state, opts->direct_io);
|
||||
pv_state_rate_limit_set(state, opts->rate_limit);
|
||||
pv_state_target_buffer_size_set(state, opts->buffer_size);
|
||||
pv_state_no_splice_set(state, opts->no_splice);
|
||||
@@ -206,6 +211,7 @@ int main(int argc, char **argv)
|
||||
pv_state_format_string_set(state, opts->format);
|
||||
pv_state_watch_pid_set(state, opts->watch_pid);
|
||||
pv_state_watch_fd_set(state, opts->watch_fd);
|
||||
pv_state_average_rate_window_set(state, opts->average_rate_window);
|
||||
|
||||
pv_state_set_format(state, opts->progress, opts->timer, opts->eta,
|
||||
opts->fineta, opts->rate, opts->average_rate,
|
||||
|
||||
+56
-5
@@ -1,18 +1,22 @@
|
||||
/*
|
||||
* Parse command-line options.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#include "options.h"
|
||||
#include "library/getopt.h"
|
||||
#include "pv.h"
|
||||
#include "pv-internal.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
@@ -56,6 +60,7 @@ opts_t opts_parse(int argc, char **argv)
|
||||
{"rate", 0, NULL, (int) 'r'},
|
||||
{"average-rate", 0, NULL, (int) 'a'},
|
||||
{"bytes", 0, NULL, (int) 'b'},
|
||||
{"bits", 0, NULL, (int) '8'},
|
||||
{"buffer-percent", 0, NULL, (int) 'T'},
|
||||
{"last-written", 1, NULL, (int) 'A'},
|
||||
{"force", 0, NULL, (int) 'f'},
|
||||
@@ -77,15 +82,18 @@ opts_t opts_parse(int argc, char **argv)
|
||||
{"no-splice", 0, NULL, (int) 'C'},
|
||||
{"skip-errors", 0, NULL, (int) 'E'},
|
||||
{"stop-at-size", 0, NULL, (int) 'S'},
|
||||
{"sync", 0, NULL, (int) 'Y'},
|
||||
{"direct-io", 0, NULL, (int) 'K'},
|
||||
{"remote", 1, NULL, (int) 'R'},
|
||||
{"pidfile", 1, NULL, (int) 'P'},
|
||||
{"watchfd", 1, NULL, (int) 'd'},
|
||||
{"average-rate-window", 1, NULL, (int) 'm'},
|
||||
{NULL, 0, NULL, 0}
|
||||
};
|
||||
int option_index = 0;
|
||||
#endif
|
||||
char *short_options =
|
||||
"hVpteIrabTA:fnqcWD:s:l0i:w:H:N:F:L:B:CESR:P:d:";
|
||||
"hVpteIrab8TA:fnqcWD:s:l0i:w:H:N:F:L:B:CESYKR:P:d:m:";
|
||||
int c, numopts;
|
||||
unsigned int check_pid;
|
||||
int check_fd;
|
||||
@@ -121,6 +129,7 @@ opts_t opts_parse(int argc, char **argv)
|
||||
opts->delay_start = 0;
|
||||
opts->watch_pid = 0;
|
||||
opts->watch_fd = -1;
|
||||
opts->average_rate_window = 30;
|
||||
|
||||
do {
|
||||
#ifdef HAVE_GETOPT_LONG
|
||||
@@ -138,12 +147,17 @@ opts_t opts_parse(int argc, char **argv)
|
||||
*/
|
||||
switch (c) {
|
||||
case 's':
|
||||
/* "-s @" is valid, so allow it. */
|
||||
if ('@' == *optarg)
|
||||
break;
|
||||
/* falls through */
|
||||
case 'A':
|
||||
case 'w':
|
||||
case 'H':
|
||||
case 'L':
|
||||
case 'B':
|
||||
case 'R':
|
||||
case 'm':
|
||||
if (pv_getnum_check(optarg, PV_NUMTYPE_INTEGER) !=
|
||||
0) {
|
||||
fprintf(stderr, "%s: -%c: %s\n",
|
||||
@@ -226,6 +240,11 @@ opts_t opts_parse(int argc, char **argv)
|
||||
opts->bytes = true;
|
||||
numopts++;
|
||||
break;
|
||||
case '8':
|
||||
opts->bytes = true;
|
||||
opts->bits = true;
|
||||
numopts++;
|
||||
break;
|
||||
case 'T':
|
||||
opts->bufpercent = true;
|
||||
numopts++;
|
||||
@@ -257,7 +276,29 @@ opts_t opts_parse(int argc, char **argv)
|
||||
opts->delay_start = pv_getnum_d(optarg);
|
||||
break;
|
||||
case 's':
|
||||
opts->size = pv_getnum_ull(optarg);
|
||||
/* Permit "@<filename>" as well as just a number. */
|
||||
if ('@' == *optarg) {
|
||||
const char *size_file = 1 + optarg;
|
||||
struct stat sb;
|
||||
int rc;
|
||||
|
||||
rc = 0;
|
||||
memset(&sb, 0, sizeof(sb));
|
||||
rc = stat(size_file, &sb);
|
||||
if (0 == rc) {
|
||||
opts->size = sb.st_size;
|
||||
} else {
|
||||
fprintf(stderr, "%s: %s %s: %s\n",
|
||||
opts->program_name,
|
||||
_("failed to stat file"),
|
||||
size_file,
|
||||
strerror(errno));
|
||||
opts_free(opts);
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
opts->size = pv_getnum_ull(optarg);
|
||||
}
|
||||
break;
|
||||
case 'l':
|
||||
opts->linemode = true;
|
||||
@@ -294,6 +335,12 @@ opts_t opts_parse(int argc, char **argv)
|
||||
case 'S':
|
||||
opts->stop_at_size = true;
|
||||
break;
|
||||
case 'Y':
|
||||
opts->sync_after_write = true;
|
||||
break;
|
||||
case 'K':
|
||||
opts->direct_io = true;
|
||||
break;
|
||||
case 'R':
|
||||
opts->remote = pv_getnum_ui(optarg);
|
||||
break;
|
||||
@@ -310,6 +357,9 @@ opts_t opts_parse(int argc, char **argv)
|
||||
(void) sscanf(optarg, "%u:%d", &(opts->watch_pid),
|
||||
&(opts->watch_fd));
|
||||
break;
|
||||
case 'm':
|
||||
opts->average_rate_window = pv_getnum_ui(optarg);
|
||||
break;
|
||||
default:
|
||||
#ifdef HAVE_GETOPT_LONG
|
||||
fprintf(stderr,
|
||||
@@ -361,7 +411,7 @@ opts_t opts_parse(int argc, char **argv)
|
||||
opts_free(opts);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifndef __APPLE__
|
||||
if (0 != access("/proc/self/fdinfo", X_OK)) {
|
||||
fprintf(stderr, "%s: -d: %s\n", opts->program_name,
|
||||
_
|
||||
@@ -369,6 +419,7 @@ opts_t opts_parse(int argc, char **argv)
|
||||
opts_free(opts);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+4
-2
@@ -1,10 +1,12 @@
|
||||
/*
|
||||
* Remote-control functions.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#include "options.h"
|
||||
#include "pv.h"
|
||||
|
||||
|
||||
+19
-19
@@ -1,34 +1,34 @@
|
||||
/*
|
||||
* Output version information to stdout.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
/*
|
||||
* Display current package version.
|
||||
* Display current package version as per GNU standards.
|
||||
*/
|
||||
void display_version(void)
|
||||
{
|
||||
printf(_("%s %s - Copyright %s %s"),
|
||||
PROGRAM_NAME, VERSION, COPYRIGHT_YEAR, COPYRIGHT_HOLDER);
|
||||
printf("\n\n");
|
||||
printf(_("Web site: %s"), PROJECT_HOMEPAGE);
|
||||
printf("\n\n");
|
||||
printf("%s",
|
||||
_("This program is free software, and is being distributed "
|
||||
"under the\nterms of the Artistic License 2.0."));
|
||||
printf("\n\n");
|
||||
printf("%s",
|
||||
/* GNU standard first line format: program and version only */
|
||||
printf("%s %s\n", PROGRAM_NAME, VERSION);
|
||||
/* GNU standard second line format - "Copyright" always in English */
|
||||
printf("Copyright %s %s\n", COPYRIGHT_YEAR, COPYRIGHT_HOLDER);
|
||||
/* GNU standard license line and free software notice */
|
||||
printf("%s\n",
|
||||
_
|
||||
("This program is distributed in the hope that it will be useful,\n"
|
||||
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
|
||||
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."));
|
||||
printf("\n\n");
|
||||
("License: Artistic v2.0 <https://opensource.org/license/artistic-2-0/>"));
|
||||
printf("%s\n",
|
||||
_
|
||||
("This is free software: you are free to change and redistribute it."));
|
||||
printf("%s\n",
|
||||
_("There is NO WARRANTY, to the extent permitted by law."));
|
||||
/* Project web site link */
|
||||
printf("\n%s: <%s>\n", _("Project web site"), PROJECT_HOMEPAGE);
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
||||
+194
-171
@@ -1,7 +1,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-09-05 19:25+0100\n"
|
||||
"POT-Creation-Date: 2023-07-17 21:52+0100\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Date: 1999-06-01 15:18:29+0100\n"
|
||||
"From: Andrew Wood <ivarch@ubik>\n"
|
||||
@@ -35,34 +35,6 @@ msgstr "Sperrversuch fehlgeschlagen"
|
||||
msgid "failed to open terminal"
|
||||
msgstr "Terminal konnte nicht geöffnet werden"
|
||||
|
||||
#: src/pv/display.c:138
|
||||
msgid "yzafpnum kMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:143
|
||||
msgid "yzafpnum KMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:558 src/pv/transfer.c:679
|
||||
msgid "buffer allocation failed"
|
||||
msgstr "Puffer konnte nicht allokiert werden"
|
||||
|
||||
#: src/pv/display.c:618 src/pv/transfer.c:458
|
||||
msgid "B"
|
||||
msgstr "B"
|
||||
|
||||
#: src/pv/display.c:654 src/pv/display.c:662
|
||||
msgid "/s"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:654 src/pv/display.c:662
|
||||
msgid "B/s"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:697 src/pv/display.c:702 src/pv/display.c:764
|
||||
msgid "ETA"
|
||||
msgstr "ETA"
|
||||
|
||||
#: src/pv/file.c:119
|
||||
msgid "failed to seek to start of output"
|
||||
msgstr "Konnte nicht versuchen, die Ausgabe zu starten"
|
||||
@@ -75,7 +47,7 @@ msgstr "Datei konnte nicht geschlossen werden"
|
||||
msgid "failed to read file"
|
||||
msgstr "Datei konnte nicht gelesen werden"
|
||||
|
||||
#: src/pv/file.c:248
|
||||
#: src/pv/file.c:248 src/main/options.c:288
|
||||
msgid "failed to stat file"
|
||||
msgstr "Dateiinformationen konnten nicht gelesen werden"
|
||||
|
||||
@@ -87,15 +59,14 @@ msgstr "Dateiinformationen für Ausgabe-Datei konnten nicht gelesen werden"
|
||||
msgid "input file is output file"
|
||||
msgstr "Eingabe-Datei ist Ausgabe-Datei"
|
||||
|
||||
#: src/pv/loop.c:520 src/pv/loop.c:590 src/pv/loop.c:642 src/pv/watchpid.c:51
|
||||
#: src/pv/watchpid.c:74 src/pv/watchpid.c:84 src/pv/watchpid.c:115
|
||||
#: src/pv/loop.c:527 src/pv/loop.c:597 src/pv/loop.c:649 src/pv/watchpid.c:68
|
||||
#: src/pv/watchpid.c:79 src/pv/watchpid.c:93 src/pv/watchpid.c:104
|
||||
#: src/pv/watchpid.c:145 src/pv/watchpid.c:168 src/pv/watchpid.c:178
|
||||
#: src/pv/watchpid.c:192 src/pv/watchpid.c:285 src/pv/watchpid.c:294
|
||||
#: src/pv/watchpid.c:332 src/pv/watchpid.c:349
|
||||
msgid "pid"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/state.c:33
|
||||
msgid "none"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:341
|
||||
msgid "read failed"
|
||||
msgstr "read-Aufruf fehlgeschlagen"
|
||||
@@ -116,19 +87,64 @@ msgstr "konnte den Fehler nicht überwinden"
|
||||
msgid "skipped past read error"
|
||||
msgstr "über den Lesefehler hinaus verschoben"
|
||||
|
||||
#: src/pv/transfer.c:458 src/pv/display.c:687
|
||||
msgid "B"
|
||||
msgstr "B"
|
||||
|
||||
#: src/pv/transfer.c:631
|
||||
msgid "write failed"
|
||||
msgstr "write-Aufruf fehlgeschlagen"
|
||||
|
||||
#: src/pv/transfer.c:679 src/pv/display.c:618
|
||||
msgid "buffer allocation failed"
|
||||
msgstr "Puffer konnte nicht allokiert werden"
|
||||
|
||||
#: src/pv/transfer.c:770
|
||||
msgid "select call failed"
|
||||
msgstr "select-Aufruf fehlgeschlagen"
|
||||
|
||||
#: src/pv/watchpid.c:76 src/pv/watchpid.c:86 src/pv/watchpid.c:117
|
||||
#: src/pv/state.c:25
|
||||
msgid "history structure allocation failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/state.c:55
|
||||
msgid "none"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:151
|
||||
msgid "yzafpnum kMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:156
|
||||
msgid "yzafpnum KMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:683
|
||||
msgid "b"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:738 src/pv/display.c:752
|
||||
msgid "b/s"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:742 src/pv/display.c:757
|
||||
msgid "/s"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:742 src/pv/display.c:758
|
||||
msgid "B/s"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:793 src/pv/display.c:798 src/pv/display.c:860
|
||||
msgid "ETA"
|
||||
msgstr "ETA"
|
||||
|
||||
#: src/pv/watchpid.c:81 src/pv/watchpid.c:95 src/pv/watchpid.c:106
|
||||
#: src/pv/watchpid.c:170 src/pv/watchpid.c:180 src/pv/watchpid.c:194
|
||||
msgid "fd"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/watchpid.c:120
|
||||
#: src/pv/watchpid.c:109 src/pv/watchpid.c:197
|
||||
msgid "not a regular file or block device"
|
||||
msgstr "keine normale Datei oder Blockgerät"
|
||||
|
||||
@@ -185,169 +201,177 @@ msgstr "zeige die Datentransferrate an"
|
||||
msgid "show data transfer average rate counter"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:44
|
||||
msgid "show number of bytes transferred"
|
||||
msgstr "zeige die Anzahl von Bytes, die transferiert worden sind"
|
||||
|
||||
#: src/main/help.c:46
|
||||
msgid "show percentage of transfer buffer in use"
|
||||
msgstr "zeige, wie viel Prozent des Übertragungsbuffers in Benutzung sind"
|
||||
|
||||
#: src/main/help.c:47
|
||||
msgid "NUM"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:48
|
||||
msgid "show NUM bytes last written"
|
||||
msgstr "NUM zeige die zuletzt geschriebenen NUM Bytes"
|
||||
|
||||
#: src/main/help.c:49
|
||||
msgid "FORMAT"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:50
|
||||
msgid "set output format to FORMAT"
|
||||
msgstr "setze das Ausgabeformat auf FORMAT"
|
||||
|
||||
#: src/main/help.c:52
|
||||
msgid "output percentages, not visual information"
|
||||
msgstr "Ausgabe von Prozent-Angaben statt visueller Darstellung"
|
||||
|
||||
#: src/main/help.c:54
|
||||
msgid "do not output any transfer information at all"
|
||||
msgstr "sämtliche Transferinformationen unterdrücken"
|
||||
|
||||
#: src/main/help.c:57
|
||||
msgid "display nothing until first byte transferred"
|
||||
msgstr "keine Ausgabe bevor das erste Byte übertragen wurde"
|
||||
|
||||
#: src/main/help.c:58 src/main/help.c:66
|
||||
#: src/main/help.c:43 src/main/help.c:63 src/main/help.c:71
|
||||
msgid "SEC"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:45
|
||||
msgid "compute average rate over past SEC seconds (default 30s)"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:47
|
||||
msgid "show number of bytes transferred"
|
||||
msgstr "zeige die Anzahl von Bytes, die transferiert worden sind"
|
||||
|
||||
#: src/main/help.c:49
|
||||
msgid "show number of bits transferred"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:51
|
||||
msgid "show percentage of transfer buffer in use"
|
||||
msgstr "zeige, wie viel Prozent des Übertragungsbuffers in Benutzung sind"
|
||||
|
||||
#: src/main/help.c:52
|
||||
msgid "NUM"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:53
|
||||
msgid "show NUM bytes last written"
|
||||
msgstr "NUM zeige die zuletzt geschriebenen NUM Bytes"
|
||||
|
||||
#: src/main/help.c:54
|
||||
msgid "FORMAT"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:55
|
||||
msgid "set output format to FORMAT"
|
||||
msgstr "setze das Ausgabeformat auf FORMAT"
|
||||
|
||||
#: src/main/help.c:57
|
||||
msgid "output percentages, not visual information"
|
||||
msgstr "Ausgabe von Prozent-Angaben statt visueller Darstellung"
|
||||
|
||||
#: src/main/help.c:59
|
||||
msgid "do not output any transfer information at all"
|
||||
msgstr "sämtliche Transferinformationen unterdrücken"
|
||||
|
||||
#: src/main/help.c:62
|
||||
msgid "display nothing until first byte transferred"
|
||||
msgstr "keine Ausgabe bevor das erste Byte übertragen wurde"
|
||||
|
||||
#: src/main/help.c:64
|
||||
msgid "display nothing until SEC seconds have passed"
|
||||
msgstr "SEC nichts anzeigen, bis SEC Sekunden vergangen sind"
|
||||
|
||||
#: src/main/help.c:60
|
||||
#: src/main/help.c:65
|
||||
msgid "SIZE"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:61
|
||||
#: src/main/help.c:66
|
||||
msgid "set estimated data size to SIZE bytes"
|
||||
msgstr "setze erwartete Datenlänge auf SIZE Byte"
|
||||
|
||||
#: src/main/help.c:63
|
||||
#: src/main/help.c:68
|
||||
msgid "count lines instead of bytes"
|
||||
msgstr "zähle Zeilen anstelle von Bytes"
|
||||
|
||||
#: src/main/help.c:65
|
||||
#: src/main/help.c:70
|
||||
msgid "lines are null-terminated"
|
||||
msgstr "Zeilen sind nullterminiert"
|
||||
|
||||
#: src/main/help.c:67
|
||||
#: src/main/help.c:72
|
||||
msgid "update every SEC seconds"
|
||||
msgstr "aktualisiere Ausgabe nach SEC Sekunden Intervall"
|
||||
|
||||
#: src/main/help.c:68
|
||||
#: src/main/help.c:73
|
||||
msgid "WIDTH"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:69
|
||||
#: src/main/help.c:74
|
||||
msgid "assume terminal is WIDTH characters wide"
|
||||
msgstr "setze Terminal-Breite auf WIDTH Zeichen"
|
||||
|
||||
#: src/main/help.c:70
|
||||
#: src/main/help.c:75
|
||||
msgid "HEIGHT"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:71
|
||||
#: src/main/help.c:76
|
||||
msgid "assume terminal is HEIGHT rows high"
|
||||
msgstr "setze Terminal-Höhe auf HEIGHT Zeichen"
|
||||
|
||||
#: src/main/help.c:72
|
||||
#: src/main/help.c:77
|
||||
msgid "NAME"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:73
|
||||
#: src/main/help.c:78
|
||||
msgid "prefix visual information with NAME"
|
||||
msgstr "setze den NAMEn für visuelle Darstellung"
|
||||
|
||||
#: src/main/help.c:75
|
||||
#: src/main/help.c:80
|
||||
msgid "output even if standard error is not a terminal"
|
||||
msgstr ""
|
||||
"Ausgabe auch dann erzwingen, wenn der Fehlerausgabe-Kanal kein Terminal ist"
|
||||
|
||||
#: src/main/help.c:77
|
||||
#: src/main/help.c:82
|
||||
msgid "use cursor positioning escape sequences"
|
||||
msgstr "benutze Escape-Sequenzen zur Cursor-Positionierung"
|
||||
|
||||
#: src/main/help.c:79
|
||||
#: src/main/help.c:84
|
||||
msgid "RATE"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:80
|
||||
#: src/main/help.c:85
|
||||
msgid "limit transfer to RATE bytes per second"
|
||||
msgstr "beschränke die Transferrate auf RATE Byte pro Sekunde"
|
||||
|
||||
#: src/main/help.c:81
|
||||
#: src/main/help.c:86
|
||||
msgid "BYTES"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:82
|
||||
#: src/main/help.c:87
|
||||
msgid "use a buffer size of BYTES"
|
||||
msgstr "BYTES benutze einen Puffer in der Größe von BYTES"
|
||||
|
||||
#: src/main/help.c:84
|
||||
#: src/main/help.c:89
|
||||
msgid "never use splice(), always use read/write"
|
||||
msgstr "anstelle von splice() immer read/write benutzen"
|
||||
|
||||
#: src/main/help.c:86
|
||||
#: src/main/help.c:91
|
||||
msgid "skip read errors in input"
|
||||
msgstr "Lesefehler in der Eingabe nicht beachten"
|
||||
|
||||
#: src/main/help.c:88
|
||||
#: src/main/help.c:93
|
||||
msgid "stop after --size bytes have been transferred"
|
||||
msgstr "anhalten, nachdem --size Bytes übertragen wurden"
|
||||
|
||||
#: src/main/help.c:90
|
||||
#: src/main/help.c:95
|
||||
msgid "PID"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:91
|
||||
#: src/main/help.c:96
|
||||
msgid "update settings of process PID"
|
||||
msgstr "Einstellungen der Prozess-PID updaten"
|
||||
|
||||
#: src/main/help.c:94
|
||||
#: src/main/help.c:99
|
||||
msgid "FILE"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:95
|
||||
#: src/main/help.c:100
|
||||
msgid "save process ID in FILE"
|
||||
msgstr "Prozess-ID in FILE speichern"
|
||||
|
||||
#: src/main/help.c:97
|
||||
#: src/main/help.c:102
|
||||
msgid "PID[:FD]"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:98
|
||||
#: src/main/help.c:103
|
||||
msgid "watch file FD opened by process PID"
|
||||
msgstr "die vom Prozess PID geöffnete Datei FD beobachten"
|
||||
|
||||
#: src/main/help.c:101
|
||||
#: src/main/help.c:106
|
||||
msgid "show this help and exit"
|
||||
msgstr "zeige diese Hilfe und beende"
|
||||
|
||||
#: src/main/help.c:103
|
||||
#: src/main/help.c:108
|
||||
msgid "show version information and exit"
|
||||
msgstr "zeige Versionsinformationen und beende"
|
||||
|
||||
#: src/main/help.c:109
|
||||
#: src/main/help.c:114
|
||||
#, c-format
|
||||
msgid "Usage: %s [OPTION] [FILE]..."
|
||||
msgstr "Syntax: %s [OPTION] [DATEI]..."
|
||||
|
||||
#: src/main/help.c:112
|
||||
#: src/main/help.c:117
|
||||
msgid ""
|
||||
"Concatenate FILE(s), or standard input, to standard output,\n"
|
||||
"with monitoring."
|
||||
@@ -355,7 +379,7 @@ msgstr ""
|
||||
"Verbindet DATEI(en) oder den Standard-Eingabe-Kanal mit dem\n"
|
||||
"Standard-Ausgabe-Kanal und misst den Datenstrom."
|
||||
|
||||
#: src/main/help.c:207
|
||||
#: src/main/help.c:212
|
||||
msgid ""
|
||||
"Debugging is enabled; export the DEBUG environment variable to define the\n"
|
||||
"output filename.\n"
|
||||
@@ -363,7 +387,7 @@ msgstr ""
|
||||
"Das Debuggen ist aktiviert. Exportieren Sie die Umgebungsvariable DEBUG,\n"
|
||||
"um den Ausgabedateinamen zu definieren.\n"
|
||||
|
||||
#: src/main/help.c:211
|
||||
#: src/main/help.c:216
|
||||
#, c-format
|
||||
msgid "Please report any bugs to %s."
|
||||
msgstr "Bitte senden Sie Fehlerberichte an %s."
|
||||
@@ -372,72 +396,9 @@ msgstr "Bitte senden Sie Fehlerberichte an %s."
|
||||
msgid "state allocation failed"
|
||||
msgstr "Zustandszuweisung fehlgeschlagen"
|
||||
|
||||
#: src/main/main.c:246
|
||||
#, fuzzy
|
||||
#: src/main/main.c:248
|
||||
msgid "failed to read terminal attributes"
|
||||
msgstr "Terminalname konnte nicht gelesen werden"
|
||||
|
||||
#: src/main/options.c:98
|
||||
msgid "option structure allocation failed"
|
||||
msgstr "`option' konnte nicht allokiert werden"
|
||||
|
||||
#: src/main/options.c:112
|
||||
msgid "option structure argv allocation failed"
|
||||
msgstr "`option' (argv) konnte nicht allokiert werden"
|
||||
|
||||
#: src/main/options.c:151
|
||||
msgid "integer argument expected"
|
||||
msgstr "Ganzzahliges Argument erwartet"
|
||||
|
||||
#: src/main/options.c:162
|
||||
msgid "numeric argument expected"
|
||||
msgstr "numerisches Argument erwartet"
|
||||
|
||||
#: src/main/options.c:173
|
||||
msgid "process ID or pid:fd pair expected"
|
||||
msgstr "Prozess-ID oder PID:FD-Paar erwartet"
|
||||
|
||||
#: src/main/options.c:180
|
||||
msgid "invalid process ID"
|
||||
msgstr "ungültige Prozess-ID"
|
||||
|
||||
#: src/main/options.c:316
|
||||
#, c-format
|
||||
msgid "Try `%s --help' for more information."
|
||||
msgstr "`%s --help' zeigt weitere Informationen an."
|
||||
|
||||
#: src/main/options.c:320
|
||||
#, c-format
|
||||
msgid "Try `%s -h' for more information."
|
||||
msgstr "`%s -h' zeigt weitere Informationen an."
|
||||
|
||||
#: src/main/options.c:336
|
||||
msgid ""
|
||||
"cannot use line mode or transfer modifier options when watching file "
|
||||
"descriptors"
|
||||
msgstr ""
|
||||
"Beim Anzeigen von Dateideskriptoren können keine Optionen für den "
|
||||
"Zeilenmodus oder den Übertragungsmodifikator verwendet werden"
|
||||
|
||||
#: src/main/options.c:344
|
||||
msgid "cannot use cursor positioning when watching file descriptors"
|
||||
msgstr ""
|
||||
"Beim Anzeigen von Dateideskriptoren können keine Zeilenmodus- oder "
|
||||
"Übertragungsmodifikatoroptionen verwendet werden."
|
||||
|
||||
#: src/main/options.c:352
|
||||
msgid "cannot use remote control when watching file descriptors"
|
||||
msgstr ""
|
||||
"kann keine Fernbedienung verwenden, wenn Dateideskriptoren angezeigt werden"
|
||||
|
||||
#: src/main/options.c:360
|
||||
msgid "cannot transfer files when watching file descriptors"
|
||||
msgstr ""
|
||||
"Dateien können beim Betrachten von Dateideskriptoren nicht übertragen werden"
|
||||
|
||||
#: src/main/options.c:368
|
||||
msgid "not available on systems without /proc/self/fdinfo"
|
||||
msgstr "Nicht verfügbar auf Systemen ohne /proc/self/fdinfo"
|
||||
|
||||
#: src/main/remote.c:221
|
||||
msgid "message not received"
|
||||
@@ -446,3 +407,65 @@ msgstr "Nachricht nicht empfangen"
|
||||
#: src/main/remote.c:328
|
||||
msgid "IPC not supported on this system"
|
||||
msgstr "IPC wird auf diesem System nicht unterstützt"
|
||||
|
||||
#: src/main/options.c:102
|
||||
msgid "option structure allocation failed"
|
||||
msgstr "`option' konnte nicht allokiert werden"
|
||||
|
||||
#: src/main/options.c:116
|
||||
msgid "option structure argv allocation failed"
|
||||
msgstr "`option' (argv) konnte nicht allokiert werden"
|
||||
|
||||
#: src/main/options.c:160
|
||||
msgid "integer argument expected"
|
||||
msgstr "Ganzzahliges Argument erwartet"
|
||||
|
||||
#: src/main/options.c:171
|
||||
msgid "numeric argument expected"
|
||||
msgstr "numerisches Argument erwartet"
|
||||
|
||||
#: src/main/options.c:182
|
||||
msgid "process ID or pid:fd pair expected"
|
||||
msgstr "Prozess-ID oder PID:FD-Paar erwartet"
|
||||
|
||||
#: src/main/options.c:189
|
||||
msgid "invalid process ID"
|
||||
msgstr "ungültige Prozess-ID"
|
||||
|
||||
#: src/main/options.c:355
|
||||
#, c-format
|
||||
msgid "Try `%s --help' for more information."
|
||||
msgstr "`%s --help' zeigt weitere Informationen an."
|
||||
|
||||
#: src/main/options.c:359
|
||||
#, c-format
|
||||
msgid "Try `%s -h' for more information."
|
||||
msgstr "`%s -h' zeigt weitere Informationen an."
|
||||
|
||||
#: src/main/options.c:375
|
||||
msgid ""
|
||||
"cannot use line mode or transfer modifier options when watching file "
|
||||
"descriptors"
|
||||
msgstr ""
|
||||
"Beim Anzeigen von Dateideskriptoren können keine Optionen für den "
|
||||
"Zeilenmodus oder den Übertragungsmodifikator verwendet werden"
|
||||
|
||||
#: src/main/options.c:383
|
||||
msgid "cannot use cursor positioning when watching file descriptors"
|
||||
msgstr ""
|
||||
"Beim Anzeigen von Dateideskriptoren können keine Zeilenmodus- oder "
|
||||
"Übertragungsmodifikatoroptionen verwendet werden."
|
||||
|
||||
#: src/main/options.c:391
|
||||
msgid "cannot use remote control when watching file descriptors"
|
||||
msgstr ""
|
||||
"kann keine Fernbedienung verwenden, wenn Dateideskriptoren angezeigt werden"
|
||||
|
||||
#: src/main/options.c:399
|
||||
msgid "cannot transfer files when watching file descriptors"
|
||||
msgstr ""
|
||||
"Dateien können beim Betrachten von Dateideskriptoren nicht übertragen werden"
|
||||
|
||||
#: src/main/options.c:407
|
||||
msgid "not available on systems without /proc/self/fdinfo"
|
||||
msgstr "Nicht verfügbar auf Systemen ohne /proc/self/fdinfo"
|
||||
|
||||
+196
-173
@@ -1,7 +1,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-09-05 19:25+0100\n"
|
||||
"POT-Creation-Date: 2023-07-17 21:52+0100\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Date: 1999-06-01 15:18:29+0100\n"
|
||||
"From: Andrew Wood <ivarch@ubik>\n"
|
||||
@@ -35,34 +35,6 @@ msgstr "tentative de verrouillage échoué"
|
||||
msgid "failed to open terminal"
|
||||
msgstr "l'ouverture du terminal a échoué"
|
||||
|
||||
#: src/pv/display.c:138
|
||||
msgid "yzafpnum kMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:143
|
||||
msgid "yzafpnum KMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:558 src/pv/transfer.c:679
|
||||
msgid "buffer allocation failed"
|
||||
msgstr "l'allocation de mémoire tampon a échoué"
|
||||
|
||||
#: src/pv/display.c:618 src/pv/transfer.c:458
|
||||
msgid "B"
|
||||
msgstr "O"
|
||||
|
||||
#: src/pv/display.c:654 src/pv/display.c:662
|
||||
msgid "/s"
|
||||
msgstr "/s"
|
||||
|
||||
#: src/pv/display.c:654 src/pv/display.c:662
|
||||
msgid "B/s"
|
||||
msgstr "O/s"
|
||||
|
||||
#: src/pv/display.c:697 src/pv/display.c:702 src/pv/display.c:764
|
||||
msgid "ETA"
|
||||
msgstr "ETA"
|
||||
|
||||
#: src/pv/file.c:119
|
||||
msgid "failed to seek to start of output"
|
||||
msgstr "ne peut pas passer au début de la sortie"
|
||||
@@ -75,7 +47,7 @@ msgstr "la fermeture du fichier a échoué"
|
||||
msgid "failed to read file"
|
||||
msgstr "la lecture du fichier a échoué"
|
||||
|
||||
#: src/pv/file.c:248
|
||||
#: src/pv/file.c:248 src/main/options.c:288
|
||||
msgid "failed to stat file"
|
||||
msgstr "échec à statuer sur le fichier"
|
||||
|
||||
@@ -87,15 +59,14 @@ msgstr "échec à statuer sur le fichier de sortie"
|
||||
msgid "input file is output file"
|
||||
msgstr "fichiers d'entré et de sortie sont les mêmes"
|
||||
|
||||
#: src/pv/loop.c:520 src/pv/loop.c:590 src/pv/loop.c:642 src/pv/watchpid.c:51
|
||||
#: src/pv/watchpid.c:74 src/pv/watchpid.c:84 src/pv/watchpid.c:115
|
||||
#: src/pv/loop.c:527 src/pv/loop.c:597 src/pv/loop.c:649 src/pv/watchpid.c:68
|
||||
#: src/pv/watchpid.c:79 src/pv/watchpid.c:93 src/pv/watchpid.c:104
|
||||
#: src/pv/watchpid.c:145 src/pv/watchpid.c:168 src/pv/watchpid.c:178
|
||||
#: src/pv/watchpid.c:192 src/pv/watchpid.c:285 src/pv/watchpid.c:294
|
||||
#: src/pv/watchpid.c:332 src/pv/watchpid.c:349
|
||||
msgid "pid"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/state.c:33
|
||||
msgid "none"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:341
|
||||
msgid "read failed"
|
||||
msgstr "la lecture a échoué"
|
||||
@@ -116,19 +87,64 @@ msgstr "n'a pas réussi à dépasser l'erreur"
|
||||
msgid "skipped past read error"
|
||||
msgstr "erreur de lecture dépassée"
|
||||
|
||||
#: src/pv/transfer.c:458 src/pv/display.c:687
|
||||
msgid "B"
|
||||
msgstr "O"
|
||||
|
||||
#: src/pv/transfer.c:631
|
||||
msgid "write failed"
|
||||
msgstr "l'écriture a échoué"
|
||||
|
||||
#: src/pv/transfer.c:679 src/pv/display.c:618
|
||||
msgid "buffer allocation failed"
|
||||
msgstr "l'allocation de mémoire tampon a échoué"
|
||||
|
||||
#: src/pv/transfer.c:770
|
||||
msgid "select call failed"
|
||||
msgstr "appel de sélection a échoué"
|
||||
|
||||
#: src/pv/watchpid.c:76 src/pv/watchpid.c:86 src/pv/watchpid.c:117
|
||||
#: src/pv/state.c:25
|
||||
msgid "history structure allocation failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/state.c:55
|
||||
msgid "none"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:151
|
||||
msgid "yzafpnum kMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:156
|
||||
msgid "yzafpnum KMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:683
|
||||
msgid "b"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:738 src/pv/display.c:752
|
||||
msgid "b/s"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:742 src/pv/display.c:757
|
||||
msgid "/s"
|
||||
msgstr "/s"
|
||||
|
||||
#: src/pv/display.c:742 src/pv/display.c:758
|
||||
msgid "B/s"
|
||||
msgstr "O/s"
|
||||
|
||||
#: src/pv/display.c:793 src/pv/display.c:798 src/pv/display.c:860
|
||||
msgid "ETA"
|
||||
msgstr "ETA"
|
||||
|
||||
#: src/pv/watchpid.c:81 src/pv/watchpid.c:95 src/pv/watchpid.c:106
|
||||
#: src/pv/watchpid.c:170 src/pv/watchpid.c:180 src/pv/watchpid.c:194
|
||||
msgid "fd"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/watchpid.c:120
|
||||
#: src/pv/watchpid.c:109 src/pv/watchpid.c:197
|
||||
msgid "not a regular file or block device"
|
||||
msgstr "pas un fichier ordinaire ou un périphérique de bloc"
|
||||
|
||||
@@ -185,168 +201,176 @@ msgstr "affiche le taux de tranfert des données"
|
||||
msgid "show data transfer average rate counter"
|
||||
msgstr "afficher le compteur de taux moyen de transfert de données"
|
||||
|
||||
#: src/main/help.c:44
|
||||
msgid "show number of bytes transferred"
|
||||
msgstr "affiche le nombre d'octets transférés"
|
||||
|
||||
#: src/main/help.c:46
|
||||
msgid "show percentage of transfer buffer in use"
|
||||
msgstr "afficher le pourcentage de tampon de transfert utilisé"
|
||||
|
||||
#: src/main/help.c:47
|
||||
msgid "NUM"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:48
|
||||
msgid "show NUM bytes last written"
|
||||
msgstr "affiche NUM octets pour la dernière fois écrits"
|
||||
|
||||
#: src/main/help.c:49
|
||||
msgid "FORMAT"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:50
|
||||
msgid "set output format to FORMAT"
|
||||
msgstr "définir le format de sortie sur FORMAT"
|
||||
|
||||
#: src/main/help.c:52
|
||||
msgid "output percentages, not visual information"
|
||||
msgstr "imprime en pourcentage, pas les informations visuelles"
|
||||
|
||||
#: src/main/help.c:54
|
||||
msgid "do not output any transfer information at all"
|
||||
msgstr "n'afficher aucune information de transfert"
|
||||
|
||||
#: src/main/help.c:57
|
||||
msgid "display nothing until first byte transferred"
|
||||
msgstr "ne rien afficher avant qu'au moins un octet soit tranféré"
|
||||
|
||||
#: src/main/help.c:58 src/main/help.c:66
|
||||
#: src/main/help.c:43 src/main/help.c:63 src/main/help.c:71
|
||||
msgid "SEC"
|
||||
msgstr "SEC"
|
||||
|
||||
#: src/main/help.c:45
|
||||
msgid "compute average rate over past SEC seconds (default 30s)"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:47
|
||||
msgid "show number of bytes transferred"
|
||||
msgstr "affiche le nombre d'octets transférés"
|
||||
|
||||
#: src/main/help.c:49
|
||||
msgid "show number of bits transferred"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:51
|
||||
msgid "show percentage of transfer buffer in use"
|
||||
msgstr "afficher le pourcentage de tampon de transfert utilisé"
|
||||
|
||||
#: src/main/help.c:52
|
||||
msgid "NUM"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:53
|
||||
msgid "show NUM bytes last written"
|
||||
msgstr "affiche NUM octets pour la dernière fois écrits"
|
||||
|
||||
#: src/main/help.c:54
|
||||
msgid "FORMAT"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:55
|
||||
msgid "set output format to FORMAT"
|
||||
msgstr "définir le format de sortie sur FORMAT"
|
||||
|
||||
#: src/main/help.c:57
|
||||
msgid "output percentages, not visual information"
|
||||
msgstr "imprime en pourcentage, pas les informations visuelles"
|
||||
|
||||
#: src/main/help.c:59
|
||||
msgid "do not output any transfer information at all"
|
||||
msgstr "n'afficher aucune information de transfert"
|
||||
|
||||
#: src/main/help.c:62
|
||||
msgid "display nothing until first byte transferred"
|
||||
msgstr "ne rien afficher avant qu'au moins un octet soit tranféré"
|
||||
|
||||
#: src/main/help.c:64
|
||||
msgid "display nothing until SEC seconds have passed"
|
||||
msgstr "n'afficher rien jusqu'à ce que SEC secondes se soient écoulées"
|
||||
|
||||
#: src/main/help.c:60
|
||||
#: src/main/help.c:65
|
||||
msgid "SIZE"
|
||||
msgstr "TAILLE"
|
||||
|
||||
#: src/main/help.c:61
|
||||
#: src/main/help.c:66
|
||||
msgid "set estimated data size to SIZE bytes"
|
||||
msgstr "ajuste la taille estimée des données à TAILLE octets"
|
||||
|
||||
#: src/main/help.c:63
|
||||
#: src/main/help.c:68
|
||||
msgid "count lines instead of bytes"
|
||||
msgstr "compte les lignes au lieu des octets"
|
||||
|
||||
#: src/main/help.c:65
|
||||
#: src/main/help.c:70
|
||||
msgid "lines are null-terminated"
|
||||
msgstr "les lignes sont terminées par un nul"
|
||||
|
||||
#: src/main/help.c:67
|
||||
#: src/main/help.c:72
|
||||
msgid "update every SEC seconds"
|
||||
msgstr "mise-à-jour toute les SEC secondes"
|
||||
|
||||
#: src/main/help.c:68
|
||||
#: src/main/help.c:73
|
||||
msgid "WIDTH"
|
||||
msgstr "LARGEUR"
|
||||
|
||||
#: src/main/help.c:69
|
||||
#: src/main/help.c:74
|
||||
msgid "assume terminal is WIDTH characters wide"
|
||||
msgstr "présumer la largeur du terminal à LARGEUR caractères"
|
||||
|
||||
#: src/main/help.c:70
|
||||
#: src/main/help.c:75
|
||||
msgid "HEIGHT"
|
||||
msgstr "HAUTEUR"
|
||||
|
||||
#: src/main/help.c:71
|
||||
#: src/main/help.c:76
|
||||
msgid "assume terminal is HEIGHT rows high"
|
||||
msgstr "présumer la hauteur du terminal à HAUTEUR lignes"
|
||||
|
||||
#: src/main/help.c:72
|
||||
#: src/main/help.c:77
|
||||
msgid "NAME"
|
||||
msgstr "NOM"
|
||||
|
||||
#: src/main/help.c:73
|
||||
#: src/main/help.c:78
|
||||
msgid "prefix visual information with NAME"
|
||||
msgstr "préfixer les informations visuelles avec NOM"
|
||||
|
||||
#: src/main/help.c:75
|
||||
#: src/main/help.c:80
|
||||
msgid "output even if standard error is not a terminal"
|
||||
msgstr "imprime vers la sortie d'erreur même si ce n'est pas un terminal"
|
||||
|
||||
#: src/main/help.c:77
|
||||
#: src/main/help.c:82
|
||||
msgid "use cursor positioning escape sequences"
|
||||
msgstr "utiliser les séquences d'échappements de positionnement de curseur"
|
||||
|
||||
#: src/main/help.c:79
|
||||
#: src/main/help.c:84
|
||||
msgid "RATE"
|
||||
msgstr "TAUX"
|
||||
|
||||
#: src/main/help.c:80
|
||||
#: src/main/help.c:85
|
||||
msgid "limit transfer to RATE bytes per second"
|
||||
msgstr "limite le taux de transfer à TAUX octets par seconde"
|
||||
|
||||
#: src/main/help.c:81
|
||||
#: src/main/help.c:86
|
||||
msgid "BYTES"
|
||||
msgstr "OCTETS"
|
||||
|
||||
#: src/main/help.c:82
|
||||
#: src/main/help.c:87
|
||||
msgid "use a buffer size of BYTES"
|
||||
msgstr "Utiliser une mémoire tampon de OCTETS octets"
|
||||
|
||||
#: src/main/help.c:84
|
||||
#: src/main/help.c:89
|
||||
msgid "never use splice(), always use read/write"
|
||||
msgstr "n'utilisez jamais splice(), utilisez toujours read/write"
|
||||
|
||||
#: src/main/help.c:86
|
||||
#: src/main/help.c:91
|
||||
msgid "skip read errors in input"
|
||||
msgstr "ignorer les erreurs de lecture dans l'entrée"
|
||||
|
||||
#: src/main/help.c:88
|
||||
#: src/main/help.c:93
|
||||
msgid "stop after --size bytes have been transferred"
|
||||
msgstr "arrêter après le transfert de --size octets"
|
||||
|
||||
#: src/main/help.c:90
|
||||
#: src/main/help.c:95
|
||||
msgid "PID"
|
||||
msgstr "PID"
|
||||
|
||||
#: src/main/help.c:91
|
||||
#: src/main/help.c:96
|
||||
msgid "update settings of process PID"
|
||||
msgstr "mettre-à-jour la configuration du processus PID"
|
||||
|
||||
#: src/main/help.c:94
|
||||
#: src/main/help.c:99
|
||||
msgid "FILE"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:95
|
||||
#: src/main/help.c:100
|
||||
msgid "save process ID in FILE"
|
||||
msgstr "enregistrer l'ID de processus dans FILE"
|
||||
|
||||
#: src/main/help.c:97
|
||||
#: src/main/help.c:102
|
||||
msgid "PID[:FD]"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:98
|
||||
#: src/main/help.c:103
|
||||
msgid "watch file FD opened by process PID"
|
||||
msgstr "regarder le fichier FD ouvert par le processus PID"
|
||||
|
||||
#: src/main/help.c:101
|
||||
#: src/main/help.c:106
|
||||
msgid "show this help and exit"
|
||||
msgstr "afficher cette aide puis quitter"
|
||||
|
||||
#: src/main/help.c:103
|
||||
#: src/main/help.c:108
|
||||
msgid "show version information and exit"
|
||||
msgstr "afficher la version puis quitter"
|
||||
|
||||
#: src/main/help.c:109
|
||||
#: src/main/help.c:114
|
||||
#, c-format
|
||||
msgid "Usage: %s [OPTION] [FILE]..."
|
||||
msgstr "Utilisation : %s [OPTIONS] [FICHIER]..."
|
||||
|
||||
#: src/main/help.c:112
|
||||
#: src/main/help.c:117
|
||||
msgid ""
|
||||
"Concatenate FILE(s), or standard input, to standard output,\n"
|
||||
"with monitoring."
|
||||
@@ -354,7 +378,7 @@ msgstr ""
|
||||
"Concatène FICHIER(s), ou l'entrée standard, sur la sortie standard\n"
|
||||
"avec monitorage."
|
||||
|
||||
#: src/main/help.c:207
|
||||
#: src/main/help.c:212
|
||||
msgid ""
|
||||
"Debugging is enabled; export the DEBUG environment variable to define the\n"
|
||||
"output filename.\n"
|
||||
@@ -362,7 +386,7 @@ msgstr ""
|
||||
"Le débogage est activé; exportez la variable d'environnement DEBUG pour\n"
|
||||
"définir le nom du fichier de sortie.\n"
|
||||
|
||||
#: src/main/help.c:211
|
||||
#: src/main/help.c:216
|
||||
#, c-format
|
||||
msgid "Please report any bugs to %s."
|
||||
msgstr "SVP rapporter touts bogues à %s."
|
||||
@@ -371,74 +395,9 @@ msgstr "SVP rapporter touts bogues à %s."
|
||||
msgid "state allocation failed"
|
||||
msgstr "échec de l'allocation de mémoire de condition"
|
||||
|
||||
#: src/main/main.c:246
|
||||
#, fuzzy
|
||||
#: src/main/main.c:248
|
||||
msgid "failed to read terminal attributes"
|
||||
msgstr "échec de lecture du nom du terminal"
|
||||
|
||||
#: src/main/options.c:98
|
||||
msgid "option structure allocation failed"
|
||||
msgstr "l'allocation pour la structure d'une option a echoué"
|
||||
|
||||
#: src/main/options.c:112
|
||||
msgid "option structure argv allocation failed"
|
||||
msgstr "l'allocation pour la structure de l'option argv a echoué"
|
||||
|
||||
#: src/main/options.c:151
|
||||
msgid "integer argument expected"
|
||||
msgstr "Valeur entière attendue"
|
||||
|
||||
#: src/main/options.c:162
|
||||
msgid "numeric argument expected"
|
||||
msgstr "Valeur numérique attendue"
|
||||
|
||||
#: src/main/options.c:173
|
||||
msgid "process ID or pid:fd pair expected"
|
||||
msgstr "ID de processus ou paire pid:fd attendue"
|
||||
|
||||
#: src/main/options.c:180
|
||||
msgid "invalid process ID"
|
||||
msgstr "ID de processus non valide"
|
||||
|
||||
#: src/main/options.c:316
|
||||
#, c-format
|
||||
msgid "Try `%s --help' for more information."
|
||||
msgstr "Essayez `%s --help' pour plus d'information."
|
||||
|
||||
#: src/main/options.c:320
|
||||
#, c-format
|
||||
msgid "Try `%s -h' for more information."
|
||||
msgstr "Essayez `%s -h' pour plus d'information."
|
||||
|
||||
#: src/main/options.c:336
|
||||
msgid ""
|
||||
"cannot use line mode or transfer modifier options when watching file "
|
||||
"descriptors"
|
||||
msgstr ""
|
||||
"impossible d'utiliser le mode ligne ou les options de modificateur de "
|
||||
"transfert lors de la visualisation des descripteurs de fichiers"
|
||||
|
||||
#: src/main/options.c:344
|
||||
msgid "cannot use cursor positioning when watching file descriptors"
|
||||
msgstr ""
|
||||
"impossible d'utiliser le positionnement du curseur lors de la visualisation "
|
||||
"des descripteurs de fichier"
|
||||
|
||||
#: src/main/options.c:352
|
||||
msgid "cannot use remote control when watching file descriptors"
|
||||
msgstr ""
|
||||
"impossible d'utiliser la télécommande lors de la visualisation des "
|
||||
"descripteurs de fichiers"
|
||||
|
||||
#: src/main/options.c:360
|
||||
msgid "cannot transfer files when watching file descriptors"
|
||||
msgstr ""
|
||||
"impossible de transférer des fichiers lorsque vous regardez des descripteurs "
|
||||
"de fichiers"
|
||||
|
||||
#: src/main/options.c:368
|
||||
msgid "not available on systems without /proc/self/fdinfo"
|
||||
msgstr "non disponible sur les systèmes sans /proc/self/fdinfo"
|
||||
|
||||
#: src/main/remote.c:221
|
||||
msgid "message not received"
|
||||
@@ -447,3 +406,67 @@ msgstr "message non reçu"
|
||||
#: src/main/remote.c:328
|
||||
msgid "IPC not supported on this system"
|
||||
msgstr "IPC non pris en charge sur ce système"
|
||||
|
||||
#: src/main/options.c:102
|
||||
msgid "option structure allocation failed"
|
||||
msgstr "l'allocation pour la structure d'une option a echoué"
|
||||
|
||||
#: src/main/options.c:116
|
||||
msgid "option structure argv allocation failed"
|
||||
msgstr "l'allocation pour la structure de l'option argv a echoué"
|
||||
|
||||
#: src/main/options.c:160
|
||||
msgid "integer argument expected"
|
||||
msgstr "Valeur entière attendue"
|
||||
|
||||
#: src/main/options.c:171
|
||||
msgid "numeric argument expected"
|
||||
msgstr "Valeur numérique attendue"
|
||||
|
||||
#: src/main/options.c:182
|
||||
msgid "process ID or pid:fd pair expected"
|
||||
msgstr "ID de processus ou paire pid:fd attendue"
|
||||
|
||||
#: src/main/options.c:189
|
||||
msgid "invalid process ID"
|
||||
msgstr "ID de processus non valide"
|
||||
|
||||
#: src/main/options.c:355
|
||||
#, c-format
|
||||
msgid "Try `%s --help' for more information."
|
||||
msgstr "Essayez `%s --help' pour plus d'information."
|
||||
|
||||
#: src/main/options.c:359
|
||||
#, c-format
|
||||
msgid "Try `%s -h' for more information."
|
||||
msgstr "Essayez `%s -h' pour plus d'information."
|
||||
|
||||
#: src/main/options.c:375
|
||||
msgid ""
|
||||
"cannot use line mode or transfer modifier options when watching file "
|
||||
"descriptors"
|
||||
msgstr ""
|
||||
"impossible d'utiliser le mode ligne ou les options de modificateur de "
|
||||
"transfert lors de la visualisation des descripteurs de fichiers"
|
||||
|
||||
#: src/main/options.c:383
|
||||
msgid "cannot use cursor positioning when watching file descriptors"
|
||||
msgstr ""
|
||||
"impossible d'utiliser le positionnement du curseur lors de la visualisation "
|
||||
"des descripteurs de fichier"
|
||||
|
||||
#: src/main/options.c:391
|
||||
msgid "cannot use remote control when watching file descriptors"
|
||||
msgstr ""
|
||||
"impossible d'utiliser la télécommande lors de la visualisation des "
|
||||
"descripteurs de fichiers"
|
||||
|
||||
#: src/main/options.c:399
|
||||
msgid "cannot transfer files when watching file descriptors"
|
||||
msgstr ""
|
||||
"impossible de transférer des fichiers lorsque vous regardez des descripteurs "
|
||||
"de fichiers"
|
||||
|
||||
#: src/main/options.c:407
|
||||
msgid "not available on systems without /proc/self/fdinfo"
|
||||
msgstr "non disponible sur les systèmes sans /proc/self/fdinfo"
|
||||
|
||||
+228
-213
@@ -6,24 +6,22 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-09-05 19:25+0100\n"
|
||||
"POT-Creation-Date: 2023-07-17 21:52+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: src/pv/cursor.c:80
|
||||
#, fuzzy
|
||||
msgid "failed to get terminal name"
|
||||
msgstr "nie uda³o siê otworzyæ terminala"
|
||||
msgstr ""
|
||||
|
||||
# "Przewidywany czas ukoñczenia" for ETA is too long
|
||||
# "Przewidywany czas ukończenia" for ETA is too long
|
||||
#: src/pv/cursor.c:125
|
||||
#, fuzzy
|
||||
msgid "failed to open lock file"
|
||||
msgstr "nie uda³o siê zamkn±æ pliku"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/cursor.c:159
|
||||
msgid "lock attempt failed"
|
||||
@@ -31,74 +29,44 @@ msgstr ""
|
||||
|
||||
#: src/pv/cursor.c:409
|
||||
msgid "failed to open terminal"
|
||||
msgstr "nie uda³o siê otworzyæ terminala"
|
||||
|
||||
#: src/pv/display.c:138
|
||||
msgid "yzafpnum kMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:143
|
||||
msgid "yzafpnum KMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:558 src/pv/transfer.c:679
|
||||
msgid "buffer allocation failed"
|
||||
msgstr "nie uda³o siê zaalokowaæ bufora"
|
||||
|
||||
#: src/pv/display.c:618 src/pv/transfer.c:458
|
||||
msgid "B"
|
||||
msgstr "B"
|
||||
|
||||
#: src/pv/display.c:654 src/pv/display.c:662
|
||||
msgid "/s"
|
||||
msgstr "/s"
|
||||
|
||||
#: src/pv/display.c:654 src/pv/display.c:662
|
||||
msgid "B/s"
|
||||
msgstr "B/s"
|
||||
|
||||
#: src/pv/display.c:697 src/pv/display.c:702 src/pv/display.c:764
|
||||
msgid "ETA"
|
||||
msgstr "ETA"
|
||||
msgstr "nie udało się otworzyć terminala"
|
||||
|
||||
#: src/pv/file.c:119
|
||||
#, fuzzy
|
||||
msgid "failed to seek to start of output"
|
||||
msgstr "nie uda³o siê wykonaæ operacji stat na pliku wyj¶ciowym"
|
||||
msgstr ""
|
||||
|
||||
# "Przewidywany czas ukoñczenia" for ETA is too long
|
||||
# "Przewidywany czas ukończenia" for ETA is too long
|
||||
#: src/pv/file.c:215
|
||||
msgid "failed to close file"
|
||||
msgstr "nie uda³o siê zamkn±æ pliku"
|
||||
msgstr "nie udało się zamknąć pliku"
|
||||
|
||||
#: src/pv/file.c:238
|
||||
msgid "failed to read file"
|
||||
msgstr "nie uda³o siê odczytaæ pliku"
|
||||
msgstr "nie udało się odczytać pliku"
|
||||
|
||||
#: src/pv/file.c:248
|
||||
#: src/pv/file.c:248 src/main/options.c:288
|
||||
msgid "failed to stat file"
|
||||
msgstr "nie uda³o siê wykonaæ operacji stat na pliku"
|
||||
msgstr "nie udało się wykonać operacji stat na pliku"
|
||||
|
||||
#: src/pv/file.c:257
|
||||
msgid "failed to stat output file"
|
||||
msgstr "nie uda³o siê wykonaæ operacji stat na pliku wyj¶ciowym"
|
||||
msgstr "nie udało się wykonać operacji stat na pliku wyjściowym"
|
||||
|
||||
#: src/pv/file.c:280
|
||||
msgid "input file is output file"
|
||||
msgstr "plik wej¶ciowy jest zarazem plikiem wyj¶ciowym"
|
||||
msgstr "plik wejściowy jest zarazem plikiem wyjściowym"
|
||||
|
||||
#: src/pv/loop.c:520 src/pv/loop.c:590 src/pv/loop.c:642 src/pv/watchpid.c:51
|
||||
#: src/pv/watchpid.c:74 src/pv/watchpid.c:84 src/pv/watchpid.c:115
|
||||
#: src/pv/loop.c:527 src/pv/loop.c:597 src/pv/loop.c:649 src/pv/watchpid.c:68
|
||||
#: src/pv/watchpid.c:79 src/pv/watchpid.c:93 src/pv/watchpid.c:104
|
||||
#: src/pv/watchpid.c:145 src/pv/watchpid.c:168 src/pv/watchpid.c:178
|
||||
#: src/pv/watchpid.c:192 src/pv/watchpid.c:285 src/pv/watchpid.c:294
|
||||
#: src/pv/watchpid.c:332 src/pv/watchpid.c:349
|
||||
msgid "pid"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/state.c:33
|
||||
msgid "none"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:341
|
||||
msgid "read failed"
|
||||
msgstr "b³±d odczytu"
|
||||
msgstr "błąd odczytu"
|
||||
|
||||
#: src/pv/transfer.c:359
|
||||
msgid "warning: read errors detected"
|
||||
@@ -109,34 +77,78 @@ msgid "file is not seekable"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:437
|
||||
#, fuzzy
|
||||
msgid "failed to seek past error"
|
||||
msgstr "nie uda³o siê wykonaæ operacji stat na pliku"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:456
|
||||
msgid "skipped past read error"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:458 src/pv/display.c:687
|
||||
msgid "B"
|
||||
msgstr "B"
|
||||
|
||||
#: src/pv/transfer.c:631
|
||||
msgid "write failed"
|
||||
msgstr "b³±d zapisu"
|
||||
msgstr "błąd zapisu"
|
||||
|
||||
#: src/pv/transfer.c:679 src/pv/display.c:618
|
||||
msgid "buffer allocation failed"
|
||||
msgstr "nie udało się zaalokować bufora"
|
||||
|
||||
#: src/pv/transfer.c:770
|
||||
msgid "select call failed"
|
||||
msgstr "nie uda³o siê wywo³aæ funkcji select"
|
||||
msgstr "nie udało się wywołać funkcji select"
|
||||
|
||||
#: src/pv/watchpid.c:76 src/pv/watchpid.c:86 src/pv/watchpid.c:117
|
||||
#: src/pv/state.c:25
|
||||
msgid "history structure allocation failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/state.c:55
|
||||
msgid "none"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:151
|
||||
msgid "yzafpnum kMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:156
|
||||
msgid "yzafpnum KMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:683
|
||||
msgid "b"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:738 src/pv/display.c:752
|
||||
msgid "b/s"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:742 src/pv/display.c:757
|
||||
msgid "/s"
|
||||
msgstr "/s"
|
||||
|
||||
#: src/pv/display.c:742 src/pv/display.c:758
|
||||
msgid "B/s"
|
||||
msgstr "B/s"
|
||||
|
||||
#: src/pv/display.c:793 src/pv/display.c:798 src/pv/display.c:860
|
||||
msgid "ETA"
|
||||
msgstr "ETA"
|
||||
|
||||
#: src/pv/watchpid.c:81 src/pv/watchpid.c:95 src/pv/watchpid.c:106
|
||||
#: src/pv/watchpid.c:170 src/pv/watchpid.c:180 src/pv/watchpid.c:194
|
||||
msgid "fd"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/watchpid.c:120
|
||||
#: src/pv/watchpid.c:109 src/pv/watchpid.c:197
|
||||
msgid "not a regular file or block device"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/version.c:17
|
||||
#, fuzzy, c-format
|
||||
#, c-format
|
||||
msgid "%s %s - Copyright %s %s"
|
||||
msgstr "%s %s - Prawa autorskie (C) %s %s"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/version.c:20
|
||||
#, c-format
|
||||
@@ -158,275 +170,222 @@ msgstr ""
|
||||
|
||||
#: src/main/help.c:31
|
||||
msgid "show progress bar"
|
||||
msgstr "poka¿ pasek postêpu"
|
||||
msgstr "pokaż pasek postępu"
|
||||
|
||||
#: src/main/help.c:33
|
||||
msgid "show elapsed time"
|
||||
msgstr "poka¿ up³ywaj±cy czas"
|
||||
msgstr "pokaż upływający czas"
|
||||
|
||||
#: src/main/help.c:35
|
||||
msgid "show estimated time of arrival (completion)"
|
||||
msgstr "poka¿ szacowany czas ukoñczenia"
|
||||
msgstr "pokaż szacowany czas ukończenia"
|
||||
|
||||
#: src/main/help.c:38
|
||||
#, fuzzy
|
||||
msgid "show absolute estimated time of arrival (completion)"
|
||||
msgstr "poka¿ szacowany czas ukoñczenia"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:40
|
||||
msgid "show data transfer rate counter"
|
||||
msgstr "poka¿ licznik prêdko¶ci przesy³ania"
|
||||
msgstr "pokaż licznik prędkości przesyłania"
|
||||
|
||||
#: src/main/help.c:42
|
||||
msgid "show data transfer average rate counter"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:44
|
||||
msgid "show number of bytes transferred"
|
||||
msgstr "poka¿ ilo¶æ przes³anych bajtów"
|
||||
#: src/main/help.c:43 src/main/help.c:63 src/main/help.c:71
|
||||
msgid "SEC"
|
||||
msgstr "WARTOŚĆ"
|
||||
|
||||
#: src/main/help.c:46
|
||||
msgid "show percentage of transfer buffer in use"
|
||||
#: src/main/help.c:45
|
||||
msgid "compute average rate over past SEC seconds (default 30s)"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:47
|
||||
msgid "NUM"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:48
|
||||
msgid "show NUM bytes last written"
|
||||
msgstr ""
|
||||
msgid "show number of bytes transferred"
|
||||
msgstr "pokaż ilość przesłanych bajtów"
|
||||
|
||||
#: src/main/help.c:49
|
||||
msgid "FORMAT"
|
||||
msgid "show number of bits transferred"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:50
|
||||
msgid "set output format to FORMAT"
|
||||
#: src/main/help.c:51
|
||||
msgid "show percentage of transfer buffer in use"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:52
|
||||
msgid "output percentages, not visual information"
|
||||
msgstr "w¶wietl wyj¶cie procentowo, bez graficznej prezentacji"
|
||||
msgid "NUM"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:53
|
||||
msgid "show NUM bytes last written"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:54
|
||||
msgid "do not output any transfer information at all"
|
||||
msgstr "nie wy¶wietlaj ¿adnych informacji o przesy³aniu"
|
||||
msgid "FORMAT"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:55
|
||||
msgid "set output format to FORMAT"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:57
|
||||
msgid "display nothing until first byte transferred"
|
||||
msgstr "nie wy¶wietlaj nic a¿ do pierwszego przes³anego bajtu"
|
||||
|
||||
#: src/main/help.c:58 src/main/help.c:66
|
||||
msgid "SEC"
|
||||
msgstr "WARTO¦Æ"
|
||||
msgid "output percentages, not visual information"
|
||||
msgstr "wświetl wyjście procentowo, bez graficznej prezentacji"
|
||||
|
||||
#: src/main/help.c:59
|
||||
#, fuzzy
|
||||
msgid "do not output any transfer information at all"
|
||||
msgstr "nie wyświetlaj żadnych informacji o przesyłaniu"
|
||||
|
||||
#: src/main/help.c:62
|
||||
msgid "display nothing until first byte transferred"
|
||||
msgstr "nie wyświetlaj nic aż do pierwszego przesłanego bajtu"
|
||||
|
||||
#: src/main/help.c:64
|
||||
msgid "display nothing until SEC seconds have passed"
|
||||
msgstr "nie wy¶wietlaj nic a¿ do pierwszego przes³anego bajtu"
|
||||
|
||||
#: src/main/help.c:60
|
||||
msgid "SIZE"
|
||||
msgstr "WARTO¦Æ"
|
||||
|
||||
#: src/main/help.c:61
|
||||
msgid "set estimated data size to SIZE bytes"
|
||||
msgstr "ustaw oczekiwany rozmiar danych na WARTO¦Æ bajtów"
|
||||
|
||||
#: src/main/help.c:63
|
||||
msgid "count lines instead of bytes"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:65
|
||||
msgid "SIZE"
|
||||
msgstr "WARTOŚĆ"
|
||||
|
||||
#: src/main/help.c:66
|
||||
msgid "set estimated data size to SIZE bytes"
|
||||
msgstr "ustaw oczekiwany rozmiar danych na WARTOŚĆ bajtów"
|
||||
|
||||
#: src/main/help.c:68
|
||||
msgid "count lines instead of bytes"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:70
|
||||
msgid "lines are null-terminated"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:67
|
||||
#: src/main/help.c:72
|
||||
msgid "update every SEC seconds"
|
||||
msgstr "aktualizuj co ka¿de WARTO¦Æ sekund"
|
||||
msgstr "aktualizuj co każde WARTOŚĆ sekund"
|
||||
|
||||
#: src/main/help.c:68
|
||||
#: src/main/help.c:73
|
||||
msgid "WIDTH"
|
||||
msgstr "WARTO¦Æ"
|
||||
msgstr "WARTOŚĆ"
|
||||
|
||||
#: src/main/help.c:69
|
||||
#: src/main/help.c:74
|
||||
msgid "assume terminal is WIDTH characters wide"
|
||||
msgstr "przyjmij, ¿e terminal ma szeroko¶æ WARTO¦Æ znaków"
|
||||
msgstr "przyjmij, że terminal ma szerokość WARTOŚĆ znaków"
|
||||
|
||||
#: src/main/help.c:70
|
||||
#: src/main/help.c:75
|
||||
msgid "HEIGHT"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:71
|
||||
#: src/main/help.c:76
|
||||
msgid "assume terminal is HEIGHT rows high"
|
||||
msgstr "przyjmij, ¿e terminal ma szeroko¶æ WARTO¦Æ znaków"
|
||||
msgstr "przyjmij, że terminal ma szerokość WARTOŚĆ znaków"
|
||||
|
||||
#: src/main/help.c:72
|
||||
#: src/main/help.c:77
|
||||
msgid "NAME"
|
||||
msgstr "NAZWA"
|
||||
|
||||
#: src/main/help.c:73
|
||||
#: src/main/help.c:78
|
||||
msgid "prefix visual information with NAME"
|
||||
msgstr "poprzed¼ informacje prefiksem NAZWA"
|
||||
msgstr "poprzedź informacje prefiksem NAZWA"
|
||||
|
||||
#: src/main/help.c:75
|
||||
#: src/main/help.c:80
|
||||
msgid "output even if standard error is not a terminal"
|
||||
msgstr "poka¿ wyj¶cie nawet gdy b³êdy nie s± typu terminal"
|
||||
msgstr "pokaż wyjście nawet gdy błędy nie są typu terminal"
|
||||
|
||||
#: src/main/help.c:77
|
||||
#: src/main/help.c:82
|
||||
msgid "use cursor positioning escape sequences"
|
||||
msgstr "u¿ywaj sekwencji escape do pozycjonowania"
|
||||
msgstr "używaj sekwencji escape do pozycjonowania"
|
||||
|
||||
#: src/main/help.c:79
|
||||
#: src/main/help.c:84
|
||||
msgid "RATE"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:80
|
||||
#: src/main/help.c:85
|
||||
msgid "limit transfer to RATE bytes per second"
|
||||
msgstr "ogranicz przesy³ane dane do RATE bajtów na sekundê"
|
||||
msgstr "ogranicz przesyłane dane do RATE bajtów na sekundę"
|
||||
|
||||
#: src/main/help.c:81
|
||||
#: src/main/help.c:86
|
||||
msgid "BYTES"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:82
|
||||
#: src/main/help.c:87
|
||||
msgid "use a buffer size of BYTES"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:84
|
||||
#: src/main/help.c:89
|
||||
msgid "never use splice(), always use read/write"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:86
|
||||
#: src/main/help.c:91
|
||||
msgid "skip read errors in input"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:88
|
||||
#, fuzzy
|
||||
#: src/main/help.c:93
|
||||
msgid "stop after --size bytes have been transferred"
|
||||
msgstr "poka¿ ilo¶æ przes³anych bajtów"
|
||||
|
||||
#: src/main/help.c:90
|
||||
msgid "PID"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:91
|
||||
msgid "update settings of process PID"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:94
|
||||
msgid "FILE"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:95
|
||||
msgid "PID"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:96
|
||||
msgid "update settings of process PID"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:99
|
||||
msgid "FILE"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:100
|
||||
msgid "save process ID in FILE"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:97
|
||||
#: src/main/help.c:102
|
||||
msgid "PID[:FD]"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:98
|
||||
#: src/main/help.c:103
|
||||
msgid "watch file FD opened by process PID"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:101
|
||||
#: src/main/help.c:106
|
||||
msgid "show this help and exit"
|
||||
msgstr "wy¶wietl te informacje z pomoc± i wyjd¼"
|
||||
msgstr "wyświetl te informacje z pomocą i wyjdź"
|
||||
|
||||
#: src/main/help.c:103
|
||||
#: src/main/help.c:108
|
||||
msgid "show version information and exit"
|
||||
msgstr "wy¶wietl informacje o wersji i wyjd¼"
|
||||
msgstr "wyświetl informacje o wersji i wyjdź"
|
||||
|
||||
#: src/main/help.c:109
|
||||
#: src/main/help.c:114
|
||||
#, c-format
|
||||
msgid "Usage: %s [OPTION] [FILE]..."
|
||||
msgstr "Sposób u¿ycia: %s [OPCJA] [PLIK]..."
|
||||
msgstr "Sposób użycia: %s [OPCJA] [PLIK]..."
|
||||
|
||||
#: src/main/help.c:112
|
||||
#: src/main/help.c:117
|
||||
msgid ""
|
||||
"Concatenate FILE(s), or standard input, to standard output,\n"
|
||||
"with monitoring."
|
||||
msgstr ""
|
||||
"£±czenie PLIK(ów) lub wej¶cia standardowego, do wyj¶cia standardowego\n"
|
||||
"Łączenie PLIK(ów) lub wejścia standardowego, do wyjścia standardowego\n"
|
||||
"z monitoringiem."
|
||||
|
||||
#: src/main/help.c:207
|
||||
#: src/main/help.c:212
|
||||
msgid ""
|
||||
"Debugging is enabled; export the DEBUG environment variable to define the\n"
|
||||
"output filename.\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:211
|
||||
#: src/main/help.c:216
|
||||
#, c-format
|
||||
msgid "Please report any bugs to %s."
|
||||
msgstr "Proszê przesy³aæ zg³oszenia b³êdów do %s."
|
||||
msgstr "Proszę przesyłać zgłoszenia błędów do %s."
|
||||
|
||||
#: src/main/main.c:74
|
||||
#, fuzzy
|
||||
msgid "state allocation failed"
|
||||
msgstr "nie uda³o siê zaalokowaæ bufora"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/main.c:246
|
||||
#, fuzzy
|
||||
#: src/main/main.c:248
|
||||
msgid "failed to read terminal attributes"
|
||||
msgstr "nie uda³o siê otworzyæ terminala"
|
||||
|
||||
#: src/main/options.c:98
|
||||
msgid "option structure allocation failed"
|
||||
msgstr "nie uda³o siê zaalokowaæ struktur opcji"
|
||||
|
||||
#: src/main/options.c:112
|
||||
msgid "option structure argv allocation failed"
|
||||
msgstr "nie uda³o siê zaalokowaæ struktur opcji argv"
|
||||
|
||||
#: src/main/options.c:151
|
||||
msgid "integer argument expected"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:162
|
||||
msgid "numeric argument expected"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:173
|
||||
msgid "process ID or pid:fd pair expected"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:180
|
||||
msgid "invalid process ID"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:316
|
||||
#, c-format
|
||||
msgid "Try `%s --help' for more information."
|
||||
msgstr "Spróbuj `%s --help' by uzyskaæ wiêcej informacji"
|
||||
|
||||
#: src/main/options.c:320
|
||||
#, fuzzy, c-format
|
||||
msgid "Try `%s -h' for more information."
|
||||
msgstr "Spróbuj `%s -h' by uzyskaæ wiêcej informacji"
|
||||
|
||||
#: src/main/options.c:336
|
||||
msgid ""
|
||||
"cannot use line mode or transfer modifier options when watching file "
|
||||
"descriptors"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:344
|
||||
msgid "cannot use cursor positioning when watching file descriptors"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:352
|
||||
msgid "cannot use remote control when watching file descriptors"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:360
|
||||
msgid "cannot transfer files when watching file descriptors"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:368
|
||||
msgid "not available on systems without /proc/self/fdinfo"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/remote.c:221
|
||||
@@ -436,3 +395,59 @@ msgstr ""
|
||||
#: src/main/remote.c:328
|
||||
msgid "IPC not supported on this system"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:102
|
||||
msgid "option structure allocation failed"
|
||||
msgstr "nie udało się zaalokować struktur opcji"
|
||||
|
||||
#: src/main/options.c:116
|
||||
msgid "option structure argv allocation failed"
|
||||
msgstr "nie udało się zaalokować struktur opcji argv"
|
||||
|
||||
#: src/main/options.c:160
|
||||
msgid "integer argument expected"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:171
|
||||
msgid "numeric argument expected"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:182
|
||||
msgid "process ID or pid:fd pair expected"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:189
|
||||
msgid "invalid process ID"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:355
|
||||
#, c-format
|
||||
msgid "Try `%s --help' for more information."
|
||||
msgstr "Spróbuj `%s --help' by uzyskać więcej informacji"
|
||||
|
||||
#: src/main/options.c:359
|
||||
#, c-format
|
||||
msgid "Try `%s -h' for more information."
|
||||
msgstr "Spróbuj `%s -h' by uzyskać więcej informacji"
|
||||
|
||||
#: src/main/options.c:375
|
||||
msgid ""
|
||||
"cannot use line mode or transfer modifier options when watching file "
|
||||
"descriptors"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:383
|
||||
msgid "cannot use cursor positioning when watching file descriptors"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:391
|
||||
msgid "cannot use remote control when watching file descriptors"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:399
|
||||
msgid "cannot transfer files when watching file descriptors"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:407
|
||||
msgid "not available on systems without /proc/self/fdinfo"
|
||||
msgstr ""
|
||||
|
||||
+192
-169
@@ -6,7 +6,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-09-05 19:25+0100\n"
|
||||
"POT-Creation-Date: 2023-07-17 21:52+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -30,34 +30,6 @@ msgstr "tentativa de bloqueio falhou"
|
||||
msgid "failed to open terminal"
|
||||
msgstr "erro abrindo o terminal"
|
||||
|
||||
#: src/pv/display.c:138
|
||||
msgid "yzafpnum kMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:143
|
||||
msgid "yzafpnum KMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:558 src/pv/transfer.c:679
|
||||
msgid "buffer allocation failed"
|
||||
msgstr "erro alocando o buffer"
|
||||
|
||||
#: src/pv/display.c:618 src/pv/transfer.c:458
|
||||
msgid "B"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:654 src/pv/display.c:662
|
||||
msgid "/s"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:654 src/pv/display.c:662
|
||||
msgid "B/s"
|
||||
msgstr "B/s"
|
||||
|
||||
#: src/pv/display.c:697 src/pv/display.c:702 src/pv/display.c:764
|
||||
msgid "ETA"
|
||||
msgstr "ETA"
|
||||
|
||||
#: src/pv/file.c:119
|
||||
msgid "failed to seek to start of output"
|
||||
msgstr "não pode mover para o início da produção"
|
||||
@@ -70,7 +42,7 @@ msgstr "erro fechando o arquivo"
|
||||
msgid "failed to read file"
|
||||
msgstr "erro lendo o arquivo"
|
||||
|
||||
#: src/pv/file.c:248
|
||||
#: src/pv/file.c:248 src/main/options.c:288
|
||||
msgid "failed to stat file"
|
||||
msgstr "erro obtendo informações do arquivo"
|
||||
|
||||
@@ -82,15 +54,14 @@ msgstr "erro obtendo informações do arquivo de saída"
|
||||
msgid "input file is output file"
|
||||
msgstr "os arquivos de entrada e saída são o mesmo"
|
||||
|
||||
#: src/pv/loop.c:520 src/pv/loop.c:590 src/pv/loop.c:642 src/pv/watchpid.c:51
|
||||
#: src/pv/watchpid.c:74 src/pv/watchpid.c:84 src/pv/watchpid.c:115
|
||||
#: src/pv/loop.c:527 src/pv/loop.c:597 src/pv/loop.c:649 src/pv/watchpid.c:68
|
||||
#: src/pv/watchpid.c:79 src/pv/watchpid.c:93 src/pv/watchpid.c:104
|
||||
#: src/pv/watchpid.c:145 src/pv/watchpid.c:168 src/pv/watchpid.c:178
|
||||
#: src/pv/watchpid.c:192 src/pv/watchpid.c:285 src/pv/watchpid.c:294
|
||||
#: src/pv/watchpid.c:332 src/pv/watchpid.c:349
|
||||
msgid "pid"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/state.c:33
|
||||
msgid "none"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:341
|
||||
msgid "read failed"
|
||||
msgstr "erro de leitura"
|
||||
@@ -111,19 +82,64 @@ msgstr "não pode ir além do erro"
|
||||
msgid "skipped past read error"
|
||||
msgstr "ignorado erro de leitura"
|
||||
|
||||
#: src/pv/transfer.c:458 src/pv/display.c:687
|
||||
msgid "B"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:631
|
||||
msgid "write failed"
|
||||
msgstr "erro de gravação"
|
||||
|
||||
#: src/pv/transfer.c:679 src/pv/display.c:618
|
||||
msgid "buffer allocation failed"
|
||||
msgstr "erro alocando o buffer"
|
||||
|
||||
#: src/pv/transfer.c:770
|
||||
msgid "select call failed"
|
||||
msgstr "erro na chamada da função select"
|
||||
|
||||
#: src/pv/watchpid.c:76 src/pv/watchpid.c:86 src/pv/watchpid.c:117
|
||||
#: src/pv/state.c:25
|
||||
msgid "history structure allocation failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/state.c:55
|
||||
msgid "none"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:151
|
||||
msgid "yzafpnum kMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:156
|
||||
msgid "yzafpnum KMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:683
|
||||
msgid "b"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:738 src/pv/display.c:752
|
||||
msgid "b/s"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:742 src/pv/display.c:757
|
||||
msgid "/s"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:742 src/pv/display.c:758
|
||||
msgid "B/s"
|
||||
msgstr "B/s"
|
||||
|
||||
#: src/pv/display.c:793 src/pv/display.c:798 src/pv/display.c:860
|
||||
msgid "ETA"
|
||||
msgstr "ETA"
|
||||
|
||||
#: src/pv/watchpid.c:81 src/pv/watchpid.c:95 src/pv/watchpid.c:106
|
||||
#: src/pv/watchpid.c:170 src/pv/watchpid.c:180 src/pv/watchpid.c:194
|
||||
msgid "fd"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/watchpid.c:120
|
||||
#: src/pv/watchpid.c:109 src/pv/watchpid.c:197
|
||||
msgid "not a regular file or block device"
|
||||
msgstr "não é um arquivo regular ou dispositivo de bloqueio"
|
||||
|
||||
@@ -179,168 +195,176 @@ msgstr "exibe a taxa de transferência"
|
||||
msgid "show data transfer average rate counter"
|
||||
msgstr "exibe o contador da taxa média de transferência de dados"
|
||||
|
||||
#: src/main/help.c:44
|
||||
msgid "show number of bytes transferred"
|
||||
msgstr "exibe a quantidade de bytes transferidos"
|
||||
|
||||
#: src/main/help.c:46
|
||||
msgid "show percentage of transfer buffer in use"
|
||||
msgstr "exibe a porcentagem de buffer de transferência em uso"
|
||||
|
||||
#: src/main/help.c:47
|
||||
msgid "NUM"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:48
|
||||
msgid "show NUM bytes last written"
|
||||
msgstr "exibe NUM bytes gravados pela última vez"
|
||||
|
||||
#: src/main/help.c:49
|
||||
msgid "FORMAT"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:50
|
||||
msgid "set output format to FORMAT"
|
||||
msgstr "definir o formato de saída para FORMAT"
|
||||
|
||||
#: src/main/help.c:52
|
||||
msgid "output percentages, not visual information"
|
||||
msgstr "exibe apenas as porcentagens, sem informações visuais"
|
||||
|
||||
#: src/main/help.c:54
|
||||
msgid "do not output any transfer information at all"
|
||||
msgstr "executa programa sem exibir quaisquer informações"
|
||||
|
||||
#: src/main/help.c:57
|
||||
msgid "display nothing until first byte transferred"
|
||||
msgstr "não exibe nada até iniciar o processamento"
|
||||
|
||||
#: src/main/help.c:58 src/main/help.c:66
|
||||
#: src/main/help.c:43 src/main/help.c:63 src/main/help.c:71
|
||||
msgid "SEC"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:45
|
||||
msgid "compute average rate over past SEC seconds (default 30s)"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:47
|
||||
msgid "show number of bytes transferred"
|
||||
msgstr "exibe a quantidade de bytes transferidos"
|
||||
|
||||
#: src/main/help.c:49
|
||||
msgid "show number of bits transferred"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:51
|
||||
msgid "show percentage of transfer buffer in use"
|
||||
msgstr "exibe a porcentagem de buffer de transferência em uso"
|
||||
|
||||
#: src/main/help.c:52
|
||||
msgid "NUM"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:53
|
||||
msgid "show NUM bytes last written"
|
||||
msgstr "exibe NUM bytes gravados pela última vez"
|
||||
|
||||
#: src/main/help.c:54
|
||||
msgid "FORMAT"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:55
|
||||
msgid "set output format to FORMAT"
|
||||
msgstr "definir o formato de saída para FORMAT"
|
||||
|
||||
#: src/main/help.c:57
|
||||
msgid "output percentages, not visual information"
|
||||
msgstr "exibe apenas as porcentagens, sem informações visuais"
|
||||
|
||||
#: src/main/help.c:59
|
||||
msgid "do not output any transfer information at all"
|
||||
msgstr "executa programa sem exibir quaisquer informações"
|
||||
|
||||
#: src/main/help.c:62
|
||||
msgid "display nothing until first byte transferred"
|
||||
msgstr "não exibe nada até iniciar o processamento"
|
||||
|
||||
#: src/main/help.c:64
|
||||
msgid "display nothing until SEC seconds have passed"
|
||||
msgstr "não exibir nada até que os segundos SEC tenham passado"
|
||||
|
||||
#: src/main/help.c:60
|
||||
#: src/main/help.c:65
|
||||
msgid "SIZE"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:61
|
||||
#: src/main/help.c:66
|
||||
msgid "set estimated data size to SIZE bytes"
|
||||
msgstr "seta a quantidade estimada de dados em SIZE bytes"
|
||||
|
||||
#: src/main/help.c:63
|
||||
#: src/main/help.c:68
|
||||
msgid "count lines instead of bytes"
|
||||
msgstr "contar linhas em vez de bytes"
|
||||
|
||||
#: src/main/help.c:65
|
||||
#: src/main/help.c:70
|
||||
msgid "lines are null-terminated"
|
||||
msgstr "linhas são terminadas em nulo"
|
||||
|
||||
#: src/main/help.c:67
|
||||
#: src/main/help.c:72
|
||||
msgid "update every SEC seconds"
|
||||
msgstr "atualiza informações a cada SEC segundos"
|
||||
|
||||
#: src/main/help.c:68
|
||||
#: src/main/help.c:73
|
||||
msgid "WIDTH"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:69
|
||||
#: src/main/help.c:74
|
||||
msgid "assume terminal is WIDTH characters wide"
|
||||
msgstr "presuma que o terminal tem WIDTH caracteres de largura"
|
||||
|
||||
#: src/main/help.c:70
|
||||
#: src/main/help.c:75
|
||||
msgid "HEIGHT"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:71
|
||||
#: src/main/help.c:76
|
||||
msgid "assume terminal is HEIGHT rows high"
|
||||
msgstr "presuma que o terminal tem HEIGHT caracteres de altura"
|
||||
|
||||
#: src/main/help.c:72
|
||||
#: src/main/help.c:77
|
||||
msgid "NAME"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:73
|
||||
#: src/main/help.c:78
|
||||
msgid "prefix visual information with NAME"
|
||||
msgstr "exibe NAME antes das demais informações"
|
||||
|
||||
#: src/main/help.c:75
|
||||
#: src/main/help.c:80
|
||||
msgid "output even if standard error is not a terminal"
|
||||
msgstr "gera dados mesmo que a saída de erro seja redirecionada"
|
||||
|
||||
#: src/main/help.c:77
|
||||
#: src/main/help.c:82
|
||||
msgid "use cursor positioning escape sequences"
|
||||
msgstr "utiliza caracteres de escape para posicionar o cursor"
|
||||
|
||||
#: src/main/help.c:79
|
||||
#: src/main/help.c:84
|
||||
msgid "RATE"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:80
|
||||
#: src/main/help.c:85
|
||||
msgid "limit transfer to RATE bytes per second"
|
||||
msgstr "limita a transferência a RATE bytes por segundo"
|
||||
|
||||
#: src/main/help.c:81
|
||||
#: src/main/help.c:86
|
||||
msgid "BYTES"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:82
|
||||
#: src/main/help.c:87
|
||||
msgid "use a buffer size of BYTES"
|
||||
msgstr "use um tamanho de buffer de BYTES"
|
||||
|
||||
#: src/main/help.c:84
|
||||
#: src/main/help.c:89
|
||||
msgid "never use splice(), always use read/write"
|
||||
msgstr "nunca use splice(), sempre use read/write"
|
||||
|
||||
#: src/main/help.c:86
|
||||
#: src/main/help.c:91
|
||||
msgid "skip read errors in input"
|
||||
msgstr "ignorar erros de leitura em entrada"
|
||||
|
||||
#: src/main/help.c:88
|
||||
#: src/main/help.c:93
|
||||
msgid "stop after --size bytes have been transferred"
|
||||
msgstr "parar após --size bytes terem sido transferidos"
|
||||
|
||||
#: src/main/help.c:90
|
||||
#: src/main/help.c:95
|
||||
msgid "PID"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:91
|
||||
#: src/main/help.c:96
|
||||
msgid "update settings of process PID"
|
||||
msgstr "atualizar as configurações do processo PID"
|
||||
|
||||
#: src/main/help.c:94
|
||||
#: src/main/help.c:99
|
||||
msgid "FILE"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:95
|
||||
#: src/main/help.c:100
|
||||
msgid "save process ID in FILE"
|
||||
msgstr "salvar ID do processo em FILE"
|
||||
|
||||
#: src/main/help.c:97
|
||||
#: src/main/help.c:102
|
||||
msgid "PID[:FD]"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:98
|
||||
#: src/main/help.c:103
|
||||
msgid "watch file FD opened by process PID"
|
||||
msgstr "assistir arquivo FD aberto pelo processo PID"
|
||||
|
||||
#: src/main/help.c:101
|
||||
#: src/main/help.c:106
|
||||
msgid "show this help and exit"
|
||||
msgstr "exibe esta tela de ajuda e termina"
|
||||
|
||||
#: src/main/help.c:103
|
||||
#: src/main/help.c:108
|
||||
msgid "show version information and exit"
|
||||
msgstr "exibe a versão e termina"
|
||||
|
||||
#: src/main/help.c:109
|
||||
#: src/main/help.c:114
|
||||
#, c-format
|
||||
msgid "Usage: %s [OPTION] [FILE]..."
|
||||
msgstr "Uso: %s [OPÇÕES] [ARQUIVOS]..."
|
||||
|
||||
#: src/main/help.c:112
|
||||
#: src/main/help.c:117
|
||||
msgid ""
|
||||
"Concatenate FILE(s), or standard input, to standard output,\n"
|
||||
"with monitoring."
|
||||
@@ -348,7 +372,7 @@ msgstr ""
|
||||
"Concatena ARQUIVO(s) ou a entrada padrão e grava na saída padrão,\n"
|
||||
"com monitoramento."
|
||||
|
||||
#: src/main/help.c:207
|
||||
#: src/main/help.c:212
|
||||
msgid ""
|
||||
"Debugging is enabled; export the DEBUG environment variable to define the\n"
|
||||
"output filename.\n"
|
||||
@@ -356,7 +380,7 @@ msgstr ""
|
||||
"A depuração está habilitada; exporte a variável de ambiente DEBUG para\n"
|
||||
"definir o nome do arquivo de saída.\n"
|
||||
|
||||
#: src/main/help.c:211
|
||||
#: src/main/help.c:216
|
||||
#, c-format
|
||||
msgid "Please report any bugs to %s."
|
||||
msgstr "Por favor, reporte quaisquer defeitos para %s."
|
||||
@@ -365,70 +389,9 @@ msgstr "Por favor, reporte quaisquer defeitos para %s."
|
||||
msgid "state allocation failed"
|
||||
msgstr "alocação de memória de status falhou"
|
||||
|
||||
#: src/main/main.c:246
|
||||
#, fuzzy
|
||||
#: src/main/main.c:248
|
||||
msgid "failed to read terminal attributes"
|
||||
msgstr "erro ao ler o nome do terminal"
|
||||
|
||||
#: src/main/options.c:98
|
||||
msgid "option structure allocation failed"
|
||||
msgstr "erro na alocação da estrutura de opções"
|
||||
|
||||
#: src/main/options.c:112
|
||||
msgid "option structure argv allocation failed"
|
||||
msgstr "erro na alocação da estrutura de opções argv"
|
||||
|
||||
#: src/main/options.c:151
|
||||
msgid "integer argument expected"
|
||||
msgstr "argumento inteiro esperado"
|
||||
|
||||
#: src/main/options.c:162
|
||||
msgid "numeric argument expected"
|
||||
msgstr "argumento numérico esperado"
|
||||
|
||||
#: src/main/options.c:173
|
||||
msgid "process ID or pid:fd pair expected"
|
||||
msgstr "ID do processo ou par pid:fd esperado"
|
||||
|
||||
#: src/main/options.c:180
|
||||
msgid "invalid process ID"
|
||||
msgstr "ID de processo inválido"
|
||||
|
||||
#: src/main/options.c:316
|
||||
#, c-format
|
||||
msgid "Try `%s --help' for more information."
|
||||
msgstr "Tente `%s --help' para maiores informações."
|
||||
|
||||
#: src/main/options.c:320
|
||||
#, c-format
|
||||
msgid "Try `%s -h' for more information."
|
||||
msgstr "Tente `%s -h' para maiores informações."
|
||||
|
||||
#: src/main/options.c:336
|
||||
msgid ""
|
||||
"cannot use line mode or transfer modifier options when watching file "
|
||||
"descriptors"
|
||||
msgstr ""
|
||||
"não pode usar o modo de linha ou opções de modificador de transferência ao "
|
||||
"assistir os descritores de arquivo"
|
||||
|
||||
#: src/main/options.c:344
|
||||
msgid "cannot use cursor positioning when watching file descriptors"
|
||||
msgstr ""
|
||||
"não pode usar o posicionamento do cursor ao observar os descritores de "
|
||||
"arquivo"
|
||||
|
||||
#: src/main/options.c:352
|
||||
msgid "cannot use remote control when watching file descriptors"
|
||||
msgstr "não pode usar o controle remoto ao assistir os descritores de arquivo"
|
||||
|
||||
#: src/main/options.c:360
|
||||
msgid "cannot transfer files when watching file descriptors"
|
||||
msgstr "não pode transferir arquivos ao assistir descritores de arquivo"
|
||||
|
||||
#: src/main/options.c:368
|
||||
msgid "not available on systems without /proc/self/fdinfo"
|
||||
msgstr "não disponível em sistemas sem /proc/self/fdinfo"
|
||||
|
||||
#: src/main/remote.c:221
|
||||
msgid "message not received"
|
||||
@@ -437,3 +400,63 @@ msgstr "mensagem não recebida"
|
||||
#: src/main/remote.c:328
|
||||
msgid "IPC not supported on this system"
|
||||
msgstr "IPC não suportado neste sistema"
|
||||
|
||||
#: src/main/options.c:102
|
||||
msgid "option structure allocation failed"
|
||||
msgstr "erro na alocação da estrutura de opções"
|
||||
|
||||
#: src/main/options.c:116
|
||||
msgid "option structure argv allocation failed"
|
||||
msgstr "erro na alocação da estrutura de opções argv"
|
||||
|
||||
#: src/main/options.c:160
|
||||
msgid "integer argument expected"
|
||||
msgstr "argumento inteiro esperado"
|
||||
|
||||
#: src/main/options.c:171
|
||||
msgid "numeric argument expected"
|
||||
msgstr "argumento numérico esperado"
|
||||
|
||||
#: src/main/options.c:182
|
||||
msgid "process ID or pid:fd pair expected"
|
||||
msgstr "ID do processo ou par pid:fd esperado"
|
||||
|
||||
#: src/main/options.c:189
|
||||
msgid "invalid process ID"
|
||||
msgstr "ID de processo inválido"
|
||||
|
||||
#: src/main/options.c:355
|
||||
#, c-format
|
||||
msgid "Try `%s --help' for more information."
|
||||
msgstr "Tente `%s --help' para maiores informações."
|
||||
|
||||
#: src/main/options.c:359
|
||||
#, c-format
|
||||
msgid "Try `%s -h' for more information."
|
||||
msgstr "Tente `%s -h' para maiores informações."
|
||||
|
||||
#: src/main/options.c:375
|
||||
msgid ""
|
||||
"cannot use line mode or transfer modifier options when watching file "
|
||||
"descriptors"
|
||||
msgstr ""
|
||||
"não pode usar o modo de linha ou opções de modificador de transferência ao "
|
||||
"assistir os descritores de arquivo"
|
||||
|
||||
#: src/main/options.c:383
|
||||
msgid "cannot use cursor positioning when watching file descriptors"
|
||||
msgstr ""
|
||||
"não pode usar o posicionamento do cursor ao observar os descritores de "
|
||||
"arquivo"
|
||||
|
||||
#: src/main/options.c:391
|
||||
msgid "cannot use remote control when watching file descriptors"
|
||||
msgstr "não pode usar o controle remoto ao assistir os descritores de arquivo"
|
||||
|
||||
#: src/main/options.c:399
|
||||
msgid "cannot transfer files when watching file descriptors"
|
||||
msgstr "não pode transferir arquivos ao assistir descritores de arquivo"
|
||||
|
||||
#: src/main/options.c:407
|
||||
msgid "not available on systems without /proc/self/fdinfo"
|
||||
msgstr "não disponível em sistemas sem /proc/self/fdinfo"
|
||||
|
||||
+200
-174
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-09-05 19:25+0100\n"
|
||||
"POT-Creation-Date: 2023-07-27 20:49+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -16,140 +16,158 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: src/pv/cursor.c:80
|
||||
#: src/pv/cursor.c:86
|
||||
msgid "failed to get terminal name"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/cursor.c:125
|
||||
#: src/pv/cursor.c:124
|
||||
msgid "failed to open lock file"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/cursor.c:159
|
||||
#: src/pv/cursor.c:158
|
||||
msgid "lock attempt failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/cursor.c:409
|
||||
#: src/pv/cursor.c:408
|
||||
msgid "failed to open terminal"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:138
|
||||
msgid "yzafpnum kMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:143
|
||||
msgid "yzafpnum KMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:558 src/pv/transfer.c:679
|
||||
msgid "buffer allocation failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:618 src/pv/transfer.c:458
|
||||
msgid "B"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:654 src/pv/display.c:662
|
||||
msgid "/s"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:654 src/pv/display.c:662
|
||||
msgid "B/s"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:697 src/pv/display.c:702 src/pv/display.c:764
|
||||
msgid "ETA"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/file.c:119
|
||||
#: src/pv/file.c:124
|
||||
msgid "failed to seek to start of output"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/file.c:215
|
||||
#: src/pv/file.c:220
|
||||
msgid "failed to close file"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/file.c:238
|
||||
#: src/pv/file.c:243
|
||||
msgid "failed to read file"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/file.c:248
|
||||
#: src/pv/file.c:253 src/main/options.c:293
|
||||
msgid "failed to stat file"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/file.c:257
|
||||
#: src/pv/file.c:262
|
||||
msgid "failed to stat output file"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/file.c:280
|
||||
#: src/pv/file.c:285
|
||||
msgid "input file is output file"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/loop.c:520 src/pv/loop.c:590 src/pv/loop.c:642 src/pv/watchpid.c:51
|
||||
#: src/pv/watchpid.c:74 src/pv/watchpid.c:84 src/pv/watchpid.c:115
|
||||
msgid "pid"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/state.c:33
|
||||
msgid "none"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:341
|
||||
#: src/pv/transfer.c:387
|
||||
msgid "read failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:359
|
||||
#: src/pv/transfer.c:405
|
||||
msgid "warning: read errors detected"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:374
|
||||
#: src/pv/transfer.c:420
|
||||
msgid "file is not seekable"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:437
|
||||
#: src/pv/transfer.c:483
|
||||
msgid "failed to seek past error"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:456
|
||||
#: src/pv/transfer.c:502
|
||||
msgid "skipped past read error"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:631
|
||||
#: src/pv/transfer.c:504 src/pv/display.c:723
|
||||
msgid "B"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:678
|
||||
msgid "write failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:770
|
||||
#: src/pv/transfer.c:808 src/pv/display.c:646
|
||||
msgid "buffer allocation failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/transfer.c:913
|
||||
msgid "select call failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/watchpid.c:76 src/pv/watchpid.c:86 src/pv/watchpid.c:117
|
||||
#: src/pv/watchpid.c:74 src/pv/watchpid.c:85 src/pv/watchpid.c:99
|
||||
#: src/pv/watchpid.c:110 src/pv/watchpid.c:151 src/pv/watchpid.c:168
|
||||
#: src/pv/watchpid.c:178 src/pv/watchpid.c:192 src/pv/watchpid.c:280
|
||||
#: src/pv/watchpid.c:289 src/pv/watchpid.c:322 src/pv/watchpid.c:343
|
||||
#: src/pv/loop.c:542 src/pv/loop.c:604 src/pv/loop.c:656
|
||||
msgid "pid"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/watchpid.c:87 src/pv/watchpid.c:101 src/pv/watchpid.c:112
|
||||
#: src/pv/watchpid.c:170 src/pv/watchpid.c:180 src/pv/watchpid.c:194
|
||||
msgid "fd"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/watchpid.c:120
|
||||
#: src/pv/watchpid.c:115 src/pv/watchpid.c:197
|
||||
msgid "not a regular file or block device"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/version.c:17
|
||||
#, c-format
|
||||
msgid "%s %s - Copyright %s %s"
|
||||
#: src/pv/state.c:31
|
||||
msgid "history structure allocation failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/version.c:20
|
||||
#, c-format
|
||||
msgid "Web site: %s"
|
||||
#: src/pv/state.c:61
|
||||
msgid "none"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/version.c:23
|
||||
msgid ""
|
||||
"This program is free software, and is being distributed under the\n"
|
||||
"terms of the Artistic License 2.0."
|
||||
#: src/pv/display.c:163
|
||||
msgid "yzafpnum kMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/version.c:28
|
||||
msgid ""
|
||||
"This program is distributed in the hope that it will be useful,\n"
|
||||
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
|
||||
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||
#: src/pv/display.c:168
|
||||
msgid "yzafpnum KMGTPEZY"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:719
|
||||
msgid "b"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:784 src/pv/display.c:798
|
||||
msgid "b/s"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:788 src/pv/display.c:803
|
||||
msgid "/s"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:788 src/pv/display.c:804
|
||||
msgid "B/s"
|
||||
msgstr ""
|
||||
|
||||
#: src/pv/display.c:841 src/pv/display.c:848 src/pv/display.c:912
|
||||
msgid "ETA"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/version.c:24
|
||||
msgid "License: Artistic v2.0 <https://opensource.org/license/artistic-2-0/>"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/version.c:27
|
||||
msgid "This is free software: you are free to change and redistribute it."
|
||||
msgstr ""
|
||||
|
||||
#: src/main/version.c:29
|
||||
msgid "There is NO WARRANTY, to the extent permitted by law."
|
||||
msgstr ""
|
||||
|
||||
#. Project web site link
|
||||
#: src/main/version.c:31
|
||||
msgid "Project web site"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/remote.c:223
|
||||
msgid "message not received"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/remote.c:330
|
||||
msgid "IPC not supported on this system"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:31
|
||||
@@ -176,252 +194,260 @@ msgstr ""
|
||||
msgid "show data transfer average rate counter"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:44
|
||||
msgid "show number of bytes transferred"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:46
|
||||
msgid "show percentage of transfer buffer in use"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:47
|
||||
msgid "NUM"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:48
|
||||
msgid "show NUM bytes last written"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:49
|
||||
msgid "FORMAT"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:50
|
||||
msgid "set output format to FORMAT"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:52
|
||||
msgid "output percentages, not visual information"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:54
|
||||
msgid "do not output any transfer information at all"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:57
|
||||
msgid "display nothing until first byte transferred"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:58 src/main/help.c:66
|
||||
#: src/main/help.c:43 src/main/help.c:63 src/main/help.c:71
|
||||
msgid "SEC"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:45
|
||||
msgid "compute average rate over past SEC seconds (default 30s)"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:47
|
||||
msgid "show number of bytes transferred"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:49
|
||||
msgid "show number of bits transferred"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:51
|
||||
msgid "show percentage of transfer buffer in use"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:52
|
||||
msgid "NUM"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:53
|
||||
msgid "show NUM bytes last written"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:54
|
||||
msgid "FORMAT"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:55
|
||||
msgid "set output format to FORMAT"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:57
|
||||
msgid "output percentages, not visual information"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:59
|
||||
msgid "do not output any transfer information at all"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:62
|
||||
msgid "display nothing until first byte transferred"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:64
|
||||
msgid "display nothing until SEC seconds have passed"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:60
|
||||
#: src/main/help.c:65
|
||||
msgid "SIZE"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:61
|
||||
#: src/main/help.c:66
|
||||
msgid "set estimated data size to SIZE bytes"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:63
|
||||
#: src/main/help.c:68
|
||||
msgid "count lines instead of bytes"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:65
|
||||
#: src/main/help.c:70
|
||||
msgid "lines are null-terminated"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:67
|
||||
#: src/main/help.c:72
|
||||
msgid "update every SEC seconds"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:68
|
||||
#: src/main/help.c:73
|
||||
msgid "WIDTH"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:69
|
||||
#: src/main/help.c:74
|
||||
msgid "assume terminal is WIDTH characters wide"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:70
|
||||
#: src/main/help.c:75
|
||||
msgid "HEIGHT"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:71
|
||||
#: src/main/help.c:76
|
||||
msgid "assume terminal is HEIGHT rows high"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:72
|
||||
#: src/main/help.c:77
|
||||
msgid "NAME"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:73
|
||||
#: src/main/help.c:78
|
||||
msgid "prefix visual information with NAME"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:75
|
||||
#: src/main/help.c:80
|
||||
msgid "output even if standard error is not a terminal"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:77
|
||||
#: src/main/help.c:82
|
||||
msgid "use cursor positioning escape sequences"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:79
|
||||
#: src/main/help.c:84
|
||||
msgid "RATE"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:80
|
||||
#: src/main/help.c:85
|
||||
msgid "limit transfer to RATE bytes per second"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:81
|
||||
#: src/main/help.c:86
|
||||
msgid "BYTES"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:82
|
||||
#: src/main/help.c:87
|
||||
msgid "use a buffer size of BYTES"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:84
|
||||
#: src/main/help.c:89
|
||||
msgid "never use splice(), always use read/write"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:86
|
||||
#: src/main/help.c:91
|
||||
msgid "skip read errors in input"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:88
|
||||
#: src/main/help.c:93
|
||||
msgid "stop after --size bytes have been transferred"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:90
|
||||
msgid "PID"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:91
|
||||
msgid "update settings of process PID"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:94
|
||||
msgid "FILE"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:95
|
||||
msgid "save process ID in FILE"
|
||||
msgid "flush cache to disk after every write"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:97
|
||||
msgid "PID[:FD]"
|
||||
msgid "use direct I/O to bypass cache"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:98
|
||||
msgid "watch file FD opened by process PID"
|
||||
#: src/main/help.c:99
|
||||
msgid "PID"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:101
|
||||
msgid "show this help and exit"
|
||||
#: src/main/help.c:100
|
||||
msgid "update settings of process PID"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:103
|
||||
msgid "FILE"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:104
|
||||
msgid "save process ID in FILE"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:106
|
||||
msgid "PID[:FD]"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:107
|
||||
msgid "watch file FD opened by process PID"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:110
|
||||
msgid "show this help and exit"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:112
|
||||
msgid "show version information and exit"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:109
|
||||
#: src/main/help.c:119
|
||||
#, c-format
|
||||
msgid "Usage: %s [OPTION] [FILE]..."
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:112
|
||||
#: src/main/help.c:122
|
||||
msgid ""
|
||||
"Concatenate FILE(s), or standard input, to standard output,\n"
|
||||
"with monitoring."
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:207
|
||||
#: src/main/help.c:215
|
||||
msgid ""
|
||||
"Debugging is enabled; export the DEBUG environment variable to define the\n"
|
||||
"output filename.\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/help.c:211
|
||||
#: src/main/help.c:219
|
||||
#, c-format
|
||||
msgid "Please report any bugs to %s."
|
||||
msgstr ""
|
||||
|
||||
#: src/main/main.c:74
|
||||
#: src/main/main.c:76
|
||||
msgid "state allocation failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/main.c:246
|
||||
#: src/main/main.c:252
|
||||
msgid "failed to read terminal attributes"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:98
|
||||
#: src/main/options.c:106
|
||||
msgid "option structure allocation failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:112
|
||||
#: src/main/options.c:120
|
||||
msgid "option structure argv allocation failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:151
|
||||
#: src/main/options.c:165
|
||||
msgid "integer argument expected"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:162
|
||||
#: src/main/options.c:176
|
||||
msgid "numeric argument expected"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:173
|
||||
#: src/main/options.c:187
|
||||
msgid "process ID or pid:fd pair expected"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:180
|
||||
#: src/main/options.c:194
|
||||
msgid "invalid process ID"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:316
|
||||
#: src/main/options.c:366
|
||||
#, c-format
|
||||
msgid "Try `%s --help' for more information."
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:320
|
||||
#: src/main/options.c:370
|
||||
#, c-format
|
||||
msgid "Try `%s -h' for more information."
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:336
|
||||
#: src/main/options.c:386
|
||||
msgid ""
|
||||
"cannot use line mode or transfer modifier options when watching file "
|
||||
"descriptors"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:344
|
||||
#: src/main/options.c:394
|
||||
msgid "cannot use cursor positioning when watching file descriptors"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:352
|
||||
#: src/main/options.c:402
|
||||
msgid "cannot use remote control when watching file descriptors"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:360
|
||||
#: src/main/options.c:410
|
||||
msgid "cannot transfer files when watching file descriptors"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/options.c:368
|
||||
#: src/main/options.c:418
|
||||
msgid "not available on systems without /proc/self/fdinfo"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/remote.c:221
|
||||
msgid "message not received"
|
||||
msgstr ""
|
||||
|
||||
#: src/main/remote.c:328
|
||||
msgid "IPC not supported on this system"
|
||||
msgstr ""
|
||||
|
||||
+24
-37
@@ -9,8 +9,14 @@
|
||||
* However, some OSes (FreeBSD and MacOS X so far) don't allow locking of a
|
||||
* terminal, so we try to use a lockfile if terminal locking doesn't work,
|
||||
* and finally abort if even that is unavailable.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "pv.h"
|
||||
#include "pv-internal.h"
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -39,7 +45,7 @@
|
||||
* Write the given buffer to the given file descriptor, retrying until all
|
||||
* bytes have been written or an error has occurred.
|
||||
*/
|
||||
static void write_retry(int fd, const char *buf, size_t count)
|
||||
void pv_write_retry(int fd, const char *buf, size_t count)
|
||||
{
|
||||
while (count > 0) {
|
||||
ssize_t nwritten;
|
||||
@@ -96,18 +102,11 @@ static void pv_crs_open_lockfile(pvstate_t state, int fd)
|
||||
if (!tmpdir)
|
||||
tmpdir = "/tmp";
|
||||
|
||||
memset(state->crs_lock_file, 0, sizeof(state->crs_lock_file));
|
||||
#ifdef HAVE_SNPRINTF
|
||||
(void) snprintf(state->crs_lock_file,
|
||||
sizeof(state->crs_lock_file) - 1,
|
||||
"%s/pv-%s-%i.lock", tmpdir, basename(ttydev),
|
||||
(int) geteuid());
|
||||
#else
|
||||
(void) sprintf(state->crs_lock_file,
|
||||
"%.*s/pv-%8s-%i.lock",
|
||||
sizeof(state->crs_lock_file) - 64, tmpdir,
|
||||
basename(ttydev), (int) geteuid());
|
||||
#endif
|
||||
memset(state->crs_lock_file, 0, PV_SIZEOF_CRS_LOCK_FILE);
|
||||
(void) pv_snprintf(state->crs_lock_file,
|
||||
PV_SIZEOF_CRS_LOCK_FILE,
|
||||
"%s/pv-%s-%i.lock", tmpdir, basename(ttydev),
|
||||
(int) geteuid());
|
||||
|
||||
/*
|
||||
* Pawel Piatek - not everyone has O_NOFOLLOW, e.g. AIX doesn't
|
||||
@@ -252,7 +251,7 @@ static int pv_crs_get_ypos(int terminalfd)
|
||||
debug("%s: %s", "tcsetattr (1) failed", strerror(errno));
|
||||
}
|
||||
|
||||
write_retry(terminalfd, "\033[6n", 4);
|
||||
pv_write_retry(terminalfd, "\033[6n", 4);
|
||||
|
||||
memset(cpr, 0, sizeof(cpr));
|
||||
|
||||
@@ -437,7 +436,7 @@ void pv_crs_init(pvstate_t state)
|
||||
* initial ypos.
|
||||
*/
|
||||
if (state->crs_y_start > 0)
|
||||
write_retry(STDERR_FILENO, "\n", 1);
|
||||
pv_write_retry(STDERR_FILENO, "\n", 1);
|
||||
pv_crs_unlock(state, fd);
|
||||
|
||||
if (state->crs_y_start < 1)
|
||||
@@ -498,7 +497,7 @@ void pv_crs_reinit(pvstate_t state)
|
||||
* Output a single-line update, moving the cursor to the correct position to
|
||||
* do so.
|
||||
*/
|
||||
void pv_crs_update(pvstate_t state, char *str)
|
||||
void pv_crs_update(pvstate_t state, const char *str)
|
||||
{
|
||||
char pos[32];
|
||||
int y;
|
||||
@@ -551,15 +550,11 @@ void pv_crs_update(pvstate_t state, char *str)
|
||||
pv_crs_lock(state, STDERR_FILENO);
|
||||
|
||||
memset(pos, 0, sizeof(pos));
|
||||
# ifdef HAVE_SNPRINTF
|
||||
(void) snprintf(pos, sizeof(pos) - 1, "\033[%u;1H",
|
||||
state->height);
|
||||
# else
|
||||
(void) sprintf(pos, "\033[%u;1H", state->height);
|
||||
# endif
|
||||
write_retry(STDERR_FILENO, pos, strlen(pos));
|
||||
(void) pv_snprintf(pos, sizeof(pos), "\033[%u;1H",
|
||||
state->height);
|
||||
pv_write_retry(STDERR_FILENO, pos, strlen(pos));
|
||||
for (; offs > 0; offs--) {
|
||||
write_retry(STDERR_FILENO, "\n", 1);
|
||||
pv_write_retry(STDERR_FILENO, "\n", 1);
|
||||
}
|
||||
|
||||
pv_crs_unlock(state, STDERR_FILENO);
|
||||
@@ -580,16 +575,12 @@ void pv_crs_update(pvstate_t state, char *str)
|
||||
y = 1;
|
||||
|
||||
memset(pos, 0, sizeof(pos));
|
||||
#ifdef HAVE_SNPRINTF
|
||||
(void) snprintf(pos, sizeof(pos) - 1, "\033[%d;1H", y);
|
||||
#else
|
||||
(void) sprintf(pos, "\033[%d;1H", y);
|
||||
#endif
|
||||
(void) pv_snprintf(pos, sizeof(pos), "\033[%d;1H", y);
|
||||
|
||||
pv_crs_lock(state, STDERR_FILENO);
|
||||
|
||||
write_retry(STDERR_FILENO, pos, strlen(pos));
|
||||
write_retry(STDERR_FILENO, str, strlen(str));
|
||||
pv_write_retry(STDERR_FILENO, pos, strlen(pos));
|
||||
pv_write_retry(STDERR_FILENO, str, strlen(str));
|
||||
|
||||
pv_crs_unlock(state, STDERR_FILENO);
|
||||
}
|
||||
@@ -622,15 +613,11 @@ void pv_crs_fini(pvstate_t state)
|
||||
y = 1;
|
||||
|
||||
memset(pos, 0, sizeof(pos));
|
||||
#ifdef HAVE_SNPRINTF
|
||||
(void) snprintf(pos, sizeof(pos) - 1, "\033[%u;1H\n", y);
|
||||
#else
|
||||
(void) sprintf(pos, "\033[%u;1H\n", y);
|
||||
#endif
|
||||
(void) pv_snprintf(pos, sizeof(pos), "\033[%u;1H\n", y);
|
||||
|
||||
pv_crs_lock(state, STDERR_FILENO);
|
||||
|
||||
write_retry(STDERR_FILENO, pos, strlen(pos));
|
||||
pv_write_retry(STDERR_FILENO, pos, strlen(pos));
|
||||
|
||||
#ifdef HAVE_IPC
|
||||
pv_crs_ipccount(state);
|
||||
|
||||
+271
-109
@@ -1,7 +1,13 @@
|
||||
/*
|
||||
* Display functions.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "pv.h"
|
||||
#include "pv-internal.h"
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -12,8 +18,14 @@
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <termios.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
#ifdef HAVE_TERMIOS_H
|
||||
# include <termios.h>
|
||||
#endif
|
||||
|
||||
#ifdef GWINSZ_IN_SYS_IOCTL
|
||||
# include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
@@ -43,13 +55,28 @@ bool pv_in_foreground(void)
|
||||
pid_t our_process_group;
|
||||
pid_t tty_process_group;
|
||||
|
||||
if (0 == isatty(STDERR_FILENO))
|
||||
if (0 == isatty(STDERR_FILENO)) {
|
||||
debug("%s: true: %s", "pv_in_foreground", "not a tty");
|
||||
return true;
|
||||
}
|
||||
|
||||
our_process_group = getpgrp();
|
||||
tty_process_group = tcgetpgrp(STDERR_FILENO);
|
||||
if (our_process_group == tty_process_group)
|
||||
|
||||
if (tty_process_group == -1 && errno == ENOTTY) {
|
||||
debug("%s: true: %s", "pv_in_foreground",
|
||||
"tty_process_group is -1, errno is ENOTTY");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (our_process_group == tty_process_group) {
|
||||
debug("%s: true: %s", "pv_in_foreground",
|
||||
"our_process_group == tty_process_group");
|
||||
return true;
|
||||
}
|
||||
|
||||
debug("%s: false: our_process_group=%d, tty_process_group=%d",
|
||||
"pv_in_foreground", our_process_group, tty_process_group);
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -95,16 +122,14 @@ static long pv__calc_percentage(long long so_far, const long long total)
|
||||
* number of seconds until completion.
|
||||
*/
|
||||
static long pv__calc_eta(const long long so_far, const long long total,
|
||||
const long elapsed)
|
||||
const long rate)
|
||||
{
|
||||
long long amount_left;
|
||||
|
||||
if (so_far < 1)
|
||||
if ((so_far < 1) || (0 == rate))
|
||||
return 0;
|
||||
|
||||
amount_left = total - so_far;
|
||||
amount_left *= (long long) elapsed;
|
||||
amount_left /= so_far;
|
||||
amount_left = (total - so_far) / rate;
|
||||
|
||||
return (long) amount_left;
|
||||
}
|
||||
@@ -158,9 +183,17 @@ static void pv__si_prefix(long double *value, char *prefix,
|
||||
|
||||
/*
|
||||
* Force an empty prefix if the value is zero to avoid "0yB".
|
||||
*
|
||||
* See below's "is_bytes" check for the reason we add another space
|
||||
* in bytes mode.
|
||||
*/
|
||||
if (0.0 == *value)
|
||||
if (0.0 == *value) {
|
||||
if (is_bytes) {
|
||||
prefix[1] = ' ';
|
||||
prefix[2] = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
cutoff = ratio * 0.97;
|
||||
|
||||
@@ -174,8 +207,13 @@ static void pv__si_prefix(long double *value, char *prefix,
|
||||
prefix[0] = *i;
|
||||
}
|
||||
|
||||
if (is_bytes && prefix[0] != ' ') {
|
||||
prefix[1] = 'i';
|
||||
/*
|
||||
* Byte prefixes are of the form "KiB" rather than "KB", so that's
|
||||
* two characters, not one - meaning that for just "B", the prefix
|
||||
* is two spaces, not one.
|
||||
*/
|
||||
if (is_bytes) {
|
||||
prefix[1] = (prefix[0] == ' ' ? ' ' : 'i');
|
||||
prefix[2] = 0;
|
||||
}
|
||||
}
|
||||
@@ -197,11 +235,13 @@ static void pv__sizestr(char *buffer, int bufsize, char *format,
|
||||
char *suffix_bytes, int is_bytes)
|
||||
{
|
||||
char sizestr_buffer[256];
|
||||
char si_prefix[8] = " ";
|
||||
char si_prefix[8];
|
||||
long double divider;
|
||||
long double display_amount;
|
||||
char *suffix;
|
||||
|
||||
(void) pv_snprintf(si_prefix, sizeof(si_prefix), "%s", " ");
|
||||
|
||||
if (is_bytes) {
|
||||
suffix = suffix_bytes;
|
||||
divider = 1024.0;
|
||||
@@ -220,8 +260,9 @@ static void pv__sizestr(char *buffer, int bufsize, char *format,
|
||||
|
||||
/* Fix for display of "1.01e+03" instead of "1010" */
|
||||
if (display_amount > 99.9) {
|
||||
sprintf(sizestr_buffer, "%4ld%.2s%.16s",
|
||||
(long) display_amount, si_prefix, suffix);
|
||||
(void) pv_snprintf(sizestr_buffer, sizeof(sizestr_buffer),
|
||||
"%4ld%.2s%.16s", (long) display_amount,
|
||||
si_prefix, suffix);
|
||||
} else {
|
||||
/*
|
||||
* AIX blows up with %4.3Lg%.2s%.16s for some reason, so we
|
||||
@@ -229,16 +270,14 @@ static void pv__sizestr(char *buffer, int bufsize, char *format,
|
||||
*/
|
||||
char str_disp[64];
|
||||
/* # to get 13.0GB instead of 13GB (#1477) */
|
||||
sprintf(str_disp, "%#4.3Lg", display_amount);
|
||||
sprintf(sizestr_buffer, "%s%.2s%.16s",
|
||||
str_disp, si_prefix, suffix);
|
||||
(void) pv_snprintf(str_disp, sizeof(str_disp), "%#4.3Lg",
|
||||
display_amount);
|
||||
(void) pv_snprintf(sizestr_buffer, sizeof(sizestr_buffer),
|
||||
"%s%.2s%.16s", str_disp, si_prefix,
|
||||
suffix);
|
||||
}
|
||||
|
||||
#ifdef HAVE_SNPRINTF
|
||||
snprintf(buffer, bufsize, format, sizestr_buffer);
|
||||
#else
|
||||
sprintf(buffer, format, sizestr_buffer);
|
||||
#endif
|
||||
(void) pv_snprintf(buffer, bufsize, format, sizestr_buffer);
|
||||
}
|
||||
|
||||
|
||||
@@ -262,15 +301,18 @@ static void pv__format_init(pvstate_t state)
|
||||
state->str_average_rate[0] = 0;
|
||||
state->str_progress[0] = 0;
|
||||
state->str_eta[0] = 0;
|
||||
memset(state->format, 0, sizeof(state->format));
|
||||
memset(state->format, 0,
|
||||
PV_FORMAT_ARRAY_MAX * sizeof(state->format[0]));
|
||||
|
||||
if (state->name) {
|
||||
sprintf(state->str_name, "%9.500s:", state->name);
|
||||
(void) pv_snprintf(state->str_name,
|
||||
PV_SIZEOF_STR_NAME, "%9.500s:",
|
||||
state->name);
|
||||
}
|
||||
|
||||
formatstr =
|
||||
state->format_string ? state->format_string : state->
|
||||
default_format;
|
||||
state->format_string ? state->
|
||||
format_string : state->default_format;
|
||||
|
||||
state->components_used = 0;
|
||||
|
||||
@@ -338,10 +380,8 @@ static void pv__format_init(pvstate_t state)
|
||||
state->format[segment].string =
|
||||
state->str_lastoutput;
|
||||
state->format[segment].length = 0;
|
||||
if (num > sizeof(state->lastoutput_buffer))
|
||||
num =
|
||||
sizeof
|
||||
(state->lastoutput_buffer);
|
||||
if (num > PV_SIZEOF_LASTOUTPUT_BUFFER)
|
||||
num = PV_SIZEOF_LASTOUTPUT_BUFFER;
|
||||
if (num < 1)
|
||||
num = 1;
|
||||
state->lastoutput_length = num;
|
||||
@@ -430,6 +470,52 @@ static long bound_long(long x, long min, long max)
|
||||
return x < min ? min : x > max ? max : x;
|
||||
}
|
||||
|
||||
/* Update history and current average rate */
|
||||
static void update_history_avg_rate(pvstate_t state, long long total_bytes,
|
||||
long double elapsed_sec,
|
||||
long double rate)
|
||||
{
|
||||
int first = state->history_first;
|
||||
int last = state->history_last;
|
||||
long double last_elapsed;
|
||||
|
||||
if (NULL == state->history)
|
||||
return;
|
||||
|
||||
last_elapsed = state->history[last].elapsed_sec;
|
||||
|
||||
/*
|
||||
* Do nothing if this is not the first call but not enough time has
|
||||
* elapsed since the previous call yet.
|
||||
*/
|
||||
if ((last_elapsed > 0.0)
|
||||
&& (elapsed_sec < (last_elapsed + state->history_interval)))
|
||||
return;
|
||||
|
||||
/*
|
||||
* This is not the first call, so add a new entry to the circular
|
||||
* buffer.
|
||||
*/
|
||||
if (last_elapsed > 0.0) {
|
||||
int len = state->history_len;
|
||||
state->history_last = last = (last + 1) % len;
|
||||
if (last == first)
|
||||
state->history_first = first = (first + 1) % len;
|
||||
}
|
||||
|
||||
state->history[last].elapsed_sec = elapsed_sec;
|
||||
state->history[last].total_bytes = total_bytes;
|
||||
|
||||
if (first == last) {
|
||||
state->current_avg_rate = rate;
|
||||
} else {
|
||||
long long bytes = (state->history[last].total_bytes -
|
||||
state->history[first].total_bytes);
|
||||
long double sec = (state->history[last].elapsed_sec -
|
||||
state->history[first].elapsed_sec);
|
||||
state->current_avg_rate = bytes / sec;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Return a pointer to a string (which must not be freed), containing status
|
||||
@@ -448,9 +534,10 @@ static long bound_long(long x, long min, long max)
|
||||
* If "total_bytes" is negative, then free all allocated memory and return
|
||||
* NULL.
|
||||
*/
|
||||
static char *pv__format(pvstate_t state,
|
||||
long double elapsed_sec,
|
||||
long long bytes_since_last, long long total_bytes)
|
||||
static const char *pv__format(pvstate_t state,
|
||||
long double elapsed_sec,
|
||||
long long bytes_since_last,
|
||||
long long total_bytes)
|
||||
{
|
||||
long double time_since_last, rate, average_rate;
|
||||
long eta;
|
||||
@@ -490,14 +577,16 @@ static char *pv__format(pvstate_t state,
|
||||
}
|
||||
state->prev_rate = rate;
|
||||
|
||||
/* Update history and current average rate for ETA. */
|
||||
update_history_avg_rate(state, total_bytes, elapsed_sec, rate);
|
||||
average_rate = state->current_avg_rate;
|
||||
|
||||
/*
|
||||
* We only calculate the overall average rate if this is the last
|
||||
* update or if the average rate display is enabled. Otherwise it's
|
||||
* not worth the extra CPU cycles.
|
||||
* If this is the final update at the end of the transfer, we
|
||||
* recalculate the rate - and the average rate - across the whole
|
||||
* period of the transfer.
|
||||
*/
|
||||
average_rate = 0;
|
||||
if ((bytes_since_last < 0)
|
||||
|| ((state->components_used & PV_DISPLAY_AVERAGERATE) != 0)) {
|
||||
if (bytes_since_last < 0) {
|
||||
/* Sanity check to avoid division by zero */
|
||||
if (elapsed_sec < 0.000001)
|
||||
elapsed_sec = 0.000001;
|
||||
@@ -505,8 +594,7 @@ static char *pv__format(pvstate_t state,
|
||||
(((long double) total_bytes) -
|
||||
((long double) state->initial_offset)) /
|
||||
(long double) elapsed_sec;
|
||||
if (bytes_since_last < 0)
|
||||
rate = average_rate;
|
||||
rate = average_rate;
|
||||
}
|
||||
|
||||
if (state->size <= 0) {
|
||||
@@ -577,18 +665,29 @@ static char *pv__format(pvstate_t state,
|
||||
numericprefix[0] = 0;
|
||||
|
||||
if ((state->components_used & PV_DISPLAY_TIMER) != 0)
|
||||
sprintf(numericprefix, "%.4Lf ", elapsed_sec);
|
||||
(void) pv_snprintf(numericprefix,
|
||||
sizeof(numericprefix), "%.4Lf ",
|
||||
elapsed_sec);
|
||||
|
||||
if ((state->components_used & PV_DISPLAY_BYTES) != 0) {
|
||||
sprintf(state->display_buffer, "%.99s%lld\n",
|
||||
numericprefix, total_bytes);
|
||||
} else if (state->percentage > 100) {
|
||||
/* As mentioned above, we go 0-100, then 100-0. */
|
||||
sprintf(state->display_buffer, "%.99s%ld\n",
|
||||
numericprefix, 200 - state->percentage);
|
||||
if (state->bits) {
|
||||
(void) pv_snprintf(state->display_buffer,
|
||||
state->display_buffer_size,
|
||||
"%.99s%lld\n",
|
||||
numericprefix,
|
||||
8 * total_bytes);
|
||||
} else {
|
||||
(void) pv_snprintf(state->display_buffer,
|
||||
state->display_buffer_size,
|
||||
"%.99s%lld\n",
|
||||
numericprefix,
|
||||
total_bytes);
|
||||
}
|
||||
} else {
|
||||
sprintf(state->display_buffer, "%.99s%ld\n",
|
||||
numericprefix, state->percentage);
|
||||
(void) pv_snprintf(state->display_buffer,
|
||||
state->display_buffer_size,
|
||||
"%.99s%ld\n", numericprefix,
|
||||
state->percentage);
|
||||
}
|
||||
|
||||
return state->display_buffer;
|
||||
@@ -613,22 +712,34 @@ static char *pv__format(pvstate_t state,
|
||||
|
||||
/* If we're showing bytes transferred, set up the display string. */
|
||||
if ((state->components_used & PV_DISPLAY_BYTES) != 0) {
|
||||
pv__sizestr(state->str_transferred,
|
||||
sizeof(state->str_transferred), "%s",
|
||||
(long double) total_bytes, "", _("B"),
|
||||
state->linemode ? 0 : 1);
|
||||
if (state->bits && !state->linemode) {
|
||||
pv__sizestr(state->str_transferred,
|
||||
PV_SIZEOF_STR_TRANSFERRED, "%s",
|
||||
(long double) total_bytes * 8, "",
|
||||
_("b"), 1);
|
||||
} else {
|
||||
pv__sizestr(state->str_transferred,
|
||||
PV_SIZEOF_STR_TRANSFERRED, "%s",
|
||||
(long double) total_bytes, "", _("B"),
|
||||
state->linemode ? 0 : 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Transfer buffer percentage - set up the display string. */
|
||||
if ((state->components_used & PV_DISPLAY_BUFPERCENT) != 0) {
|
||||
if (state->buffer_size > 0)
|
||||
sprintf(state->str_bufpercent, "{%3ld%%}",
|
||||
pv__calc_percentage(state->read_position -
|
||||
state->write_position,
|
||||
state->buffer_size));
|
||||
(void) pv_snprintf(state->str_bufpercent,
|
||||
PV_SIZEOF_STR_BUFPERCENT,
|
||||
"{%3ld%%}",
|
||||
pv__calc_percentage
|
||||
(state->read_position -
|
||||
state->write_position,
|
||||
state->buffer_size));
|
||||
#ifdef HAVE_SPLICE
|
||||
if (state->splice_used)
|
||||
strcpy(state->str_bufpercent, "{----}");
|
||||
(void) pv_snprintf(state->str_bufpercent,
|
||||
PV_SIZEOF_STR_BUFPERCENT,
|
||||
"{%s}", "----");
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -642,25 +753,56 @@ static char *pv__format(pvstate_t state,
|
||||
if (elapsed_sec > (long double) 360000000.0L)
|
||||
elapsed_sec = (long double) 360000000.0L;
|
||||
|
||||
sprintf(state->str_timer, "%ld:%02ld:%02ld",
|
||||
((long) elapsed_sec) / 3600,
|
||||
(((long) elapsed_sec) / 60) % 60,
|
||||
((long) elapsed_sec) % 60);
|
||||
/*
|
||||
* If the elapsed time is more than a day, include a day count as
|
||||
* well as hours, minutes, and seconds.
|
||||
*/
|
||||
if (elapsed_sec > (long double) 86400.0L) {
|
||||
(void) pv_snprintf(state->str_timer,
|
||||
PV_SIZEOF_STR_TIMER,
|
||||
"%ld:%02ld:%02ld:%02ld",
|
||||
((long) elapsed_sec) / 86400,
|
||||
(((long) elapsed_sec) / 3600) %
|
||||
24,
|
||||
(((long) elapsed_sec) / 60) %
|
||||
60, ((long) elapsed_sec) % 60);
|
||||
} else {
|
||||
(void) pv_snprintf(state->str_timer,
|
||||
PV_SIZEOF_STR_TIMER,
|
||||
"%ld:%02ld:%02ld",
|
||||
((long) elapsed_sec) / 3600,
|
||||
(((long) elapsed_sec) / 60) %
|
||||
60, ((long) elapsed_sec) % 60);
|
||||
}
|
||||
}
|
||||
|
||||
/* Rate - set up the display string. */
|
||||
if ((state->components_used & PV_DISPLAY_RATE) != 0) {
|
||||
pv__sizestr(state->str_rate, sizeof(state->str_rate),
|
||||
"[%s]", rate, _("/s"), _("B/s"),
|
||||
state->linemode ? 0 : 1);
|
||||
if (state->bits && !state->linemode) {
|
||||
pv__sizestr(state->str_rate,
|
||||
PV_SIZEOF_STR_RATE, "[%s]",
|
||||
8 * rate, "", _("b/s"), 1);
|
||||
} else {
|
||||
pv__sizestr(state->str_rate,
|
||||
PV_SIZEOF_STR_RATE, "[%s]", rate,
|
||||
_("/s"), _("B/s"),
|
||||
state->linemode ? 0 : 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Average rate - set up the display string. */
|
||||
if ((state->components_used & PV_DISPLAY_AVERAGERATE) != 0) {
|
||||
pv__sizestr(state->str_average_rate,
|
||||
sizeof(state->str_average_rate), "[%s]",
|
||||
average_rate, _("/s"), _("B/s"),
|
||||
state->linemode ? 0 : 1);
|
||||
if (state->bits && !state->linemode) {
|
||||
pv__sizestr(state->str_average_rate,
|
||||
PV_SIZEOF_STR_AVERAGE_RATE,
|
||||
"[%s]", 8 * average_rate, "", _("b/s"),
|
||||
1);
|
||||
} else {
|
||||
pv__sizestr(state->str_average_rate,
|
||||
PV_SIZEOF_STR_AVERAGE_RATE,
|
||||
"[%s]", average_rate, _("/s"),
|
||||
_("B/s"), state->linemode ? 0 : 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Last output bytes - set up the display string. */
|
||||
@@ -680,7 +822,7 @@ static char *pv__format(pvstate_t state,
|
||||
eta =
|
||||
pv__calc_eta(total_bytes - state->initial_offset,
|
||||
state->size - state->initial_offset,
|
||||
elapsed_sec);
|
||||
state->current_avg_rate);
|
||||
|
||||
/*
|
||||
* Bounds check, so we don't overrun the suffix buffer. This
|
||||
@@ -693,14 +835,18 @@ static char *pv__format(pvstate_t state,
|
||||
* well as hours, minutes, and seconds.
|
||||
*/
|
||||
if (eta > 86400L) {
|
||||
sprintf(state->str_eta,
|
||||
"%.16s %ld:%02ld:%02ld:%02ld", _("ETA"),
|
||||
eta / 86400, (eta / 3600) % 24,
|
||||
(eta / 60) % 60, eta % 60);
|
||||
(void) pv_snprintf(state->str_eta,
|
||||
PV_SIZEOF_STR_ETA,
|
||||
"%.16s %ld:%02ld:%02ld:%02ld",
|
||||
_("ETA"), eta / 86400,
|
||||
(eta / 3600) % 24,
|
||||
(eta / 60) % 60, eta % 60);
|
||||
} else {
|
||||
sprintf(state->str_eta, "%.16s %ld:%02ld:%02ld",
|
||||
_("ETA"), eta / 3600, (eta / 60) % 60,
|
||||
eta % 60);
|
||||
(void) pv_snprintf(state->str_eta,
|
||||
PV_SIZEOF_STR_ETA,
|
||||
"%.16s %ld:%02ld:%02ld",
|
||||
_("ETA"), eta / 3600,
|
||||
(eta / 60) % 60, eta % 60);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -709,8 +855,8 @@ static char *pv__format(pvstate_t state,
|
||||
*/
|
||||
if (bytes_since_last < 0) {
|
||||
unsigned int i;
|
||||
for (i = 0; i < sizeof(state->str_eta)
|
||||
&& state->str_eta[i] != 0; i++) {
|
||||
for (i = 0; i < PV_SIZEOF_STR_ETA
|
||||
&& state->str_eta[i] != '\0'; i++) {
|
||||
state->str_eta[i] = ' ';
|
||||
}
|
||||
}
|
||||
@@ -732,7 +878,7 @@ static char *pv__format(pvstate_t state,
|
||||
eta =
|
||||
pv__calc_eta(total_bytes - state->initial_offset,
|
||||
state->size - state->initial_offset,
|
||||
elapsed_sec);
|
||||
state->current_avg_rate);
|
||||
|
||||
/*
|
||||
* Bounds check, so we don't overrun the suffix buffer. This
|
||||
@@ -761,18 +907,20 @@ static char *pv__format(pvstate_t state,
|
||||
* by time functions. */
|
||||
struct tm time = *time_ptr;
|
||||
|
||||
sprintf(state->str_fineta, "%.16s ", _("ETA"));
|
||||
(void) pv_snprintf(state->str_fineta,
|
||||
PV_SIZEOF_STR_FINETA,
|
||||
"%.16s ", _("ETA"));
|
||||
strftime(state->str_fineta +
|
||||
strlen(state->str_fineta),
|
||||
sizeof(state->str_fineta) - 1 -
|
||||
strlen(state->str_fineta),
|
||||
time_format, &time);
|
||||
PV_SIZEOF_STR_FINETA - 1 -
|
||||
strlen(state->str_fineta), time_format,
|
||||
&time);
|
||||
}
|
||||
|
||||
if (!show_eta) {
|
||||
unsigned int i;
|
||||
for (i = 0; i < sizeof(state->str_fineta)
|
||||
&& state->str_fineta[i] != 0; i++) {
|
||||
for (i = 0; i < PV_SIZEOF_STR_FINETA
|
||||
&& state->str_fineta[i] != '\0'; i++) {
|
||||
state->str_fineta[i] = ' ';
|
||||
}
|
||||
}
|
||||
@@ -812,7 +960,8 @@ static char *pv__format(pvstate_t state,
|
||||
state->percentage = 0;
|
||||
if (state->percentage > 100000)
|
||||
state->percentage = 100000;
|
||||
sprintf(pct, "%2ld%%", state->percentage);
|
||||
(void) pv_snprintf(pct, sizeof(pct), "%2ld%%",
|
||||
state->percentage);
|
||||
|
||||
available_width =
|
||||
state->width - static_portion_size -
|
||||
@@ -822,26 +971,32 @@ static char *pv__format(pvstate_t state,
|
||||
available_width = 0;
|
||||
|
||||
if (available_width >
|
||||
(int) (sizeof(state->str_progress)) - 16)
|
||||
(int) (PV_SIZEOF_STR_PROGRESS) - 16)
|
||||
available_width =
|
||||
sizeof(state->str_progress) - 16;
|
||||
PV_SIZEOF_STR_PROGRESS - 16;
|
||||
|
||||
for (i = 0;
|
||||
i <
|
||||
(available_width * state->percentage) / 100 -
|
||||
1; i++) {
|
||||
if (i < available_width)
|
||||
strcat(state->str_progress, "=");
|
||||
pv_strlcat(state->str_progress,
|
||||
"=",
|
||||
PV_SIZEOF_STR_PROGRESS);
|
||||
}
|
||||
if (i < available_width) {
|
||||
strcat(state->str_progress, ">");
|
||||
pv_strlcat(state->str_progress, ">",
|
||||
PV_SIZEOF_STR_PROGRESS);
|
||||
i++;
|
||||
}
|
||||
for (; i < available_width; i++) {
|
||||
strcat(state->str_progress, " ");
|
||||
pv_strlcat(state->str_progress, " ",
|
||||
PV_SIZEOF_STR_PROGRESS);
|
||||
}
|
||||
strcat(state->str_progress, "] ");
|
||||
strcat(state->str_progress, pct);
|
||||
pv_strlcat(state->str_progress, "] ",
|
||||
PV_SIZEOF_STR_PROGRESS);
|
||||
pv_strlcat(state->str_progress, pct,
|
||||
PV_SIZEOF_STR_PROGRESS);
|
||||
} else {
|
||||
int p = state->percentage;
|
||||
|
||||
@@ -852,9 +1007,9 @@ static char *pv__format(pvstate_t state,
|
||||
available_width = 0;
|
||||
|
||||
if (available_width >
|
||||
(int) (sizeof(state->str_progress)) - 16)
|
||||
(int) (PV_SIZEOF_STR_PROGRESS) - 16)
|
||||
available_width =
|
||||
sizeof(state->str_progress) - 16;
|
||||
PV_SIZEOF_STR_PROGRESS - 16;
|
||||
|
||||
debug("available_width: %d", available_width);
|
||||
|
||||
@@ -862,13 +1017,18 @@ static char *pv__format(pvstate_t state,
|
||||
p = 200 - p;
|
||||
for (i = 0; i < (available_width * p) / 100; i++) {
|
||||
if (i < available_width)
|
||||
strcat(state->str_progress, " ");
|
||||
pv_strlcat(state->str_progress,
|
||||
" ",
|
||||
PV_SIZEOF_STR_PROGRESS);
|
||||
}
|
||||
strcat(state->str_progress, "<=>");
|
||||
pv_strlcat(state->str_progress, "<=>",
|
||||
PV_SIZEOF_STR_PROGRESS);
|
||||
for (; i < available_width; i++) {
|
||||
strcat(state->str_progress, " ");
|
||||
pv_strlcat(state->str_progress, " ",
|
||||
PV_SIZEOF_STR_PROGRESS);
|
||||
}
|
||||
strcat(state->str_progress, "]");
|
||||
pv_strlcat(state->str_progress, "]",
|
||||
PV_SIZEOF_STR_PROGRESS);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -935,7 +1095,8 @@ static char *pv__format(pvstate_t state,
|
||||
while (--spaces_to_add >= 0) {
|
||||
spaces[spaces_to_add] = ' ';
|
||||
}
|
||||
strcat(state->display_buffer, spaces);
|
||||
pv_strlcat(state->display_buffer, spaces,
|
||||
state->display_buffer_size);
|
||||
}
|
||||
state->prev_width = state->width;
|
||||
state->prev_length = output_length;
|
||||
@@ -958,7 +1119,7 @@ static char *pv__format(pvstate_t state,
|
||||
void pv_display(pvstate_t state, long double esec, long long sl,
|
||||
long long tot)
|
||||
{
|
||||
char *display;
|
||||
const char *display;
|
||||
|
||||
if (NULL == state)
|
||||
return;
|
||||
@@ -979,16 +1140,17 @@ void pv_display(pvstate_t state, long double esec, long long sl,
|
||||
return;
|
||||
|
||||
if (state->numeric) {
|
||||
write(STDERR_FILENO, display, strlen(display));
|
||||
pv_write_retry(STDERR_FILENO, display, strlen(display));
|
||||
} else if (state->cursor) {
|
||||
if (pv_in_foreground()) {
|
||||
if (state->force || pv_in_foreground()) {
|
||||
pv_crs_update(state, display);
|
||||
state->display_visible = true;
|
||||
}
|
||||
} else {
|
||||
if (pv_in_foreground()) {
|
||||
write(STDERR_FILENO, display, strlen(display));
|
||||
write(STDERR_FILENO, "\r", 1);
|
||||
if (state->force || pv_in_foreground()) {
|
||||
pv_write_retry(STDERR_FILENO, display,
|
||||
strlen(display));
|
||||
pv_write_retry(STDERR_FILENO, "\r", 1);
|
||||
state->display_visible = true;
|
||||
}
|
||||
}
|
||||
|
||||
+37
-20
@@ -1,7 +1,13 @@
|
||||
/*
|
||||
* Functions for opening and closing files.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "pv.h"
|
||||
#include "pv-internal.h"
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -31,7 +37,7 @@
|
||||
unsigned long long pv_calc_total_size(pvstate_t state)
|
||||
{
|
||||
unsigned long long total;
|
||||
struct stat64 sb;
|
||||
struct stat sb;
|
||||
int rc, i, j, fd;
|
||||
|
||||
total = 0;
|
||||
@@ -42,20 +48,20 @@ unsigned long long pv_calc_total_size(pvstate_t state)
|
||||
* No files specified - check stdin.
|
||||
*/
|
||||
if (state->input_file_count < 1) {
|
||||
if (0 == fstat64(STDIN_FILENO, &sb))
|
||||
if (0 == fstat(STDIN_FILENO, &sb))
|
||||
total = sb.st_size;
|
||||
return total;
|
||||
}
|
||||
|
||||
for (i = 0; i < state->input_file_count; i++) {
|
||||
if (0 == strcmp(state->input_files[i], "-")) {
|
||||
rc = fstat64(STDIN_FILENO, &sb);
|
||||
rc = fstat(STDIN_FILENO, &sb);
|
||||
if (rc != 0) {
|
||||
total = 0;
|
||||
return total;
|
||||
}
|
||||
} else {
|
||||
rc = stat64(state->input_files[i], &sb);
|
||||
rc = stat(state->input_files[i], &sb);
|
||||
if (0 == rc)
|
||||
rc = access(state->input_files[i], R_OK);
|
||||
}
|
||||
@@ -79,13 +85,12 @@ unsigned long long pv_calc_total_size(pvstate_t state)
|
||||
* them and seeking to the end.
|
||||
*/
|
||||
if (0 == strcmp(state->input_files[i], "-")) {
|
||||
fd = open64("/dev/stdin", O_RDONLY);
|
||||
fd = open("/dev/stdin", O_RDONLY);
|
||||
} else {
|
||||
fd = open64(state->input_files[i],
|
||||
O_RDONLY);
|
||||
fd = open(state->input_files[i], O_RDONLY);
|
||||
}
|
||||
if (fd >= 0) {
|
||||
total += lseek64(fd, 0, SEEK_END);
|
||||
total += lseek(fd, 0, SEEK_END);
|
||||
close(fd);
|
||||
} else {
|
||||
pv_error(state, "%s: %s",
|
||||
@@ -109,11 +114,11 @@ unsigned long long pv_calc_total_size(pvstate_t state)
|
||||
* and that we can seek back to the start after getting the size.
|
||||
*/
|
||||
if (total <= 0) {
|
||||
rc = fstat64(STDOUT_FILENO, &sb);
|
||||
rc = fstat(STDOUT_FILENO, &sb);
|
||||
if ((0 == rc) && S_ISBLK(sb.st_mode)
|
||||
&& (0 == (fcntl(STDOUT_FILENO, F_GETFL) & O_APPEND))) {
|
||||
total = lseek64(STDOUT_FILENO, 0, SEEK_END);
|
||||
if (lseek64(STDOUT_FILENO, 0, SEEK_SET) != 0) {
|
||||
total = lseek(STDOUT_FILENO, 0, SEEK_END);
|
||||
if (lseek(STDOUT_FILENO, 0, SEEK_SET) != 0) {
|
||||
pv_error(state, "%s: %s: %s", "(stdout)",
|
||||
_
|
||||
("failed to seek to start of output"),
|
||||
@@ -144,19 +149,19 @@ unsigned long long pv_calc_total_size(pvstate_t state)
|
||||
fd = -1;
|
||||
|
||||
if (0 == strcmp(state->input_files[i], "-")) {
|
||||
rc = fstat64(STDIN_FILENO, &sb);
|
||||
rc = fstat(STDIN_FILENO, &sb);
|
||||
if ((rc != 0) || (!S_ISREG(sb.st_mode))) {
|
||||
total = 0;
|
||||
return total;
|
||||
}
|
||||
fd = dup(STDIN_FILENO);
|
||||
} else {
|
||||
rc = stat64(state->input_files[i], &sb);
|
||||
rc = stat(state->input_files[i], &sb);
|
||||
if ((rc != 0) || (!S_ISREG(sb.st_mode))) {
|
||||
total = 0;
|
||||
return total;
|
||||
}
|
||||
fd = open64(state->input_files[i], O_RDONLY);
|
||||
fd = open(state->input_files[i], O_RDONLY);
|
||||
}
|
||||
|
||||
if (fd < 0) {
|
||||
@@ -187,7 +192,7 @@ unsigned long long pv_calc_total_size(pvstate_t state)
|
||||
}
|
||||
}
|
||||
|
||||
lseek64(fd, 0, SEEK_SET);
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
close(fd);
|
||||
}
|
||||
|
||||
@@ -205,8 +210,8 @@ unsigned long long pv_calc_total_size(pvstate_t state)
|
||||
*/
|
||||
int pv_next_file(pvstate_t state, int filenum, int oldfd)
|
||||
{
|
||||
struct stat64 isb;
|
||||
struct stat64 osb;
|
||||
struct stat isb;
|
||||
struct stat osb;
|
||||
int fd, input_file_is_stdout;
|
||||
|
||||
if (oldfd > 0) {
|
||||
@@ -232,7 +237,7 @@ int pv_next_file(pvstate_t state, int filenum, int oldfd)
|
||||
if (0 == strcmp(state->input_files[filenum], "-")) {
|
||||
fd = STDIN_FILENO;
|
||||
} else {
|
||||
fd = open64(state->input_files[filenum], O_RDONLY);
|
||||
fd = open(state->input_files[filenum], O_RDONLY);
|
||||
if (fd < 0) {
|
||||
pv_error(state, "%s: %s: %s",
|
||||
_("failed to read file"),
|
||||
@@ -243,7 +248,7 @@ int pv_next_file(pvstate_t state, int filenum, int oldfd)
|
||||
}
|
||||
}
|
||||
|
||||
if (fstat64(fd, &isb)) {
|
||||
if (fstat(fd, &isb)) {
|
||||
pv_error(state, "%s: %s: %s",
|
||||
_("failed to stat file"),
|
||||
state->input_files[filenum], strerror(errno));
|
||||
@@ -252,7 +257,7 @@ int pv_next_file(pvstate_t state, int filenum, int oldfd)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (fstat64(STDOUT_FILENO, &osb)) {
|
||||
if (fstat(STDOUT_FILENO, &osb)) {
|
||||
pv_error(state, "%s: %s",
|
||||
_("failed to stat output file"), strerror(errno));
|
||||
close(fd);
|
||||
@@ -288,6 +293,18 @@ int pv_next_file(pvstate_t state, int filenum, int oldfd)
|
||||
if (0 == strcmp(state->input_files[filenum], "-")) {
|
||||
state->current_file = "(stdin)";
|
||||
}
|
||||
#ifdef O_DIRECT
|
||||
/*
|
||||
* Set or clear O_DIRECT on the file descriptor.
|
||||
*/
|
||||
fcntl(fd, F_SETFL,
|
||||
(state->direct_io ? O_DIRECT : 0) | fcntl(fd, F_GETFL));
|
||||
/*
|
||||
* We don't clear direct_io_changed here, to avoid race conditions
|
||||
* that could cause the input and output settings to differ.
|
||||
*/
|
||||
#endif /* O_DIRECT */
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
|
||||
+48
-34
@@ -1,8 +1,14 @@
|
||||
/*
|
||||
* Main program entry point - read the command line options, then perform
|
||||
* the appropriate actions.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "pv.h"
|
||||
#include "pv-internal.h"
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -53,7 +59,7 @@ int pv_main_loop(pvstate_t state)
|
||||
struct timeval start_time, next_update, next_ratecheck, cur_time;
|
||||
struct timeval init_time, next_remotecheck;
|
||||
long double elapsed;
|
||||
struct stat64 sb;
|
||||
struct stat sb;
|
||||
int fd, n;
|
||||
|
||||
/*
|
||||
@@ -111,12 +117,21 @@ int pv_main_loop(pvstate_t state)
|
||||
pv_crs_fini(state);
|
||||
return state->exit_status;
|
||||
}
|
||||
#ifdef O_DIRECT
|
||||
/*
|
||||
* Set or clear O_DIRECT on the output.
|
||||
*/
|
||||
fcntl(STDOUT_FILENO, F_SETFL,
|
||||
(state->direct_io ? O_DIRECT : 0) | fcntl(STDOUT_FILENO,
|
||||
F_GETFL));
|
||||
state->direct_io_changed = false;
|
||||
#endif /* O_DIRECT */
|
||||
|
||||
/*
|
||||
* Set target buffer size if the initial file's block size can be
|
||||
* read and we weren't given a target buffer size.
|
||||
*/
|
||||
if ((0 == fstat64(fd, &sb)) && (0 == state->target_buffer_size)) {
|
||||
if ((0 == fstat(fd, &sb)) && (0 == state->target_buffer_size)) {
|
||||
unsigned long long sz;
|
||||
sz = sb.st_blksize * 32;
|
||||
if (sz > BUFFER_SIZE_MAX)
|
||||
@@ -151,10 +166,17 @@ int pv_main_loop(pvstate_t state)
|
||||
|| (cur_time.tv_sec == next_ratecheck.tv_sec
|
||||
&& cur_time.tv_usec >=
|
||||
next_ratecheck.tv_usec)) {
|
||||
|
||||
target +=
|
||||
((long double) (state->rate_limit)) /
|
||||
(long double) (1000000 /
|
||||
RATE_GRANULARITY);
|
||||
long double burstMax =
|
||||
((long double) (state->rate_limit *
|
||||
RATE_BURST_WINDOW));
|
||||
if (target > burstMax) {
|
||||
target = burstMax;
|
||||
}
|
||||
pv_timeval_add_usec(&next_ratecheck,
|
||||
RATE_GRANULARITY);
|
||||
}
|
||||
@@ -321,7 +343,7 @@ int pv_main_loop(pvstate_t state)
|
||||
} else {
|
||||
if ((!state->numeric) && (!state->no_op)
|
||||
&& (state->display_visible))
|
||||
write(STDERR_FILENO, "\n", 1);
|
||||
pv_write_retry(STDERR_FILENO, "\n", 1);
|
||||
}
|
||||
|
||||
if (state->pv_sig_abort)
|
||||
@@ -481,7 +503,7 @@ int pv_watchfd_loop(pvstate_t state)
|
||||
}
|
||||
|
||||
if (!state->numeric)
|
||||
write(STDERR_FILENO, "\n", 1);
|
||||
pv_write_retry(STDERR_FILENO, "\n", 1);
|
||||
|
||||
if (state->pv_sig_abort)
|
||||
state->exit_status |= 32;
|
||||
@@ -533,31 +555,23 @@ int pv_watchpid_loop(pvstate_t state)
|
||||
* it's not present.
|
||||
*/
|
||||
original_format_string =
|
||||
state->format_string ? state->format_string : state->
|
||||
default_format;
|
||||
state->format_string ? state->
|
||||
format_string : state->default_format;
|
||||
if (NULL == strstr(original_format_string, "%N")) {
|
||||
#ifdef HAVE_SNPRINTF
|
||||
snprintf(new_format_string, sizeof(new_format_string) - 1,
|
||||
#else
|
||||
sprintf(new_format_string,
|
||||
#endif
|
||||
"%%N %s", original_format_string);
|
||||
(void) pv_snprintf(new_format_string,
|
||||
sizeof(new_format_string), "%%N %s",
|
||||
original_format_string);
|
||||
} else {
|
||||
#ifdef HAVE_SNPRINTF
|
||||
snprintf(new_format_string, sizeof(new_format_string) - 1,
|
||||
#else
|
||||
sprintf(new_format_string,
|
||||
#endif
|
||||
"%s", original_format_string);
|
||||
(void) pv_snprintf(new_format_string,
|
||||
sizeof(new_format_string), "%s",
|
||||
original_format_string);
|
||||
}
|
||||
new_format_string[sizeof(new_format_string) - 1] = '\0';
|
||||
state_copy.format_string = NULL;
|
||||
#ifdef HAVE_SNPRINTF
|
||||
snprintf(state_copy.default_format,
|
||||
sizeof(state_copy.default_format) - 1,
|
||||
#else
|
||||
sprintf(state_copy.default_format,
|
||||
#endif
|
||||
"%.510s", new_format_string);
|
||||
(void) pv_snprintf(state_copy.default_format,
|
||||
PV_SIZEOF_DEFAULT_FORMAT,
|
||||
"%.510s", new_format_string);
|
||||
state_copy.default_format[PV_SIZEOF_DEFAULT_FORMAT - 1] = '\0';
|
||||
|
||||
/*
|
||||
* Get things ready for the main loop.
|
||||
@@ -721,7 +735,7 @@ int pv_watchpid_loop(pvstate_t state)
|
||||
|
||||
if (displayed_lines > 0) {
|
||||
debug("%s", "adding newline");
|
||||
write(STDERR_FILENO, "\n", 1);
|
||||
pv_write_retry(STDERR_FILENO, "\n", 1);
|
||||
}
|
||||
|
||||
debug("%s %d [%d]: %Lf / %Ld / %Ld", "fd", fd, idx,
|
||||
@@ -745,10 +759,10 @@ int pv_watchpid_loop(pvstate_t state)
|
||||
while (blank_lines > 0) {
|
||||
unsigned int x;
|
||||
if (displayed_lines > 0)
|
||||
write(STDERR_FILENO, "\n", 1);
|
||||
pv_write_retry(STDERR_FILENO, "\n", 1);
|
||||
for (x = 0; x < state->width; x++)
|
||||
write(STDERR_FILENO, " ", 1);
|
||||
write(STDERR_FILENO, "\r", 1);
|
||||
pv_write_retry(STDERR_FILENO, " ", 1);
|
||||
pv_write_retry(STDERR_FILENO, "\r", 1);
|
||||
blank_lines--;
|
||||
displayed_lines++;
|
||||
}
|
||||
@@ -756,7 +770,7 @@ int pv_watchpid_loop(pvstate_t state)
|
||||
debug("%s: %d", "displayed lines", displayed_lines);
|
||||
|
||||
while (displayed_lines > 1) {
|
||||
write(STDERR_FILENO, "\033[A", 3);
|
||||
pv_write_retry(STDERR_FILENO, "\033[A", 3);
|
||||
displayed_lines--;
|
||||
}
|
||||
}
|
||||
@@ -768,14 +782,14 @@ int pv_watchpid_loop(pvstate_t state)
|
||||
while (blank_lines > 0) {
|
||||
unsigned int x;
|
||||
for (x = 0; x < state->width; x++)
|
||||
write(STDERR_FILENO, " ", 1);
|
||||
write(STDERR_FILENO, "\r", 1);
|
||||
pv_write_retry(STDERR_FILENO, " ", 1);
|
||||
pv_write_retry(STDERR_FILENO, "\r", 1);
|
||||
blank_lines--;
|
||||
if (blank_lines > 0)
|
||||
write(STDERR_FILENO, "\n", 1);
|
||||
pv_write_retry(STDERR_FILENO, "\n", 1);
|
||||
}
|
||||
while (prev_displayed_lines > 1) {
|
||||
write(STDERR_FILENO, "\033[A", 3);
|
||||
pv_write_retry(STDERR_FILENO, "\033[A", 3);
|
||||
prev_displayed_lines--;
|
||||
}
|
||||
|
||||
|
||||
+6
-2
@@ -1,12 +1,16 @@
|
||||
/*
|
||||
* Functions for converting strings to numbers.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#include "pv.h"
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
/*
|
||||
* This function is used instead of the macro from <ctype.h> because
|
||||
|
||||
@@ -1,7 +1,13 @@
|
||||
/*
|
||||
* Signal handling functions.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "pv.h"
|
||||
#include "pv-internal.h"
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
+81
-10
@@ -1,14 +1,42 @@
|
||||
/*
|
||||
* State management functions.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "pv.h"
|
||||
#include "pv-internal.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
/* alloc / realloc history buffer */
|
||||
static void pv_alloc_history(pvstate_t state)
|
||||
{
|
||||
if (NULL != state->history)
|
||||
free(state->history);
|
||||
state->history = NULL;
|
||||
|
||||
state->history =
|
||||
calloc(state->history_len, sizeof(state->history[0]));
|
||||
if (NULL == state->history) {
|
||||
fprintf(stderr, "%s: %s: %s\n", state->program_name,
|
||||
_("history structure allocation failed"),
|
||||
strerror(errno));
|
||||
return;
|
||||
}
|
||||
|
||||
state->history_first = state->history_last = 0;
|
||||
state->history[0].elapsed_sec = 0.0; /* to be safe, memset() not recommended for doubles */
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a new state structure, and return it, or 0 (NULL) on error.
|
||||
*/
|
||||
@@ -36,6 +64,20 @@ pvstate_t pv_state_alloc(const char *program_name)
|
||||
#endif /* HAVE_SPLICE */
|
||||
state->display_visible = false;
|
||||
|
||||
/*
|
||||
* Get the current working directory, if possible, as a base for
|
||||
* showing relative filenames with --watchfd.
|
||||
*/
|
||||
if (NULL == getcwd(state->cwd, PV_SIZEOF_CWD - 1)) {
|
||||
/* failed - will always show full path */
|
||||
state->cwd[0] = '\0';
|
||||
}
|
||||
if ('\0' == state->cwd[1]) {
|
||||
/* CWD is root directory - always show full path */
|
||||
state->cwd[0] = '\0';
|
||||
}
|
||||
state->cwd[PV_SIZEOF_CWD - 1] = '\0';
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
@@ -48,14 +90,18 @@ void pv_state_free(pvstate_t state)
|
||||
if (0 == state)
|
||||
return;
|
||||
|
||||
if (state->display_buffer)
|
||||
if (NULL != state->display_buffer)
|
||||
free(state->display_buffer);
|
||||
state->display_buffer = NULL;
|
||||
|
||||
if (state->transfer_buffer)
|
||||
if (NULL != state->transfer_buffer)
|
||||
free(state->transfer_buffer);
|
||||
state->transfer_buffer = NULL;
|
||||
|
||||
if (NULL != state->history)
|
||||
free(state->history);
|
||||
state->history = NULL;
|
||||
|
||||
free(state);
|
||||
|
||||
return;
|
||||
@@ -74,8 +120,8 @@ void pv_state_set_format(pvstate_t state, bool progress,
|
||||
{
|
||||
#define PV_ADDFORMAT(x,y) if (x) { \
|
||||
if (state->default_format[0] != '\0') \
|
||||
strcat(state->default_format, " "); \
|
||||
strcat(state->default_format, y); \
|
||||
pv_strlcat(state->default_format, " ", sizeof(state->default_format)); \
|
||||
pv_strlcat(state->default_format, y, sizeof(state->default_format)); \
|
||||
}
|
||||
|
||||
state->default_format[0] = '\0';
|
||||
@@ -91,12 +137,7 @@ void pv_state_set_format(pvstate_t state, bool progress,
|
||||
if (lastwritten > 0) {
|
||||
char buf[16];
|
||||
memset(buf, 0, sizeof(buf));
|
||||
#ifdef HAVE_SNPRINTF
|
||||
(void) snprintf(buf, sizeof(buf) - 1, "%%%uA",
|
||||
lastwritten);
|
||||
#else
|
||||
(void) sprintf(buf, "%%%uA", lastwritten);
|
||||
#endif
|
||||
(void) pv_snprintf(buf, sizeof(buf), "%%%uA", lastwritten);
|
||||
PV_ADDFORMAT(lastwritten > 0, buf);
|
||||
}
|
||||
|
||||
@@ -135,6 +176,11 @@ void pv_state_linemode_set(pvstate_t state, bool val)
|
||||
state->linemode = val;
|
||||
};
|
||||
|
||||
void pv_state_bits_set(pvstate_t state, bool bits)
|
||||
{
|
||||
state->bits = bits;
|
||||
};
|
||||
|
||||
void pv_state_null_set(pvstate_t state, bool val)
|
||||
{
|
||||
state->null = val;
|
||||
@@ -155,6 +201,17 @@ void pv_state_stop_at_size_set(pvstate_t state, bool val)
|
||||
state->stop_at_size = val;
|
||||
};
|
||||
|
||||
void pv_state_sync_after_write_set(pvstate_t state, bool val)
|
||||
{
|
||||
state->sync_after_write = val;
|
||||
};
|
||||
|
||||
void pv_state_direct_io_set(pvstate_t state, bool val)
|
||||
{
|
||||
state->direct_io = val;
|
||||
state->direct_io_changed = true;
|
||||
};
|
||||
|
||||
void pv_state_rate_limit_set(pvstate_t state, unsigned long long val)
|
||||
{
|
||||
state->rate_limit = val;
|
||||
@@ -211,6 +268,20 @@ void pv_state_watch_fd_set(pvstate_t state, int val)
|
||||
state->watch_fd = val;
|
||||
};
|
||||
|
||||
void pv_state_average_rate_window_set(pvstate_t state, int val)
|
||||
{
|
||||
if (val < 1)
|
||||
val = 1;
|
||||
if (val >= 20) {
|
||||
state->history_len = val / 5 + 1;
|
||||
state->history_interval = 5;
|
||||
} else {
|
||||
state->history_len = val + 1;
|
||||
state->history_interval = 1;
|
||||
}
|
||||
pv_alloc_history(state);
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Set the array of input files.
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
* Functions for converting strings to numbers.
|
||||
*
|
||||
* Copyright 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "pv.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/*
|
||||
* Wrapper for sprintf(), falling back to sprintf() on systems without that
|
||||
* function.
|
||||
*
|
||||
* Returns -1 if "str" or "format" are NULL or if "size" is 0.
|
||||
*
|
||||
* Otherwise, ensures that the buffer "str" is always terminated with a '\0'
|
||||
* byte, before returning whatever the system's vsnprintf() or vsprintf()
|
||||
* returned.
|
||||
*/
|
||||
int pv_snprintf(char *str, size_t size, const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int ret;
|
||||
|
||||
if (NULL == str)
|
||||
return -1;
|
||||
if (0 == size)
|
||||
return -1;
|
||||
if (NULL == format)
|
||||
return -1;
|
||||
|
||||
str[0] = '\0';
|
||||
|
||||
va_start(ap, format);
|
||||
#ifdef HAVE_VSNPRINTF
|
||||
ret = vsnprintf(str, size, format, ap);
|
||||
#else /* ! HAVE_VSNPRINTF */
|
||||
ret = vsprintf(str, format, ap);
|
||||
#endif /* HAVE_VSNPRINTF */
|
||||
va_end(ap);
|
||||
|
||||
str[size - 1] = '\0';
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Implementation of strlcat() where it is unavailable: append a string to a
|
||||
* buffer, constraining the buffer to a particular size and ensuring
|
||||
* termination with '\0'.
|
||||
*
|
||||
* Appends the string "src" to the buffer "dst", assuming "dst" is "dstsize"
|
||||
* bytes long, and ensuring that "dst" is always terminated with a '\0'
|
||||
* byte.
|
||||
*
|
||||
* Returns the intended length of the string, not including the terminating
|
||||
* '\0', i.e. strlen(src)+strlen(dst), regardless of whether truncation
|
||||
* occurred.
|
||||
*
|
||||
* Note that this implementation has the side effect that "dst" will always
|
||||
* be terminated with a '\0' even if "src" was zero bytes long.
|
||||
*/
|
||||
size_t pv_strlcat(char *dst, const char *src, size_t dstsize)
|
||||
{
|
||||
#ifdef HAVE_STRLCAT
|
||||
return strlcat(dst, src, dstsize);
|
||||
#else
|
||||
size_t dstlen, srclen, available;
|
||||
|
||||
if (NULL == dst)
|
||||
return 0;
|
||||
if (NULL == src)
|
||||
return 0;
|
||||
if (0 == dstsize)
|
||||
return 0;
|
||||
|
||||
dst[dstsize - 1] = '\0';
|
||||
dstlen = strlen(dst);
|
||||
srclen = strlen(src);
|
||||
|
||||
available = dstsize - dstlen;
|
||||
if (available > 1)
|
||||
(void) pv_snprintf(dst + dstlen, available, "%.*s",
|
||||
available - 1, src);
|
||||
|
||||
return dstlen + srclen;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
+154
-11
@@ -1,7 +1,13 @@
|
||||
/*
|
||||
* Functions for transferring between file descriptors.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "pv.h"
|
||||
#include "pv-internal.h"
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -97,10 +103,13 @@ static ssize_t pv__transfer_read_repeated(int fd, void *buf, size_t count)
|
||||
* see if we can write any more, and keep trying, to make sure we empty the
|
||||
* buffer as much as we can.
|
||||
*
|
||||
* If "sync_after_write" is true, we call fdatasync() after each write().
|
||||
*
|
||||
* We stop retrying if the time elapsed since this function was entered
|
||||
* reaches TRANSFER_WRITE_TIMEOUT microseconds.
|
||||
*/
|
||||
static ssize_t pv__transfer_write_repeated(int fd, void *buf, size_t count)
|
||||
static ssize_t pv__transfer_write_repeated(int fd, void *buf, size_t count,
|
||||
bool sync_after_write)
|
||||
{
|
||||
struct timeval start_time;
|
||||
ssize_t total_written;
|
||||
@@ -119,6 +128,20 @@ static ssize_t pv__transfer_write_repeated(int fd, void *buf, size_t count)
|
||||
MAX_WRITE_AT_ONCE ? MAX_WRITE_AT_ONCE : count;
|
||||
|
||||
nwritten = write(fd, buf, asked_to_write);
|
||||
|
||||
#ifdef HAVE_FDATASYNC
|
||||
if (sync_after_write && nwritten >= 0) {
|
||||
/*
|
||||
* Ignore non IO errors, such as EBADFD (bad file
|
||||
* descriptor), EINVAL (non syncable fd, such as a
|
||||
* pipe), etc - only return an error on EIO.
|
||||
*/
|
||||
if ((fdatasync(fd) < 0) && (EIO == errno)) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
#endif /* HAVE_FDATASYNC */
|
||||
|
||||
if (nwritten < 0) {
|
||||
if ((EINTR == errno) || (EAGAIN == errno)) {
|
||||
/*
|
||||
@@ -214,6 +237,7 @@ static int pv__transfer_read(pvstate_t state, int fd,
|
||||
int *eof_in, int *eof_out,
|
||||
unsigned long long allowed)
|
||||
{
|
||||
bool do_not_skip_errors;
|
||||
unsigned long bytes_can_read;
|
||||
unsigned long amount_to_skip;
|
||||
long amount_skipped;
|
||||
@@ -224,6 +248,10 @@ static int pv__transfer_read(pvstate_t state, int fd,
|
||||
size_t bytes_to_splice;
|
||||
#endif /* HAVE_SPLICE */
|
||||
|
||||
do_not_skip_errors = false;
|
||||
if (0 == state->skip_errors)
|
||||
do_not_skip_errors = true;
|
||||
|
||||
bytes_can_read = state->buffer_size - state->read_position;
|
||||
|
||||
#ifdef HAVE_SPLICE
|
||||
@@ -250,6 +278,24 @@ static int pv__transfer_read(pvstate_t state, int fd,
|
||||
*/
|
||||
} else if (nread > 0) {
|
||||
state->written = nread;
|
||||
# ifdef HAVE_FDATASYNC
|
||||
if (state->sync_after_write) {
|
||||
/*
|
||||
* Ignore non IO errors, such as EBADFD (bad file
|
||||
* descriptor), EINVAL (non syncable fd, such as a
|
||||
* pipe), etc - only treat EIO as a failure.
|
||||
*
|
||||
* Since this is a write error, not a read
|
||||
* error, we cannot skip it, so set
|
||||
* "do_not_skip_errors".
|
||||
*/
|
||||
if ((fdatasync(STDOUT_FILENO) < 0)
|
||||
&& (EIO == errno)) {
|
||||
nread = -1;
|
||||
do_not_skip_errors = true;
|
||||
}
|
||||
}
|
||||
# endif /* HAVE_FDATASYNC */
|
||||
} else if ((-1 == nread) && (EAGAIN == errno)) {
|
||||
/* nothing read yet - do nothing */
|
||||
} else {
|
||||
@@ -335,7 +381,7 @@ static int pv__transfer_read(pvstate_t state, int fd,
|
||||
* If we aren't skipping errors, show the error and pretend we
|
||||
* reached the end of this file.
|
||||
*/
|
||||
if (0 == state->skip_errors) {
|
||||
if (do_not_skip_errors) {
|
||||
pv_error(state, "%s: %s: %s",
|
||||
state->current_file,
|
||||
_("read failed"), strerror(errno));
|
||||
@@ -361,7 +407,7 @@ static int pv__transfer_read(pvstate_t state, int fd,
|
||||
state->read_error_warning_shown = 1;
|
||||
}
|
||||
|
||||
orig_offset = lseek64(fd, 0, SEEK_CUR);
|
||||
orig_offset = lseek(fd, 0, SEEK_CUR);
|
||||
|
||||
/*
|
||||
* If the file is not seekable, we can't skip past the error, so we
|
||||
@@ -406,7 +452,7 @@ static int pv__transfer_read(pvstate_t state, int fd,
|
||||
if (amount_to_skip > bytes_can_read)
|
||||
amount_to_skip = bytes_can_read;
|
||||
|
||||
skip_offset = lseek64(fd, orig_offset + amount_to_skip, SEEK_SET);
|
||||
skip_offset = lseek(fd, orig_offset + amount_to_skip, SEEK_SET);
|
||||
|
||||
/*
|
||||
* If the skip we just tried didn't work, try only skipping 1 byte
|
||||
@@ -415,7 +461,7 @@ static int pv__transfer_read(pvstate_t state, int fd,
|
||||
if (skip_offset < 0) {
|
||||
amount_to_skip = 1;
|
||||
skip_offset =
|
||||
lseek64(fd, orig_offset + amount_to_skip, SEEK_SET);
|
||||
lseek(fd, orig_offset + amount_to_skip, SEEK_SET);
|
||||
}
|
||||
|
||||
if (skip_offset < 0) {
|
||||
@@ -496,7 +542,8 @@ static int pv__transfer_write(pvstate_t state,
|
||||
nwritten = pv__transfer_write_repeated(STDOUT_FILENO,
|
||||
state->transfer_buffer +
|
||||
state->write_position,
|
||||
state->to_write);
|
||||
state->to_write,
|
||||
state->sync_after_write);
|
||||
|
||||
alarm(0);
|
||||
|
||||
@@ -637,6 +684,63 @@ static int pv__transfer_write(pvstate_t state,
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Return a pointer to a newly allocated buffer of the given size, aligned
|
||||
* appropriately for the current input and output file descriptors
|
||||
* (important if using O_DIRECT).
|
||||
*
|
||||
* Falls back to unaligned allocation if it was not possible to get an
|
||||
* aligned buffer, or if the relevant operating system features were not
|
||||
* available. With O_DIRECT, this means that transfers could fail with an
|
||||
* "Invalid argument" error (EINVAL).
|
||||
*
|
||||
* Returns NULL on complete allocation failure.
|
||||
*/
|
||||
static unsigned char *pv__allocate_aligned_buffer(int fd,
|
||||
size_t target_size)
|
||||
{
|
||||
unsigned char *newptr;
|
||||
|
||||
#if defined(HAVE_FPATHCONF) && defined(HAVE_POSIX_MEMALIGN) && defined(_PC_REC_XFER_ALIGN)
|
||||
long input_alignment, output_alignment, min_alignment;
|
||||
size_t required_alignment;
|
||||
|
||||
input_alignment = fd >= 0 ? fpathconf(fd, _PC_REC_XFER_ALIGN) : -1;
|
||||
output_alignment = fpathconf(STDOUT_FILENO, _PC_REC_XFER_ALIGN);
|
||||
# if defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE)
|
||||
min_alignment = sysconf(_SC_PAGESIZE);
|
||||
# else /* ! defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE) */
|
||||
min_alignment = 8192;
|
||||
# endif /* defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE) */
|
||||
|
||||
if (input_alignment > output_alignment) {
|
||||
required_alignment = input_alignment;
|
||||
} else if (output_alignment > input_alignment) {
|
||||
required_alignment = output_alignment;
|
||||
} else if (input_alignment < min_alignment) {
|
||||
required_alignment = min_alignment;
|
||||
} else {
|
||||
required_alignment = input_alignment;
|
||||
}
|
||||
|
||||
/* Ensure the alignment is at least the page size. */
|
||||
if (required_alignment < min_alignment) {
|
||||
required_alignment = min_alignment;
|
||||
}
|
||||
|
||||
if (0 !=
|
||||
posix_memalign((void **) (&newptr), required_alignment,
|
||||
target_size)) {
|
||||
newptr = (unsigned char *) malloc(target_size);
|
||||
}
|
||||
#else /* ! defined(HAVE_FPATHCONF) && defined(HAVE_POSIX_MEMALIGN) && defined(_PC_REC_XFER_ALIGN) */
|
||||
newptr = (unsigned char *) malloc(target_size);
|
||||
#endif /* defined(HAVE_FPATHCONF) && defined(HAVE_POSIX_MEMALIGN) && defined(_PC_REC_XFER_ALIGN) */
|
||||
|
||||
return newptr;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Transfer some data from "fd" to standard output, timing out after 9/100
|
||||
* of a second. If state->rate_limit is >0, and/or "allowed" is >0, only up
|
||||
@@ -660,6 +764,26 @@ long pv_transfer(pvstate_t state, int fd, int *eof_in, int *eof_out,
|
||||
if (NULL == state)
|
||||
return 0;
|
||||
|
||||
#ifdef O_DIRECT
|
||||
/*
|
||||
* Set or clear O_DIRECT on the input and output file descriptors,
|
||||
* if the setting has changed.
|
||||
*/
|
||||
if (state->direct_io_changed) {
|
||||
if (!(*eof_in)) {
|
||||
fcntl(fd, F_SETFL,
|
||||
(state->direct_io ? O_DIRECT : 0) | fcntl(fd,
|
||||
F_GETFL));
|
||||
}
|
||||
if (!(*eof_out)) {
|
||||
fcntl(STDOUT_FILENO, F_SETFL,
|
||||
(state->direct_io ? O_DIRECT : 0) |
|
||||
fcntl(STDOUT_FILENO, F_GETFL));
|
||||
}
|
||||
state->direct_io_changed = false;
|
||||
}
|
||||
#endif /* O_DIRECT */
|
||||
|
||||
/*
|
||||
* Reinitialise the error skipping variables if the file descriptor
|
||||
* has changed since the last time we were called.
|
||||
@@ -670,10 +794,15 @@ long pv_transfer(pvstate_t state, int fd, int *eof_in, int *eof_out,
|
||||
state->read_error_warning_shown = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate a new buffer, aligned appropriately for the input file
|
||||
* (important if using O_DIRECT).
|
||||
*/
|
||||
if (NULL == state->transfer_buffer) {
|
||||
state->buffer_size = state->target_buffer_size;
|
||||
state->transfer_buffer =
|
||||
(unsigned char *) malloc(state->buffer_size + 32);
|
||||
pv__allocate_aligned_buffer(fd,
|
||||
state->target_buffer_size +
|
||||
32);
|
||||
if (NULL == state->transfer_buffer) {
|
||||
pv_error(state, "%s: %s",
|
||||
_("buffer allocation failed"),
|
||||
@@ -681,16 +810,22 @@ long pv_transfer(pvstate_t state, int fd, int *eof_in, int *eof_out,
|
||||
state->exit_status |= 64;
|
||||
return -1;
|
||||
}
|
||||
state->buffer_size = state->target_buffer_size;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reallocate the buffer if the buffer size has changed mid-transfer.
|
||||
* Reallocate the buffer if the buffer size has changed
|
||||
* mid-transfer. We have to do this by allocating a new buffer,
|
||||
* copying to it, and freeing the old one (potentially leaking
|
||||
* memory) because the buffer may need to be aligned for O_DIRECT,
|
||||
* and we can't realloc() an aligned buffer.
|
||||
*/
|
||||
if (state->buffer_size < state->target_buffer_size) {
|
||||
unsigned char *newptr;
|
||||
newptr =
|
||||
realloc(state->transfer_buffer,
|
||||
state->target_buffer_size + 32);
|
||||
pv__allocate_aligned_buffer(fd,
|
||||
state->target_buffer_size +
|
||||
32);
|
||||
if (NULL == newptr) {
|
||||
/*
|
||||
* Reset target if realloc failed so we don't keep
|
||||
@@ -701,6 +836,14 @@ long pv_transfer(pvstate_t state, int fd, int *eof_in, int *eof_out,
|
||||
} else {
|
||||
debug("%s: %ld", "buffer resized",
|
||||
state->buffer_size);
|
||||
/*
|
||||
* Copy the old buffer contents into the new buffer,
|
||||
* and free the old one.
|
||||
*/
|
||||
if (state->buffer_size > 0)
|
||||
memcpy(newptr, state->transfer_buffer,
|
||||
state->buffer_size);
|
||||
free(state->transfer_buffer);
|
||||
state->transfer_buffer = newptr;
|
||||
state->buffer_size = state->target_buffer_size;
|
||||
}
|
||||
|
||||
+228
-67
@@ -1,7 +1,13 @@
|
||||
/*
|
||||
* Functions for watching file descriptors in other processes.
|
||||
*
|
||||
* Copyright 2002-2008, 2010, 2012-2015, 2017, 2021, 2023 Andrew Wood
|
||||
*
|
||||
* Distributed under the Artistic License v2.0; see `doc/COPYING'.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "pv.h"
|
||||
#include "pv-internal.h"
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -20,6 +26,100 @@
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <libproc.h>
|
||||
#include <sys/proc_info.h>
|
||||
#endif
|
||||
|
||||
int filesize(pvwatchfd_t info)
|
||||
{
|
||||
if (S_ISBLK(info->sb_fd.st_mode)) {
|
||||
int fd;
|
||||
|
||||
/*
|
||||
* Get the size of block devices by opening
|
||||
* them and seeking to the end.
|
||||
*/
|
||||
fd = open(info->file_fdpath, O_RDONLY);
|
||||
if (fd >= 0) {
|
||||
info->size = lseek(fd, 0, SEEK_END);
|
||||
close(fd);
|
||||
} else {
|
||||
info->size = 0;
|
||||
}
|
||||
} else if (S_ISREG(info->sb_fd.st_mode)) {
|
||||
if ((info->sb_fd_link.st_mode & S_IWUSR) == 0) {
|
||||
info->size = info->sb_fd.st_size;
|
||||
}
|
||||
} else {
|
||||
return 4;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef __APPLE__
|
||||
int pv_watchfd_info(pvstate_t state, pvwatchfd_t info, int automatic)
|
||||
{
|
||||
struct vnode_fdinfowithpath vnodeInfo = { };
|
||||
|
||||
if (NULL == state)
|
||||
return -1;
|
||||
if (NULL == info)
|
||||
return -1;
|
||||
|
||||
if (kill(info->watch_pid, 0) != 0) {
|
||||
if (!automatic)
|
||||
pv_error(state, "%s %u: %s",
|
||||
_("pid"),
|
||||
info->watch_pid, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
|
||||
int32_t proc_fd = (int32_t) info->watch_fd;
|
||||
int size = proc_pidfdinfo(info->watch_pid, proc_fd,
|
||||
PROC_PIDFDVNODEPATHINFO, &vnodeInfo,
|
||||
PROC_PIDFDVNODEPATHINFO_SIZE);
|
||||
if (size != PROC_PIDFDVNODEPATHINFO_SIZE) {
|
||||
pv_error(state, "%s %u: %s %d: %s",
|
||||
_("pid"),
|
||||
info->watch_pid,
|
||||
_("fd"), info->watch_fd, strerror(errno));
|
||||
return 3;
|
||||
}
|
||||
|
||||
strlcpy(info->file_fdpath, vnodeInfo.pvip.vip_path,
|
||||
PV_SIZEOF_FILE_FDPATH);
|
||||
|
||||
info->size = 0;
|
||||
|
||||
if (!(0 == stat(info->file_fdpath, &(info->sb_fd)))) {
|
||||
if (!automatic)
|
||||
pv_error(state, "%s %u: %s %d: %s: %s",
|
||||
_("pid"),
|
||||
info->watch_pid,
|
||||
_("fd"),
|
||||
info->watch_fd, info->file_fdpath,
|
||||
strerror(errno));
|
||||
return 3;
|
||||
}
|
||||
|
||||
if (filesize(info) != 0) {
|
||||
if (!automatic)
|
||||
pv_error(state, "%s %u: %s %d: %s: %s",
|
||||
_("pid"),
|
||||
info->watch_pid,
|
||||
_("fd"),
|
||||
info->watch_fd,
|
||||
info->file_fdpath,
|
||||
_("not a regular file or block device"));
|
||||
return 4;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* Fill in the given information structure with the file paths and stat
|
||||
@@ -52,23 +152,17 @@ int pv_watchfd_info(pvstate_t state, pvwatchfd_t info, int automatic)
|
||||
info->watch_pid, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
#ifdef HAVE_SNPRINTF
|
||||
snprintf(info->file_fdinfo, sizeof(info->file_fdinfo) - 1,
|
||||
#else
|
||||
sprintf(info->file_fdinfo,
|
||||
#endif
|
||||
"/proc/%u/fdinfo/%d", info->watch_pid, info->watch_fd);
|
||||
#ifdef HAVE_SNPRINTF
|
||||
snprintf(info->file_fd, sizeof(info->file_fd) - 1,
|
||||
#else
|
||||
sprintf(info->file_fd,
|
||||
#endif
|
||||
"/proc/%u/fd/%d", info->watch_pid, info->watch_fd);
|
||||
(void) pv_snprintf(info->file_fdinfo, PV_SIZEOF_FILE_FDINFO,
|
||||
"/proc/%u/fdinfo/%d", info->watch_pid,
|
||||
info->watch_fd);
|
||||
(void) pv_snprintf(info->file_fd, PV_SIZEOF_FILE_FD,
|
||||
"/proc/%u/fd/%d", info->watch_pid,
|
||||
info->watch_fd);
|
||||
|
||||
memset(info->file_fdpath, 0, sizeof(info->file_fdpath));
|
||||
memset(info->file_fdpath, 0, PV_SIZEOF_FILE_FDPATH);
|
||||
if (readlink
|
||||
(info->file_fd, info->file_fdpath,
|
||||
sizeof(info->file_fdpath) - 1) < 0) {
|
||||
PV_SIZEOF_FILE_FDPATH - 1) < 0) {
|
||||
if (!automatic)
|
||||
pv_error(state, "%s %u: %s %d: %s",
|
||||
_("pid"),
|
||||
@@ -77,8 +171,8 @@ int pv_watchfd_info(pvstate_t state, pvwatchfd_t info, int automatic)
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (!((0 == stat64(info->file_fd, &(info->sb_fd)))
|
||||
&& (0 == lstat64(info->file_fd, &(info->sb_fd_link))))) {
|
||||
if (!((0 == stat(info->file_fd, &(info->sb_fd)))
|
||||
&& (0 == lstat(info->file_fd, &(info->sb_fd_link))))) {
|
||||
if (!automatic)
|
||||
pv_error(state, "%s %u: %s %d: %s: %s",
|
||||
_("pid"),
|
||||
@@ -91,25 +185,8 @@ int pv_watchfd_info(pvstate_t state, pvwatchfd_t info, int automatic)
|
||||
|
||||
info->size = 0;
|
||||
|
||||
if (S_ISBLK(info->sb_fd.st_mode)) {
|
||||
int fd;
|
||||
|
||||
/*
|
||||
* Get the size of block devices by opening
|
||||
* them and seeking to the end.
|
||||
*/
|
||||
fd = open64(info->file_fdpath, O_RDONLY);
|
||||
if (fd >= 0) {
|
||||
info->size = lseek64(fd, 0, SEEK_END);
|
||||
close(fd);
|
||||
} else {
|
||||
info->size = 0;
|
||||
}
|
||||
} else if (S_ISREG(info->sb_fd.st_mode)) {
|
||||
if ((info->sb_fd_link.st_mode & S_IWUSR) == 0) {
|
||||
info->size = info->sb_fd.st_size;
|
||||
}
|
||||
} else {
|
||||
int ret = filesize(info);
|
||||
if (ret != 0) {
|
||||
if (!automatic)
|
||||
pv_error(state, "%s %u: %s %d: %s: %s",
|
||||
_("pid"),
|
||||
@@ -118,23 +195,29 @@ int pv_watchfd_info(pvstate_t state, pvwatchfd_t info, int automatic)
|
||||
info->watch_fd,
|
||||
info->file_fdpath,
|
||||
_("not a regular file or block device"));
|
||||
return 4;
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __APPLE__
|
||||
int pv_watchfd_changed(pvwatchfd_t info)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
/*
|
||||
* Return nonzero if the given file descriptor has changed in some way since
|
||||
* we started looking at it (i.e. changed destination or permissions).
|
||||
*/
|
||||
int pv_watchfd_changed(pvwatchfd_t info)
|
||||
{
|
||||
struct stat64 sb_fd, sb_fd_link;
|
||||
struct stat sb_fd, sb_fd_link;
|
||||
|
||||
if ((0 == stat64(info->file_fd, &sb_fd))
|
||||
&& (0 == lstat64(info->file_fd, &sb_fd_link))) {
|
||||
if ((0 == stat(info->file_fd, &sb_fd))
|
||||
&& (0 == lstat(info->file_fd, &sb_fd_link))) {
|
||||
if ((sb_fd.st_dev != info->sb_fd.st_dev)
|
||||
|| (sb_fd.st_ino != info->sb_fd.st_ino)
|
||||
|| (sb_fd_link.st_mode != info->sb_fd_link.st_mode)
|
||||
@@ -147,6 +230,7 @@ int pv_watchfd_changed(pvwatchfd_t info)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
@@ -156,6 +240,19 @@ int pv_watchfd_changed(pvwatchfd_t info)
|
||||
long long pv_watchfd_position(pvwatchfd_t info)
|
||||
{
|
||||
long long position;
|
||||
#ifdef __APPLE__
|
||||
struct vnode_fdinfowithpath vnodeInfo = { };
|
||||
int32_t proc_fd = (int32_t) info->watch_fd;
|
||||
|
||||
int size = proc_pidfdinfo(info->watch_pid, proc_fd,
|
||||
PROC_PIDFDVNODEPATHINFO, &vnodeInfo,
|
||||
PROC_PIDFDVNODEPATHINFO_SIZE);
|
||||
if (size != PROC_PIDFDVNODEPATHINFO_SIZE) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
position = (long long) vnodeInfo.pfi.fi_offset;
|
||||
#else
|
||||
FILE *fptr;
|
||||
|
||||
if (pv_watchfd_changed(info))
|
||||
@@ -165,13 +262,41 @@ long long pv_watchfd_position(pvwatchfd_t info)
|
||||
if (NULL == fptr)
|
||||
return -1;
|
||||
position = -1;
|
||||
fscanf(fptr, "pos: %llu", &position);
|
||||
if (1 != fscanf(fptr, "pos: %llu", &position))
|
||||
position = -1;
|
||||
fclose(fptr);
|
||||
#endif
|
||||
|
||||
return position;
|
||||
}
|
||||
|
||||
|
||||
#ifdef __APPLE__
|
||||
static int pidfds(pvstate_t state, unsigned int pid,
|
||||
struct proc_fdinfo **fds, int *count)
|
||||
{
|
||||
int size_needed = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, 0, 0);
|
||||
if (size_needed == -1) {
|
||||
pv_error(state, "%s: unable to list pid fds: %s", _("pid"),
|
||||
strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
*count = size_needed / PROC_PIDLISTFD_SIZE;
|
||||
|
||||
*fds = (struct proc_fdinfo *) malloc(size_needed);
|
||||
if (*fds == NULL) {
|
||||
pv_error(state, "%s: alloc failed: %s", _("pid"),
|
||||
strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
proc_pidinfo(pid, PROC_PIDLISTFDS, 0, *fds, size_needed);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Scan the given process and update the arrays with any new file
|
||||
* descriptors.
|
||||
@@ -185,35 +310,55 @@ int pv_watchpid_scanfds(pvstate_t state, pvstate_t pristine,
|
||||
pvstate_t * state_array_ptr, int *fd_to_idx)
|
||||
{
|
||||
char fd_dir[512] = { 0, };
|
||||
DIR *dptr;
|
||||
struct dirent *d;
|
||||
int array_length = 0;
|
||||
struct pvwatchfd_s *info_array = NULL;
|
||||
struct pvstate_s *state_array = NULL;
|
||||
|
||||
#ifdef HAVE_SNPRINTF
|
||||
snprintf(fd_dir, sizeof(fd_dir) - 1, "/proc/%u/fd", watch_pid);
|
||||
#ifdef __APPLE__
|
||||
struct proc_fdinfo *fd_infos = NULL;
|
||||
int fd_infos_count = 0;
|
||||
|
||||
if (pidfds(state, watch_pid, &fd_infos, &fd_infos_count) != 0) {
|
||||
pv_error(state, "%s: pidfds failed", _("pid"));
|
||||
return -1;
|
||||
}
|
||||
#else
|
||||
sprintf(fd_dir, "/proc/%u/fd", watch_pid);
|
||||
#endif
|
||||
DIR *dptr;
|
||||
struct dirent *d;
|
||||
|
||||
(void) pv_snprintf(fd_dir, sizeof(fd_dir), "/proc/%u/fd",
|
||||
watch_pid);
|
||||
|
||||
dptr = opendir(fd_dir);
|
||||
if (NULL == dptr)
|
||||
return 1;
|
||||
#endif
|
||||
|
||||
array_length = *array_length_ptr;
|
||||
info_array = *info_array_ptr;
|
||||
state_array = *state_array_ptr;
|
||||
|
||||
#ifdef __APPLE__
|
||||
if (fd_infos_count < 1) {
|
||||
pv_error(state, "%s: no fds found", _("pid"));
|
||||
return -1;
|
||||
}
|
||||
for (int i = 0; i < fd_infos_count; i++) {
|
||||
#else
|
||||
while ((d = readdir(dptr)) != NULL) {
|
||||
#endif
|
||||
int fd, check_idx, use_idx, rc;
|
||||
long long position_now;
|
||||
|
||||
fd = -1;
|
||||
#ifdef __APPLE__
|
||||
fd = fd_infos[i].proc_fd;
|
||||
#else
|
||||
if (sscanf(d->d_name, "%d", &fd) != 1)
|
||||
continue;
|
||||
if ((fd < 0) || (fd >= FD_SETSIZE))
|
||||
continue;
|
||||
|
||||
#endif
|
||||
/*
|
||||
* Skip if this fd is already known to us.
|
||||
*/
|
||||
@@ -296,6 +441,11 @@ int pv_watchpid_scanfds(pvstate_t state, pvstate_t pristine,
|
||||
|
||||
info_array[use_idx].watch_pid = watch_pid;
|
||||
info_array[use_idx].watch_fd = fd;
|
||||
#ifdef __APPLE__
|
||||
if (fd_infos[i].proc_fdtype != PROX_FDTYPE_VNODE) {
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
rc = pv_watchfd_info(state, &(info_array[use_idx]), 1);
|
||||
|
||||
/*
|
||||
@@ -354,7 +504,12 @@ int pv_watchpid_scanfds(pvstate_t state, pvstate_t pristine,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef __APPLE__
|
||||
free(fd_infos);
|
||||
#else
|
||||
closedir(dptr);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -363,40 +518,46 @@ int pv_watchpid_scanfds(pvstate_t state, pvstate_t pristine,
|
||||
/*
|
||||
* Set the display name for the given watched file descriptor, truncating at
|
||||
* the relevant places according to the current screen width.
|
||||
*
|
||||
* If the file descriptor is pointing to a file under the current working
|
||||
* directory, show its relative path, not the full path.
|
||||
*/
|
||||
void pv_watchpid_setname(pvstate_t state, pvwatchfd_t info)
|
||||
{
|
||||
int path_length, max_display_length;
|
||||
int path_length, cwd_length, max_display_length;
|
||||
char *file_fdpath = info->file_fdpath;
|
||||
|
||||
memset(info->display_name, 0, sizeof(info->display_name));
|
||||
memset(info->display_name, 0, PV_SIZEOF_DISPLAY_NAME);
|
||||
|
||||
path_length = strlen(info->file_fdpath);
|
||||
cwd_length = strlen(state->cwd);
|
||||
if (cwd_length > 0 && path_length > cwd_length) {
|
||||
if (0 ==
|
||||
strncmp(info->file_fdpath, state->cwd, cwd_length)) {
|
||||
file_fdpath += cwd_length + 1;
|
||||
path_length -= cwd_length + 1;
|
||||
}
|
||||
}
|
||||
|
||||
max_display_length = (state->width / 2) - 6;
|
||||
if (max_display_length >= path_length) {
|
||||
#ifdef HAVE_SNPRINTF
|
||||
snprintf(info->display_name,
|
||||
sizeof(info->display_name) - 1,
|
||||
#else
|
||||
sprintf(info->display_name,
|
||||
#endif
|
||||
"%4d:%.498s", info->watch_fd, info->file_fdpath);
|
||||
(void) pv_snprintf(info->display_name,
|
||||
PV_SIZEOF_DISPLAY_NAME,
|
||||
"%4d:%.498s", info->watch_fd,
|
||||
file_fdpath);
|
||||
} else {
|
||||
int prefix_length, suffix_length;
|
||||
|
||||
prefix_length = max_display_length / 4;
|
||||
suffix_length = max_display_length - prefix_length - 3;
|
||||
|
||||
#ifdef HAVE_SNPRINTF
|
||||
snprintf(info->display_name,
|
||||
sizeof(info->display_name) - 1,
|
||||
#else
|
||||
sprintf(info->display_name,
|
||||
#endif
|
||||
"%4d:%.*s...%.*s",
|
||||
info->watch_fd, prefix_length, info->file_fdpath,
|
||||
suffix_length,
|
||||
info->file_fdpath + path_length - suffix_length);
|
||||
(void) pv_snprintf(info->display_name,
|
||||
PV_SIZEOF_DISPLAY_NAME,
|
||||
"%4d:%.*s...%.*s",
|
||||
info->watch_fd, prefix_length,
|
||||
file_fdpath, suffix_length,
|
||||
file_fdpath + path_length -
|
||||
suffix_length);
|
||||
}
|
||||
|
||||
debug("%s: %d: [%s]", "set name for fd", info->watch_fd,
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that data can be just passed straight through.
|
||||
|
||||
VALUE=`echo TESTING | $PROG 2>/dev/null` || exit 1
|
||||
test "$VALUE" = "TESTING"
|
||||
|
||||
# EOF
|
||||
@@ -1,12 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that the update interval can be set.
|
||||
|
||||
sleep 1 | $PROG -f -i 0.1 >/dev/null 2>$TMP1
|
||||
|
||||
# There should be more than 6 lines of output.
|
||||
#
|
||||
NUM=`tr '\r' '\n' < $TMP1 | wc -l | tr -d ' '`
|
||||
test $NUM -gt 6
|
||||
|
||||
# EOF
|
||||
@@ -1,13 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# A simple test of rate limiting.
|
||||
|
||||
# Transfer 102 bytes at 100 bytes/sec. It should take at least 1 second.
|
||||
#
|
||||
START=`date +%S`
|
||||
dd if=/dev/zero bs=102 count=1 2>/dev/null | $PROG -L 100 2>/dev/null | cat >/dev/null
|
||||
END=`date +%S`
|
||||
|
||||
test $START -ne $END
|
||||
|
||||
# EOF
|
||||
@@ -1,13 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that the progress bar moves when data is coming in.
|
||||
|
||||
dd if=/dev/zero bs=100 count=1 2>/dev/null \
|
||||
| $PROG -f -p -i 0.1 -L 500 >/dev/null 2>$TMP1
|
||||
|
||||
# There should be more than 2 different lines of output.
|
||||
#
|
||||
NUM=`tr '\r' '\n' < $TMP1 | sort | uniq -u | wc -l | tr -d ' '`
|
||||
test $NUM -gt 2
|
||||
|
||||
# EOF
|
||||
@@ -1,14 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that the elapsed time counter does count up.
|
||||
|
||||
# Transfer a zero amount of data, but take 3 seconds to do it.
|
||||
#
|
||||
(sleep 3 | $PROG -f -t >/dev/null) 2>&1 | tr '\r' '\n' > $TMP1
|
||||
|
||||
# Count the number of different timer values; it should be >1.
|
||||
#
|
||||
NUM=`sort < $TMP1 | uniq -u | wc -l | tr -d ' '`
|
||||
test $NUM -gt 1
|
||||
|
||||
# EOF
|
||||
@@ -1,20 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that the estimated time counter counts.
|
||||
|
||||
dd if=/dev/zero bs=100 count=1 2>/dev/null \
|
||||
| $PROG -f -e -s 100 -i 0.1 -L 25 >/dev/null 2>$TMP1
|
||||
|
||||
# Count the number of different ETA values there have been.
|
||||
#
|
||||
NUM=`tr '\r' '\n' < $TMP1 | tr -d ' ' | sed '/^$/d' | sort | uniq | wc -l | tr -d ' '`
|
||||
|
||||
# 3 or less - not OK, since it should have taken 4 seconds.
|
||||
#
|
||||
test $NUM -gt 3 || exit 1
|
||||
|
||||
# 8 or more - not OK, since even on a heavily loaded system that's too long.
|
||||
#
|
||||
test $NUM -lt 8
|
||||
|
||||
# EOF
|
||||
@@ -1,20 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that the estimated time counter can show the end time of day.
|
||||
|
||||
dd if=/dev/zero bs=100 count=1 2>/dev/null \
|
||||
| $PROG -f -I -s 100 -i 0.1 -L 25 >/dev/null 2>$TMP1
|
||||
|
||||
# Count the number of different ETA values there have been.
|
||||
#
|
||||
NUM=`tr '\r' '\n' < $TMP1 | tr -d ' ' | sed '/^$/d' | sort | uniq | wc -l | tr -d ' '`
|
||||
|
||||
# There should be at least 1 line of output.
|
||||
#
|
||||
test $NUM -gt 0 || exit 1
|
||||
|
||||
# 8 or more different values - not OK.
|
||||
#
|
||||
test $NUM -lt 8
|
||||
|
||||
# EOF
|
||||
@@ -1,10 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that the byte counter counts.
|
||||
|
||||
dd if=/dev/zero bs=100 count=1 2>/dev/null \
|
||||
| LANG=C $PROG -f -b >/dev/null 2>$TMP1
|
||||
NUM=`tr '\r' '\n' < $TMP1 | tr -d ' '`
|
||||
test "$NUM" = "100B"
|
||||
|
||||
# EOF
|
||||
@@ -1,18 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that numeric output outputs some percentages.
|
||||
|
||||
# Process 100 bytes at 100 bytes per second, updating every 0.1 seconds for
|
||||
# around 10 output lines.
|
||||
#
|
||||
dd if=/dev/zero bs=100 count=1 2>/dev/null \
|
||||
| $PROG -s 100 -n -i 0.1 -L 100 >/dev/null 2>$TMP1
|
||||
|
||||
# The number of output lines should be >8 and <13, and the final percentage
|
||||
# should be 100.
|
||||
#
|
||||
test `wc -l < $TMP1` -gt 8
|
||||
test `wc -l < $TMP1` -lt 13
|
||||
test `sed -n '$p' < $TMP1` -eq 100
|
||||
|
||||
# EOF
|
||||
@@ -1,9 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that the -q option shuts everything up.
|
||||
|
||||
dd if=/dev/zero bs=1000 count=5 2>/dev/null \
|
||||
| $PROG -f -q -i 0.1 -L 5000 >/dev/null 2>$TMP1
|
||||
test ! -s $TMP1
|
||||
|
||||
# EOF
|
||||
@@ -1,26 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that there is no SIGPIPE or dropped data on bigger data transfers.
|
||||
|
||||
# We nead GNU head. On some platforms it is named ghead instead of head.
|
||||
HEAD=head
|
||||
for p in `echo $PATH | tr ':' '\n'`
|
||||
do
|
||||
if test -x $p/ghead
|
||||
then
|
||||
HEAD=$p/ghead
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# Don't use dd. See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=324308
|
||||
COUNT1=100000000
|
||||
#COUNT2=`$PROG -B 100000 -q /dev/zero | $HEAD -c $COUNT1 | wc -c | tr -d ' '`
|
||||
# Remove \n to fix the test on AIX
|
||||
COUNT2=`$PROG -B 100000 -q /dev/zero | $HEAD -c $COUNT1 | tr -d '\n' | wc -c | tr -d ' '`
|
||||
|
||||
#echo "[$COUNT1] [$COUNT2]"
|
||||
|
||||
test "x$COUNT1" = "x$COUNT2"
|
||||
|
||||
# EOF
|
||||
@@ -1,26 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Transfer a large chunk of data through pv and check data correctness
|
||||
# afterwards.
|
||||
|
||||
rm -f $TMP1 $TMP2 2>/dev/null
|
||||
|
||||
# exit on non-zero return codes
|
||||
set -e
|
||||
|
||||
# generate some data
|
||||
dd if=/dev/urandom of=$TMP1 bs=1024 count=10240 2>/dev/null
|
||||
|
||||
CKSUM1=`cksum $TMP1 | awk '{print $1}'`
|
||||
|
||||
# read through pv and test afterwards
|
||||
$PROG -B 100000 -q $TMP1 > $TMP2
|
||||
|
||||
CKSUM2=`cksum $TMP2 | awk '{print $1}'`
|
||||
|
||||
test "x$CKSUM1" = "x$CKSUM2"
|
||||
|
||||
# clean up
|
||||
rm -f $TMP1 $TMP2 2>/dev/null
|
||||
|
||||
# EOF
|
||||
@@ -1,25 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Same as test 13 (1mboundary) but for rate, not bytes transferred.
|
||||
|
||||
# Transfer 1500kB of data in a bursty fashion.
|
||||
#
|
||||
(dd if=/dev/zero bs=1k count=999;
|
||||
sleep 1;
|
||||
dd if=/dev/zero bs=1k count=1;
|
||||
sleep 1;
|
||||
dd if=/dev/zero bs=3 count=1;
|
||||
sleep 1;
|
||||
dd if=/dev/zero bs=1k count=500;
|
||||
sleep 1;
|
||||
) 2>/dev/null | ($PROG -rtef -s 1500k >/dev/null) 2>$TMP1
|
||||
|
||||
# Count how many different line lengths we've seen.
|
||||
#
|
||||
NUM=`tr '\r' '\n' < $TMP1 | awk '{x=length($0);if(x>0)print length($0)}' | sort | uniq | wc -l`
|
||||
|
||||
# There should only be one length (not counting 0).
|
||||
#
|
||||
test $NUM -eq 1 || { echo; tr '\r' '\n' < $TMP1; exit 1; }
|
||||
|
||||
# EOF
|
||||
@@ -1,53 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Transfer a large chunk of data through pv using pipes, sending it in a
|
||||
# bursty fashion, and check data correctness afterwards.
|
||||
|
||||
rm -f $TMP1 $TMP2 2>/dev/null
|
||||
|
||||
# exit on non-zero return codes
|
||||
set -e
|
||||
|
||||
# generate some data
|
||||
dd if=/dev/urandom of=$TMP1 bs=1024 count=10240 2>/dev/null
|
||||
|
||||
CKSUM1=`cksum $TMP1 | awk '{print $1}'`
|
||||
|
||||
# read through pv and test afterwards
|
||||
(
|
||||
dd if=$TMP1 bs=1 count=9000
|
||||
sleep 1
|
||||
dd if=$TMP1 bs=1 skip=9000 count=1240
|
||||
sleep 1
|
||||
dd if=$TMP1 bs=1024 skip=10 count=1014
|
||||
sleep 1
|
||||
dd if=$TMP1 bs=1024 skip=1024 count=1024
|
||||
sleep 1
|
||||
dd if=$TMP1 bs=1024 skip=2048
|
||||
) 2>/dev/null | $PROG -q -L 2M | cat > $TMP2
|
||||
|
||||
CKSUM2=`cksum $TMP2 | awk '{print $1}'`
|
||||
|
||||
test "x$CKSUM1" = "x$CKSUM2"
|
||||
|
||||
# same again but with one less pipe
|
||||
(
|
||||
dd if=$TMP1 bs=1 count=9000
|
||||
sleep 1
|
||||
dd if=$TMP1 bs=1 skip=9000 count=1240
|
||||
sleep 1
|
||||
dd if=$TMP1 bs=1024 skip=10 count=1014
|
||||
sleep 1
|
||||
dd if=$TMP1 bs=1024 skip=1024 count=1024
|
||||
sleep 1
|
||||
dd if=$TMP1 bs=1024 skip=2048
|
||||
) 2>/dev/null | $PROG -q -L 2M > $TMP2
|
||||
|
||||
CKSUM2=`cksum $TMP2 | awk '{print $1}'`
|
||||
|
||||
test "x$CKSUM1" = "x$CKSUM2"
|
||||
|
||||
# clean up
|
||||
rm -f $TMP1 $TMP2 2>/dev/null
|
||||
|
||||
# EOF
|
||||
@@ -1,20 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that numeric output gives a timer when used with -t.
|
||||
|
||||
# Process 100 bytes at 100 bytes per second, updating every 0.1 seconds for
|
||||
# around 10 output lines.
|
||||
#
|
||||
dd if=/dev/zero bs=100 count=1 2>/dev/null \
|
||||
| $PROG -s 100 -n -t -i 0.1 -L 100 >/dev/null 2>$TMP1
|
||||
|
||||
# The number of output lines should be >8 and <13, and the number of
|
||||
# different elapsed times should be at least 7. The last percentage should
|
||||
# be 100.
|
||||
#
|
||||
test `wc -l < $TMP1` -gt 8
|
||||
test `wc -l < $TMP1` -lt 13
|
||||
test `tr , . < "$TMP1" | awk '{print int(10*$1)}' | sort -n | uniq | wc -l` -gt 7
|
||||
test `sed -n '$p' < $TMP1 | awk '{print $2}'` -eq 100
|
||||
|
||||
# EOF
|
||||
@@ -1,19 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that numeric output gives a byte count instead of a percentage when
|
||||
# used with -b.
|
||||
|
||||
# Process 500 bytes at 500 bytes per second, updating every 0.1 seconds for
|
||||
# around 10 output lines.
|
||||
#
|
||||
dd if=/dev/zero bs=500 count=1 2>/dev/null \
|
||||
| $PROG -s 500 -n -b -i 0.1 -L 500 >/dev/null 2>$TMP1
|
||||
|
||||
# The number of output lines should be >8 and <13, and the final byte count
|
||||
# should be 500.
|
||||
#
|
||||
test `wc -l < $TMP1` -gt 8
|
||||
test `wc -l < $TMP1` -lt 13
|
||||
test `sed -n '$p' < $TMP1` -eq 500
|
||||
|
||||
# EOF
|
||||
@@ -1,32 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Try changing the format of a transfer remotely.
|
||||
|
||||
# Do nothing if IPC is not supported.
|
||||
if ! $PROG -h | grep -Eq "^ -R,"; then
|
||||
echo "SKIPPED" | tr "\n" ' '
|
||||
exit 0
|
||||
fi
|
||||
|
||||
rm -f $TMP1 $TMP2 $TMP3 $TMP4 2>/dev/null
|
||||
|
||||
# Exit on non-zero return codes.
|
||||
set -e
|
||||
|
||||
# Generate an empty test file.
|
||||
dd if=/dev/zero of=$TMP1 bs=1024 count=10240 2>/dev/null
|
||||
|
||||
(
|
||||
sleep 1
|
||||
$PROG -R `cat $TMP4` -a
|
||||
sleep 2
|
||||
$PROG -R `cat $TMP4` -L 10M
|
||||
) &
|
||||
|
||||
$PROG -L 2M -f -P $TMP4 $TMP1 > $TMP2 2>$TMP3
|
||||
|
||||
# Make sure there is more than one length of line (excluding blank lines).
|
||||
line_lengths=`tr '\r' '\n' < "$TMP3" | awk '{print length($0)}' | grep -Fvx 0 | sort -n | uniq | wc -l`
|
||||
test $line_lengths -gt 1
|
||||
|
||||
# EOF
|
||||
@@ -1,54 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Try repeatedly messaging a transfer process, and make sure the data stays
|
||||
# intact.
|
||||
|
||||
# Do nothing if IPC is not supported.
|
||||
if ! $PROG -h | grep -Eq "^ -R,"; then
|
||||
echo "SKIPPED" | tr "\n" ' '
|
||||
exit 0
|
||||
fi
|
||||
|
||||
rm -f $TMP1 $TMP2 $TMP3 $TMP4 2>/dev/null
|
||||
|
||||
# Exit on non-zero return codes.
|
||||
set -e
|
||||
|
||||
# Generate some data.
|
||||
dd if=/dev/urandom of=$TMP1 bs=1024 count=10240 2>/dev/null
|
||||
|
||||
# Run a few remote control commands in the background.
|
||||
#
|
||||
echo FAIL > $TMP3
|
||||
(
|
||||
set +e
|
||||
sleep 2
|
||||
for x in 1 2 3; do
|
||||
$PROG -R `cat $TMP4` -apterb || exit 1
|
||||
(usleep 200000 || sleep 1) 2>/dev/null
|
||||
$PROG -R `cat $TMP4` -p || exit 1
|
||||
(usleep 200000 || sleep 1) 2>/dev/null
|
||||
$PROG -R `cat $TMP4` -N "test" || exit 1
|
||||
(usleep 200000 || sleep 1) 2>/dev/null
|
||||
$PROG -R `cat $TMP4` -F "%e" || exit 1
|
||||
(usleep 200000 || sleep 1) 2>/dev/null
|
||||
$PROG -R `cat $TMP4` -N "." || exit 1
|
||||
(usleep 200000 || sleep 1) 2>/dev/null
|
||||
done
|
||||
$PROG -R `cat $TMP4` -L 10M
|
||||
echo OK > $TMP3
|
||||
) &
|
||||
|
||||
# Run our data transfer.
|
||||
$PROG -L 100k -i 0.1 -f -P $TMP4 $TMP1 > $TMP2 2>/dev/null
|
||||
|
||||
# Check our remote control calls ran OK.
|
||||
BGSTATUS=`cat $TMP3`
|
||||
test "x$BGSTATUS" = "xOK"
|
||||
|
||||
# Check data integrity.
|
||||
CKSUM1=`cksum $TMP1 | awk '{print $1}'`
|
||||
CKSUM2=`cksum $TMP2 | awk '{print $1}'`
|
||||
test "x$CKSUM1" = "x$CKSUM2"
|
||||
|
||||
# EOF
|
||||
@@ -1,28 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Make sure -S stops at the given size.
|
||||
|
||||
rm -f $TMP1 $TMP2 2>/dev/null
|
||||
|
||||
# exit on non-zero return codes
|
||||
set -e
|
||||
|
||||
# generate some data
|
||||
dd if=/dev/urandom of=$TMP1 bs=1024 count=10 2>/dev/null
|
||||
|
||||
# read through pv and test afterwards
|
||||
$PROG -S -s 5120 -q $TMP1 > $TMP2
|
||||
|
||||
CKSUM2=`cksum $TMP2 | awk '{print $1}'`
|
||||
|
||||
# take the first 5120 bytes of TMP1 and cksum them
|
||||
rm -f $TMP2
|
||||
dd if=$TMP1 of=$TMP2 bs=1024 count=5 2>/dev/null
|
||||
CKSUM1=`cksum $TMP2 | awk '{print $1}'`
|
||||
|
||||
test "x$CKSUM1" = "x$CKSUM2"
|
||||
|
||||
# clean up
|
||||
rm -f $TMP1 $TMP2 2>/dev/null
|
||||
|
||||
# EOF
|
||||
@@ -4,6 +4,9 @@
|
||||
# 1MiB, described here:
|
||||
# http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=586763
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
# Transfer 1500kB of data in a bursty fashion.
|
||||
#
|
||||
(dd if=/dev/zero bs=1k count=999;
|
||||
@@ -12,14 +15,18 @@
|
||||
sleep 1;
|
||||
dd if=/dev/zero bs=1k count=500;
|
||||
sleep 1;
|
||||
) 2>/dev/null | ($PROG -btef -s 1500k >/dev/null) 2>$TMP1
|
||||
) 2>/dev/null | ("${testSubject}" -btIf -s 1500k >/dev/null) 2>"${workFile1}"
|
||||
|
||||
# Count how many different line lengths we've seen.
|
||||
#
|
||||
NUM=`tr '\r' '\n' < $TMP1 | awk '{x=length($0);if(x>0)print length($0)}' | sort | uniq | wc -l`
|
||||
lineLengthCount=$(tr '\r' '\n' < "${workFile1}" | sed 's/ *$//' | awk '{x=length($0);if(x>0)print length($0)}' | sort | uniq | wc -l | tr -dc '0-9')
|
||||
|
||||
# There should only be one length (not counting 0).
|
||||
#
|
||||
test $NUM -eq 1 || { echo; tr '\r' '\n' < $TMP1; exit 1; }
|
||||
test "${lineLengthCount}" = "1" && exit 0
|
||||
|
||||
echo "variable line lengths detected"
|
||||
tr '\r' '\n' < "${workFile1}"
|
||||
exit 1
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,33 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# This is the same as the other display length at magnitude boundary check,
|
||||
# but for rate, not bytes transferred.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
# Transfer 1500kB of data in a bursty fashion.
|
||||
#
|
||||
(dd if=/dev/zero bs=1k count=999;
|
||||
sleep 1;
|
||||
dd if=/dev/zero bs=1k count=1;
|
||||
sleep 1;
|
||||
dd if=/dev/zero bs=3 count=1;
|
||||
sleep 1;
|
||||
dd if=/dev/zero bs=1k count=500;
|
||||
sleep 1;
|
||||
) 2>/dev/null | ("${testSubject}" -rtIf -s 1500k >/dev/null) 2>"${workFile1}"
|
||||
|
||||
# Count how many different line lengths we've seen.
|
||||
#
|
||||
lineLengthCount=$(tr '\r' '\n' < "${workFile1}" | sed 's/ *$//' | awk '{x=length($0);if(x>0)print length($0)}' | sort | uniq | wc -l | tr -dc '0-9')
|
||||
|
||||
# There should only be one length (not counting 0).
|
||||
#
|
||||
test "${lineLengthCount}" = "1" && exit 0
|
||||
|
||||
echo "variable line lengths detected"
|
||||
tr '\r' '\n' < "${workFile1}"
|
||||
exit 1
|
||||
|
||||
# EOF
|
||||
@@ -3,6 +3,9 @@
|
||||
# Check that the average transfer rate counter changes, but not more than it
|
||||
# should.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
# Transfer 210 bytes as 100 bytes, a 1 second gap, 110 bytes, and another 1
|
||||
# second gap.
|
||||
#
|
||||
@@ -10,15 +13,19 @@
|
||||
sleep 1;
|
||||
dd if=/dev/zero bs=110 count=1 2>/dev/null;
|
||||
sleep 1;
|
||||
) | $PROG -f -i 0.5 -a >/dev/null 2>$TMP1
|
||||
) | "${testSubject}" -f -i 0.5 -a >/dev/null 2>"${workFile1}"
|
||||
|
||||
# Count the number of rates output that are below 80.
|
||||
#
|
||||
NUM=`tr '\r' '\n' < $TMP1 | tr -dc '0-9.\n' | sed '/^$/d' | awk '$1<80{print}' | wc -l | tr -d ' '`
|
||||
lineCount=$(tr '\r' '\n' < "${workFile1}" | tr -dc '0-9.\n' | sed '/^$/d' | awk '$1<80{print}' | wc -l | tr -dc '0-9')
|
||||
|
||||
# Nearly all of the output rates should be above 80 since the average rate
|
||||
# will always be around 100 bytes per second, except for pauses.
|
||||
#
|
||||
test $NUM -lt 2
|
||||
test "${lineCount}" -lt 2 && exit 0
|
||||
|
||||
echo "average rate varied more than expected"
|
||||
tr '\r' '\n' < "${workFile1}"
|
||||
exit 1
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,17 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that the byte counter counts in bits when --bits is selected.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
dd if=/dev/zero bs=100 count=1 2>/dev/null \
|
||||
| "${testSubject}" -f -b -8 >/dev/null 2>"${workFile1}"
|
||||
|
||||
counterValue=$(tr '\r' '\n' < "${workFile1}" | tr -d ' ')
|
||||
test "${counterValue}" = "800b" && exit 0
|
||||
|
||||
echo "unexpected bit counter value: ${counterValue}"
|
||||
exit 1
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that "--buffer-percent" displays correctly.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
# The output should show 100% and 0% as the buffer initially fills up due to
|
||||
# there being nowhere to write it to, and then empties.
|
||||
( dd if=/dev/zero bs=1024 count=1024; sleep 2; ) 2>/dev/null \
|
||||
| "${testSubject}" -f -T -i 0.5 -B 1024 2>"${workFile1}" \
|
||||
| (sleep 1; dd bs=1024 count=512; sleep 1; cat; ) >/dev/null 2>&1
|
||||
|
||||
differentLines=$(tr '\r' '\n' < "${workFile1}" | sed '/^ *$/d' | sort | uniq | wc -l | tr -dc '0-9')
|
||||
test "${differentLines}" -gt 1 && exit 0
|
||||
|
||||
echo "expected output changes not seen"
|
||||
tr '\r' '\n' < "${workFile1}" | sed 's/^ *$/d' | sort | uniq
|
||||
exit 1
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,17 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that the byte counter counts.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
dd if=/dev/zero bs=100 count=1 2>/dev/null \
|
||||
| "${testSubject}" -f -b >/dev/null 2>"${workFile1}"
|
||||
|
||||
counterValue=$(tr '\r' '\n' < "${workFile1}" | tr -d ' ')
|
||||
test "${counterValue}" = "100B" && exit 0
|
||||
|
||||
echo "unexpected byte counter value: ${counterValue}"
|
||||
exit 1
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,33 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that the estimated time counter counts.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
dd if=/dev/zero bs=100 count=1 2>/dev/null \
|
||||
| "${testSubject}" -f -e -s 100 -i 0.1 -L 25 >/dev/null 2>"${workFile1}"
|
||||
|
||||
# Count the number of different ETA values there have been.
|
||||
#
|
||||
valueCount=$(tr '\r' '\n' < "${workFile1}" | tr -d ' ' | sed '/^$/d' | sort | uniq | wc -l | tr -dc '0-9')
|
||||
|
||||
# 3 or less - not OK, since it should have taken 4 seconds.
|
||||
#
|
||||
if ! test "${valueCount}" -gt 3; then
|
||||
echo "fewer than 4 ETA values seen"
|
||||
tr '\r' '\n' < "${workFile1}" | sed '/^ *$/d' | sort | uniq
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 12 or more - not OK, since even on a heavily loaded system that's too long.
|
||||
#
|
||||
if ! test "${valueCount}" -lt 12; then
|
||||
echo "more than 11 ETA values seen"
|
||||
tr '\r' '\n' < "${workFile1}" | sed '/^ *$/d' | sort | uniq
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,32 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that the estimated time counter can show the end time of day.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
dd if=/dev/zero bs=100 count=1 2>/dev/null \
|
||||
| "${testSubject}" -f -I -s 100 -i 0.1 -L 25 >/dev/null 2>"${workFile1}"
|
||||
|
||||
# Count the number of different ETA values there have been.
|
||||
#
|
||||
valueCount=$(tr '\r' '\n' < "${workFile1}" | tr -d ' ' | sed '/^$/d' | sort | uniq | wc -l | tr -dc '0-9')
|
||||
|
||||
# There should be at least 1 line of output.
|
||||
#
|
||||
if ! test "${valueCount}" -gt 0; then
|
||||
echo "no output found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 8 or more different values - not OK.
|
||||
#
|
||||
if ! test "${valueCount}" -lt 8; then
|
||||
echo "more than 7 different values (${valueCount})"
|
||||
tr '\r' '\n' < "${workFile1}" | sed '/^ *$/d' | sort | uniq
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,34 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that "--last-written" works.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
# Slowly write a sequence of numbers (rate-limited by another `pv' instance)
|
||||
# and watch the "--last-written" output of a second `pv' instance to make
|
||||
# sure the buffer contents are visible (we use "-B" to disable splice mode).
|
||||
seq -w 3 1 100 \
|
||||
| "${testSubject}" -qL 200 \
|
||||
| "${testSubject}" -f -B 1024 -A 16 -i 0.2 >/dev/null 2>"${workFile1}"
|
||||
|
||||
differentLines=$(tr '\r' '\n' < "${workFile1}" | sed '/^ *$/d' | sort | uniq | wc -l | tr -dc '0-9')
|
||||
lastLine=$(tr '\r' '\n' < "${workFile1}" | sed '/^ *$/d' | sed -n '$p')
|
||||
|
||||
if ! test "${differentLines}" -gt 5; then
|
||||
echo "fewer than 6 different outputs seen"
|
||||
tr '\r' '\n' < "${workFile1}" | sed '/^ *$/d' | sort | uniq
|
||||
exit 1
|
||||
fi
|
||||
|
||||
expectedLastLine="097.098.099.100."
|
||||
if ! test "${lastLine}" = "${expectedLastLine}"; then
|
||||
echo "final output differs from expected value"
|
||||
echo "expected value: [${expectedLastLine}]"
|
||||
echo "observed value: [${lastLine}]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,35 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that numeric output outputs some percentages.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
# Process 100 bytes at 100 bytes per second, updating every 0.1 seconds for
|
||||
# around 10 output lines.
|
||||
#
|
||||
dd if=/dev/zero bs=100 count=1 2>/dev/null \
|
||||
| "${testSubject}" -s 100 -n -i 0.1 -L 100 >/dev/null 2>"${workFile1}"
|
||||
|
||||
lineCount=$(wc -l < "${workFile1}" | tr -dc '0-9')
|
||||
finalLine=$(sed -n '$p' < "${workFile1}")
|
||||
|
||||
# The number of output lines should be >8 and <13, and the final percentage
|
||||
# should be 100.
|
||||
#
|
||||
if ! test "${lineCount}" -gt 8; then
|
||||
echo "fewer than 9 output lines (${lineCount})"
|
||||
exit 1
|
||||
fi
|
||||
if ! test "${lineCount}" -lt 13; then
|
||||
echo "more than 12 output lines (${lineCount})"
|
||||
exit 1
|
||||
fi
|
||||
if ! test "${finalLine}" = "100"; then
|
||||
echo "final percentage was not 100 (${finalLine})"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,34 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that numeric output gives a byte count instead of a percentage when
|
||||
# used with -b.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
# Process 500 bytes at 500 bytes per second, updating every 0.1 seconds for
|
||||
# around 10 output lines.
|
||||
#
|
||||
dd if=/dev/zero bs=500 count=1 2>/dev/null \
|
||||
| "${testSubject}" -s 500 -n -b -i 0.1 -L 500 >/dev/null 2>"${workFile1}"
|
||||
|
||||
lineCount=$(wc -l < "${workFile1}" | tr -dc '0-9')
|
||||
finalLine=$(sed -n '$p' < "${workFile1}")
|
||||
|
||||
# The number of output lines should be >8 and <13, and the final byte count
|
||||
# should be 500.
|
||||
#
|
||||
if ! test "${lineCount}" -gt 8; then
|
||||
echo "fewer than 9 output lines (${lineCount})"
|
||||
exit 1
|
||||
fi
|
||||
if ! test "${lineCount}" -lt 13; then
|
||||
echo "more than 12 output lines (${lineCount})"
|
||||
exit 1
|
||||
fi
|
||||
if ! test "${finalLine}" = "500"; then
|
||||
echo "final byte count was not 500 (${finalLine})"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,37 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that numeric output shows line counts instead of percentages, when
|
||||
# used in line mode together with bytes mode.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"; workFile2="${workFile2:-.tmp2}"
|
||||
|
||||
# Pass through 100 lines.
|
||||
#
|
||||
seq -w 3 1 100 \
|
||||
| "${testSubject}" -bnl -i 0.2 -f -L 100 2>"${workFile1}" > "${workFile2}"
|
||||
|
||||
lineCount=$(wc -l < "${workFile1}" | tr -dc '0-9')
|
||||
finalStdoutLine=$(sed -n '$p' < "${workFile2}")
|
||||
|
||||
# The number of output lines should be >3 and <10, and the final line of
|
||||
# transferred data on stdout should be 100.
|
||||
#
|
||||
if ! test "${lineCount}" -gt 3; then
|
||||
echo "fewer than 4 output lines (${lineCount})"
|
||||
cat "${workFile1}"
|
||||
exit 1
|
||||
fi
|
||||
if ! test "${lineCount}" -lt 10; then
|
||||
echo "more than 9 output lines (${lineCount})"
|
||||
cat "${workFile1}"
|
||||
exit 1
|
||||
fi
|
||||
if ! test "${finalStdoutLine}" = "100"; then
|
||||
echo "final transferred line was not 100 (${finalStdoutLine})"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,41 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that numeric output gives a timer when used with -t.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
# Process 100 bytes at 100 bytes per second, updating every 0.1 seconds for
|
||||
# around 10 output lines.
|
||||
#
|
||||
dd if=/dev/zero bs=100 count=1 2>/dev/null \
|
||||
| "${testSubject}" -s 100 -n -t -i 0.1 -L 100 >/dev/null 2>"${workFile1}"
|
||||
|
||||
lineCount=$(wc -l < "${workFile1}" | tr -dc '0-9')
|
||||
timesCount=$(tr ',' '.' < "${workFile1}" | awk '{print int(10*$1)}' | sort -n | uniq | wc -l | tr -dc '0-9')
|
||||
finalPercentage=$(sed -n '$p' < "${workFile1}" | awk '{print $2}')
|
||||
|
||||
# The number of output lines should be >8 and <13, and the number of
|
||||
# different elapsed times should be at least 7. The last percentage should
|
||||
# be 100.
|
||||
#
|
||||
if ! test "${lineCount}" -gt 8; then
|
||||
echo "fewer than 9 output lines (${lineCount})"
|
||||
exit 1
|
||||
fi
|
||||
if ! test "${lineCount}" -lt 13; then
|
||||
echo "more than 12 output lines (${lineCount})"
|
||||
exit 1
|
||||
fi
|
||||
if ! test "${timesCount}" -gt 7; then
|
||||
echo "fewer than 8 different elapsed times (${timesCount})"
|
||||
exit 1
|
||||
fi
|
||||
if ! test "${finalPercentage}" = "100"; then
|
||||
echo "final percentage was not 100 (${finalPercentage})"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,22 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that the progress bar moves when data is coming in.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
dd if=/dev/zero bs=100 count=1 2>/dev/null \
|
||||
| "${testSubject}" -f -p -i 0.1 -L 500 >/dev/null 2>"${workFile1}"
|
||||
|
||||
# There should be more than 2 different lines of output.
|
||||
#
|
||||
lineCount=$(tr '\r' '\n' < "${workFile1}" | sort | uniq -u | wc -l | tr -dc '0-9')
|
||||
if ! test "${lineCount}" -gt 2; then
|
||||
echo "fewer than 3 different progress lines (${lineCount})"
|
||||
tr '\r' '\n' < "${workFile1}" | sort | uniq -u
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,32 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that the progress bar increases in size when data is coming in.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
dd if=/dev/zero bs=100 count=1 2>/dev/null \
|
||||
| "${testSubject}" -f -p -i 0.1 -L 50 -s 100 >/dev/null 2>"${workFile1}"
|
||||
|
||||
# There should be more than 5 different lines of output.
|
||||
#
|
||||
lineCount=$(tr '\r' '\n' < "${workFile1}" | sort | uniq -u | wc -l | tr -dc '0-9')
|
||||
if ! test "${lineCount}" -gt 5; then
|
||||
echo "fewer than 6 different progress lines (${lineCount})"
|
||||
tr '\r' '\n' < "${workFile1}" | sort | uniq -u
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Counting the "=" characters in each line that make up the progress bar
|
||||
# should give at least 5 different line lengths.
|
||||
#
|
||||
differentBarLengthsCount=$(tr '\r' '\n' < "${workFile1}" | tr -dc '=\n' | awk '{print length($1)}' | sort | uniq -u | wc -l | tr -dc '0-9')
|
||||
if ! test "${differentBarLengthsCount}" -gt 5; then
|
||||
echo "fewer than 6 different progress bar lengths detected (${differentBarLengthsCount})"
|
||||
tr '\r' '\n' < "${workFile1}" | sort | uniq -u
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,19 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that the -q option shuts everything up.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
dd if=/dev/zero bs=1000 count=5 2>/dev/null \
|
||||
| "${testSubject}" -f -q -i 0.1 -L 5000 >/dev/null 2>"${workFile1}"
|
||||
|
||||
if test -s "${workFile1}"; then
|
||||
echo "output detected when there should be none"
|
||||
cat "${workFile1}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
@@ -2,21 +2,30 @@
|
||||
#
|
||||
# Check that the transfer rate counter changes.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
# Transfer 200 bytes as two 100-byte blocks with a 2-second gap between.
|
||||
#
|
||||
(dd if=/dev/zero bs=100 count=1 2>/dev/null;
|
||||
sleep 2;
|
||||
dd if=/dev/zero bs=100 count=1 2>/dev/null;
|
||||
) | $PROG -f -i 0.5 -r >/dev/null 2>$TMP1
|
||||
) | "${testSubject}" -f -i 0.5 -r >/dev/null 2>"${workFile1}"
|
||||
|
||||
# Count the number of different rates output.
|
||||
#
|
||||
NUM=`tr '\r' '\n' < $TMP1 | sort | uniq -u | wc -l | tr -d ' '`
|
||||
rateCount=$(tr '\r' '\n' < "${workFile1}" | sort | uniq -u | wc -l | tr -dc '0-9')
|
||||
|
||||
# There should be more than 2 different rates counted (around 100 bytes/sec
|
||||
# for the each block, 0 bytes/sec for the gap in the middle, and around 50
|
||||
# bytes/sec for the average time reported at the end).
|
||||
#
|
||||
test $NUM -gt 2
|
||||
if ! test "${rateCount}" -gt 2; then
|
||||
echo "fewer than 3 different rates detected (${rateCount})"
|
||||
tr '\r' '\n' < "${workFile1}" | sort | uniq -u
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,22 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that the elapsed time counter does count up.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
# Transfer a zero amount of data, but take 3 seconds to do it.
|
||||
#
|
||||
(sleep 3 | "${testSubject}" -f -t >/dev/null) 2>&1 | tr '\r' '\n' > "${workFile1}"
|
||||
|
||||
# Count the number of different timer values; it should be >1.
|
||||
#
|
||||
valueCount=$(sort < "${workFile1}" | uniq -u | wc -l | tr -dc '0-9')
|
||||
if ! test "${valueCount}" -gt 1; then
|
||||
echo "timer value did not change"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,49 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that process ID can be written to a file as described in the manual.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"
|
||||
|
||||
# Check we can run "kill -s 0".
|
||||
if ! kill -s 0 $$ >/dev/null 2>&1; then
|
||||
echo "cannot check process existence with \`kill -s 0'"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
dd if=/dev/zero bs=150 count=1 2>/dev/null \
|
||||
| "${testSubject}" -q -L 50 -P "${workFile1}" >/dev/null 2>/dev/null \
|
||||
&
|
||||
|
||||
testPid="$!"
|
||||
sleep 1
|
||||
|
||||
storedPid=$(cat "${workFile1}" 2>/dev/null)
|
||||
|
||||
pidValid="0"
|
||||
kill -s 0 "${storedPid}" 2>/dev/null && pidValid="1"
|
||||
|
||||
wait
|
||||
|
||||
sleep 1
|
||||
|
||||
if test -s "${workFile1}"; then
|
||||
echo "PID file was not removed on exit"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
true > "${workFile1}"
|
||||
|
||||
if ! test "${testPid}" = "${storedPid}"; then
|
||||
echo "stored PID [${storedPid}] did not match actual PID [${testPid}]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! test "${pidValid}" = "1"; then
|
||||
echo "stored PID [${storedPid}] was not reachable"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,27 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check that data can be just passed straight through.
|
||||
|
||||
# Dummy assignment for "shellcheck".
|
||||
testSubject="${testSubject:-false}"
|
||||
|
||||
inputString="TESTING"
|
||||
outputString=$(printf "%s" "${inputString}" | "${testSubject}" 2>/dev/null) || { echo "unexpected failure code"; exit 1; }
|
||||
|
||||
if ! test "${inputString}" = "${outputString}"; then
|
||||
echo "output did not match input"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Test again with --force.
|
||||
inputString="TESTINGAGAIN"
|
||||
outputString=$(printf "%s" "${inputString}" | "${testSubject}" -f 2>/dev/null) || { echo "unexpected failure code"; exit 1; }
|
||||
|
||||
if ! test "${inputString}" = "${outputString}"; then
|
||||
echo "output did not match input when using --force"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,23 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Transfer a large chunk of data through pv and check data correctness
|
||||
# afterwards.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"; workFile2="${workFile2:-.tmp2}"
|
||||
|
||||
# generate some data
|
||||
dd if=/dev/urandom of="${workFile1}" bs=1024 count=10240 2>/dev/null
|
||||
|
||||
inputChecksum=$(cksum "${workFile1}" | awk '{print $1}')
|
||||
|
||||
# read through pv and test afterwards
|
||||
"${testSubject}" -B 100000 -q "${workFile1}" > "${workFile2}"
|
||||
|
||||
outputChecksum=$(cksum "${workFile2}" | awk '{print $1}')
|
||||
|
||||
test "${inputChecksum}" = "${outputChecksum}" || exit 1
|
||||
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,56 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Transfer a large chunk of data through pv using pipes, sending it in a
|
||||
# bursty fashion, and check data correctness afterwards.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"; workFile2="${workFile2:-.tmp2}"
|
||||
|
||||
# generate some data
|
||||
dd if=/dev/urandom of="${workFile1}" bs=1024 count=10240 2>/dev/null
|
||||
|
||||
inputChecksum=$(cksum "${workFile1}" | awk '{print $1}')
|
||||
|
||||
# read through pv and test afterwards
|
||||
(
|
||||
dd if="${workFile1}" bs=1 count=9000
|
||||
sleep 1
|
||||
dd if="${workFile1}" bs=1 skip=9000 count=1240
|
||||
sleep 1
|
||||
dd if="${workFile1}" bs=1024 skip=10 count=1014
|
||||
sleep 1
|
||||
dd if="${workFile1}" bs=1024 skip=1024 count=1024
|
||||
sleep 1
|
||||
dd if="${workFile1}" bs=1024 skip=2048
|
||||
) 2>/dev/null | "${testSubject}" -q -L 2M | cat > "${workFile2}"
|
||||
|
||||
outputChecksum=$(cksum "${workFile2}" | awk '{print $1}')
|
||||
|
||||
if ! test "${inputChecksum}" = "${outputChecksum}"; then
|
||||
echo "checksum mismatch with dd | pv | cat"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# same again but with one less pipe
|
||||
(
|
||||
dd if="${workFile1}" bs=1 count=9000
|
||||
sleep 1
|
||||
dd if="${workFile1}" bs=1 skip=9000 count=1240
|
||||
sleep 1
|
||||
dd if="${workFile1}" bs=1024 skip=10 count=1014
|
||||
sleep 1
|
||||
dd if="${workFile1}" bs=1024 skip=1024 count=1024
|
||||
sleep 1
|
||||
dd if="${workFile1}" bs=1024 skip=2048
|
||||
) 2>/dev/null | "${testSubject}" -q -L 2M > "${workFile2}"
|
||||
|
||||
outputChecksum=$(cksum "${workFile2}" | awk '{print $1}')
|
||||
|
||||
if ! test "${inputChecksum}" = "${outputChecksum}"; then
|
||||
echo "checksum mismatch with dd | pv > file"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
@@ -0,0 +1,80 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Make sure that files larger than 2GB are supported.
|
||||
|
||||
# Dummy assignments for "shellcheck".
|
||||
testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"; workFile2="${workFile2:-.tmp2}"
|
||||
|
||||
# Check there is enough free space for this test.
|
||||
workFile1Dir="${workFile1%/*}"
|
||||
workFile1FreeKiB=$(df -kP "${workFile1Dir}" | sed -n '$p' | awk '{print $(NF-2)}')
|
||||
test -n "${workFile1FreeKiB}" || workFile1FreeKiB=0
|
||||
if ! test "${workFile1FreeKiB}" -gt 3300000 2>/dev/null; then
|
||||
echo "test requires at least 3GB free on ${workFile1Dir}"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# Generate a 3GB sparse file - we don't really need 3GB of free space unless
|
||||
# sparse files are not supported.
|
||||
true > "${workFile1}"
|
||||
if ! dd if="/dev/zero" of="${workFile1}" count=1 bs=1048576 seek=3072 2>/dev/null; then
|
||||
echo "failed to create 3GB specimen file"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# NB the "stat" command is not portable - BSD stat(1) has a different syntax
|
||||
# to GNU stat(1) - so we have to parse the output of ls(1).
|
||||
# shellcheck disable=SC2012
|
||||
fileSize=$(ls -nl "${workFile1}" 2>/dev/null | awk '{print $5}')
|
||||
test -n "${fileSize}" || fileSize=0
|
||||
if ! test "${fileSize}" -gt 3000000; then
|
||||
echo "failed to validate specimen file size"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# Transfer the file, and count how many bytes came through.
|
||||
bytesTransferred=$("${testSubject}" -n -b "${workFile1}" 2>"${workFile2}" | wc -c 2>/dev/null | tr -dc '0-9')
|
||||
test -n "${bytesTransferred}" || bytesTransferred=0
|
||||
bytesReported=$(sed -n '$p' "${workFile2}" | tr -dc '0-9')
|
||||
test -n "${bytesReported}" || bytesReported=0
|
||||
if ! test "${bytesTransferred}" -eq "${fileSize}"; then
|
||||
echo "transferred ${bytesTransferred} of ${fileSize} bytes"
|
||||
exit 1
|
||||
fi
|
||||
if ! test "${bytesReported}" -eq "${fileSize}"; then
|
||||
echo "counted ${bytesTransferred} of ${fileSize} bytes"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Transfer the file from stdin, and count how many bytes came through.
|
||||
bytesTransferred=$("${testSubject}" -n -b < "${workFile1}" 2>"${workFile2}" | wc -c 2>/dev/null | tr -dc '0-9')
|
||||
test -n "${bytesTransferred}" || bytesTransferred=0
|
||||
bytesReported=$(sed -n '$p' "${workFile2}" | tr -dc '0-9')
|
||||
test -n "${bytesReported}" || bytesReported=0
|
||||
if ! test "${bytesTransferred}" -eq "${fileSize}"; then
|
||||
echo "stdin - transferred ${bytesTransferred} of ${fileSize} bytes"
|
||||
exit 1
|
||||
fi
|
||||
if ! test "${bytesReported}" -eq "${fileSize}"; then
|
||||
echo "stdin - counted ${bytesTransferred} of ${fileSize} bytes"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Use the file as a size value and transfer its size of bytes from dev/zero,
|
||||
# and count how many bytes came through.
|
||||
bytesTransferred=$("${testSubject}" -n -b -S -s "@${workFile1}" /dev/zero 2>"${workFile2}" | wc -c 2>/dev/null | tr -dc '0-9')
|
||||
test -n "${bytesTransferred}" || bytesTransferred=0
|
||||
bytesReported=$(sed -n '$p' "${workFile2}" | tr -dc '0-9')
|
||||
test -n "${bytesReported}" || bytesReported=0
|
||||
if ! test "${bytesTransferred}" -eq "${fileSize}"; then
|
||||
echo "size read - transferred ${bytesTransferred} of ${fileSize} bytes"
|
||||
exit 1
|
||||
fi
|
||||
if ! test "${bytesReported}" -eq "${fileSize}"; then
|
||||
echo "size read - counted ${bytesReported} of ${fileSize} bytes"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
# EOF
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user