diff --git a/Makefile.am b/Makefile.am index 3869205..3a2e1c9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -24,6 +24,7 @@ src/pv/elapsedtime.c \ src/pv/file.c \ src/pv/loop.c \ src/pv/number.c \ +src/pv/proctitle.c \ src/pv/signal.c \ src/pv/state.c \ src/pv/string.c \ @@ -70,6 +71,7 @@ tests/Integrity_-_Large_file_support.test \ tests/Integrity_-_On_output_pipe_close.test \ tests/Integrity_-_When_adjusted_remotely.test \ tests/Memory_safety_-_Basic.test \ +tests/Memory_safety_-_Process_title.test \ tests/Memory_safety_-_Remote_control_receiver.test \ tests/Memory_safety_-_Remote_control_sender.test \ tests/Memory_safety_-_Watchfd.test \ diff --git a/configure.ac b/configure.ac index 603e4cc..f52b770 100644 --- a/configure.ac +++ b/configure.ac @@ -30,6 +30,7 @@ AC_CHECK_FUNCS([fdatasync]) AC_CHECK_FUNCS([fpathconf sysconf posix_memalign posix_fadvise]) AC_CHECK_FUNCS([nanosleep]) AC_CHECK_FUNCS([setitimer]) +AC_CHECK_FUNCS([setproctitle]) AC_CHECK_HEADERS([getopt.h]) AC_CHECK_HEADERS([limits.h]) AC_CHECK_HEADERS([wctype.h]) diff --git a/docs/NEWS.md b/docs/NEWS.md index 8ff6d8f..75a47f2 100644 --- a/docs/NEWS.md +++ b/docs/NEWS.md @@ -1,5 +1,6 @@ ### UNRELEASED + * *feature:* new **--extra-display** option to update window and process titles ([#3](https://codeberg.org/a-j-wood/pv/issues/3), [#4](https://codeberg.org/a-j-wood/pv/issues/4)) * *fix:* correct failure to report file positions in **--watchfd** ([#118](https://codeberg.org/a-j-wood/pv/issues/118)) * *i18n:* Russian translations added * *cleanup:* tests added for **--watchfd** ([#10](https://codeberg.org/a-j-wood/pv/issues/10)) diff --git a/docs/pv.1 b/docs/pv.1 index e8ee7c8..886d104 100644 --- a/docs/pv.1 +++ b/docs/pv.1 @@ -10,6 +10,7 @@ pv \- monitor the progress of data through a pipe .OP \-pteIrab8kTv .OP \-A NUM .OP \-F FORMAT +.OP \-x SPEC .OP \-Wgl0fc .OP \-D SEC .OP \-s SIZE @@ -303,6 +304,19 @@ to determine the output format. See the .B FORMATTING section below. .TP +.BI \-x\ SPEC \fR,\ \fB\-\-extra\-display\ SPEC +As well as displaying progress to the terminal, also write it to \fISPEC\fR. +The \fISPEC\fR must start with a comma-separated list of destinations, and +can optionally be followed by a colon and a format string. +The destinations can be \fBwindowtitle\fR or \fBwindow\fR for the xterm +window title, and \fBprocesstitle\fR, \fBproctitle\fR, \fBprocess\fR, or +\fBproc\fR for the process title displayed by \fBps\fR(1). +If a format string is not supplied, the same format is used as for the +terminal. +For example, \*(lq\fB\-x\~'window,process:%t\~%b\~%r'\fR\*(rq will show the +elapsed time, bytes transferred, and rate, in both the window title and the +process title. +.TP .B \-v, \-\-stats At the end of the transfer, write an additional line showing the transfer rate minimum, maximum, mean, and standard deviation. The values are always diff --git a/docs/pv.1.md b/docs/pv.1.md index 9ab56c4..90708fd 100644 --- a/docs/pv.1.md +++ b/docs/pv.1.md @@ -7,10 +7,11 @@ pv - monitor the progress of data through a pipe **pv** \[*OPTION*\]\... \[*FILE*\]\... **pv** \[ **-pteIrab8kTv** \] \[ **-A** NUM \] \[ **-F** FORMAT \] \[ -**-Wgl0fc** \] \[ **-D** SEC \] \[ **-s** SIZE \] \[ **-i** SEC \] \[ -**-m** SEC \] \[ **-w** WIDTH \] \[ **-H** HEIGHT \] \[ **-N** NAME \] -[ **-o** FILE \] \[ **-L** RATE \] \[ **-B** BYTES \] \[ **-CESYKX** \] -[ **-Z** BYTES \] \[ **-U** FILE \] \[ **-P** FILE \] \[*FILE* . . .\] +**-x** SPEC \] \[ **-Wgl0fc** \] \[ **-D** SEC \] \[ **-s** SIZE \] \[ +**-i** SEC \] \[ **-m** SEC \] \[ **-w** WIDTH \] \[ **-H** HEIGHT \] \[ +**-N** NAME \] \[ **-o** FILE \] \[ **-L** RATE \] \[ **-B** BYTES \] \[ +**-CESYKX** \] \[ **-Z** BYTES \] \[ **-U** FILE \] \[ **-P** FILE \] +[*FILE* . . .\] **pv** **-n** \[ **-trbv** \] \[ **-Wl0** \] \[ **-D** SEC \] \[ **-s** SIZE \] \[ **-i** SEC \] \[ **-o** FILE \] \[ **-L** RATE \] \[ **-B** @@ -177,6 +178,20 @@ display types that are explicitly switched on will be shown. **-T**, and **-A**, and instead use the format string *FORMAT* to determine the output format. See the **FORMATTING** section below. +**-x SPEC, \--extra-display SPEC** + +: As well as displaying progress to the terminal, also write it to + *SPEC*. The *SPEC* must start with a comma-separated list of + destinations, and can optionally be followed by a colon and a format + string. The destinations can be **windowtitle** or **window** for + the xterm window title, and **processtitle**, **proctitle**, + **process**, or **proc** for the process title displayed by + **ps**(1). If a format string is not supplied, the same format is + used as for the terminal. For example, + "**-x \'window,process:%t %b %r\'**" will show the elapsed time, + bytes transferred, and rate, in both the window title and the + process title. + **-v, \--stats** : At the end of the transfer, write an additional line showing the diff --git a/po/cs.po b/po/cs.po index e881aed..4d1fa4b 100644 --- a/po/cs.po +++ b/po/cs.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-01 16:08+0000\n" +"POT-Creation-Date: 2024-12-01 19:09+0000\n" "PO-Revision-Date: 2024-10-13 20:43+0000\n" "Last-Translator: mmatous \n" "Language-Team: Czech \n" @@ -36,7 +36,7 @@ msgstr "ukaž okamžitou rychlost přenosu dat" msgid "show data transfer average rate counter" msgstr "ukaž průměrnou rychlost přenosu dat" -#: src/main/help.c:301 src/main/help.c:335 src/main/help.c:350 +#: src/main/help.c:301 src/main/help.c:338 src/main/help.c:353 msgid "SEC" msgstr "SEK" @@ -76,183 +76,191 @@ msgstr "FORMÁT" msgid "set output format to FORMAT" msgstr "nastav formát výstupu na FORMÁT" +#: src/main/help.c:322 +msgid "SPEC" +msgstr "" + #: src/main/help.c:323 +msgid "also send progress to SPEC" +msgstr "" + +#: src/main/help.c:326 msgid "output transfer statistics at the end" msgstr "po dokončení vypiš údaje o přenosu" -#: src/main/help.c:326 +#: src/main/help.c:329 msgid "output percentages, not visual information" msgstr "vypisuj procenta, ne vizuální informace" -#: src/main/help.c:329 +#: src/main/help.c:332 msgid "do not output any transfer information at all" msgstr "nevypisuj žádné informace o přenosu" -#: src/main/help.c:333 +#: src/main/help.c:336 msgid "display nothing until first byte transferred" msgstr "nic nevypisuj, dokud není přenesen první byte" -#: src/main/help.c:336 +#: src/main/help.c:339 msgid "display nothing until SEC seconds have passed" msgstr "nic nevypisuj, dokud neuplyne SEK sekund" -#: src/main/help.c:338 +#: src/main/help.c:341 msgid "SIZE" msgstr "VEL" -#: src/main/help.c:339 +#: src/main/help.c:342 msgid "set estimated data size to SIZE bytes" msgstr "nastav očekávanou velikost dat na VEL bajtů" -#: src/main/help.c:342 +#: src/main/help.c:345 msgid "if size unknown, show rate vs max rate" msgstr "pokud je velikost neznámá, ukaž rychlost vs maximální rychlost" -#: src/main/help.c:345 +#: src/main/help.c:348 msgid "count lines instead of bytes" msgstr "počítej řádky místo bajtů" -#: src/main/help.c:348 +#: src/main/help.c:351 msgid "lines are null-terminated" msgstr "řádky jsou zakončené nulovým znakem" -#: src/main/help.c:351 +#: src/main/help.c:354 msgid "update every SEC seconds" msgstr "aktualizuj každých SEK sekund" -#: src/main/help.c:353 +#: src/main/help.c:356 msgid "WIDTH" msgstr "ŠÍŘ" -#: src/main/help.c:354 +#: src/main/help.c:357 msgid "assume terminal is WIDTH characters wide" msgstr "předpokládej šířku terminálu ŠÍŘ znaků" -#: src/main/help.c:356 +#: src/main/help.c:359 msgid "HEIGHT" msgstr "VÝŠ" -#: src/main/help.c:357 +#: src/main/help.c:360 msgid "assume terminal is HEIGHT rows high" msgstr "předpokládej výšku terminálu VÝŠ znaků" -#: src/main/help.c:359 +#: src/main/help.c:362 msgid "NAME" msgstr "JMÉNO" -#: src/main/help.c:360 +#: src/main/help.c:363 msgid "prefix visual information with NAME" msgstr "přidej JMÉNO před vizuální informace" -#: src/main/help.c:363 +#: src/main/help.c:366 msgid "output even if standard error is not a terminal" msgstr "vypisuj výstup i pokud standardní chybový výstup není terminál" -#: src/main/help.c:366 +#: src/main/help.c:369 msgid "use cursor positioning escape sequences" msgstr "pozicuj kurzor pomocí řídících znaků" -#: src/main/help.c:369 src/main/help.c:399 src/main/help.c:408 -#: src/main/help.c:423 +#: src/main/help.c:372 src/main/help.c:402 src/main/help.c:411 +#: src/main/help.c:426 msgid "FILE" msgstr "SOUBOR" -#: src/main/help.c:370 +#: src/main/help.c:373 msgid "write output to FILE instead of stdout" msgstr "zapiš výstup do SOUBORu namísto standardního výstupu" -#: src/main/help.c:372 +#: src/main/help.c:375 msgid "RATE" msgstr "RYCH" -#: src/main/help.c:373 +#: src/main/help.c:376 msgid "limit transfer to RATE bytes per second" msgstr "omez přenosovou rychlost na RYCH bajtů za sekundu" -#: src/main/help.c:375 src/main/help.c:384 +#: src/main/help.c:378 src/main/help.c:387 msgid "BYTES" msgstr "BAJT" -#: src/main/help.c:376 +#: src/main/help.c:379 msgid "use a buffer size of BYTES" msgstr "použij vyrovnávací pamět BAJT bajtů" -#: src/main/help.c:379 +#: src/main/help.c:382 msgid "never use splice(), always use read/write" msgstr "nepoužívej splice(), vždy použij read/write" -#: src/main/help.c:382 +#: src/main/help.c:385 msgid "skip read errors in input" msgstr "ignoruj chyby při čtení vstupu" -#: src/main/help.c:385 +#: src/main/help.c:388 msgid "skip errors in BYTES blocks at a time" msgstr "přeskakuj chyby v blocích BAJTů naráz" -#: src/main/help.c:388 +#: src/main/help.c:391 msgid "stop after --size bytes have been transferred" msgstr "zastav po přenosu --size bajtů" -#: src/main/help.c:391 +#: src/main/help.c:394 msgid "flush cache to disk after every write" msgstr "po každém zápisu vyprázdni cache na disk" -#: src/main/help.c:394 +#: src/main/help.c:397 msgid "use direct I/O to bypass cache" msgstr "použij přímý V/V k obejítí cache" -#: src/main/help.c:397 +#: src/main/help.c:400 msgid "discard input instead of writing to output" msgstr "zahoď vstup namísto zápisu na výstup" -#: src/main/help.c:400 +#: src/main/help.c:403 msgid "write all input to FILE before writing to output" msgstr "zapiš veškerý vstup do SOUBORu před výpisem na výstup" -#: src/main/help.c:403 +#: src/main/help.c:406 msgid "PID" msgstr "PID" -#: src/main/help.c:404 +#: src/main/help.c:407 msgid "update settings of process PID" msgstr "aktualizuj nastavení procesu PID" -#: src/main/help.c:409 +#: src/main/help.c:412 msgid "save process ID in FILE" msgstr "ulož id procesu do SOUBORu" -#: src/main/help.c:412 +#: src/main/help.c:415 msgid "PID[:FD]" msgstr "PID[:DS]" -#: src/main/help.c:413 +#: src/main/help.c:416 msgid "watch file FD opened by process PID" msgstr "sleduj soubor DS otevřený procesem PID" -#: src/main/help.c:417 +#: src/main/help.c:420 msgid "show this help and exit" msgstr "ukaž pomoc a skonči" -#: src/main/help.c:420 +#: src/main/help.c:423 msgid "show version information and exit" msgstr "ukaž informace o verzi a skonči" -#: src/main/help.c:424 +#: src/main/help.c:427 msgid "write debug logs to FILE" msgstr "zapiš ladící záznamy do SOUBORu" -#: src/main/help.c:449 +#: src/main/help.c:452 #, c-format msgid "Usage: %s [OPTION] [FILE]..." msgstr "Použití: %s [VOLBY] [SOUBOR]..." -#: src/main/help.c:460 +#: src/main/help.c:463 msgid "" "Concatenate FILE(s), or standard input, to standard output, with monitoring." msgstr "" "Spoj SOUBOR(y) nebo standardní vstup na standardního výstup, s monitoringem." -#: src/main/help.c:597 +#: src/main/help.c:600 #, c-format msgid "Please report any bugs to: %s" msgstr "Prosím, hlašte veškeré chyby na: %s" @@ -261,69 +269,69 @@ msgstr "Prosím, hlašte veškeré chyby na: %s" msgid "(input)" msgstr "(vstup)" -#: src/main/main.c:315 +#: src/main/main.c:319 msgid "state allocation failed" msgstr "selhala alokace stavu" -#: src/main/options.c:142 src/pv/file.c:324 +#: src/main/options.c:144 src/pv/file.c:324 msgid "failed to stat file" msgstr "nebylo možné zjistit informace o souboru" -#: src/main/options.c:156 +#: src/main/options.c:158 msgid "is a directory" msgstr "je adresář" -#: src/main/options.c:185 +#: src/main/options.c:187 msgid "failed to generate sysfs filename" msgstr "selhalo vytváření jména pro soubor v sysfs" -#: src/main/options.c:207 +#: src/main/options.c:209 msgid "failed to read sysfs size file" msgstr "selhalo čtení velikosti souboru v sysfs" -#: src/main/options.c:227 +#: src/main/options.c:229 msgid "failed to open block device" msgstr "selhalo otevření blokového zařízení" -#: src/main/options.c:237 +#: src/main/options.c:239 msgid "failed to determine size of block device" msgstr "selhalo zjištění velikosti blokového zařízení" -#: src/main/options.c:341 +#: src/main/options.c:344 msgid "option structure allocation failed" msgstr "selhala alokace struktury pro volby" -#: src/main/options.c:360 +#: src/main/options.c:363 msgid "option structure argv allocation failed" msgstr "selhala alokace struktury pro argv" -#: src/main/options.c:422 +#: src/main/options.c:425 msgid "integer argument expected" msgstr "očekáván celočíselný argument" -#: src/main/options.c:433 +#: src/main/options.c:436 msgid "numeric argument expected" msgstr "očekáván číselný argument" -#: src/main/options.c:444 +#: src/main/options.c:447 msgid "process ID or pid:fd pair expected" msgstr "očekáváno ID procesu nebo dvojice PID:DS" -#: src/main/options.c:451 +#: src/main/options.c:454 msgid "invalid process ID" msgstr "neplatné ID procesu" -#: src/main/options.c:668 +#: src/main/options.c:679 #, c-format msgid "Try `%s --help' for more information." msgstr "Zkuste `%s --help' pro více informací." -#: src/main/options.c:670 +#: src/main/options.c:681 #, c-format msgid "Try `%s -h' for more information." msgstr "Zkuste `%s --h' pro více informací." -#: src/main/options.c:701 +#: src/main/options.c:712 msgid "" "cannot use line mode or transfer modifier options when watching file " "descriptors" @@ -331,19 +339,19 @@ msgstr "" "při sledování deskriptorů souborů nelze použít řádkový mód nebo volby pro " "modifikaci přenosu" -#: src/main/options.c:710 +#: src/main/options.c:721 msgid "cannot use cursor positioning when watching file descriptors" msgstr "při sledování deskriptorů souborů nelze pozicování kurzoru použít" -#: src/main/options.c:719 +#: src/main/options.c:730 msgid "cannot use remote control when watching file descriptors" msgstr "při sledování deskriptorů souborů nelze použít vzdálené ovládání" -#: src/main/options.c:728 +#: src/main/options.c:739 msgid "cannot transfer files when watching file descriptors" msgstr "při sledování deskriptorů souborů nelze použít přenos souborů" -#: src/main/options.c:743 +#: src/main/options.c:754 msgid "not available on systems without /proc/self/fdinfo" msgstr "není dostupné na systémech bez /proc/self/fdinfo" @@ -395,37 +403,37 @@ msgstr "yzafpnum kMGTPEZY" msgid "yzafpnum KMGTPEZY" msgstr "yzafpnum KMGTPEZY" -#: src/pv/display.c:678 src/pv/transfer.c:1011 +#: src/pv/display.c:681 src/pv/transfer.c:1011 msgid "buffer allocation failed" msgstr "selhala alokace vyrovnávací paměti" -#: src/pv/display.c:807 +#: src/pv/display.c:810 msgid "b" msgstr "b" -#: src/pv/display.c:810 src/pv/transfer.c:602 +#: src/pv/display.c:813 src/pv/transfer.c:602 msgid "B" msgstr "B" -#: src/pv/display.c:854 src/pv/display.c:869 src/pv/display.c:1088 +#: src/pv/display.c:857 src/pv/display.c:872 src/pv/display.c:1091 #: src/pv/loop.c:549 msgid "b/s" msgstr "b/s" -#: src/pv/display.c:858 src/pv/display.c:873 src/pv/display.c:1092 +#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 msgid "/s" msgstr "/s" -#: src/pv/display.c:858 src/pv/display.c:873 src/pv/display.c:1092 +#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 #: src/pv/loop.c:549 msgid "B/s" msgstr "B/s" -#: src/pv/display.c:901 src/pv/display.c:905 +#: src/pv/display.c:904 src/pv/display.c:908 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:971 +#: src/pv/display.c:974 msgid "FIN" msgstr "FIN" @@ -477,7 +485,7 @@ msgstr "pid" msgid "history structure allocation failed" msgstr "selhala alokace struktury historie" -#: src/pv/state.c:509 src/pv/state.c:520 +#: src/pv/state.c:572 src/pv/state.c:583 msgid "file list allocation failed" msgstr "selhala alokace seznamu souborů" diff --git a/po/de.po b/po/de.po index 302fbbc..7d3306d 100644 --- a/po/de.po +++ b/po/de.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-01 16:08+0000\n" +"POT-Creation-Date: 2024-12-01 19:09+0000\n" "PO-Revision-Date: 2024-10-13 20:43+0000\n" "Last-Translator: fnetX \n" "Language-Team: German \n" @@ -50,7 +50,7 @@ msgstr "zeige die Datentransferrate an" msgid "show data transfer average rate counter" msgstr "zeige die durchschnittliche Übertragungsrate" -#: src/main/help.c:301 src/main/help.c:335 src/main/help.c:350 +#: src/main/help.c:301 src/main/help.c:338 src/main/help.c:353 msgid "SEC" msgstr "SEK" @@ -92,185 +92,193 @@ msgstr "FORMAT" msgid "set output format to FORMAT" msgstr "setze das Ausgabeformat auf FORMAT" +#: src/main/help.c:322 +msgid "SPEC" +msgstr "" + #: src/main/help.c:323 +msgid "also send progress to SPEC" +msgstr "" + +#: src/main/help.c:326 msgid "output transfer statistics at the end" msgstr "Übertragungsstatistiken am Ende ausgeben" -#: src/main/help.c:326 +#: src/main/help.c:329 msgid "output percentages, not visual information" msgstr "Ausgabe von Prozent-Angaben statt visueller Darstellung" -#: src/main/help.c:329 +#: src/main/help.c:332 msgid "do not output any transfer information at all" msgstr "sämtliche Transferinformationen unterdrücken" -#: src/main/help.c:333 +#: src/main/help.c:336 msgid "display nothing until first byte transferred" msgstr "keine Ausgabe bevor das erste Byte übertragen wurde" -#: src/main/help.c:336 +#: src/main/help.c:339 msgid "display nothing until SEC seconds have passed" msgstr "nichts anzeigen ehe SEK Sekunden vergangen sind" -#: src/main/help.c:338 +#: src/main/help.c:341 msgid "SIZE" msgstr "GRÖẞE" -#: src/main/help.c:339 +#: src/main/help.c:342 msgid "set estimated data size to SIZE bytes" msgstr "setze erwartete Datenlänge auf SIZE Byte" -#: src/main/help.c:342 +#: src/main/help.c:345 msgid "if size unknown, show rate vs max rate" msgstr "zeige Rate vs maximale Rate, falls die größe unbekannt ist" -#: src/main/help.c:345 +#: src/main/help.c:348 msgid "count lines instead of bytes" msgstr "zähle Zeilen anstelle von Bytes" -#: src/main/help.c:348 +#: src/main/help.c:351 msgid "lines are null-terminated" msgstr "Zeilen sind nullterminiert" -#: src/main/help.c:351 +#: src/main/help.c:354 msgid "update every SEC seconds" msgstr "aktualisiere Ausgabe nach SEK Sekunden Intervall" -#: src/main/help.c:353 +#: src/main/help.c:356 msgid "WIDTH" msgstr "BREITE" -#: src/main/help.c:354 +#: src/main/help.c:357 msgid "assume terminal is WIDTH characters wide" msgstr "setze Terminal-Breite auf BREITE Zeichen" -#: src/main/help.c:356 +#: src/main/help.c:359 msgid "HEIGHT" msgstr "HÖHE" -#: src/main/help.c:357 +#: src/main/help.c:360 msgid "assume terminal is HEIGHT rows high" msgstr "setze Terminal-Höhe auf HÖHE Zeichen" -#: src/main/help.c:359 +#: src/main/help.c:362 msgid "NAME" msgstr "NAME" -#: src/main/help.c:360 +#: src/main/help.c:363 msgid "prefix visual information with NAME" msgstr "setze den NAMEn für visuelle Darstellung" -#: src/main/help.c:363 +#: src/main/help.c:366 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:366 +#: src/main/help.c:369 msgid "use cursor positioning escape sequences" msgstr "benutze Escape-Sequenzen zur Cursor-Positionierung" -#: src/main/help.c:369 src/main/help.c:399 src/main/help.c:408 -#: src/main/help.c:423 +#: src/main/help.c:372 src/main/help.c:402 src/main/help.c:411 +#: src/main/help.c:426 msgid "FILE" msgstr "DATEI" -#: src/main/help.c:370 +#: src/main/help.c:373 msgid "write output to FILE instead of stdout" msgstr "schreibe die Ausgabe in DATEI statt in die Standardausgabe" -#: src/main/help.c:372 +#: src/main/help.c:375 msgid "RATE" msgstr "RATE" -#: src/main/help.c:373 +#: src/main/help.c:376 msgid "limit transfer to RATE bytes per second" msgstr "beschränke die Transferrate auf RATE Byte pro Sekunde" -#: src/main/help.c:375 src/main/help.c:384 +#: src/main/help.c:378 src/main/help.c:387 msgid "BYTES" msgstr "BYTES" -#: src/main/help.c:376 +#: src/main/help.c:379 msgid "use a buffer size of BYTES" msgstr "benutze einen Puffer in der Größe von BYTES" -#: src/main/help.c:379 +#: src/main/help.c:382 msgid "never use splice(), always use read/write" msgstr "anstelle von splice() immer read/write benutzen" -#: src/main/help.c:382 +#: src/main/help.c:385 msgid "skip read errors in input" msgstr "Lesefehler in der Eingabe nicht beachten" -#: src/main/help.c:385 +#: src/main/help.c:388 msgid "skip errors in BYTES blocks at a time" msgstr "bei Fehlern BYTES am Stück überspringen" -#: src/main/help.c:388 +#: src/main/help.c:391 msgid "stop after --size bytes have been transferred" msgstr "anhalten, nachdem --size Bytes übertragen wurden" -#: src/main/help.c:391 +#: src/main/help.c:394 msgid "flush cache to disk after every write" msgstr "schreibe den Cache nach jedem Schreibvorgang auf die Festplatte" -#: src/main/help.c:394 +#: src/main/help.c:397 msgid "use direct I/O to bypass cache" msgstr "verwende direkte E/A, um den Cache zu umgehen" -#: src/main/help.c:397 +#: src/main/help.c:400 msgid "discard input instead of writing to output" msgstr "verwirf die Eingabe anstatt in die Ausgabe zu schreiben" -#: src/main/help.c:400 +#: src/main/help.c:403 msgid "write all input to FILE before writing to output" msgstr "Ausgabe nach FILE schrieben bevor sie ausgegeben wird" -#: src/main/help.c:403 +#: src/main/help.c:406 msgid "PID" msgstr "PID" -#: src/main/help.c:404 +#: src/main/help.c:407 msgid "update settings of process PID" msgstr "Einstellungen der Prozess-PID updaten" -#: src/main/help.c:409 +#: src/main/help.c:412 msgid "save process ID in FILE" msgstr "Prozess-ID in DATEI speichern" -#: src/main/help.c:412 +#: src/main/help.c:415 msgid "PID[:FD]" msgstr "PID[:FD]" -#: src/main/help.c:413 +#: src/main/help.c:416 msgid "watch file FD opened by process PID" msgstr "die vom Prozess PID geöffnete Datei FD beobachten" -#: src/main/help.c:417 +#: src/main/help.c:420 msgid "show this help and exit" msgstr "zeige diese Hilfe und beende" -#: src/main/help.c:420 +#: src/main/help.c:423 msgid "show version information and exit" msgstr "zeige Versionsinformationen und beende" -#: src/main/help.c:424 +#: src/main/help.c:427 msgid "write debug logs to FILE" msgstr "schreibe Debug-Protokolle in DATEI" -#: src/main/help.c:449 +#: src/main/help.c:452 #, c-format msgid "Usage: %s [OPTION] [FILE]..." msgstr "Aufruf: %s [OPTION] [DATEI]..." -#: src/main/help.c:460 +#: src/main/help.c:463 msgid "" "Concatenate FILE(s), or standard input, to standard output, with monitoring." msgstr "" "Verbindet DATEI(en) oder den Standard-Eingabe-Kanal mit dem Standard-Ausgabe-" "Kanal und misst den Datenstrom." -#: src/main/help.c:597 +#: src/main/help.c:600 #, c-format msgid "Please report any bugs to: %s" msgstr "Bitte senden Sie Fehlerberichte an %s" @@ -279,69 +287,69 @@ msgstr "Bitte senden Sie Fehlerberichte an %s" msgid "(input)" msgstr "(eingabe)" -#: src/main/main.c:315 +#: src/main/main.c:319 msgid "state allocation failed" msgstr "Speicherzuweisung für `state' fehlgeschlagen" -#: src/main/options.c:142 src/pv/file.c:324 +#: src/main/options.c:144 src/pv/file.c:324 msgid "failed to stat file" msgstr "konnte Dateiinformationen nicht lesen" -#: src/main/options.c:156 +#: src/main/options.c:158 msgid "is a directory" msgstr "ist ein Verzeichnis" -#: src/main/options.c:185 +#: src/main/options.c:187 msgid "failed to generate sysfs filename" msgstr "konnte Sysfs-Dateinamen nicht erzeugen" -#: src/main/options.c:207 +#: src/main/options.c:209 msgid "failed to read sysfs size file" msgstr "konnte Größe der Sysfs-Datei nicht lesen" -#: src/main/options.c:227 +#: src/main/options.c:229 msgid "failed to open block device" msgstr "konnte Blockgerät nicht öffnen" -#: src/main/options.c:237 +#: src/main/options.c:239 msgid "failed to determine size of block device" msgstr "konnte Größe des Blockgeräts nicht ermitteln" -#: src/main/options.c:341 +#: src/main/options.c:344 msgid "option structure allocation failed" msgstr "Speicherzuweisung für `option' fehlgeschlagen" -#: src/main/options.c:360 +#: src/main/options.c:363 msgid "option structure argv allocation failed" msgstr "Speicherzuweisung für `argv' der Option fehlgeschlagen" -#: src/main/options.c:422 +#: src/main/options.c:425 msgid "integer argument expected" msgstr "Ganzzahliges Argument erwartet" -#: src/main/options.c:433 +#: src/main/options.c:436 msgid "numeric argument expected" msgstr "numerisches Argument erwartet" -#: src/main/options.c:444 +#: src/main/options.c:447 msgid "process ID or pid:fd pair expected" msgstr "Prozess-ID oder PID:FD-Paar erwartet" -#: src/main/options.c:451 +#: src/main/options.c:454 msgid "invalid process ID" msgstr "ungültige Prozess-ID" -#: src/main/options.c:668 +#: src/main/options.c:679 #, c-format msgid "Try `%s --help' for more information." msgstr "`%s --help' zeigt weitere Informationen an." -#: src/main/options.c:670 +#: src/main/options.c:681 #, c-format msgid "Try `%s -h' for more information." msgstr "`%s -h' zeigt weitere Informationen an." -#: src/main/options.c:701 +#: src/main/options.c:712 msgid "" "cannot use line mode or transfer modifier options when watching file " "descriptors" @@ -349,24 +357,24 @@ msgstr "" "Beim Beobachten von Dateideskriptoren können keine Optionen für den " "Zeilenmodus oder den Übertragungsmodifikator verwendet werden" -#: src/main/options.c:710 +#: src/main/options.c:721 msgid "cannot use cursor positioning when watching file descriptors" msgstr "" "Beim Beobachten von Dateideskriptoren kann Cursor-Positionierung nicht " "verwendet werden" -#: src/main/options.c:719 +#: src/main/options.c:730 msgid "cannot use remote control when watching file descriptors" msgstr "" "Beim Beobachten von Dateideskriptoren kann die Fernbedienung nicht verwenden " "werden" -#: src/main/options.c:728 +#: src/main/options.c:739 msgid "cannot transfer files when watching file descriptors" msgstr "" "Beim Beobachten von Dateideskriptoren können Dateien nicht übertragen werden" -#: src/main/options.c:743 +#: src/main/options.c:754 msgid "not available on systems without /proc/self/fdinfo" msgstr "Nicht verfügbar auf Systemen ohne /proc/self/fdinfo" @@ -418,37 +426,37 @@ msgstr "yzafpnµm kMGTPEZY" msgid "yzafpnum KMGTPEZY" msgstr "yzafpnµm KMGTPEZY" -#: src/pv/display.c:678 src/pv/transfer.c:1011 +#: src/pv/display.c:681 src/pv/transfer.c:1011 msgid "buffer allocation failed" msgstr "Speicherzuweisung für den Puffer fehlgeschlagen" -#: src/pv/display.c:807 +#: src/pv/display.c:810 msgid "b" msgstr "b" -#: src/pv/display.c:810 src/pv/transfer.c:602 +#: src/pv/display.c:813 src/pv/transfer.c:602 msgid "B" msgstr "B" -#: src/pv/display.c:854 src/pv/display.c:869 src/pv/display.c:1088 +#: src/pv/display.c:857 src/pv/display.c:872 src/pv/display.c:1091 #: src/pv/loop.c:549 msgid "b/s" msgstr "b/s" -#: src/pv/display.c:858 src/pv/display.c:873 src/pv/display.c:1092 +#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 msgid "/s" msgstr "/s" -#: src/pv/display.c:858 src/pv/display.c:873 src/pv/display.c:1092 +#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 #: src/pv/loop.c:549 msgid "B/s" msgstr "B/s" -#: src/pv/display.c:901 src/pv/display.c:905 +#: src/pv/display.c:904 src/pv/display.c:908 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:971 +#: src/pv/display.c:974 msgid "FIN" msgstr "Endzeit" @@ -501,7 +509,7 @@ msgstr "pid" msgid "history structure allocation failed" msgstr "Speicherzuweisung für `history' fehlgeschlagen" -#: src/pv/state.c:509 src/pv/state.c:520 +#: src/pv/state.c:572 src/pv/state.c:583 msgid "file list allocation failed" msgstr "Speicherzuweisung für die Dateiliste fehlgeschlagen" diff --git a/po/es.po b/po/es.po index f618872..4c4f398 100644 --- a/po/es.po +++ b/po/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-01 16:08+0000\n" +"POT-Creation-Date: 2024-12-01 19:09+0000\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -31,7 +31,7 @@ msgstr "" msgid "show data transfer average rate counter" msgstr "" -#: src/main/help.c:301 src/main/help.c:335 src/main/help.c:350 +#: src/main/help.c:301 src/main/help.c:338 src/main/help.c:353 msgid "SEC" msgstr "" @@ -71,182 +71,190 @@ msgstr "" msgid "set output format to FORMAT" msgstr "" +#: src/main/help.c:322 +msgid "SPEC" +msgstr "" + #: src/main/help.c:323 -msgid "output transfer statistics at the end" +msgid "also send progress to SPEC" msgstr "" #: src/main/help.c:326 -msgid "output percentages, not visual information" +msgid "output transfer statistics at the end" msgstr "" #: src/main/help.c:329 +msgid "output percentages, not visual information" +msgstr "" + +#: src/main/help.c:332 msgid "do not output any transfer information at all" msgstr "" -#: src/main/help.c:333 +#: src/main/help.c:336 msgid "display nothing until first byte transferred" msgstr "" -#: src/main/help.c:336 +#: src/main/help.c:339 msgid "display nothing until SEC seconds have passed" msgstr "" -#: src/main/help.c:338 +#: src/main/help.c:341 msgid "SIZE" msgstr "" -#: src/main/help.c:339 +#: src/main/help.c:342 msgid "set estimated data size to SIZE bytes" msgstr "" -#: src/main/help.c:342 +#: src/main/help.c:345 msgid "if size unknown, show rate vs max rate" msgstr "" -#: src/main/help.c:345 +#: src/main/help.c:348 msgid "count lines instead of bytes" msgstr "" -#: src/main/help.c:348 +#: src/main/help.c:351 msgid "lines are null-terminated" msgstr "" -#: src/main/help.c:351 +#: src/main/help.c:354 msgid "update every SEC seconds" msgstr "" -#: src/main/help.c:353 +#: src/main/help.c:356 msgid "WIDTH" msgstr "" -#: src/main/help.c:354 +#: src/main/help.c:357 msgid "assume terminal is WIDTH characters wide" msgstr "" -#: src/main/help.c:356 +#: src/main/help.c:359 msgid "HEIGHT" msgstr "" -#: src/main/help.c:357 +#: src/main/help.c:360 msgid "assume terminal is HEIGHT rows high" msgstr "" -#: src/main/help.c:359 +#: src/main/help.c:362 msgid "NAME" msgstr "" -#: src/main/help.c:360 +#: src/main/help.c:363 msgid "prefix visual information with NAME" msgstr "" -#: src/main/help.c:363 +#: src/main/help.c:366 msgid "output even if standard error is not a terminal" msgstr "" -#: src/main/help.c:366 +#: src/main/help.c:369 msgid "use cursor positioning escape sequences" msgstr "" -#: src/main/help.c:369 src/main/help.c:399 src/main/help.c:408 -#: src/main/help.c:423 +#: src/main/help.c:372 src/main/help.c:402 src/main/help.c:411 +#: src/main/help.c:426 msgid "FILE" msgstr "" -#: src/main/help.c:370 +#: src/main/help.c:373 msgid "write output to FILE instead of stdout" msgstr "" -#: src/main/help.c:372 +#: src/main/help.c:375 msgid "RATE" msgstr "" -#: src/main/help.c:373 +#: src/main/help.c:376 msgid "limit transfer to RATE bytes per second" msgstr "" -#: src/main/help.c:375 src/main/help.c:384 +#: src/main/help.c:378 src/main/help.c:387 msgid "BYTES" msgstr "" -#: src/main/help.c:376 +#: src/main/help.c:379 msgid "use a buffer size of BYTES" msgstr "" -#: src/main/help.c:379 +#: src/main/help.c:382 msgid "never use splice(), always use read/write" msgstr "" -#: src/main/help.c:382 +#: src/main/help.c:385 msgid "skip read errors in input" msgstr "" -#: src/main/help.c:385 +#: src/main/help.c:388 msgid "skip errors in BYTES blocks at a time" msgstr "" -#: src/main/help.c:388 +#: src/main/help.c:391 msgid "stop after --size bytes have been transferred" msgstr "" -#: src/main/help.c:391 +#: src/main/help.c:394 msgid "flush cache to disk after every write" msgstr "" -#: src/main/help.c:394 +#: src/main/help.c:397 msgid "use direct I/O to bypass cache" msgstr "" -#: src/main/help.c:397 +#: src/main/help.c:400 msgid "discard input instead of writing to output" msgstr "" -#: src/main/help.c:400 +#: src/main/help.c:403 msgid "write all input to FILE before writing to output" msgstr "" -#: src/main/help.c:403 +#: src/main/help.c:406 msgid "PID" msgstr "" -#: src/main/help.c:404 +#: src/main/help.c:407 msgid "update settings of process PID" msgstr "" -#: src/main/help.c:409 +#: src/main/help.c:412 msgid "save process ID in FILE" msgstr "" -#: src/main/help.c:412 +#: src/main/help.c:415 msgid "PID[:FD]" msgstr "" -#: src/main/help.c:413 +#: src/main/help.c:416 msgid "watch file FD opened by process PID" msgstr "" -#: src/main/help.c:417 +#: src/main/help.c:420 msgid "show this help and exit" msgstr "" -#: src/main/help.c:420 +#: src/main/help.c:423 msgid "show version information and exit" msgstr "" -#: src/main/help.c:424 +#: src/main/help.c:427 msgid "write debug logs to FILE" msgstr "" -#: src/main/help.c:449 +#: src/main/help.c:452 #, c-format msgid "Usage: %s [OPTION] [FILE]..." msgstr "" -#: src/main/help.c:460 +#: src/main/help.c:463 msgid "" "Concatenate FILE(s), or standard input, to standard output, with monitoring." msgstr "" -#: src/main/help.c:597 +#: src/main/help.c:600 #, c-format msgid "Please report any bugs to: %s" msgstr "" @@ -255,87 +263,87 @@ msgstr "" msgid "(input)" msgstr "" -#: src/main/main.c:315 +#: src/main/main.c:319 msgid "state allocation failed" msgstr "" -#: src/main/options.c:142 src/pv/file.c:324 +#: src/main/options.c:144 src/pv/file.c:324 msgid "failed to stat file" msgstr "" -#: src/main/options.c:156 +#: src/main/options.c:158 msgid "is a directory" msgstr "" -#: src/main/options.c:185 +#: src/main/options.c:187 msgid "failed to generate sysfs filename" msgstr "" -#: src/main/options.c:207 +#: src/main/options.c:209 msgid "failed to read sysfs size file" msgstr "" -#: src/main/options.c:227 +#: src/main/options.c:229 msgid "failed to open block device" msgstr "" -#: src/main/options.c:237 +#: src/main/options.c:239 msgid "failed to determine size of block device" msgstr "" -#: src/main/options.c:341 +#: src/main/options.c:344 msgid "option structure allocation failed" msgstr "" -#: src/main/options.c:360 +#: src/main/options.c:363 msgid "option structure argv allocation failed" msgstr "" -#: src/main/options.c:422 +#: src/main/options.c:425 msgid "integer argument expected" msgstr "" -#: src/main/options.c:433 +#: src/main/options.c:436 msgid "numeric argument expected" msgstr "" -#: src/main/options.c:444 +#: src/main/options.c:447 msgid "process ID or pid:fd pair expected" msgstr "" -#: src/main/options.c:451 +#: src/main/options.c:454 msgid "invalid process ID" msgstr "" -#: src/main/options.c:668 +#: src/main/options.c:679 #, c-format msgid "Try `%s --help' for more information." msgstr "" -#: src/main/options.c:670 +#: src/main/options.c:681 #, c-format msgid "Try `%s -h' for more information." msgstr "" -#: src/main/options.c:701 +#: src/main/options.c:712 msgid "" "cannot use line mode or transfer modifier options when watching file " "descriptors" msgstr "" -#: src/main/options.c:710 +#: src/main/options.c:721 msgid "cannot use cursor positioning when watching file descriptors" msgstr "" -#: src/main/options.c:719 +#: src/main/options.c:730 msgid "cannot use remote control when watching file descriptors" msgstr "" -#: src/main/options.c:728 +#: src/main/options.c:739 msgid "cannot transfer files when watching file descriptors" msgstr "" -#: src/main/options.c:743 +#: src/main/options.c:754 msgid "not available on systems without /proc/self/fdinfo" msgstr "" @@ -387,37 +395,37 @@ msgstr "" msgid "yzafpnum KMGTPEZY" msgstr "" -#: src/pv/display.c:678 src/pv/transfer.c:1011 +#: src/pv/display.c:681 src/pv/transfer.c:1011 msgid "buffer allocation failed" msgstr "" -#: src/pv/display.c:807 +#: src/pv/display.c:810 msgid "b" msgstr "" -#: src/pv/display.c:810 src/pv/transfer.c:602 +#: src/pv/display.c:813 src/pv/transfer.c:602 msgid "B" msgstr "" -#: src/pv/display.c:854 src/pv/display.c:869 src/pv/display.c:1088 +#: src/pv/display.c:857 src/pv/display.c:872 src/pv/display.c:1091 #: src/pv/loop.c:549 msgid "b/s" msgstr "" -#: src/pv/display.c:858 src/pv/display.c:873 src/pv/display.c:1092 +#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 msgid "/s" msgstr "" -#: src/pv/display.c:858 src/pv/display.c:873 src/pv/display.c:1092 +#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 #: src/pv/loop.c:549 msgid "B/s" msgstr "" -#: src/pv/display.c:901 src/pv/display.c:905 +#: src/pv/display.c:904 src/pv/display.c:908 msgid "ETA" msgstr "" -#: src/pv/display.c:971 +#: src/pv/display.c:974 msgid "FIN" msgstr "" @@ -469,7 +477,7 @@ msgstr "" msgid "history structure allocation failed" msgstr "" -#: src/pv/state.c:509 src/pv/state.c:520 +#: src/pv/state.c:572 src/pv/state.c:583 msgid "file list allocation failed" msgstr "" diff --git a/po/fr.po b/po/fr.po index 2bfae53..ebd2e6f 100644 --- a/po/fr.po +++ b/po/fr.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-01 16:08+0000\n" +"POT-Creation-Date: 2024-12-01 19:09+0000\n" "PO-Revision-Date: 2024-10-12 11:13+0000\n" "Last-Translator: a-j-wood \n" "Language-Team: French \n" @@ -50,7 +50,7 @@ msgstr "afficher 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:301 src/main/help.c:335 src/main/help.c:350 +#: src/main/help.c:301 src/main/help.c:338 src/main/help.c:353 msgid "SEC" msgstr "SEC" @@ -91,187 +91,195 @@ msgstr "FORMAT" msgid "set output format to FORMAT" msgstr "définir le format de sortie sur FORMAT" +#: src/main/help.c:322 +msgid "SPEC" +msgstr "" + #: src/main/help.c:323 +msgid "also send progress to SPEC" +msgstr "" + +#: src/main/help.c:326 msgid "output transfer statistics at the end" msgstr "afficher les statistiques de transfert à la fin" -#: src/main/help.c:326 +#: src/main/help.c:329 msgid "output percentages, not visual information" msgstr "imprimer en pourcentage plutôt que des informations visuelles" -#: src/main/help.c:329 +#: src/main/help.c:332 msgid "do not output any transfer information at all" msgstr "n'afficher aucune information de transfert" -#: src/main/help.c:333 +#: src/main/help.c:336 msgid "display nothing until first byte transferred" msgstr "ne rien afficher avant qu'au moins un octet soit tranféré" -#: src/main/help.c:336 +#: src/main/help.c:339 msgid "display nothing until SEC seconds have passed" msgstr "ne rien afficher jusqu'à ce que SEC secondes se soient écoulées" -#: src/main/help.c:338 +#: src/main/help.c:341 msgid "SIZE" msgstr "TAILLE" -#: src/main/help.c:339 +#: src/main/help.c:342 msgid "set estimated data size to SIZE bytes" msgstr "ajuster la taille estimée des données à TAILLE octets" -#: src/main/help.c:342 +#: src/main/help.c:345 msgid "if size unknown, show rate vs max rate" msgstr "" "si la taille est inconnue, afficher le taux de transfert par rapport au taux " "de transfert max" -#: src/main/help.c:345 +#: src/main/help.c:348 msgid "count lines instead of bytes" msgstr "compter les lignes au lieu des octets" -#: src/main/help.c:348 +#: src/main/help.c:351 msgid "lines are null-terminated" msgstr "les lignes sont terminées par un caractère nul" -#: src/main/help.c:351 +#: src/main/help.c:354 msgid "update every SEC seconds" msgstr "mettre à jour toutes les SEC secondes" -#: src/main/help.c:353 +#: src/main/help.c:356 msgid "WIDTH" msgstr "LARGEUR" -#: src/main/help.c:354 +#: src/main/help.c:357 msgid "assume terminal is WIDTH characters wide" msgstr "présumer la largeur du terminal à LARGEUR caractères" -#: src/main/help.c:356 +#: src/main/help.c:359 msgid "HEIGHT" msgstr "HAUTEUR" -#: src/main/help.c:357 +#: src/main/help.c:360 msgid "assume terminal is HEIGHT rows high" msgstr "présumer la hauteur du terminal à HAUTEUR lignes" -#: src/main/help.c:359 +#: src/main/help.c:362 msgid "NAME" msgstr "NOM" -#: src/main/help.c:360 +#: src/main/help.c:363 msgid "prefix visual information with NAME" msgstr "préfixer les informations visuelles avec NOM" -#: src/main/help.c:363 +#: src/main/help.c:366 msgid "output even if standard error is not a terminal" msgstr "" "imprimer vers la sortie d'erreur standard même si ce n'est pas un terminal" -#: src/main/help.c:366 +#: src/main/help.c:369 msgid "use cursor positioning escape sequences" msgstr "utiliser les séquences d'échappements de positionnement de curseur" -#: src/main/help.c:369 src/main/help.c:399 src/main/help.c:408 -#: src/main/help.c:423 +#: src/main/help.c:372 src/main/help.c:402 src/main/help.c:411 +#: src/main/help.c:426 msgid "FILE" msgstr "FICHIER" -#: src/main/help.c:370 +#: src/main/help.c:373 msgid "write output to FILE instead of stdout" msgstr "écrire la sortie dans FICHIER au lieu de la sortie standard" -#: src/main/help.c:372 +#: src/main/help.c:375 msgid "RATE" msgstr "TAUX" -#: src/main/help.c:373 +#: src/main/help.c:376 msgid "limit transfer to RATE bytes per second" msgstr "limite le taux de transfert à TAUX octets par seconde" -#: src/main/help.c:375 src/main/help.c:384 +#: src/main/help.c:378 src/main/help.c:387 msgid "BYTES" msgstr "OCTETS" -#: src/main/help.c:376 +#: src/main/help.c:379 msgid "use a buffer size of BYTES" msgstr "Utiliser une mémoire tampon de OCTETS octets" -#: src/main/help.c:379 +#: src/main/help.c:382 msgid "never use splice(), always use read/write" msgstr "ne jamais utiliser splice(), toujours utiliser read/write" -#: src/main/help.c:382 +#: src/main/help.c:385 msgid "skip read errors in input" msgstr "ignorer les erreurs de lecture dans l'entrée" -#: src/main/help.c:385 +#: src/main/help.c:388 msgid "skip errors in BYTES blocks at a time" msgstr "ignorer les erreurs dans OCTETS blocs à la fois" -#: src/main/help.c:388 +#: src/main/help.c:391 msgid "stop after --size bytes have been transferred" msgstr "arrêter après le transfert de --size octets" -#: src/main/help.c:391 +#: src/main/help.c:394 msgid "flush cache to disk after every write" msgstr "vider le cache sur le disque après chaque écriture" -#: src/main/help.c:394 +#: src/main/help.c:397 msgid "use direct I/O to bypass cache" msgstr "utiliser les E/S directes pour contourner le cache" -#: src/main/help.c:397 +#: src/main/help.c:400 msgid "discard input instead of writing to output" msgstr "rejeter l'entrée au lieu de l'écrire vers la sortie" -#: src/main/help.c:400 +#: src/main/help.c:403 msgid "write all input to FILE before writing to output" msgstr "écrire toute l'entrée vers FICHIER avant de l'écrire vers la sortie" -#: src/main/help.c:403 +#: src/main/help.c:406 msgid "PID" msgstr "PID" -#: src/main/help.c:404 +#: src/main/help.c:407 msgid "update settings of process PID" msgstr "mettre à jour la configuration du processus PID" -#: src/main/help.c:409 +#: src/main/help.c:412 msgid "save process ID in FILE" msgstr "enregistrer l'ID de processus dans FICHIER" -#: src/main/help.c:412 +#: src/main/help.c:415 msgid "PID[:FD]" msgstr "PID[:FD]" -#: src/main/help.c:413 +#: src/main/help.c:416 msgid "watch file FD opened by process PID" msgstr "surveiller le fichier FD ouvert par le processus PID" -#: src/main/help.c:417 +#: src/main/help.c:420 msgid "show this help and exit" msgstr "afficher cette aide puis quitter" -#: src/main/help.c:420 +#: src/main/help.c:423 msgid "show version information and exit" msgstr "afficher la version puis quitter" -#: src/main/help.c:424 +#: src/main/help.c:427 msgid "write debug logs to FILE" msgstr "écrire les journaux de déboggage vers FICHIER" -#: src/main/help.c:449 +#: src/main/help.c:452 #, c-format msgid "Usage: %s [OPTION] [FILE]..." msgstr "Utilisation : %s [OPTIONS] [FICHIER]..." -#: src/main/help.c:460 +#: src/main/help.c:463 msgid "" "Concatenate FILE(s), or standard input, to standard output, with monitoring." msgstr "" "Concaténer FICHIER(s), ou l'entrée standard, sur la sortie standard avec " "monitorage." -#: src/main/help.c:597 +#: src/main/help.c:600 #, c-format msgid "Please report any bugs to: %s" msgstr "SVP rapporter tous bogues à %s" @@ -280,69 +288,69 @@ msgstr "SVP rapporter tous bogues à %s" msgid "(input)" msgstr "(entrée)" -#: src/main/main.c:315 +#: src/main/main.c:319 msgid "state allocation failed" msgstr "échec de l'allocation de mémoire de condition" -#: src/main/options.c:142 src/pv/file.c:324 +#: src/main/options.c:144 src/pv/file.c:324 msgid "failed to stat file" msgstr "échec à statuer sur le fichier" -#: src/main/options.c:156 +#: src/main/options.c:158 msgid "is a directory" msgstr "est un répertoire" -#: src/main/options.c:185 +#: src/main/options.c:187 msgid "failed to generate sysfs filename" msgstr "" -#: src/main/options.c:207 +#: src/main/options.c:209 msgid "failed to read sysfs size file" msgstr "" -#: src/main/options.c:227 +#: src/main/options.c:229 msgid "failed to open block device" msgstr "" -#: src/main/options.c:237 +#: src/main/options.c:239 msgid "failed to determine size of block device" msgstr "" -#: src/main/options.c:341 +#: src/main/options.c:344 msgid "option structure allocation failed" msgstr "l'allocation pour la structure d'une option a échoué" -#: src/main/options.c:360 +#: src/main/options.c:363 msgid "option structure argv allocation failed" msgstr "l'allocation pour la structure de l'option argv a échoué" -#: src/main/options.c:422 +#: src/main/options.c:425 msgid "integer argument expected" msgstr "Valeur entière attendue" -#: src/main/options.c:433 +#: src/main/options.c:436 msgid "numeric argument expected" msgstr "Valeur numérique attendue" -#: src/main/options.c:444 +#: src/main/options.c:447 msgid "process ID or pid:fd pair expected" msgstr "ID de processus ou paire pid:fd attendue" -#: src/main/options.c:451 +#: src/main/options.c:454 msgid "invalid process ID" msgstr "ID de processus non valide" -#: src/main/options.c:668 +#: src/main/options.c:679 #, c-format msgid "Try `%s --help' for more information." msgstr "Essayez `%s --help' pour plus d'informations." -#: src/main/options.c:670 +#: src/main/options.c:681 #, c-format msgid "Try `%s -h' for more information." msgstr "Essayez `%s -h' pour plus d'informations." -#: src/main/options.c:701 +#: src/main/options.c:712 msgid "" "cannot use line mode or transfer modifier options when watching file " "descriptors" @@ -350,25 +358,25 @@ 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:710 +#: src/main/options.c:721 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:719 +#: src/main/options.c:730 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:728 +#: src/main/options.c:739 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:743 +#: src/main/options.c:754 msgid "not available on systems without /proc/self/fdinfo" msgstr "non disponible sur les systèmes sans /proc/self/fdinfo" @@ -422,37 +430,37 @@ msgstr "" msgid "yzafpnum KMGTPEZY" msgstr "" -#: src/pv/display.c:678 src/pv/transfer.c:1011 +#: src/pv/display.c:681 src/pv/transfer.c:1011 msgid "buffer allocation failed" msgstr "échec de l'allocation de mémoire tampon" -#: src/pv/display.c:807 +#: src/pv/display.c:810 msgid "b" msgstr "" -#: src/pv/display.c:810 src/pv/transfer.c:602 +#: src/pv/display.c:813 src/pv/transfer.c:602 msgid "B" msgstr "O" -#: src/pv/display.c:854 src/pv/display.c:869 src/pv/display.c:1088 +#: src/pv/display.c:857 src/pv/display.c:872 src/pv/display.c:1091 #: src/pv/loop.c:549 msgid "b/s" msgstr "" -#: src/pv/display.c:858 src/pv/display.c:873 src/pv/display.c:1092 +#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 msgid "/s" msgstr "/s" -#: src/pv/display.c:858 src/pv/display.c:873 src/pv/display.c:1092 +#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 #: src/pv/loop.c:549 msgid "B/s" msgstr "O/s" -#: src/pv/display.c:901 src/pv/display.c:905 +#: src/pv/display.c:904 src/pv/display.c:908 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:971 +#: src/pv/display.c:974 msgid "FIN" msgstr "" @@ -504,7 +512,7 @@ msgstr "" msgid "history structure allocation failed" msgstr "l'allocation de la structure de l'historique a échoué" -#: src/pv/state.c:509 src/pv/state.c:520 +#: src/pv/state.c:572 src/pv/state.c:583 msgid "file list allocation failed" msgstr "échec de l'allocation de la liste de fichiers" diff --git a/po/pl.po b/po/pl.po index 01aa1ff..a338cb3 100644 --- a/po/pl.po +++ b/po/pl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-01 16:08+0000\n" +"POT-Creation-Date: 2024-12-01 19:09+0000\n" "PO-Revision-Date: 2024-10-20 14:07+0000\n" "Last-Translator: coralpink \n" "Language-Team: Polish \n" @@ -42,7 +42,7 @@ msgstr "pokaż licznik prędkości przesyłania" msgid "show data transfer average rate counter" msgstr "pokaż licznik uśrednionej prędkości przesyłania" -#: src/main/help.c:301 src/main/help.c:335 src/main/help.c:350 +#: src/main/help.c:301 src/main/help.c:338 src/main/help.c:353 msgid "SEC" msgstr "SEKUNDY" @@ -84,188 +84,196 @@ msgstr "FORMAT" msgid "set output format to FORMAT" msgstr "ustaw FORMAT jako format wyjściowy" +#: src/main/help.c:322 +msgid "SPEC" +msgstr "" + #: src/main/help.c:323 +msgid "also send progress to SPEC" +msgstr "" + +#: src/main/help.c:326 msgid "output transfer statistics at the end" msgstr "wyświetl na końcu statystyki transferu" -#: src/main/help.c:326 +#: src/main/help.c:329 msgid "output percentages, not visual information" msgstr "wyświetl wyjście procentowo, bez graficznej prezentacji" -#: src/main/help.c:329 +#: src/main/help.c:332 msgid "do not output any transfer information at all" msgstr "nie wyświetlaj żadnych informacji o przesyłaniu" -#: src/main/help.c:333 +#: src/main/help.c:336 msgid "display nothing until first byte transferred" msgstr "nie wyświetlaj nic aż do pierwszego przesłanego bajtu" -#: src/main/help.c:336 +#: src/main/help.c:339 msgid "display nothing until SEC seconds have passed" msgstr "nie wyświetlaj nic do momentu upłynięcia SEKUNDY sekund" -#: src/main/help.c:338 +#: src/main/help.c:341 msgid "SIZE" msgstr "ROZMIAR" -#: src/main/help.c:339 +#: src/main/help.c:342 msgid "set estimated data size to SIZE bytes" msgstr "ustaw oczekiwany rozmiar danych na ROZMIAR bajtów" -#: src/main/help.c:342 +#: src/main/help.c:345 msgid "if size unknown, show rate vs max rate" msgstr "" "jeśli rozmiar nie jest znany, wyświetl zestawienie prędkości do maksymalnej " "prędkości" -#: src/main/help.c:345 +#: src/main/help.c:348 msgid "count lines instead of bytes" msgstr "zliczaj linie zamiast bajty" -#: src/main/help.c:348 +#: src/main/help.c:351 msgid "lines are null-terminated" msgstr "linie są zakończone znakiem NUL" -#: src/main/help.c:351 +#: src/main/help.c:354 msgid "update every SEC seconds" msgstr "aktualizuj co każde SEKUNDY sekund" -#: src/main/help.c:353 +#: src/main/help.c:356 msgid "WIDTH" msgstr "SZEROKOŚĆ" -#: src/main/help.c:354 +#: src/main/help.c:357 msgid "assume terminal is WIDTH characters wide" msgstr "przyjmij, że terminal ma szerokość SZEROKOŚĆ znaków" -#: src/main/help.c:356 +#: src/main/help.c:359 msgid "HEIGHT" msgstr "WYSOKOŚĆ" -#: src/main/help.c:357 +#: src/main/help.c:360 msgid "assume terminal is HEIGHT rows high" msgstr "przyjmij, że terminal ma wysokość WYSOKOŚĆ linii" -#: src/main/help.c:359 +#: src/main/help.c:362 msgid "NAME" msgstr "NAZWA" -#: src/main/help.c:360 +#: src/main/help.c:363 msgid "prefix visual information with NAME" msgstr "poprzedź informacje prefiksem NAZWA" -#: src/main/help.c:363 +#: src/main/help.c:366 msgid "output even if standard error is not a terminal" msgstr "pokaż wyjście nawet standardowe wyjście błędu nie jest terminalem" -#: src/main/help.c:366 +#: src/main/help.c:369 msgid "use cursor positioning escape sequences" msgstr "używaj znaków ucieczki do pozycjonowania kursora" -#: src/main/help.c:369 src/main/help.c:399 src/main/help.c:408 -#: src/main/help.c:423 +#: src/main/help.c:372 src/main/help.c:402 src/main/help.c:411 +#: src/main/help.c:426 msgid "FILE" msgstr "PLIK" -#: src/main/help.c:370 +#: src/main/help.c:373 msgid "write output to FILE instead of stdout" msgstr "zapisz wyjście do PLIK zamiast do wyjścia standardowego" -#: src/main/help.c:372 +#: src/main/help.c:375 msgid "RATE" msgstr "PRĘDKOŚĆ" -#: src/main/help.c:373 +#: src/main/help.c:376 msgid "limit transfer to RATE bytes per second" msgstr "ogranicz przesyłane dane do PRĘDKOŚĆ bajtów na sekundę" -#: src/main/help.c:375 src/main/help.c:384 +#: src/main/help.c:378 src/main/help.c:387 msgid "BYTES" msgstr "BAJTY" -#: src/main/help.c:376 +#: src/main/help.c:379 msgid "use a buffer size of BYTES" msgstr "użyj bufora o rozmiarze BAJTY" -#: src/main/help.c:379 +#: src/main/help.c:382 msgid "never use splice(), always use read/write" msgstr "nigdy nie używaj splice(), zawsze używaj read/write" -#: src/main/help.c:382 +#: src/main/help.c:385 msgid "skip read errors in input" msgstr "pomijaj błędy odczytu wejścia" -#: src/main/help.c:385 +#: src/main/help.c:388 msgid "skip errors in BYTES blocks at a time" msgstr "pomijaj błędy w blokach po BAJTY bajtów na raz" -#: src/main/help.c:388 +#: src/main/help.c:391 msgid "stop after --size bytes have been transferred" msgstr "zakończ po przesłaniu --size bajtów" -#: src/main/help.c:391 +#: src/main/help.c:394 msgid "flush cache to disk after every write" msgstr "wymuś zapis pamięci podręcznej na dysk po każdym zapisie" -#: src/main/help.c:394 +#: src/main/help.c:397 msgid "use direct I/O to bypass cache" msgstr "" "użyj bezpośredniego wejścia/wyjścia celem pominięcia pamięci podręcznej" -#: src/main/help.c:397 +#: src/main/help.c:400 msgid "discard input instead of writing to output" msgstr "zignoruj dane wejściowe zamiast wyświetlić je na wyjściu standardowym" -#: src/main/help.c:400 +#: src/main/help.c:403 msgid "write all input to FILE before writing to output" msgstr "" "zapisz wszystkie dane wejściowe do PLIK przed wyświetleniem ich na wyjściu" -#: src/main/help.c:403 +#: src/main/help.c:406 msgid "PID" msgstr "PID" -#: src/main/help.c:404 +#: src/main/help.c:407 msgid "update settings of process PID" msgstr "zaktualizuj ustawienia procesu PID" -#: src/main/help.c:409 +#: src/main/help.c:412 msgid "save process ID in FILE" msgstr "zapisz ID procesu do PLIK" -#: src/main/help.c:412 +#: src/main/help.c:415 msgid "PID[:FD]" msgstr "PID[:FD]" -#: src/main/help.c:413 +#: src/main/help.c:416 msgid "watch file FD opened by process PID" msgstr "obserwuj plik FD otworzony przez proces PID" -#: src/main/help.c:417 +#: src/main/help.c:420 msgid "show this help and exit" msgstr "wyświetl te informacje z pomocą i wyjdź" -#: src/main/help.c:420 +#: src/main/help.c:423 msgid "show version information and exit" msgstr "wyświetl informacje o wersji i wyjdź" -#: src/main/help.c:424 +#: src/main/help.c:427 msgid "write debug logs to FILE" msgstr "zapisz logi debugujące do PLIK" -#: src/main/help.c:449 +#: src/main/help.c:452 #, c-format msgid "Usage: %s [OPTION] [FILE]..." msgstr "Sposób użycia: %s [OPCJA] [PLIK]..." -#: src/main/help.c:460 +#: src/main/help.c:463 msgid "" "Concatenate FILE(s), or standard input, to standard output, with monitoring." msgstr "" "Łączenie PLIK(ów) lub wejścia standardowego, do wyjścia standardowego z " "monitoringiem." -#: src/main/help.c:597 +#: src/main/help.c:600 #, c-format msgid "Please report any bugs to: %s" msgstr "Proszę przesyłać zgłoszenia błędów do %s" @@ -274,69 +282,69 @@ msgstr "Proszę przesyłać zgłoszenia błędów do %s" msgid "(input)" msgstr "(wejście)" -#: src/main/main.c:315 +#: src/main/main.c:319 msgid "state allocation failed" msgstr "alokacja stanu programu nie powiodła się" -#: src/main/options.c:142 src/pv/file.c:324 +#: src/main/options.c:144 src/pv/file.c:324 msgid "failed to stat file" msgstr "nie udało się wykonać operacji stat na pliku" -#: src/main/options.c:156 +#: src/main/options.c:158 msgid "is a directory" msgstr "jest katalogiem" -#: src/main/options.c:185 +#: src/main/options.c:187 msgid "failed to generate sysfs filename" msgstr "nie udało się wygenerować nazwy pliku dla sysfs" -#: src/main/options.c:207 +#: src/main/options.c:209 msgid "failed to read sysfs size file" msgstr "nie udało się odczytać rozmiaru pliku sysfs" -#: src/main/options.c:227 +#: src/main/options.c:229 msgid "failed to open block device" msgstr "nie udało się otworzyć urządzenia blokowego" -#: src/main/options.c:237 +#: src/main/options.c:239 msgid "failed to determine size of block device" msgstr "nie udało się ustalić rozmiaru urządzenia blokowego" -#: src/main/options.c:341 +#: src/main/options.c:344 msgid "option structure allocation failed" msgstr "nie udało się zaalokować struktur opcji" -#: src/main/options.c:360 +#: src/main/options.c:363 msgid "option structure argv allocation failed" msgstr "nie udało się zaalokować struktur opcji argv" -#: src/main/options.c:422 +#: src/main/options.c:425 msgid "integer argument expected" msgstr "oczekiwany argument typu liczby całkowitej" -#: src/main/options.c:433 +#: src/main/options.c:436 msgid "numeric argument expected" msgstr "oczekiwany argument liczbowy" -#: src/main/options.c:444 +#: src/main/options.c:447 msgid "process ID or pid:fd pair expected" msgstr "oczekiwany proces ID lub para PID:FD" -#: src/main/options.c:451 +#: src/main/options.c:454 msgid "invalid process ID" msgstr "niepoprawne ID procesu" -#: src/main/options.c:668 +#: src/main/options.c:679 #, c-format msgid "Try `%s --help' for more information." msgstr "Spróbuj `%s --help' by uzyskać więcej informacji." -#: src/main/options.c:670 +#: src/main/options.c:681 #, c-format msgid "Try `%s -h' for more information." msgstr "Spróbuj `%s -h' by uzyskać więcej informacji." -#: src/main/options.c:701 +#: src/main/options.c:712 msgid "" "cannot use line mode or transfer modifier options when watching file " "descriptors" @@ -344,23 +352,23 @@ msgstr "" "nie można użyć trybu zliczania linii lub opcji modyfikujących przesył " "łącznie z opcją obserwowania deskryptorów plików" -#: src/main/options.c:710 +#: src/main/options.c:721 msgid "cannot use cursor positioning when watching file descriptors" msgstr "" "nie można użyć pozycjonowania kursora łącznie z opcją obserwowania " "deskryptorów plików" -#: src/main/options.c:719 +#: src/main/options.c:730 msgid "cannot use remote control when watching file descriptors" msgstr "" "nie można użyć opcji zaktualizowania ustawień procesu łącznie z opcją " "obserwowania deskryptorów plików" -#: src/main/options.c:728 +#: src/main/options.c:739 msgid "cannot transfer files when watching file descriptors" msgstr "nie można przesyłać plików z opcją obserwowania deskryptorów plików" -#: src/main/options.c:743 +#: src/main/options.c:754 msgid "not available on systems without /proc/self/fdinfo" msgstr "niedostępne na systemach bez /proc/self/fdinfo" @@ -413,37 +421,37 @@ msgstr "yzafpnum kMGTPEZY" msgid "yzafpnum KMGTPEZY" msgstr "yzafpnum KMGTPEZY" -#: src/pv/display.c:678 src/pv/transfer.c:1011 +#: src/pv/display.c:681 src/pv/transfer.c:1011 msgid "buffer allocation failed" msgstr "nie udało się zaalokować bufora" -#: src/pv/display.c:807 +#: src/pv/display.c:810 msgid "b" msgstr "b" -#: src/pv/display.c:810 src/pv/transfer.c:602 +#: src/pv/display.c:813 src/pv/transfer.c:602 msgid "B" msgstr "B" -#: src/pv/display.c:854 src/pv/display.c:869 src/pv/display.c:1088 +#: src/pv/display.c:857 src/pv/display.c:872 src/pv/display.c:1091 #: src/pv/loop.c:549 msgid "b/s" msgstr "b/s" -#: src/pv/display.c:858 src/pv/display.c:873 src/pv/display.c:1092 +#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 msgid "/s" msgstr "/s" -#: src/pv/display.c:858 src/pv/display.c:873 src/pv/display.c:1092 +#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 #: src/pv/loop.c:549 msgid "B/s" msgstr "B/s" -#: src/pv/display.c:901 src/pv/display.c:905 +#: src/pv/display.c:904 src/pv/display.c:908 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:971 +#: src/pv/display.c:974 msgid "FIN" msgstr "FIN" @@ -496,7 +504,7 @@ msgstr "pid" msgid "history structure allocation failed" msgstr "nie udało się zaalokować struktury historii" -#: src/pv/state.c:509 src/pv/state.c:520 +#: src/pv/state.c:572 src/pv/state.c:583 msgid "file list allocation failed" msgstr "nie udało się zaalokować listy plików" diff --git a/po/pt.po b/po/pt.po index 21a2357..a0e7209 100644 --- a/po/pt.po +++ b/po/pt.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-01 16:08+0000\n" +"POT-Creation-Date: 2024-12-01 19:09+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -39,7 +39,7 @@ 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:301 src/main/help.c:335 src/main/help.c:350 +#: src/main/help.c:301 src/main/help.c:338 src/main/help.c:353 msgid "SEC" msgstr "" @@ -79,184 +79,192 @@ msgstr "" msgid "set output format to FORMAT" msgstr "definir o formato de saída para FORMAT" +#: src/main/help.c:322 +msgid "SPEC" +msgstr "" + #: src/main/help.c:323 -msgid "output transfer statistics at the end" +msgid "also send progress to SPEC" msgstr "" #: src/main/help.c:326 +msgid "output transfer statistics at the end" +msgstr "" + +#: src/main/help.c:329 msgid "output percentages, not visual information" msgstr "exibe apenas as porcentagens, sem informações visuais" -#: src/main/help.c:329 +#: src/main/help.c:332 msgid "do not output any transfer information at all" msgstr "executa programa sem exibir quaisquer informações" -#: src/main/help.c:333 +#: src/main/help.c:336 msgid "display nothing until first byte transferred" msgstr "não exibe nada até iniciar o processamento" -#: src/main/help.c:336 +#: src/main/help.c:339 msgid "display nothing until SEC seconds have passed" msgstr "não exibir nada até que os segundos SEC tenham passado" -#: src/main/help.c:338 +#: src/main/help.c:341 msgid "SIZE" msgstr "" -#: src/main/help.c:339 +#: src/main/help.c:342 msgid "set estimated data size to SIZE bytes" msgstr "seta a quantidade estimada de dados em SIZE bytes" -#: src/main/help.c:342 +#: src/main/help.c:345 msgid "if size unknown, show rate vs max rate" msgstr "" -#: src/main/help.c:345 +#: src/main/help.c:348 msgid "count lines instead of bytes" msgstr "contar linhas em vez de bytes" -#: src/main/help.c:348 +#: src/main/help.c:351 msgid "lines are null-terminated" msgstr "linhas são terminadas em nulo" -#: src/main/help.c:351 +#: src/main/help.c:354 msgid "update every SEC seconds" msgstr "atualiza informações a cada SEC segundos" -#: src/main/help.c:353 +#: src/main/help.c:356 msgid "WIDTH" msgstr "" -#: src/main/help.c:354 +#: src/main/help.c:357 msgid "assume terminal is WIDTH characters wide" msgstr "presuma que o terminal tem WIDTH caracteres de largura" -#: src/main/help.c:356 +#: src/main/help.c:359 msgid "HEIGHT" msgstr "" -#: src/main/help.c:357 +#: src/main/help.c:360 msgid "assume terminal is HEIGHT rows high" msgstr "presuma que o terminal tem HEIGHT caracteres de altura" -#: src/main/help.c:359 +#: src/main/help.c:362 msgid "NAME" msgstr "" -#: src/main/help.c:360 +#: src/main/help.c:363 msgid "prefix visual information with NAME" msgstr "exibe NAME antes das demais informações" -#: src/main/help.c:363 +#: src/main/help.c:366 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:366 +#: src/main/help.c:369 msgid "use cursor positioning escape sequences" msgstr "utiliza caracteres de escape para posicionar o cursor" -#: src/main/help.c:369 src/main/help.c:399 src/main/help.c:408 -#: src/main/help.c:423 +#: src/main/help.c:372 src/main/help.c:402 src/main/help.c:411 +#: src/main/help.c:426 msgid "FILE" msgstr "" -#: src/main/help.c:370 +#: src/main/help.c:373 msgid "write output to FILE instead of stdout" msgstr "" -#: src/main/help.c:372 +#: src/main/help.c:375 msgid "RATE" msgstr "" -#: src/main/help.c:373 +#: src/main/help.c:376 msgid "limit transfer to RATE bytes per second" msgstr "limita a transferência a RATE bytes por segundo" -#: src/main/help.c:375 src/main/help.c:384 +#: src/main/help.c:378 src/main/help.c:387 msgid "BYTES" msgstr "" -#: src/main/help.c:376 +#: src/main/help.c:379 msgid "use a buffer size of BYTES" msgstr "use um tamanho de buffer de BYTES" -#: src/main/help.c:379 +#: src/main/help.c:382 msgid "never use splice(), always use read/write" msgstr "nunca use splice(), sempre use read/write" -#: src/main/help.c:382 +#: src/main/help.c:385 msgid "skip read errors in input" msgstr "ignorar erros de leitura em entrada" -#: src/main/help.c:385 +#: src/main/help.c:388 msgid "skip errors in BYTES blocks at a time" msgstr "" -#: src/main/help.c:388 +#: src/main/help.c:391 msgid "stop after --size bytes have been transferred" msgstr "parar após --size bytes terem sido transferidos" -#: src/main/help.c:391 +#: src/main/help.c:394 msgid "flush cache to disk after every write" msgstr "" -#: src/main/help.c:394 +#: src/main/help.c:397 msgid "use direct I/O to bypass cache" msgstr "" -#: src/main/help.c:397 +#: src/main/help.c:400 msgid "discard input instead of writing to output" msgstr "" -#: src/main/help.c:400 +#: src/main/help.c:403 msgid "write all input to FILE before writing to output" msgstr "" -#: src/main/help.c:403 +#: src/main/help.c:406 msgid "PID" msgstr "" -#: src/main/help.c:404 +#: src/main/help.c:407 msgid "update settings of process PID" msgstr "atualizar as configurações do processo PID" -#: src/main/help.c:409 +#: src/main/help.c:412 msgid "save process ID in FILE" msgstr "salvar ID do processo em FILE" -#: src/main/help.c:412 +#: src/main/help.c:415 msgid "PID[:FD]" msgstr "" -#: src/main/help.c:413 +#: src/main/help.c:416 msgid "watch file FD opened by process PID" msgstr "assistir arquivo FD aberto pelo processo PID" -#: src/main/help.c:417 +#: src/main/help.c:420 msgid "show this help and exit" msgstr "exibe esta tela de ajuda e termina" -#: src/main/help.c:420 +#: src/main/help.c:423 msgid "show version information and exit" msgstr "exibe a versão e termina" -#: src/main/help.c:424 +#: src/main/help.c:427 msgid "write debug logs to FILE" msgstr "" -#: src/main/help.c:449 +#: src/main/help.c:452 #, c-format msgid "Usage: %s [OPTION] [FILE]..." msgstr "Uso: %s [OPÇÕES] [ARQUIVOS]..." -#: src/main/help.c:460 +#: src/main/help.c:463 msgid "" "Concatenate FILE(s), or standard input, to standard output, with monitoring." msgstr "" "Concatena ARQUIVO(s) ou a entrada padrão e grava na saída padrão, com " "monitoramento." -#: src/main/help.c:597 +#: src/main/help.c:600 #, c-format msgid "Please report any bugs to: %s" msgstr "Por favor, reporte quaisquer defeitos para %s" @@ -265,69 +273,69 @@ msgstr "Por favor, reporte quaisquer defeitos para %s" msgid "(input)" msgstr "" -#: src/main/main.c:315 +#: src/main/main.c:319 msgid "state allocation failed" msgstr "alocação de memória de status falhou" -#: src/main/options.c:142 src/pv/file.c:324 +#: src/main/options.c:144 src/pv/file.c:324 msgid "failed to stat file" msgstr "erro obtendo informações do arquivo" -#: src/main/options.c:156 +#: src/main/options.c:158 msgid "is a directory" msgstr "" -#: src/main/options.c:185 +#: src/main/options.c:187 msgid "failed to generate sysfs filename" msgstr "" -#: src/main/options.c:207 +#: src/main/options.c:209 msgid "failed to read sysfs size file" msgstr "" -#: src/main/options.c:227 +#: src/main/options.c:229 msgid "failed to open block device" msgstr "" -#: src/main/options.c:237 +#: src/main/options.c:239 msgid "failed to determine size of block device" msgstr "" -#: src/main/options.c:341 +#: src/main/options.c:344 msgid "option structure allocation failed" msgstr "erro na alocação da estrutura de opções" -#: src/main/options.c:360 +#: src/main/options.c:363 msgid "option structure argv allocation failed" msgstr "erro na alocação da estrutura de opções argv" -#: src/main/options.c:422 +#: src/main/options.c:425 msgid "integer argument expected" msgstr "argumento inteiro esperado" -#: src/main/options.c:433 +#: src/main/options.c:436 msgid "numeric argument expected" msgstr "argumento numérico esperado" -#: src/main/options.c:444 +#: src/main/options.c:447 msgid "process ID or pid:fd pair expected" msgstr "ID do processo ou par pid:fd esperado" -#: src/main/options.c:451 +#: src/main/options.c:454 msgid "invalid process ID" msgstr "ID de processo inválido" -#: src/main/options.c:668 +#: src/main/options.c:679 #, c-format msgid "Try `%s --help' for more information." msgstr "Tente `%s --help' para maiores informações." -#: src/main/options.c:670 +#: src/main/options.c:681 #, c-format msgid "Try `%s -h' for more information." msgstr "Tente `%s -h' para maiores informações." -#: src/main/options.c:701 +#: src/main/options.c:712 msgid "" "cannot use line mode or transfer modifier options when watching file " "descriptors" @@ -335,21 +343,21 @@ 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:710 +#: src/main/options.c:721 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:719 +#: src/main/options.c:730 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:728 +#: src/main/options.c:739 msgid "cannot transfer files when watching file descriptors" msgstr "não pode transferir arquivos ao assistir descritores de arquivo" -#: src/main/options.c:743 +#: src/main/options.c:754 msgid "not available on systems without /proc/self/fdinfo" msgstr "não disponível em sistemas sem /proc/self/fdinfo" @@ -401,37 +409,37 @@ msgstr "" msgid "yzafpnum KMGTPEZY" msgstr "" -#: src/pv/display.c:678 src/pv/transfer.c:1011 +#: src/pv/display.c:681 src/pv/transfer.c:1011 msgid "buffer allocation failed" msgstr "erro alocando o buffer" -#: src/pv/display.c:807 +#: src/pv/display.c:810 msgid "b" msgstr "" -#: src/pv/display.c:810 src/pv/transfer.c:602 +#: src/pv/display.c:813 src/pv/transfer.c:602 msgid "B" msgstr "" -#: src/pv/display.c:854 src/pv/display.c:869 src/pv/display.c:1088 +#: src/pv/display.c:857 src/pv/display.c:872 src/pv/display.c:1091 #: src/pv/loop.c:549 msgid "b/s" msgstr "" -#: src/pv/display.c:858 src/pv/display.c:873 src/pv/display.c:1092 +#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 msgid "/s" msgstr "" -#: src/pv/display.c:858 src/pv/display.c:873 src/pv/display.c:1092 +#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 #: src/pv/loop.c:549 msgid "B/s" msgstr "B/s" -#: src/pv/display.c:901 src/pv/display.c:905 +#: src/pv/display.c:904 src/pv/display.c:908 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:971 +#: src/pv/display.c:974 msgid "FIN" msgstr "" @@ -483,7 +491,7 @@ msgstr "" msgid "history structure allocation failed" msgstr "" -#: src/pv/state.c:509 src/pv/state.c:520 +#: src/pv/state.c:572 src/pv/state.c:583 msgid "file list allocation failed" msgstr "" diff --git a/po/ru.po b/po/ru.po index 8f1adc1..aa219e2 100644 --- a/po/ru.po +++ b/po/ru.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-01 16:08+0000\n" +"POT-Creation-Date: 2024-12-01 19:09+0000\n" "PO-Revision-Date: 2024-10-22 18:07+0000\n" "Last-Translator: 0ko <0ko@users.noreply.translate.codeberg.org>\n" "Language-Team: Russian \n" @@ -37,7 +37,7 @@ msgstr "показать скорость передачи данных" msgid "show data transfer average rate counter" msgstr "показать среднюю скорость передачи данных" -#: src/main/help.c:301 src/main/help.c:335 src/main/help.c:350 +#: src/main/help.c:301 src/main/help.c:338 src/main/help.c:353 msgid "SEC" msgstr "СЕК" @@ -77,183 +77,191 @@ msgstr "ФОРМАТ" msgid "set output format to FORMAT" msgstr "указать формат вывода как ФОРМАТ" +#: src/main/help.c:322 +msgid "SPEC" +msgstr "" + #: src/main/help.c:323 +msgid "also send progress to SPEC" +msgstr "" + +#: src/main/help.c:326 msgid "output transfer statistics at the end" msgstr "после завершения показать статистику" -#: src/main/help.c:326 +#: src/main/help.c:329 msgid "output percentages, not visual information" msgstr "показать проценты вместо визуальной информации" -#: src/main/help.c:329 +#: src/main/help.c:332 msgid "do not output any transfer information at all" msgstr "не отображать никакую информацию о передаче" -#: src/main/help.c:333 +#: src/main/help.c:336 msgid "display nothing until first byte transferred" msgstr "ничего не показывать, пока не будет передан первый байт" -#: src/main/help.c:336 +#: src/main/help.c:339 msgid "display nothing until SEC seconds have passed" msgstr "ничего не показывать, пока не пройдёт СЕК секунд" -#: src/main/help.c:338 +#: src/main/help.c:341 msgid "SIZE" msgstr "РАЗМ" -#: src/main/help.c:339 +#: src/main/help.c:342 msgid "set estimated data size to SIZE bytes" msgstr "указать ожидаемый объём данных как РАЗМ байт" -#: src/main/help.c:342 +#: src/main/help.c:345 msgid "if size unknown, show rate vs max rate" msgstr "если объём неизвестен, показать скорость и макс. скорость" -#: src/main/help.c:345 +#: src/main/help.c:348 msgid "count lines instead of bytes" msgstr "считать линии вместо байт" -#: src/main/help.c:348 +#: src/main/help.c:351 msgid "lines are null-terminated" msgstr "строки прерываются нулями" -#: src/main/help.c:351 +#: src/main/help.c:354 msgid "update every SEC seconds" msgstr "обновлять каждые СЕК секунд" -#: src/main/help.c:353 +#: src/main/help.c:356 msgid "WIDTH" msgstr "ШИРИНА" -#: src/main/help.c:354 +#: src/main/help.c:357 msgid "assume terminal is WIDTH characters wide" msgstr "считать, что в одной строке помещается ШИРИНА символов" -#: src/main/help.c:356 +#: src/main/help.c:359 msgid "HEIGHT" msgstr "ВЫСОТА" -#: src/main/help.c:357 +#: src/main/help.c:360 msgid "assume terminal is HEIGHT rows high" msgstr "считать, что на экране помещается ВЫСОТА строк" -#: src/main/help.c:359 +#: src/main/help.c:362 msgid "NAME" msgstr "ИМЯ" -#: src/main/help.c:360 +#: src/main/help.c:363 msgid "prefix visual information with NAME" msgstr "писать ИМЯ до визуальной информации" -#: src/main/help.c:363 +#: src/main/help.c:366 msgid "output even if standard error is not a terminal" msgstr "вевести, даже если стд. ошибка не является терминалом" -#: src/main/help.c:366 +#: src/main/help.c:369 msgid "use cursor positioning escape sequences" msgstr "" "использовать символьные последовательности для позиционирования курсора" -#: src/main/help.c:369 src/main/help.c:399 src/main/help.c:408 -#: src/main/help.c:423 +#: src/main/help.c:372 src/main/help.c:402 src/main/help.c:411 +#: src/main/help.c:426 msgid "FILE" msgstr "ФАЙЛ" -#: src/main/help.c:370 +#: src/main/help.c:373 msgid "write output to FILE instead of stdout" msgstr "направить вывод в ФАЙЛ вместо стд. вывода" -#: src/main/help.c:372 +#: src/main/help.c:375 msgid "RATE" msgstr "СКОР" -#: src/main/help.c:373 +#: src/main/help.c:376 msgid "limit transfer to RATE bytes per second" msgstr "ограничить скорость передачи до СКОР байт/сек" -#: src/main/help.c:375 src/main/help.c:384 +#: src/main/help.c:378 src/main/help.c:387 msgid "BYTES" msgstr "БАЙТ" -#: src/main/help.c:376 +#: src/main/help.c:379 msgid "use a buffer size of BYTES" msgstr "использовать буфер размера БАЙТ" -#: src/main/help.c:379 +#: src/main/help.c:382 msgid "never use splice(), always use read/write" msgstr "использовать чтение/запись вместо splice()" -#: src/main/help.c:382 +#: src/main/help.c:385 msgid "skip read errors in input" msgstr "пропустить ошибки чтения во вводе" -#: src/main/help.c:385 +#: src/main/help.c:388 msgid "skip errors in BYTES blocks at a time" msgstr "пропускать ошибки в <БАЙТ> блоках за раз" -#: src/main/help.c:388 +#: src/main/help.c:391 msgid "stop after --size bytes have been transferred" msgstr "остановить после передачи --size байт" -#: src/main/help.c:391 +#: src/main/help.c:394 msgid "flush cache to disk after every write" msgstr "сбрасывать кеш на диск каждый раз" -#: src/main/help.c:394 +#: src/main/help.c:397 msgid "use direct I/O to bypass cache" msgstr "использовать прямой ввод/вывод для обхода кеша" -#: src/main/help.c:397 +#: src/main/help.c:400 msgid "discard input instead of writing to output" msgstr "отбрасывать ввод вместо записи в вывод" -#: src/main/help.c:400 +#: src/main/help.c:403 msgid "write all input to FILE before writing to output" msgstr "записывать весь ввод в ФАЙЛ прежде, чем отправлять на вывод" -#: src/main/help.c:403 +#: src/main/help.c:406 msgid "PID" msgstr "ИДпр" -#: src/main/help.c:404 +#: src/main/help.c:407 msgid "update settings of process PID" msgstr "обновить настройки ИДпр процесса" -#: src/main/help.c:409 +#: src/main/help.c:412 msgid "save process ID in FILE" msgstr "сохранить ИД процесса в ФАЙЛ" -#: src/main/help.c:412 +#: src/main/help.c:415 msgid "PID[:FD]" msgstr "ИДпр[:FD]" -#: src/main/help.c:413 +#: src/main/help.c:416 msgid "watch file FD opened by process PID" msgstr "следить за FD файла, открытого процессом ИДпр" -#: src/main/help.c:417 +#: src/main/help.c:420 msgid "show this help and exit" msgstr "показать справку и завершить работу" -#: src/main/help.c:420 +#: src/main/help.c:423 msgid "show version information and exit" msgstr "показать версию программы и завершить работу" -#: src/main/help.c:424 +#: src/main/help.c:427 msgid "write debug logs to FILE" msgstr "вести запись отладочного журнала в ФАЙЛ" -#: src/main/help.c:449 +#: src/main/help.c:452 #, c-format msgid "Usage: %s [OPTION] [FILE]..." msgstr "Использование: %s [ОПЦИИ] [ФАЙЛ]..." -#: src/main/help.c:460 +#: src/main/help.c:463 msgid "" "Concatenate FILE(s), or standard input, to standard output, with monitoring." msgstr "" -#: src/main/help.c:597 +#: src/main/help.c:600 #, c-format msgid "Please report any bugs to: %s" msgstr "Сообщайте о проблемах на: %s" @@ -262,87 +270,87 @@ msgstr "Сообщайте о проблемах на: %s" msgid "(input)" msgstr "(ввод)" -#: src/main/main.c:315 +#: src/main/main.c:319 msgid "state allocation failed" msgstr "" -#: src/main/options.c:142 src/pv/file.c:324 +#: src/main/options.c:144 src/pv/file.c:324 msgid "failed to stat file" msgstr "не удалось получить информацию о файле" -#: src/main/options.c:156 +#: src/main/options.c:158 msgid "is a directory" msgstr "является каталогом" -#: src/main/options.c:185 +#: src/main/options.c:187 msgid "failed to generate sysfs filename" msgstr "не удалось создать имя файла sysfs" -#: src/main/options.c:207 +#: src/main/options.c:209 msgid "failed to read sysfs size file" msgstr "не удалось узнать размер файла sysfs" -#: src/main/options.c:227 +#: src/main/options.c:229 msgid "failed to open block device" msgstr "не удалось открыть блочное устройство" -#: src/main/options.c:237 +#: src/main/options.c:239 msgid "failed to determine size of block device" msgstr "не удалось определить размер блочного устройства" -#: src/main/options.c:341 +#: src/main/options.c:344 msgid "option structure allocation failed" msgstr "не удалось выделить память для структуры опций" -#: src/main/options.c:360 +#: src/main/options.c:363 msgid "option structure argv allocation failed" msgstr "не удалось выделить память для структуры опций argv" -#: src/main/options.c:422 +#: src/main/options.c:425 msgid "integer argument expected" msgstr "ожидалось целое число" -#: src/main/options.c:433 +#: src/main/options.c:436 msgid "numeric argument expected" msgstr "ожидалось число" -#: src/main/options.c:444 +#: src/main/options.c:447 msgid "process ID or pid:fd pair expected" msgstr "ожидался ИД процесса или пара ИДпр:ДФ" -#: src/main/options.c:451 +#: src/main/options.c:454 msgid "invalid process ID" msgstr "неправильный ИД процесса" -#: src/main/options.c:668 +#: src/main/options.c:679 #, c-format msgid "Try `%s --help' for more information." msgstr "Выполните `%s --help' для получения подробностей." -#: src/main/options.c:670 +#: src/main/options.c:681 #, c-format msgid "Try `%s -h' for more information." msgstr "Выполните `%s -h' для получения подробностей." -#: src/main/options.c:701 +#: src/main/options.c:712 msgid "" "cannot use line mode or transfer modifier options when watching file " "descriptors" msgstr "" -#: src/main/options.c:710 +#: src/main/options.c:721 msgid "cannot use cursor positioning when watching file descriptors" msgstr "" -#: src/main/options.c:719 +#: src/main/options.c:730 msgid "cannot use remote control when watching file descriptors" msgstr "удалённое управление невозможно при отслеживании дескрипторов файлов" -#: src/main/options.c:728 +#: src/main/options.c:739 msgid "cannot transfer files when watching file descriptors" msgstr "передача файлов невозможна при отслеживании дескрипторов файлов" -#: src/main/options.c:743 +#: src/main/options.c:754 msgid "not available on systems without /proc/self/fdinfo" msgstr "невозможно на системах без /proc/self/fdinfo" @@ -396,37 +404,37 @@ msgstr "" msgid "yzafpnum KMGTPEZY" msgstr "" -#: src/pv/display.c:678 src/pv/transfer.c:1011 +#: src/pv/display.c:681 src/pv/transfer.c:1011 msgid "buffer allocation failed" msgstr "не удалось выделить память для буфера" -#: src/pv/display.c:807 +#: src/pv/display.c:810 msgid "b" msgstr "бит" -#: src/pv/display.c:810 src/pv/transfer.c:602 +#: src/pv/display.c:813 src/pv/transfer.c:602 msgid "B" msgstr "байт" -#: src/pv/display.c:854 src/pv/display.c:869 src/pv/display.c:1088 +#: src/pv/display.c:857 src/pv/display.c:872 src/pv/display.c:1091 #: src/pv/loop.c:549 msgid "b/s" msgstr "бит/с" -#: src/pv/display.c:858 src/pv/display.c:873 src/pv/display.c:1092 +#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 msgid "/s" msgstr "/с" -#: src/pv/display.c:858 src/pv/display.c:873 src/pv/display.c:1092 +#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 #: src/pv/loop.c:549 msgid "B/s" msgstr "байт/с" -#: src/pv/display.c:901 src/pv/display.c:905 +#: src/pv/display.c:904 src/pv/display.c:908 msgid "ETA" msgstr "ОЖИД" -#: src/pv/display.c:971 +#: src/pv/display.c:974 msgid "FIN" msgstr "ЗАВЕРШ" @@ -478,7 +486,7 @@ msgstr "ИДпр" msgid "history structure allocation failed" msgstr "не удалось выделить память для структуры истории" -#: src/pv/state.c:509 src/pv/state.c:520 +#: src/pv/state.c:572 src/pv/state.c:583 msgid "file list allocation failed" msgstr "не удалось выделить память для списка файлов" diff --git a/po/tr.po b/po/tr.po index 3dfd7ea..37ae204 100644 --- a/po/tr.po +++ b/po/tr.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: pv 1.8.14\n" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-01 16:08+0000\n" +"POT-Creation-Date: 2024-12-01 19:09+0000\n" "PO-Revision-Date: 2024-10-12 23:51+0000\n" "Last-Translator: a-j-wood \n" "Language-Team: Turkish \n" @@ -37,7 +37,7 @@ msgstr "veri aktarım oranı sayacını göster" msgid "show data transfer average rate counter" msgstr "veri aktarımı ortalama hız sayacını göster" -#: src/main/help.c:301 src/main/help.c:335 src/main/help.c:350 +#: src/main/help.c:301 src/main/help.c:338 src/main/help.c:353 msgid "SEC" msgstr "SEC" @@ -77,183 +77,191 @@ msgstr "FORMAT" msgid "set output format to FORMAT" msgstr "çıktı formatını FORMAT olarak ayarlayın" +#: src/main/help.c:322 +msgid "SPEC" +msgstr "" + #: src/main/help.c:323 +msgid "also send progress to SPEC" +msgstr "" + +#: src/main/help.c:326 msgid "output transfer statistics at the end" msgstr "transfer istatistiklerini sonda göster" -#: src/main/help.c:326 +#: src/main/help.c:329 msgid "output percentages, not visual information" msgstr "görsel bilgileri değil, yüzdeleri çıktı olarak yazdır" -#: src/main/help.c:329 +#: src/main/help.c:332 msgid "do not output any transfer information at all" msgstr "hiçbir transfer bilgisini yazdırma" -#: src/main/help.c:333 +#: src/main/help.c:336 msgid "display nothing until first byte transferred" msgstr "ilk bayt aktarılana kadar hiçbir şey gösterme" -#: src/main/help.c:336 +#: src/main/help.c:339 msgid "display nothing until SEC seconds have passed" msgstr "SEC saniye geçene kadar hiçbir şey gösterme" -#: src/main/help.c:338 +#: src/main/help.c:341 msgid "SIZE" msgstr "BOYUT" -#: src/main/help.c:339 +#: src/main/help.c:342 msgid "set estimated data size to SIZE bytes" msgstr "tahmini veri boyutunu BOYUT bayt olarak ayarlayın" -#: src/main/help.c:342 +#: src/main/help.c:345 msgid "if size unknown, show rate vs max rate" msgstr "boyut bilinmiyorsa, oranı maksimum oranla göster" -#: src/main/help.c:345 +#: src/main/help.c:348 msgid "count lines instead of bytes" msgstr "bayt yerine satır say" -#: src/main/help.c:348 +#: src/main/help.c:351 msgid "lines are null-terminated" msgstr "satırlar boş sonlandırılır" -#: src/main/help.c:351 +#: src/main/help.c:354 msgid "update every SEC seconds" msgstr "her SEC saniyede bir güncelleme" -#: src/main/help.c:353 +#: src/main/help.c:356 msgid "WIDTH" msgstr "GENİŞLİK" -#: src/main/help.c:354 +#: src/main/help.c:357 msgid "assume terminal is WIDTH characters wide" msgstr "terminalin GENİŞLİK karakter genişliğinde olduğunu varsayalım" -#: src/main/help.c:356 +#: src/main/help.c:359 msgid "HEIGHT" msgstr "YÜKSEKLİK" -#: src/main/help.c:357 +#: src/main/help.c:360 msgid "assume terminal is HEIGHT rows high" msgstr "terminalin YÜKSEKLİK sıraları yüksekliğinde olduğunu varsayalım" -#: src/main/help.c:359 +#: src/main/help.c:362 msgid "NAME" msgstr "İSİM" -#: src/main/help.c:360 +#: src/main/help.c:363 msgid "prefix visual information with NAME" msgstr "görsel bilgiyi İSİM ile öne ekle" -#: src/main/help.c:363 +#: src/main/help.c:366 msgid "output even if standard error is not a terminal" msgstr "standart hata bir terminal olmasa bile çıktı yazdır" -#: src/main/help.c:366 +#: src/main/help.c:369 msgid "use cursor positioning escape sequences" msgstr "imleç konumlandırma kaçış dizilerini kullan" -#: src/main/help.c:369 src/main/help.c:399 src/main/help.c:408 -#: src/main/help.c:423 +#: src/main/help.c:372 src/main/help.c:402 src/main/help.c:411 +#: src/main/help.c:426 msgid "FILE" msgstr "DOSYA" -#: src/main/help.c:370 +#: src/main/help.c:373 msgid "write output to FILE instead of stdout" msgstr "çıktıyı stdout yerine DOSYA'ya yaz" -#: src/main/help.c:372 +#: src/main/help.c:375 msgid "RATE" msgstr "ORAN" -#: src/main/help.c:373 +#: src/main/help.c:376 msgid "limit transfer to RATE bytes per second" msgstr "aktarımı saniye başına ORAN bayt ile sınırlandırın" -#: src/main/help.c:375 src/main/help.c:384 +#: src/main/help.c:378 src/main/help.c:387 msgid "BYTES" msgstr "BAYTLAR" -#: src/main/help.c:376 +#: src/main/help.c:379 msgid "use a buffer size of BYTES" msgstr "BAYTLAR tampon boyutu kullanın" -#: src/main/help.c:379 +#: src/main/help.c:382 msgid "never use splice(), always use read/write" msgstr "splice() kullanma, her zaman read/write kullan" -#: src/main/help.c:382 +#: src/main/help.c:385 msgid "skip read errors in input" msgstr "girdideki okuma hatalarını atla" -#: src/main/help.c:385 +#: src/main/help.c:388 msgid "skip errors in BYTES blocks at a time" msgstr "BAYTLAR blokları halinde hataları atla" -#: src/main/help.c:388 +#: src/main/help.c:391 msgid "stop after --size bytes have been transferred" msgstr "--size bayt transfer edildikten sonra dur" -#: src/main/help.c:391 +#: src/main/help.c:394 msgid "flush cache to disk after every write" msgstr "her yazmadan sonra önbelleği diske boşalt" -#: src/main/help.c:394 +#: src/main/help.c:397 msgid "use direct I/O to bypass cache" msgstr "Önbelleği atlamak için doğrudan I/O kullan" -#: src/main/help.c:397 +#: src/main/help.c:400 msgid "discard input instead of writing to output" msgstr "Girdiyi çıktıya yazmak yerine yok say" -#: src/main/help.c:400 +#: src/main/help.c:403 msgid "write all input to FILE before writing to output" msgstr "çıktıya yazmadan önce tüm girdiyi DOSYA'ya yaz" -#: src/main/help.c:403 +#: src/main/help.c:406 msgid "PID" msgstr "PID" -#: src/main/help.c:404 +#: src/main/help.c:407 msgid "update settings of process PID" msgstr "süreç PID ayarlarını güncelle" -#: src/main/help.c:409 +#: src/main/help.c:412 msgid "save process ID in FILE" msgstr "FILE'da işlem kimliğini (ID) kaydet" -#: src/main/help.c:412 +#: src/main/help.c:415 msgid "PID[:FD]" msgstr "PID[:FD]" -#: src/main/help.c:413 +#: src/main/help.c:416 msgid "watch file FD opened by process PID" msgstr "FD izleme dosyası PID işlemi tarafından açıldı" -#: src/main/help.c:417 +#: src/main/help.c:420 msgid "show this help and exit" msgstr "bu yardımı göster ve çık" -#: src/main/help.c:420 +#: src/main/help.c:423 msgid "show version information and exit" msgstr "sürüm bilgilerini göster ve çık" -#: src/main/help.c:424 +#: src/main/help.c:427 msgid "write debug logs to FILE" msgstr "Hata ayıklama kayıtlarını DOSYA'ya yaz" -#: src/main/help.c:449 +#: src/main/help.c:452 #, c-format msgid "Usage: %s [OPTION] [FILE]..." msgstr "Kullanım şekli: %s [AYAR] [DOSYA]..." -#: src/main/help.c:460 +#: src/main/help.c:463 msgid "" "Concatenate FILE(s), or standard input, to standard output, with monitoring." msgstr "" "İzleme ile DOSYA(lar)ı veya standart girdiyi standart çıktı ile birleştirin." -#: src/main/help.c:597 +#: src/main/help.c:600 #, c-format msgid "Please report any bugs to: %s" msgstr "Lütfen hataları şu adrese bildirin: %s" @@ -262,69 +270,69 @@ msgstr "Lütfen hataları şu adrese bildirin: %s" msgid "(input)" msgstr "(giriş)" -#: src/main/main.c:315 +#: src/main/main.c:319 msgid "state allocation failed" msgstr "durum tahsisi başarısız oldu" -#: src/main/options.c:142 src/pv/file.c:324 +#: src/main/options.c:144 src/pv/file.c:324 msgid "failed to stat file" msgstr "dosya statüsünde başarısız oldu" -#: src/main/options.c:156 +#: src/main/options.c:158 msgid "is a directory" msgstr "bir dizindir" -#: src/main/options.c:185 +#: src/main/options.c:187 msgid "failed to generate sysfs filename" msgstr "sysfs dosya adı oluşturulamadı" -#: src/main/options.c:207 +#: src/main/options.c:209 msgid "failed to read sysfs size file" msgstr "sysfs boyut dosyası okunamadı" -#: src/main/options.c:227 +#: src/main/options.c:229 msgid "failed to open block device" msgstr "blok aygıtı açılamadı" -#: src/main/options.c:237 +#: src/main/options.c:239 msgid "failed to determine size of block device" msgstr "blok aygıtının boyutu belirlenemedi" -#: src/main/options.c:341 +#: src/main/options.c:344 msgid "option structure allocation failed" msgstr "seçenek yapısı tahsisi başarısız oldu" -#: src/main/options.c:360 +#: src/main/options.c:363 msgid "option structure argv allocation failed" msgstr "seçenek yapısı argv tahsisi başarısız oldu" -#: src/main/options.c:422 +#: src/main/options.c:425 msgid "integer argument expected" msgstr "tamsayı bağımsız değişkeni bekleniyor" -#: src/main/options.c:433 +#: src/main/options.c:436 msgid "numeric argument expected" msgstr "sayısal bağımsız değişken bekleniyor" -#: src/main/options.c:444 +#: src/main/options.c:447 msgid "process ID or pid:fd pair expected" msgstr "süreç kimliği (ID) veya pid:fd çifti bekleniyor" -#: src/main/options.c:451 +#: src/main/options.c:454 msgid "invalid process ID" msgstr "geçersiz süreç kimliği (ID)" -#: src/main/options.c:668 +#: src/main/options.c:679 #, c-format msgid "Try `%s --help' for more information." msgstr "Daha fazla bilgi için `%s --help' seçeneğini deneyin." -#: src/main/options.c:670 +#: src/main/options.c:681 #, c-format msgid "Try `%s -h' for more information." msgstr "Daha fazla bilgi için `%s -h' seçeneğini deneyin." -#: src/main/options.c:701 +#: src/main/options.c:712 msgid "" "cannot use line mode or transfer modifier options when watching file " "descriptors" @@ -332,19 +340,19 @@ msgstr "" "dosya tanımlayıcılarını izlerken satır modu veya aktarım değiştirici " "seçeneklerini kullanamaz" -#: src/main/options.c:710 +#: src/main/options.c:721 msgid "cannot use cursor positioning when watching file descriptors" msgstr "dosya tanımlayıcılarını izlerken imleç konumlandırmayı kullanamaz" -#: src/main/options.c:719 +#: src/main/options.c:730 msgid "cannot use remote control when watching file descriptors" msgstr "dosya tanımlayıcılarını izlerken uzaktan kumandayı kullanamaz" -#: src/main/options.c:728 +#: src/main/options.c:739 msgid "cannot transfer files when watching file descriptors" msgstr "dosya tanımlayıcıları izlenirken dosya aktarılamıyor" -#: src/main/options.c:743 +#: src/main/options.c:754 msgid "not available on systems without /proc/self/fdinfo" msgstr "/proc/self/fdinfo olmayan sistemlerde kullanılamaz" @@ -397,37 +405,37 @@ msgstr "yzafpnum kMGTPEZY" msgid "yzafpnum KMGTPEZY" msgstr "yzafpnum KMGTPEZY" -#: src/pv/display.c:678 src/pv/transfer.c:1011 +#: src/pv/display.c:681 src/pv/transfer.c:1011 msgid "buffer allocation failed" msgstr "arabellek tahsisi başarısız oldu" -#: src/pv/display.c:807 +#: src/pv/display.c:810 msgid "b" msgstr "b" -#: src/pv/display.c:810 src/pv/transfer.c:602 +#: src/pv/display.c:813 src/pv/transfer.c:602 msgid "B" msgstr "B" -#: src/pv/display.c:854 src/pv/display.c:869 src/pv/display.c:1088 +#: src/pv/display.c:857 src/pv/display.c:872 src/pv/display.c:1091 #: src/pv/loop.c:549 msgid "b/s" msgstr "b/s" -#: src/pv/display.c:858 src/pv/display.c:873 src/pv/display.c:1092 +#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 msgid "/s" msgstr "/s" -#: src/pv/display.c:858 src/pv/display.c:873 src/pv/display.c:1092 +#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 #: src/pv/loop.c:549 msgid "B/s" msgstr "B/s" -#: src/pv/display.c:901 src/pv/display.c:905 +#: src/pv/display.c:904 src/pv/display.c:908 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:971 +#: src/pv/display.c:974 msgid "FIN" msgstr "FIN" @@ -479,7 +487,7 @@ msgstr "pid" msgid "history structure allocation failed" msgstr "geçmiş yapısı tahsisi başarısız oldu" -#: src/pv/state.c:509 src/pv/state.c:520 +#: src/pv/state.c:572 src/pv/state.c:583 msgid "file list allocation failed" msgstr "dosya listesi tahsisi başarısız oldu" diff --git a/src/include/config.h.in b/src/include/config.h.in index fcfb410..04a8ddf 100644 --- a/src/include/config.h.in +++ b/src/include/config.h.in @@ -112,6 +112,9 @@ /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE +/* Define to 1 if you have the `setproctitle' function. */ +#undef HAVE_SETPROCTITLE + /* Define to 1 if you have the `shmget' function. */ #undef HAVE_SHMGET diff --git a/src/include/options.h b/src/include/options.h index ce2b332..fa16d49 100644 --- a/src/include/options.h +++ b/src/include/options.h @@ -37,6 +37,7 @@ struct opts_s { /*@keep@*/ /*@null@*/ char *format; /* output format, if any */ /*@keep@*/ /*@null@*/ char *pidfile; /* PID file, if any */ /*@keep@*/ /*@null@*/ char *store_and_forward_file; /* store and forward file, if any */ + /*@keep@*/ /*@null@*/ char *extra_display; /* extra display specifier, if any */ /*@keep@*/ /*@null@*/ const char **argv; /* array of non-option arguments */ size_t lastwritten; /* show N bytes last written */ off_t rate_limit; /* rate limit, in bytes per second */ diff --git a/src/include/pv-internal.h b/src/include/pv-internal.h index b0cf7b2..21186ca 100644 --- a/src/include/pv-internal.h +++ b/src/include/pv-internal.h @@ -64,6 +64,9 @@ typedef enum { #define PV_SIZEOF_FILE_FDPATH 4096 #define PV_SIZEOF_DISPLAY_NAME 512 +#define PV_DISPLAY_WINDOWTITLE 1 +#define PV_DISPLAY_PROCESSTITLE 2 + /* * Structure for data shared between multiple "pv -c" instances. @@ -107,6 +110,7 @@ struct pvstate_s { double delay_start; /* delay before first display */ /*@only@*/ /*@null@*/ char *name; /* display name */ /*@only@*/ /*@null@*/ char *format_string; /* output format string */ + /*@only@*/ /*@null@*/ char *extra_format_string; /* extra format string */ /*@null@*/ char *output_name; /* name of the output, for diagnostics */ off_t error_skip_block; /* skip block size, 0 for adaptive */ off_t rate_limit; /* rate limit, in bytes per second */ @@ -120,6 +124,7 @@ struct pvstate_s { unsigned int history_interval; /* seconds between each average rate calc history entry */ unsigned int width; /* screen width */ unsigned int height; /* screen height */ + unsigned int extra_displays; /* bitmask of extra display destinations */ bool force; /* display even if not on terminal */ bool cursor; /* use cursor positioning */ bool numeric; /* numeric output only */ @@ -182,7 +187,7 @@ struct pvstate_s { /***************** * Display state * *****************/ - struct { + struct pvdisplay_s { struct { /* format string broken into display components */ size_t str_start; /* for strings: start offset */ @@ -211,6 +216,9 @@ struct pvstate_s { } display; + /* Extra display for alternate outputs like a window title. */ + struct pvdisplay_s extra_display; + /************************************ * Calculated state of the transfer * ************************************/ @@ -358,11 +366,13 @@ struct pvwatchfd_s { }; typedef struct pvwatchfd_s *pvwatchfd_t; +typedef struct pvdisplay_s *pvdisplay_t; + void pv_error(pvstate_t, char *, ...); int pv_main_loop(pvstate_t); void pv_calculate_transfer_rate(pvstate_t, bool); -bool pv_format(pvstate_t, bool); +bool pv_format(pvstate_t, /*@null@*/ const char *, pvdisplay_t, bool, bool); void pv_display(pvstate_t, bool); ssize_t pv_transfer(pvstate_t, int, bool *, bool *, off_t, long *); int pv_next_file(pvstate_t, unsigned int, int); diff --git a/src/include/pv.h b/src/include/pv.h index 1931398..e00dc04 100644 --- a/src/include/pv.h +++ b/src/include/pv.h @@ -210,6 +210,7 @@ extern void pv_state_width_set(pvstate_t, unsigned int, bool); extern void pv_state_height_set(pvstate_t, unsigned int, bool); extern void pv_state_name_set(pvstate_t, /*@null@*/ const char *); extern void pv_state_format_string_set(pvstate_t, /*@null@*/ const char *); +extern void pv_state_extra_display_set(pvstate_t, /*@null@*/ const char *); extern void pv_state_watch_pid_set(pvstate_t, pid_t); extern void pv_state_watch_fd_set(pvstate_t, int); extern void pv_state_output_set(pvstate_t, int, const char *); @@ -269,6 +270,10 @@ extern void pv_sig_fini(pvstate_t); */ extern void pv_state_free(/*@only@*/ pvstate_t); +#if ! HAVE_SETPROCTITLE +void initproctitle(int, char **); +void setproctitle(const char *, ...); +#endif #ifdef ENABLE_DEBUGGING # if __STDC_VERSION__ < 199901L && !defined(__func__) diff --git a/src/main/help.c b/src/main/help.c index 1a7c530..be34ac2 100644 --- a/src/main/help.c +++ b/src/main/help.c @@ -319,6 +319,9 @@ void display_help(void) { "-F", "--format", N_("FORMAT"), N_("set output format to FORMAT"), { 0, 0, 0, 0} }, + { "-x", "--extra-display", N_("SPEC"), + N_("also send progress to SPEC"), + { 0, 0, 0, 0} }, { "-v", "--stats", NULL, N_("output transfer statistics at the end"), { 0, 0, 0, 0} }, diff --git a/src/main/main.c b/src/main/main.c index 7f93446..2ba4747 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -280,6 +280,10 @@ int main(int argc, char **argv) int retcode = 0; bool can_have_eta = true; +#if ! HAVE_SETPROCTITLE + initproctitle(argc, argv); +#endif + #ifdef ENABLE_NLS /* Initialise language translation. */ (void) setlocale(LC_ALL, ""); @@ -490,6 +494,7 @@ int main(int argc, char **argv) pv_state_size_set(state, opts->size); pv_state_name_set(state, opts->name); pv_state_format_string_set(state, opts->format); + pv_state_extra_display_set(state, opts->extra_display); 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); diff --git a/src/main/options.c b/src/main/options.c index 68241b4..82b9dc6 100644 --- a/src/main/options.c +++ b/src/main/options.c @@ -59,6 +59,8 @@ void opts_free( /*@only@ */ opts_t opts) free(opts->output); if (NULL != opts->store_and_forward_file) free(opts->store_and_forward_file); + if (NULL != opts->extra_display) + free(opts->extra_display); if (NULL != opts->argv) free(opts->argv); /*@+keeptrans@ */ @@ -295,6 +297,7 @@ opts_t opts_parse(unsigned int argc, char **argv) { "height", 1, NULL, (int) 'H' }, { "name", 1, NULL, (int) 'N' }, { "format", 1, NULL, (int) 'F' }, + { "extra-display", 1, NULL, (int) 'x' }, { "stats", 0, NULL, (int) 'v' }, { "rate-limit", 1, NULL, (int) 'L' }, { "buffer-size", 1, NULL, (int) 'B' }, @@ -319,7 +322,7 @@ opts_t opts_parse(unsigned int argc, char **argv) /*@+nullassign@ */ int option_index = 0; #endif /* HAVE_GETOPT_LONG */ - char *short_options = "hVpteIrab8kTA:fvnqcWD:s:gl0i:w:H:N:F:L:B:CEZ:SYKXU:R:P:d:m:o:" + char *short_options = "hVpteIrab8kTA:fvnqcWD:s:gl0i:w:H:N:F:x:L:B:CEZ:SYKXU:R:P:d:m:o:" #ifdef ENABLE_DEBUGGING "!:" #endif @@ -637,6 +640,14 @@ opts_t opts_parse(unsigned int argc, char **argv) return NULL; } break; + case 'x': + opts->extra_display = pv_strdup(optarg); + if (NULL == opts->extra_display) { + fprintf(stderr, "%s: -x: %s\n", opts->program_name, strerror(errno)); + opts_free(opts); + return NULL; + } + break; case 'd': parse_pid = 0; parse_fd = -1; diff --git a/src/pv/display.c b/src/pv/display.c index 8215615..75f2963 100644 --- a/src/pv/display.c +++ b/src/pv/display.c @@ -428,29 +428,31 @@ static void pv__sizestr(char *buffer, size_t bufsize, char *format, /* * Initialise the output format structure, based on the current options. */ -static void pv__format_init(pvstate_t state) +static void pv__format_init(pvstate_t state, /*@null@ */ const char *format_supplied, pvdisplay_t display) { - const char *formatstr; + const char *format_used; size_t strpos; size_t segment; if (NULL == state) return; + if (NULL == display) + return; - state->display.format_segment_count = 0; - memset(state->display.format, 0, PV_FORMAT_ARRAY_MAX * sizeof(state->display.format[0])); - memset(state->display.component, 0, PV_COMPONENT__MAX * sizeof(state->display.component[0])); + display->format_segment_count = 0; + memset(display->format, 0, PV_FORMAT_ARRAY_MAX * sizeof(display->format[0])); + memset(display->component, 0, PV_COMPONENT__MAX * sizeof(display->component[0])); if (state->control.name) { - (void) pv_snprintf(state->display.component[PV_COMPONENT_NAME].content, PV_SIZEOF_COMPONENT_STR, + (void) pv_snprintf(display->component[PV_COMPONENT_NAME].content, PV_SIZEOF_COMPONENT_STR, "%9.500s:", state->control.name); - state->display.component[PV_COMPONENT_NAME].length = strlen(state->display.component[PV_COMPONENT_NAME].content); /* flawfinder: ignore */ + display->component[PV_COMPONENT_NAME].length = strlen(display->component[PV_COMPONENT_NAME].content); /* flawfinder: ignore */ /* flawfinder: content always bounded thanks to pv_snprintf(). */ } - formatstr = state->control.format_string ? state->control.format_string : state->control.default_format; + format_used = NULL == format_supplied ? state->control.default_format : format_supplied; - if (NULL == formatstr) + if (NULL == format_used) return; /* @@ -473,11 +475,11 @@ static void pv__format_init(pvstate_t state) * of these segments together. */ segment = 0; - for (strpos = 0; formatstr[strpos] != '\0' && segment < PV_FORMAT_ARRAY_MAX; strpos++, segment++) { + for (strpos = 0; format_used[strpos] != '\0' && segment < PV_FORMAT_ARRAY_MAX; strpos++, segment++) { pv_display_component seg_type; size_t str_start, str_length; - if ('%' == formatstr[strpos]) { + if ('%' == format_used[strpos]) { unsigned long number_prefix; #if HAVE_STRTOUL char *number_end_ptr; @@ -491,15 +493,15 @@ static void pv__format_init(pvstate_t state) */ #if HAVE_STRTOUL number_end_ptr = NULL; - number_prefix = strtoul(&(formatstr[strpos]), &number_end_ptr, 10); + number_prefix = strtoul(&(format_used[strpos]), &number_end_ptr, 10); if ((NULL == number_end_ptr) || (number_end_ptr[0] == '\0')) break; - if (number_end_ptr > &(formatstr[strpos])) - strpos += (number_end_ptr - &(formatstr[strpos])); + if (number_end_ptr > &(format_used[strpos])) + strpos += (number_end_ptr - &(format_used[strpos])); #else /* !HAVE_STRTOUL */ - while (isdigit((int) (formatstr[strpos]))) { + while (isdigit((int) (format_used[strpos]))) { number_prefix = number_prefix * 10; - number_prefix += formatstr[strpos] - '0'; + number_prefix += format_used[strpos] - '0'; strpos++; } #endif /* !HAVE_STRTOUL */ @@ -508,7 +510,7 @@ static void pv__format_init(pvstate_t state) str_start = 0; str_length = 0; - switch (formatstr[strpos]) { + switch (format_used[strpos]) { case 'p': seg_type = PV_COMPONENT_PROGRESS; break; @@ -527,7 +529,7 @@ static void pv__format_init(pvstate_t state) number_prefix = PV_SIZEOF_LASTOUTPUT_BUFFER; if (number_prefix < 1) number_prefix = 1; - state->display.lastoutput_length = (size_t) number_prefix; + display->lastoutput_length = (size_t) number_prefix; break; case 'r': seg_type = PV_COMPONENT_RATE; @@ -567,12 +569,12 @@ static void pv__format_init(pvstate_t state) const char *searchptr; int foundlength; - searchptr = strchr(&(formatstr[strpos]), '%'); + searchptr = strchr(&(format_used[strpos]), '%'); if (NULL == searchptr) { - foundlength = (int) strlen(&(formatstr[strpos])); /* flawfinder: ignore */ - /* flawfinder: formatstr is explicitly \0-terminated. */ + foundlength = (int) strlen(&(format_used[strpos])); /* flawfinder: ignore */ + /* flawfinder: format_used is explicitly \0-terminated. */ } else { - foundlength = searchptr - &(formatstr[strpos]); + foundlength = searchptr - &(format_used[strpos]); } seg_type = PV_COMPONENT_STRING; @@ -583,12 +585,12 @@ static void pv__format_init(pvstate_t state) } if (seg_type != PV_COMPONENT_STRING) - state->display.component[seg_type].required = true; + display->component[seg_type].required = true; - state->display.format[segment].type = seg_type; - state->display.format[segment].str_start = str_start; - state->display.format[segment].str_length = str_length; - state->display.format_segment_count++; + display->format[segment].type = seg_type; + display->format[segment].str_start = str_start; + display->format[segment].str_length = str_length; + display->format_segment_count++; } } @@ -604,44 +606,46 @@ static long bound_long(long x, long min, long max) /* - * Update state->display.display_buffer with status information formatted + * Update display->display_buffer with status information formatted * according to the state held within the given structure. * + * If "reinitialise" is true, the format string is reparsed first. This + * should be true for the first call, and true whenever the format is + * changed. + * * If "final" is true, this is the final update so the rate is given as an * an average over the whole transfer; otherwise the current rate is shown. * * Returns true if the display buffer can be used, false if not. * * When returning true, this function will have also set - * state->display.display_string_len to the length of the string in - * state->display.display_buffer, in bytes. + * display->display_string_len to the length of the string in + * display->display_buffer, in bytes. */ -bool pv_format(pvstate_t state, bool final) +bool pv_format(pvstate_t state, /*@null@ */ const char *format_supplied, pvdisplay_t display, bool reinitialise, + bool final) { long eta; int static_portion_size; pv_display_component component_type; size_t segment; size_t new_display_string_len; - const char *formatstr; + const char *format_used; pv__transfercount_t count_type; - /* Quick safety check - state must exist. */ + /* Quick safety check - state and display must exist. */ if (NULL == state) return false; + if (NULL == display) + return false; - /* - * If the display options need reparsing, do so to generate new - * formatting parameters. - */ - if (0 != state->flag.reparse_display) { - pv__format_init(state); - state->flag.reparse_display = 0; - } + /* Reinitialise if we were asked to. */ + if (reinitialise) + pv__format_init(state, format_supplied, display); /* The format string is needed for the static segments. */ - formatstr = state->control.format_string ? state->control.format_string : state->control.default_format; - if (NULL == formatstr) + format_used = NULL == format_supplied ? state->control.default_format : format_supplied; + if (NULL == format_used) return false; /* Determine the type of thing being counted for transfer, rate, etc. */ @@ -654,17 +658,16 @@ bool pv_format(pvstate_t state, bool final) /* * Reallocate output buffer if width changes. */ - if (state->display.display_buffer != NULL - && state->display.display_buffer_size < (size_t) ((state->control.width * 2))) { - free(state->display.display_buffer); - state->display.display_buffer = NULL; - state->display.display_buffer_size = 0; + if (display->display_buffer != NULL && display->display_buffer_size < (size_t) ((state->control.width * 2))) { + free(display->display_buffer); + display->display_buffer = NULL; + display->display_buffer_size = 0; } /* * Allocate output buffer if there isn't one. */ - if (NULL == state->display.display_buffer) { + if (NULL == display->display_buffer) { char *new_buffer; size_t new_size; @@ -677,13 +680,13 @@ bool pv_format(pvstate_t state, bool final) if (NULL == new_buffer) { pv_error(state, "%s: %s", _("buffer allocation failed"), strerror(errno)); state->status.exit_status |= PV_ERROREXIT_MEMORY; - state->display.display_buffer = NULL; + display->display_buffer = NULL; return false; } - state->display.display_buffer = new_buffer; - state->display.display_buffer_size = new_size; - state->display.display_buffer[0] = '\0'; + display->display_buffer = new_buffer; + display->display_buffer_size = new_size; + display->display_buffer[0] = '\0'; } /* @@ -713,14 +716,14 @@ bool pv_format(pvstate_t state, bool final) show_percentage = true; msg_timer[0] = '\0'; - if (state->display.component[PV_COMPONENT_TIMER].required) { + if (display->component[PV_COMPONENT_TIMER].required) { (void) pv_snprintf(msg_timer, sizeof(msg_timer), "%s%.4Lf", first_item ? "" : " ", state->transfer.elapsed_seconds); first_item = false; } msg_bytes[0] = '\0'; - if (state->display.component[PV_COMPONENT_BYTES].required) { + if (display->component[PV_COMPONENT_BYTES].required) { (void) pv_snprintf(msg_bytes, sizeof(msg_bytes), "%s%lld", first_item ? "" : " ", (long long) ((state->control.bits ? 8 : 1) * state->transfer.transferred)); @@ -729,7 +732,7 @@ bool pv_format(pvstate_t state, bool final) } msg_rate[0] = '\0'; - if (state->display.component[PV_COMPONENT_RATE].required) { + if (display->component[PV_COMPONENT_RATE].required) { (void) pv_snprintf(msg_rate, sizeof(msg_rate), "%s%.4Lf", first_item ? "" : " ", ((state->control.bits ? 8.0 : 1.0) * state->calc.transfer_rate)); @@ -744,11 +747,11 @@ bool pv_format(pvstate_t state, bool final) first_item = false; } - (void) pv_snprintf(state->display.display_buffer, - state->display.display_buffer_size, "%.39s%.39s%.39s%.39s\n", msg_timer, msg_bytes, + (void) pv_snprintf(display->display_buffer, + display->display_buffer_size, "%.39s%.39s%.39s%.39s\n", msg_timer, msg_bytes, msg_rate, msg_percent); - state->display.display_string_len = strlen(state->display.display_buffer); /* flawfinder: ignore */ + display->display_string_len = strlen(display->display_buffer); /* flawfinder: ignore */ /* flawfinder: always \0 terminated by pv_snprintf(). */ return true; @@ -771,7 +774,7 @@ bool pv_format(pvstate_t state, bool final) struct tm *time_ptr; char *time_format; - if (!state->display.component[component_type].required) + if (!display->component[component_type].required) continue; /* @@ -781,12 +784,12 @@ bool pv_format(pvstate_t state, bool final) */ if (state->control.size < 1 && ((component_type == PV_COMPONENT_ETA) || (component_type == PV_COMPONENT_FINETA))) { - state->display.component[component_type].content[0] = '\0'; - state->display.component[component_type].length = 0; + display->component[component_type].content[0] = '\0'; + display->component[component_type].length = 0; continue; } - component_content = state->display.component[component_type].content; + component_content = display->component[component_type].content; component_content[0] = '\0'; component_buf_size = PV_SIZEOF_COMPONENT_STR; @@ -879,8 +882,8 @@ bool pv_format(pvstate_t state, bool final) case PV_COMPONENT_ETA: /* Estimated time remaining until completion - if size is known. */ eta = - pv__seconds_remaining((state->transfer.transferred - state->display.initial_offset), - state->control.size - state->display.initial_offset, + pv__seconds_remaining((state->transfer.transferred - display->initial_offset), + state->control.size - display->initial_offset, state->calc.current_avg_rate); /* @@ -934,8 +937,8 @@ bool pv_format(pvstate_t state, bool final) */ eta = - pv__seconds_remaining(state->transfer.transferred - state->display.initial_offset, - state->control.size - state->display.initial_offset, + pv__seconds_remaining(state->transfer.transferred - display->initial_offset, + state->control.size - display->initial_offset, state->calc.current_avg_rate); /* @@ -1012,9 +1015,9 @@ bool pv_format(pvstate_t state, bool final) case PV_COMPONENT_OUTPUTBUF: /* Recently transferred bytes. */ - for (buf_idx = 0; buf_idx < state->display.lastoutput_length; buf_idx++) { + for (buf_idx = 0; buf_idx < display->lastoutput_length; buf_idx++) { int display_char; - display_char = (int) (state->display.lastoutput_buffer[buf_idx]); + display_char = (int) (display->lastoutput_buffer[buf_idx]); component_content[buf_idx] = isprint(display_char) ? (char) display_char : '.'; } component_content[buf_idx] = '\0'; @@ -1025,7 +1028,7 @@ bool pv_format(pvstate_t state, bool final) } /* Record the string length for this component. */ - state->display.component[component_type].length = strlen(component_content); /* flawfinder: ignore */ + display->component[component_type].length = strlen(component_content); /* flawfinder: ignore */ /* flawfinder: always bounded by \0 either explicitly or by pv_snprintf(). */ } @@ -1036,11 +1039,11 @@ bool pv_format(pvstate_t state, bool final) * (i.e. the progress bar). */ static_portion_size = 0; - for (segment = 0; segment < state->display.format_segment_count; segment++) { - if (state->display.format[segment].type == PV_COMPONENT_STRING) { - static_portion_size += state->display.format[segment].str_length; - } else if (state->display.format[segment].type != PV_COMPONENT_PROGRESS) { - static_portion_size += state->display.component[state->display.format[segment].type].length; + for (segment = 0; segment < display->format_segment_count; segment++) { + if (display->format[segment].type == PV_COMPONENT_STRING) { + static_portion_size += display->format[segment].str_length; + } else if (display->format[segment].type != PV_COMPONENT_PROGRESS) { + static_portion_size += display->component[display->format[segment].type].length; } } @@ -1049,13 +1052,13 @@ bool pv_format(pvstate_t state, bool final) /* * Assemble the progress bar now we know how big it should be. */ - if (state->display.component[PV_COMPONENT_PROGRESS].required) { + if (display->component[PV_COMPONENT_PROGRESS].required) { char *component_content; size_t component_buf_size; char after_bar[32]; /* flawfinder: ignore - only populated by pv_snprintf(). */ int available_width, bar_length, pad_count; - component_content = state->display.component[PV_COMPONENT_PROGRESS].content; + component_content = display->component[PV_COMPONENT_PROGRESS].content; component_content[0] = '\0'; component_buf_size = PV_SIZEOF_COMPONENT_STR; @@ -1179,16 +1182,16 @@ bool pv_format(pvstate_t state, bool final) } /* Record the string length for this component. */ - state->display.component[PV_COMPONENT_PROGRESS].length = strlen(component_content); /* flawfinder: ignore */ + display->component[PV_COMPONENT_PROGRESS].length = strlen(component_content); /* flawfinder: ignore */ /* flawfinder: always bounded with \0 by pv_strlcat(). */ /* * If the progress bar won't fit, drop it. */ - if ((unsigned int) (state->display.component[PV_COMPONENT_PROGRESS].length + static_portion_size) > + if ((unsigned int) (display->component[PV_COMPONENT_PROGRESS].length + static_portion_size) > state->control.width) { component_content[0] = '\0'; - state->display.component[PV_COMPONENT_PROGRESS].length = 0; + display->component[PV_COMPONENT_PROGRESS].length = 0; } } @@ -1196,18 +1199,18 @@ bool pv_format(pvstate_t state, bool final) * We can now build the output string using the format structure. */ - memset(state->display.display_buffer, 0, state->display.display_buffer_size); + memset(display->display_buffer, 0, display->display_buffer_size); new_display_string_len = 0; - for (segment = 0; segment < state->display.format_segment_count; segment++) { + for (segment = 0; segment < display->format_segment_count; segment++) { const char *segment_content; size_t segment_length; - if (state->display.format[segment].type == PV_COMPONENT_STRING) { - segment_content = &(formatstr[state->display.format[segment].str_start]); - segment_length = state->display.format[segment].str_length; + if (display->format[segment].type == PV_COMPONENT_STRING) { + segment_content = &(format_used[display->format[segment].str_start]); + segment_length = display->format[segment].str_length; } else { - segment_content = state->display.component[state->display.format[segment].type].content; - segment_length = state->display.component[state->display.format[segment].type].length; + segment_content = display->component[display->format[segment].type].content; + segment_length = display->component[display->format[segment].type].length; } /* Skip empty segments. */ @@ -1218,8 +1221,8 @@ bool pv_format(pvstate_t state, bool final) * Truncate the segment if it would make the display string * overflow the buffer. */ - if (segment_length + new_display_string_len > state->display.display_buffer_size - 2) - segment_length = state->display.display_buffer_size - new_display_string_len - 2; + if (segment_length + new_display_string_len > display->display_buffer_size - 2) + segment_length = display->display_buffer_size - new_display_string_len - 2; if (segment_length < 1) break; @@ -1228,7 +1231,7 @@ bool pv_format(pvstate_t state, bool final) break; /* Append the segment to the output string. */ - strncat(state->display.display_buffer, segment_content, segment_length); /* flawfinder: ignore */ + strncat(display->display_buffer, segment_content, segment_length); /* flawfinder: ignore */ /* flawfinder: length is checked above, and buffer is \0 terminated already. */ new_display_string_len += segment_length; @@ -1237,7 +1240,7 @@ bool pv_format(pvstate_t state, bool final) debug("%s: %d", "display string length counted by format segments", (int) new_display_string_len); /* Recalculate display string length with strlen() in case of miscounting. */ - new_display_string_len = strlen(state->display.display_buffer); /* flawfinder: ignore */ + new_display_string_len = strlen(display->display_buffer); /* flawfinder: ignore */ /* flawfinder: \0 terminated by memset() above and then by segment bounds checking. */ debug("%s: %d", "display string length from strlen()", (int) new_display_string_len); @@ -1245,12 +1248,12 @@ bool pv_format(pvstate_t state, bool final) * If the size of our output shrinks, we need to keep appending * spaces at the end, so that we don't leave dangling bits behind. */ - if ((new_display_string_len < state->display.display_string_len) - && (state->control.width >= state->display.prev_screen_width)) { + if ((new_display_string_len < display->display_string_len) + && (state->control.width >= display->prev_screen_width)) { char spaces[32]; /* flawfinder: ignore - terminated, bounded */ int spaces_to_add; - spaces_to_add = (int) (state->display.display_string_len - new_display_string_len); + spaces_to_add = (int) (display->display_string_len - new_display_string_len); /* Upper boundary on number of spaces */ if (spaces_to_add > 15) { spaces_to_add = 15; @@ -1260,11 +1263,11 @@ bool pv_format(pvstate_t state, bool final) while (--spaces_to_add >= 0) { spaces[spaces_to_add] = ' '; } - (void) pv_strlcat(state->display.display_buffer, spaces, state->display.display_buffer_size); + (void) pv_strlcat(display->display_buffer, spaces, display->display_buffer_size); } - state->display.display_string_len = new_display_string_len; - state->display.prev_screen_width = state->control.width; + display->display_string_len = new_display_string_len; + display->prev_screen_width = state->control.width; return true; } @@ -1278,6 +1281,8 @@ bool pv_format(pvstate_t state, bool final) */ void pv_display(pvstate_t state, bool final) { + bool reinitialise = false; + if (NULL == state) return; @@ -1285,9 +1290,23 @@ void pv_display(pvstate_t state, bool final) pv_calculate_transfer_rate(state, final); - if (!pv_format(state, final)) + /* + * If the display options need reparsing, do so to generate new + * formatting parameters. + */ + if (0 != state->flag.reparse_display) { + reinitialise = true; + state->flag.reparse_display = 0; + } + + if (!pv_format(state, state->control.format_string, &(state->display), reinitialise, final)) return; + if (0 != state->control.extra_displays) { + if (!pv_format(state, state->control.extra_format_string, &(state->extra_display), reinitialise, final)) + return; + } + if (NULL == state->display.display_buffer) return; @@ -1307,4 +1326,23 @@ void pv_display(pvstate_t state, bool final) } debug("%s: [%s]", "display", state->display.display_buffer); + + if ((0 != (PV_DISPLAY_WINDOWTITLE & state->control.extra_displays)) + && (state->control.force || pv_in_foreground()) + && (NULL != state->extra_display.display_buffer) + ) { + pv_tty_write(state, "\e]2;", 4); + pv_tty_write(state, state->extra_display.display_buffer, state->extra_display.display_string_len); + pv_tty_write(state, "\e\\", 2); + state->extra_display.display_visible = true; + debug("%s: [%s]", "windowtitle display", state->extra_display.display_buffer); + } + + if ((0 != (PV_DISPLAY_PROCESSTITLE & state->control.extra_displays)) + && (NULL != state->extra_display.display_buffer) + ) { + setproctitle("%s", state->extra_display.display_buffer); + state->extra_display.display_visible = true; + debug("%s: [%s]", "processtitle display", state->extra_display.display_buffer); + } } diff --git a/src/pv/proctitle.c b/src/pv/proctitle.c new file mode 100644 index 0000000..59cf426 --- /dev/null +++ b/src/pv/proctitle.c @@ -0,0 +1,118 @@ +/* + * Functions for setting the process title. + * + * Copyright 2024 Andrew Wood + * + * License GPLv3+: GNU GPL version 3 or later; see `docs/COPYING'. + */ + +#include "config.h" +#include "pv.h" +#include +#include +#include +#include + +#if ! HAVE_SETPROCTITLE +extern char **environ; + +/*@null@*/ static char **base_argv = NULL; +static size_t space_available = 0; + + +/* + * Assuming the environment comes after the command line arguments, we make + * a duplicate of the environment array and all its values, so we can use + * the space the environment used to occupy for the process title. + * + * The logic for this was derived from util-linux-ng. + */ +/*@-mustfreefresh@ */ +/*@-nullstate@ */ +void initproctitle(int argc, char **argv) +{ + char **original_environment = environ; + char **new_environment; + size_t env_array_size, env_index; + + /* Find the number of entries in the environment array. */ + for (env_array_size = 0; environ[env_array_size] != NULL; env_array_size++) + continue; + + /* Allocate a new environment array. */ + new_environment = (char **) malloc(sizeof(char *) * (env_array_size + 1)); + if (NULL == new_environment) + return; + + /* Duplicate the strings in the environment. */ + for (env_index = 0; original_environment[env_index] != NULL; env_index++) { + new_environment[env_index] = pv_strdup(original_environment[env_index]); + if (NULL == new_environment[env_index]) + return; + } + new_environment[env_index] = NULL; + + base_argv = argv; + + /* Work out how much room we have. */ + if (env_index > 0) { + /* From argv[0] to the end of the last environment value. */ + space_available = (size_t) + (original_environment[env_index - 1] + strlen(original_environment[env_index - 1]) - argv[0]); /* flawfinder: ignore */ + } else if (argc > 0) { + /* No environment; from argv[0] to the end of the last argument. */ + space_available = (size_t) (argv[argc - 1] + strlen(argv[argc - 1]) - argv[0]); /* flawfinder: ignore */ + } + + /* + * flawfinder - we have to trust that the environment and argument + * strings are null-terminated, since that's what the OS is supposed + * to guarantee. + */ + + environ = new_environment; +} + +/*@+nullstate@ */ +/*@+mustfreefresh@ */ + + +/* + * Set the process title visible to ps(1), by overwriting argv[0] with the + * given printf() format string. + */ +void setproctitle(const char *format, ...) +{ + char title[1024]; /* flawfinder: ignore */ + size_t length; + va_list ap; + + /* flawfinder - buffer is zeroed and users of it are bounded. */ + + if (NULL == base_argv) + return; + + memset(title, 0, sizeof(title)); + + va_start(ap, format); + (void) vsnprintf(title, sizeof(title)-1, format, ap); /* flawfinder: ignore */ + va_end(ap); + + /* + * flawfinder - the format is explicitly caller-supplied. Callers + * of this function are all passing fixed format strings and not + * user-supplied formats. + */ + + length = strlen(title); /* flawfinder: ignore */ + /* flawfinder - we left a byte at the end to force null-termination. */ + + if (length > space_available - 2) + length = space_available - 2; + + (void) pv_snprintf(base_argv[0], space_available, "%s -- %s", PACKAGE_NAME, title); + if (space_available > length) + memset(base_argv[0] + length, 0, space_available - length); +} + +#endif diff --git a/src/pv/state.c b/src/pv/state.c index 149f3fa..1d47922 100644 --- a/src/pv/state.c +++ b/src/pv/state.c @@ -61,6 +61,9 @@ void pv_state_reset(pvstate_t state) state->display.initial_offset = 0; state->display.display_visible = false; + state->extra_display.initial_offset = 0; + state->extra_display.display_visible = false; + /* * Explicitly set important floating point values to 0, as memset() * is not recommended for this. @@ -190,6 +193,10 @@ void pv_state_free(pvstate_t state) free(state->display.display_buffer); state->display.display_buffer = NULL; + if (NULL != state->extra_display.display_buffer) + free(state->extra_display.display_buffer); + state->extra_display.display_buffer = NULL; + if (NULL != state->control.name) { free(state->control.name); state->control.name = NULL; @@ -200,6 +207,11 @@ void pv_state_free(pvstate_t state) state->control.format_string = NULL; } + if (NULL != state->control.extra_format_string) { + free(state->control.extra_format_string); + state->control.extra_format_string = NULL; + } + /*@-keeptrans@ */ if (NULL != state->transfer.transfer_buffer) free(state->transfer.transfer_buffer); @@ -427,6 +439,57 @@ void pv_state_format_string_set(pvstate_t state, /*@null@ */ const char *val) state->control.format_string = pv_strdup(val); } +void pv_state_extra_display_set(pvstate_t state, /*@null@ */ const char *val) +{ + const char *word_start; + size_t offset; + + if (NULL != state->control.extra_format_string) { + free(state->control.extra_format_string); + state->control.extra_format_string = NULL; + } + + state->control.extra_displays = 0; + if (NULL == val) + return; + + word_start = val; + while (NULL != word_start && '\0' != word_start[0]) { + offset = 0; + while ('\0' != word_start[offset] && ',' != word_start[offset] && ':' != word_start[offset]) + offset++; + if (((11 == offset) && (0 == strncmp(word_start, "windowtitle", 11))) + || ((6 == offset) && (0 == strncmp(word_start, "window", 6))) + ) { + debug("%s", "enabling windowtitle"); + state->control.extra_displays |= PV_DISPLAY_WINDOWTITLE; + } else if (((12 == offset) && (0 == strncmp(word_start, "processtitle", 12))) + || ((9 == offset) && (0 == strncmp(word_start, "proctitle", 9))) + || ((7 == offset) && (0 == strncmp(word_start, "process", 7))) + || ((4 == offset) && (0 == strncmp(word_start, "proc", 4))) + ) { + debug("%s", "enabling processtitle"); + state->control.extra_displays |= PV_DISPLAY_PROCESSTITLE; + } + switch (word_start[offset]) { + case ',': + offset++; + break; + case ':': + offset++; + debug("%s: [%s]", "setting extra_format_string", word_start + offset); + state->control.extra_format_string = pv_strdup(word_start + offset); + word_start = NULL; + break; + default: + word_start = NULL; + break; + } + if (NULL != word_start) + word_start += offset; + } +} + void pv_state_watch_pid_set(pvstate_t state, pid_t val) { state->control.watch_pid = val; diff --git a/tests/Memory_safety_-_Process_title.test b/tests/Memory_safety_-_Process_title.test new file mode 100755 index 0000000..d6b3b80 --- /dev/null +++ b/tests/Memory_safety_-_Process_title.test @@ -0,0 +1,30 @@ +#!/bin/sh +# +# Run valgrind's memory checker against a process that sets is process +# title. + +true "${sourcePath:?not set - call this from 'make check'}" +true "${testSubject:?not set - call this from 'make check'}" +true "${workFile1:?not set - call this from 'make check'}" +true "${workFile2:?not set - call this from 'make check'}" +true "${workFile3:?not set - call this from 'make check'}" +true "${workFile4:?not set - call this from 'make check'}" + +# Load the valgrind function. +. "${sourcePath}/tests/run-valgrind.sh" + +# Without an extra format string. +(dd if=/dev/zero bs=100 count=1 2>/dev/null; + sleep 1; + dd if=/dev/zero bs=110 count=1 2>/dev/null; + sleep 1; +) | { runWithValgrind -f -i 0.5 -a -x processtitle >/dev/null 2>"${workFile1}"; } 4>&1 || exit 1 + +# With an extra format string. +(dd if=/dev/zero bs=100 count=1 2>/dev/null; + sleep 1; + dd if=/dev/zero bs=110 count=1 2>/dev/null; + sleep 1; +) | { runWithValgrind -f -i 0.5 -a -x 'processtitle:%t %b' >/dev/null 2>"${workFile1}"; } 4>&1 || exit 1 + +exit 0 diff --git a/tests/run-valgrind.sh b/tests/run-valgrind.sh index 859da73..337000b 100755 --- a/tests/run-valgrind.sh +++ b/tests/run-valgrind.sh @@ -23,6 +23,7 @@ valgrindOutputFile="valgrind.out" true "${testSubject:?not set - call this from 'make check'}" true "${workFile4:?not set - call this from 'make check'}" +true "${workFile5:?not set - call this from 'make check'}" if ! command -v valgrind >/dev/null 2>&1; then echo "test requires \`valgrind'" @@ -36,9 +37,21 @@ done runWithValgrind () { + cat > "${workFile5}" < "${workFile4}" valgrind --tool=memcheck \ - --verbose --show-error-list=yes \ + --verbose \ + --show-error-list=yes \ + --suppressions="${workFile5}" \ --log-file="${workFile4}" \ --error-exitcode=125 \ --track-fds=yes \ diff --git a/tests/test-env.sh b/tests/test-env.sh index 6cd52aa..3dcfde1 100644 --- a/tests/test-env.sh +++ b/tests/test-env.sh @@ -22,9 +22,10 @@ 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" +workFile5=$(mktemp 2>/dev/null) || workFile4="./.tmp5" # Clean up the temporary files on exit, in case we are interrupted. -trap 'rm -f "${workFile1}" "${workFile2}" "${workFile3}" "${workFile4}"' EXIT +trap 'rm -f "${workFile1}" "${workFile2}" "${workFile3}" "${workFile4}" "${workFile5}"' EXIT # Variables used by the test scripts. -export testSubject sourcePath workFile1 workFile2 workFile3 workFile4 +export testSubject sourcePath workFile1 workFile2 workFile3 workFile4 workFile5