[Forensics-changes] [SCM] debian-forensics/dc3dd branch, debian, updated. upstream/6.12.3-26-g8601a6c

Christophe Monniez christophe.monniez at fccu.be
Thu Mar 17 14:56:32 UTC 2011


The following commit has been merged in the debian branch:
commit 112267936b5952371ad6ef7e279d2d03cd6b93f9
Author: Christophe Monniez <christophe.monniez at fccu.be>
Date:   Thu Mar 17 15:36:16 2011 +0100

    Merging upstream version 7.0.0.

diff --git a/.prev-version b/.prev-version
index f867e29..aea5e0b 100644
--- a/.prev-version
+++ b/.prev-version
@@ -1 +1 @@
-6.12.2
+6.12.5
diff --git a/.version b/.version
index ffd41f5..66ce77b 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-6.12.3
+7.0.0
diff --git a/ChangeLog b/ChangeLog
index bbabefd..bbaad77 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,50 @@
+2009-08-28 Richard Cordovano <rcordovano at users.sourceforge.net>
+
+	* Replaced the byte-by-byte verification capability with a verification capability that
+     hashes imaging outputs and compares the hashes to the input hash. The new verification capability
+     does not require a second read of the device.
+	* Enhanced the ability to generate multiple outputs by adding the capability to combine split and unsplit
+     outputs.
+	* Added the ability for the user to specify a sector size via the command line.
+	* Added display/logging of results of device size probes. Size probes are now always performed, providing
+     run statistics in most use cases (reading from standard input excepted). 
+	* Added display/logging of size statistics for each file in an input or output split.
+	* Simplified the command line options and removed all legacy dd features not needed for imaging. The simplified
+     command line is more rigorously validated to reduce the likelihood of performing a run contrary to user 
+     intent in order to avoid a second read of a device.
+	* Removed the progress=on command line option and the cumbersome INFO signaling protocol for 
+     obtaining a progress report. Instead, a progress bar is always displayed.
+	* Added new DEFAULT_IMAGING_MODE compile flag support (equivalent to command line options:
+     recovererrs=on, grouperrs=on, idirect=on).
+	* Reduced the use of global variables from 71 to 9, reduced function lengths, and
+     removed several instances of code duplication. 
+	* Introduced a program architecture that replaces a single loop with a jobs abstraction, allowing execution
+     of an arbitrary chain of jobs, each composed of one or more tasks that execute in parallel. The new
+     program architecture is designed to allow for the transparent addition of multi-step processing
+     scenarios such as the new verification capability.      
+	         
+
+2009-05-11 Richard Cordovano <rcordovano at users.sourceforge.net>
+
+     * Added ability to generate multiple outputs simultaneously by supporting multiple
+       of, vf, and vfjoin command line arguments.
+
+2009-04-01 Andrew Medico <amedico at users.sourceforge.net>
+
+	* Put hashing and disk I/O into dedicated threads to increase
+	  throughput.
+
+	  As a side effect, removed cbs and conv=ascii/ebcdic/ibm/(un)block/lcase/swab
+	  command-line options since they don't apply to the goal of disk imaging.
+
+	  Also removed hashconv option and set behavior to hashconv=after.
+
+
+2009-03-24 Andrew Medico <amedico at users.sourceforge.net>
+
+	* Added ability to detect HPA / DCO hidden areas on ATA drives (Linux only)
+
+
 2009-03-16 Andrew Medico <amedico at users.sourceforge.net>
 
 	* Fix hashwindow - result buffer was too small, causing incorrect
diff --git a/Makefile.in b/Makefile.in
index 5b10280..073c028 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -102,9 +102,10 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/alloca.m4 \
 	$(top_srcdir)/m4/gnulib-common.m4 \
 	$(top_srcdir)/m4/gnulib-comp.m4 \
 	$(top_srcdir)/m4/hard-locale.m4 $(top_srcdir)/m4/hash.m4 \
-	$(top_srcdir)/m4/host-os.m4 $(top_srcdir)/m4/human.m4 \
-	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/iconv_h.m4 \
-	$(top_srcdir)/m4/iconv_open.m4 $(top_srcdir)/m4/idcache.m4 \
+	$(top_srcdir)/m4/hdparm.m4 $(top_srcdir)/m4/host-os.m4 \
+	$(top_srcdir)/m4/human.m4 $(top_srcdir)/m4/iconv.m4 \
+	$(top_srcdir)/m4/iconv_h.m4 $(top_srcdir)/m4/iconv_open.m4 \
+	$(top_srcdir)/m4/idcache.m4 \
 	$(top_srcdir)/m4/include-exclude-prog.m4 \
 	$(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/inline.m4 \
 	$(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax_t.m4 \
@@ -617,6 +618,7 @@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
 U = @U@
 UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@
 UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@
+USE_HDPARM = @USE_HDPARM@
 USE_NLS = @USE_NLS@
 VERSION = @VERSION@
 VOID_UNSETENV = @VOID_UNSETENV@
diff --git a/NEWS b/NEWS
index 77cd69a..2032765 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,37 @@
 dc3dd NEWS
 
-* Noteworth changes in release 6.12.3 (2009-03-17)
+* Noteworthy changes in release 7.0.0 (2009-09)
+
+** New Features
+
+   Verification hashes
+   Simplified command line
+   Can mix split and unsplit outputs
+   User-defined sector size
+   Display/logging enhancements
+   More compiled in options support
+
+* Noteworthy changes in release 6.12.5 (2009-05)
+
+** New Features
+
+   Added multiple outputs
+
+* Noteworthy changes in release 6.12.4 (2009-04)
+
+** New Features
+
+   Added HPA/DCO detection capability
+
+   Added multithreading for hashing and disk I/O to increase throughput
+
+** Notes
+
+   Removed obs option, and conv ascii,ebcdic,ibm,block,unblock,lcase,swab options
+
+   Removed hashconv option and set behavior to hashconv=after
+
+* Noteworthy changes in release 6.12.3 (2009-03-17)
 
 ** New features
 
diff --git a/Options_Reference.txt b/Options_Reference.txt
index b993f36..958237a 100644
--- a/Options_Reference.txt
+++ b/Options_Reference.txt
@@ -1,118 +1,165 @@
-  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input sector size)
-  obs=BYTES       write BYTES bytes at a time
-  bs=BYTES        force ibs=BYTES and obs=BYTES
-
-
-  conv=CONVS      convert the file as per the comma separated symbol list
-
-  count=SECTORS   copy only SECTORS input sectors
-  seek=SECTORS    skip SECTORS input sectors at start of output
-  skip=SECTORS    skip SECTORS input sectors at start of input
-                  (based on the device's reported sector size)
-
-  if=FILE         read from FILE instead of stdin
-  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT
-
-  iflag=FLAGS     read as per the comma separated symbol list
-
-
-  pattern=HEX     write HEX to every byte of the output
-
-  textpattern=TEXT write the string TEXT repeatedly to the output
-
-
-  of=FILE         write to FILE instead of stdout
-  of:=COMMAND     pipe output to the given command
-
-  oflag=FLAGS     write as per the comma separated symbol list
-
-
-  split=BYTES     split the output into pieces of size BYTES
-                  Note: BYTES must be a multiple of the device sector size.
-
-  splitformat=FMT create extensions for split pieces using FMT
-                  Extensions can be numerical starting at zero,
-                  numerical starting at one, or alphabetical.
-                  These options are selected by using a series of
-                  zeros, ones, or a's, respectively. The number
-                  of characters used indicates the desired length of
-                  the extensions. For example, splitformat=1111
-                  indicates four character numerical extensions
-                  starting with 0001.
-
-  vf=FILE         verify the input against FILE
-  vfjoin=BASE.FMT verify the input against split files with name BASE and splitformat FMT
-  verifylog=FILE  write the results of the verify to the given file
-
-  progress=on     displays a progress meter
-  progresscount=NUM number of blocks processed between each progress update
-                  Note: excessively frequent progress updates will reduce
-                  transfer rates. NUM should be chosen to cause updates at most
-                  a few times per second.
-
-  status=noxfer   suppress transfer statistics
-
-  sizeprobe=on    estimates size of input file for use with status
-
-  hash=ALGORITHM  computes ALGORITHM hashes of the input data
-  hashconv=WHEN   determines when data should be hashed, either before
-                  or after conversions
-  hashwindow=BYTES  number of bytes for piecewise hashing
-  hashlog=FILE    appends piecewise hashes to the log file
-
-  errlog=FILE     appends errors to the log file
-
-  log=FILE        appends hashes and errors to the same file
-
-  errors=group    group read errors together
-
-  
-
-ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512
-
-
-BLOCKS and BYTES may be followed by the following multiplicative suffixes:
-xM M, c 1, w 2, b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,
-GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.
-
-Each CONV symbol may be:
-
-  nocreat   do not create the output file
-  excl      fail if the output file already exists
-  notrunc   do not truncate the output file
-  ucase     change lower case to upper case
-  swab      swap every pair of input bytes
-  noerror   continue after read errors
-  sync      pad every input block with NULs to ibs-size; when used
-            with block or unblock, pad with spaces rather than NULs
-  fdatasync  physically write output file data before finishing
-  fsync     likewise, but also write metadata
-
-Each FLAG symbol may be:
-
-  append    append mode (makes sense only for output; conv=notrunc suggested)
-  direct    use direct I/O for data
-  directory fail unless a directory
-  dsync     use synchronized I/O for data
-  sync      likewise, but also for metadata
-  nonblock  use non-blocking I/O
-  noatime   do not update access time
-  noctty    do not assign controlling terminal from file
-  nofollow  do not follow symlinks
-
-Sending a USR1 signal to a running `dd' process makes it
-print I/O statistics to standard error and then resume copying.
-
-  $ dd if=/dev/zero of=/dev/null& pid=$!
-  $ kill -USR1 $pid; sleep 1; kill $pid
-  18335302+0 sectors in
-  18335302+0 sectors out
-  9387674624 bytes (9.4 GB) copied, 34.6279 seconds, 271 MB/s
-
-Options are:
-
-      --help     display this help and exit
-      --version  output version information and exit
-      --flags    display compile-time flags
-
-Report bugs to <dc3dd at dc3.mil>.
+-----
+usage:
+-----
+
+	./dc3dd [OPTION 1] [OPTION 2] ... [OPTION N]
+
+		*or*
+
+	./dc3dd [HELP OPTION]
+
+	where each OPTION is selected from the basic or advanced
+	options listed below, or HELP OPTION is selected from the
+	help options listed below.
+
+--------------
+basic options:
+--------------
+
+	if=FILE              Read input from the device or regular file FILE
+	                     (see note #1 below). This option can only be used
+	                     once and cannot be combined with ifs=, pat=,
+	                     or tpat=.
+	ifs=BASE.FMT         Read input from a set of files with base name
+	                     BASE and sequential file name extensions
+	                     conforming to the format specifier FMT (see
+	                     note #4 below). This option can only be used once
+	                     and cannot be combined with if=, pat=, or
+	                     tpat=.
+	of=FILE              Write output to FILE (see note #2 below). This
+	                     option can be used more than once (see note #3
+	                     below).
+	hof=FILE             Write output to FILE and verify FILE after
+                             writing it by hashing it and comparing the output
+                             hash(es) to the input hash(es). This option can be
+                             used more than once (see note #3 below).
+	ofs=BASE.FMT         Write output to a set of files with base name BASE
+	                     and sequential file name extensions generated from
+	                     the format specifier FMT (see note #4 below).  This
+	                     option can be used more than once (see note #3
+	                     below). Specify the maximum size of each file
+	                     in the set using ofsz=.
+	hofs=BASE.FMT        Write output to a set of files with base name BASE
+	                     and sequential file name extensions generated from
+	                     the format specifier FMT (see note #4 below).
+	                     Verify the files after writing them by hashing
+	                     them and comparing the output hash(es) to the input
+	                     hash(es). This option can be used more than once
+	                     (see note #3 below). Specify the maximum size of
+	                     each file in the set using ofsz=.
+	ofsz=BYTES           Set the maximum size of each file in the sets of
+	                     files specified using ofs= or hofs= to
+	                     BYTES (see note #5 below). A default value for
+	                     this option may be set at compile time using
+	                     -DDEFAULT_OUTPUT_FILE_SIZE followed by the desired
+	                     value in BYTES.
+	hash=ALGORITHM       Compute an ALGORITHM hash of the input and also
+	                     of any outputs specified using hof= or hofs=,
+	                     where ALGORITHM is one of md5, sha1, sha256, or
+	                     sha512. This option may be used once for each
+	                     supported ALGORITHM. Alternatively, hashing can
+	                     be activated at compile time using one or more of
+	                     -DDEFAULT_HASH_MD5,-DDEFAULT_HASH_SHA1,
+	                     -DDEFAULT_HASH_SHA256, and -DDEFAULT_HASH_SHA512.
+	log=FILE             Log I/O statistcs, diagnostics, and total hashes
+	                     of input and output to FILE. If hlog= is not
+	                     specified, piecewise hashes of multiple file
+	                     input and output are also logged to FILE.
+	hlog=FILE            Log total hashes and piecewise hashes to FILE.
+
+-----------------
+advanced options:
+-----------------
+
+	rec=off              By default, zeros are written to the output(s) in
+	                     place of bad sectors when the input is a device.
+	                     Use this option to cause the program to instead
+	                     exit when a bad sector is encountered.
+	wipe=DEVICE          Wipe DEVICE by writing zeros (default) or a
+	                     pattern specified by pat= or tpat=.
+	vwipe=DEVICE         Wipe DEVICE by writing zeros (default) or a
+	                     pattern specified by pat= or tpat=.
+	                     Verify DEVICE after writing it by hashing it
+	                     and comparing the hash(es) to the input hash(es).
+	pat=HEX              Use pattern as input, writing HEX to every byte
+	                     of the output. This option can only be used once
+	                     and cannot be combined with if=, ifs=, or
+	                     tpat=.
+	tpat=TEXT            Use text pattern as input, writing the string TEXT
+	                     repeatedly to the output. This option can only be
+	                     used once and cannot be combined with if=, ifs=,
+	                     or pat=.
+	cnt=SECTORS          Input only SECTORS input sectors. Must be used with
+	                     pat= or tpat= if not using the pattern
+	                     with wipe= or vwipe= to wipe a device.
+	iskip=SECTORS        Skip SECTORS sectors at start of the input device
+	                     or file.
+	oskip=SECTORS        Skip SECTORS sectors at start of the output
+	                     file. Specifying oskip= automatically 
+	                     sets app=on.
+	app=on               Do not overwrite an output file specified with
+	                     of= if it already exists, appending output instead.
+	ssz=BYTES            Unconditionally use BYTES (see note #5 below) bytes
+	                     for sector size. If ssz= is not specified,
+	                     sector size is determined by probing the device;
+	                     if the probe fails or the target is not a device,
+	                     a sector size of 512 bytes is assumed.
+	bufsz=BYTES          Set the size of the internal byte buffers to BYTES
+	                     (see note #5 below). This effectively sets the
+	                     maximum number of bytes that may be read at a time
+	                     from the input. BYTES must be a multiple of sector
+	                     size. Use this option to fine-tune performance.
+	verb=on              Activate verbose reporting, where sectors in/out
+	                     are reported for each file in sets of files
+	                     specified using ifs=, ofs=, or hofs=.
+	                     Alternatively, verbose reporting may be
+	                     activated at compile time using
+	                     -DDEFAULT_VERBOSE_REPORTING.
+	nwspc=on             Activate compact reporting, where the use
+	                     of white space to divide log output into
+	                     logical sections is suppressed. Alternatively,
+	                     compact reporting may be activated at compile
+	                     time using -DDEFAULT_COMPACT_REPORTING.
+	b10=on               Activate base 10 bytes reporting, where the
+	                     progress display reports 1000 bytes instead
+	                     of 1024 bytes as 1 KB. Alternatively, base 10
+	                     bytes reporting may be activated at compile
+	                     time using -DDEFAULT_DECIMAL_BYTES_REPORTING.
+	corruptoutput=on     For verification testing and demonstration
+	                     purposes, corrupt the output file(s) with extra
+	                     bytes so a hash mismatch is guaranteed.
+
+-------------
+help options:
+-------------
+
+      --help     display this help and exit
+      --version  output version information and exit
+      --flags    display compile-time flags and exit
+
+------
+notes:
+------
+
+1. To read from stdin, do not specify if=, ifs=, pat=, or tpat=.
+2. To write to stdout, do not specify of=, hof=, ofs=, hofs=, wipe=,
+   or vwipe=.
+3. To write to multiple outputs specify more than one of of=, hof=, ofs=,
+   or hofs=, in any combination.
+4. FMT is a pattern for a sequence of file extensions that can be numerical
+   starting at zero, numerical starting at one, or alphabetical. Specify FMT
+   by using a series of zeros, ones, or a's, respectively. The number of
+   characters used indicates the desired length of the extensions.
+   For example, a FMT specifier of 1111 indicates four character
+   numerical extensions starting with 0001.
+5. BYTES may be followed by the following multiplicative suffixes:
+   c (1), w (2), b (512), kB (1000), K (1024), MB (1000*1000),
+   M (1024*1024), GB (1000*1000*1000), G (1024*1024*1024), and
+   so on for T, P, E, Z, and Y.
+6. Consider using cnt=, iskip= and oskip= to work around
+   unreadable sectors if error recovery fails.
+7. Sending an interrupt (e.g., CTRL+C) to dc3dd will cause
+   the program to report the work completed at the time
+   the interrupt is received and then exit.
+
+Report bugs to <dc3dd at dc3.mil>.
diff --git a/README b/README
index d7c2e9f..77b4c7f 100644
--- a/README
+++ b/README
@@ -1,149 +1,105 @@
-dc3dd 6.12.3
-DCCI 
-Andrew Medico
-2008-12-03
-
-
-New Features:
-
-
-Error Recovery:
-dc3dd 6.12 includes a new dynamic error recovery mode. dc3dd now reads large
-blocks (32KB) by default, which results in much higher transfer rates.
-When an error is encountered, dc3dd no longer drops the entire block but instead
-goes back to the beginning of the block and reads one sector at a time to recover
-all the valid data on the drive.
-
-* The mode is automatically enabled when the "conv=noerror,sync" command line
-  option is used. In order to make recovery effective, OS read caching must
-  be disabled by:
-
-  Linux / Unix / Cygwin (Windows):
-  Add the "iflag=direct" command line option, or "-DDEFAULT_IFLAG_DIRECT" compile option.
-
-  Mac OS X:
-  Use /dev/rdisk* instead of /dev/disk*
- 
-* "conv=sync,noerror" must also be present in command line.
-
-Example Command Line:
-# dc3dd if=/dev/sda of=sda.img conv=sync,noerror iflag=direct bs=262144 hash=md5,sha1 log=sda_log.txt
-
-
-
-Default Block Size:
-* The new default block size is 32KB (32,768 bytes).
-
-* The default block size may be overridden by the "bs=X" command line option
-  or the "-DDEFAULT_BLOCKSIZE=X" compile option.
-
-
-
-Sector Input/Output:
-* Errors messages now report absolute sector addresses, based on the device's
-  reported sector size.
-
-* The "count=X", "skip=X", and "seek=X" options all take sector counts.
-
-
-
-Built-in Join:
-dc3dd can now automatically join split files, for verification or input/output.
-
-Split output to CD-size images:
-# dc3dd if=/dev/sda of=sda.cd_size.img split=650M splitformat=000
-
-# Verify split output against source device:
-# dc3dd if=/dev/sda vfjoin=sda.cd_size.img.000
-
-# Read in split files and re-output to DVD-size images:
-# dc3dd ifjoin=sda.cd_size.img.000 of=sda.dvd_size.img split=4700M splitformat=000
-
-
-
-Building dc3dd:
-
-dc3dd is distributed as source code and must be compiled before use.
-The default configuration can be built and installed to /usr/local/bin
-with the following commands:
-
-$ tar zxvf dc3dd-6.12.3.tar.gz
-$ cd dc3dd-6.12.3
-$ ./configure
-$ make
-$ sudo make install
-
-
-Note: dependencies autoconf-1.10.1 and gperf may need to be installed
-
-Custom Configuration:
-
-dc3dd can be customized at compile-time with various options.
-The available options are as follows:
-
-(Unless otherwise noted, compile-time options can be overridden
-by their command-line equivalents)
-
--DDEFAULT_BLOCKSIZE=bytes
-equivalent to bs=BYTES command-line option
-
--DDEFAULT_HASH_MD5
--DDEFAULT_HASH_SHA1
--DDEFAULT_HASH_SHA256
--DDEFAULT_HASH_SHA512
-equivalent to hash={md5,sha1,sha256,sha512}
-
--DDEFAULT_HASHCONV_AFTER
-equivalent to hashconv=after
-
--DDEFAULT_HASHCONV_BEFORE
-equivalent to hashconv=before
-
--DDEFAULT_SIZEPROBE
-equvalent to sizeprobe=on
-Cannot be overridden via command-line
-
--DDEFAULT_PROGRESS
-equivalent to progress=on
-Cannot be overridden via command-line
-
--DDEFAULT_PROGRESSCOUNT=blocks
-equivalent to progresscount=BLOCKS
-
--DDEFAULT_IFLAG_DIRECT
-equivalent to iflag=direct
-Cannot be overridden via command-line
-
-These options are enabled by including them in the CFLAGS argument to configure.
-For example, to enable MD5 hashing and progress display:
-
-$ ./configure CFLAGS="-O2 -DDEFAULT_HASH_MD5 -DDEFAULT_PROGRESS -DDEFAULT_PROGRESSCOUNT=1000"
-
-
-Static Compilation:
-The program can be statically linked by adding "-static" to the CFLAGS
-compile options:
-
-$ ./configure CFLAGS="-O2 -static"
-
-
-
-Portability Notes:
-
-Mac OS X:
-* iflag=direct is not available. Instead, use /dev/rdisk* (vs. /dev/disk*)
-
-Windows:
-* dc3dd can be compiled using Cygwin, but bad sectors can put the program into
-  an infinite loop due to bugs in Cygwin.
-
-Performance Notes:
-
-* When using the progress display (progress=on / DEFAULT_PROGRESS),
-  it is important to set the progresscount to a sufficiently large value.
-  Setting a value that is too small will cause excessively frequent updates
-  and limit throughput. The best value will depend on the block size used and
-  the transfer rate of the drives/interfaces.
-
-Please send all correspondence to: dc3dd at dc3.mil
-
+dc3dd 7.0.0
+DCCI 
+Richard Cordovano
+2009-09-11
+
+New Features:
+-------------
+The command line options supported by dc3dd are significantly changed in
+7.0.0. For a full listing of the command line options, please consult
+Options_Reference.txt or execute dc3dd using the --help option:
+
+$ ./dc3dd --help 
+
+The command line is now more rigorously validated to reduce the
+likelihood of performing a run contrary to user intent. This is done
+to minimize reading of the input device. Examples of command lines for
+common uses of dc3dd are provided in Sample_Commands.txt.  
+
+Release 7.0.0 replaces the byte-by-byte comparison verification
+capability of prior releases with a verification capability that hashes
+imaging outputs and compares output hash(es) to input hash(es). This
+new verification capability does not require a second read of the input
+device. 
+
+It is now possible to specify more than one output file and to mix split
+and unsplit outputs, where splitting an output refers to writing to a
+set of files rather than to a single file.
+
+Devices are now always probed for size, and the size of the device in 
+sectors and sector size is reported. It is however, also now possible to
+explicitly specify the sector size dc3dd is to use, overriding the
+probed sector size (for devices) or assumed sector size (for files).  
+
+Progress display is now always on and various options for formatting
+output are now provided.
+
+Building dc3dd:
+---------------
+dc3dd is distributed as source code and must be compiled before use.
+The default configuration can be built and installed to /usr/local/bin
+with the following commands:
+
+$ tar zxvf dc3dd-7.0.0.tar.gz
+$ cd dc3dd-7.0.0
+$ ./configure
+$ make
+$ sudo make install
+
+Note that autoconf-1.10.1 and gperf may need to be installed prior to
+execution of the above commands.
+
+dc3dd can be customized at compile-time with various options.
+The available options are as follows, and can be verified after
+compilation using the --flags command line option: 
+
+-DDEFAULT_HASH_MD5
+(equivalent to hash=md5 command-line option)
+
+-DDEFAULT_HASH_SHA1
+(equivalent to hash=sha1 command-line option)
+
+-DDEFAULT_HASH_SHA256
+(equivalent to hash=sha256 command-line option)
+
+-DDEFAULT_HASH_SHA512
+(equivalent to hash=sha512 command-line option)
+
+-DDEFAULT_OUTPUT_FILE_SIZE=BYTES
+(equivalent to ofsz=BYTES command-line option)
+
+-DDEFAULT_VERBOSE_REPORTING
+(equivalent to verb=on command-line option)
+
+-DDEFAULT_COMPACT_REPORTING
+(equivalent to nwspc=on command-line option)
+
+-DDEFAULT_DECIMAL_BYTES_REPORTING
+(equivalent to dbr=on command-line option)
+
+--enable-hpadco
+Enable checking ATA/SATA drives for hidden areas
+No command-line equivalent, cannot be overridden.
+
+These options are enabled by including them in the CFLAGS argument to
+configure. For example, to enable MD5 hashing and default output file
+size:
+
+$ ./configure CFLAGS="-O2 -DDEFAULT_HASH_MD5 
+-DDEFAULT_OUTPUT_FILE_SIZE=1900M"
+
+The program can be statically linked by adding "-static" to the CFLAGS
+compile options:
+
+$ ./configure CFLAGS="-O2 -static"
+
+Portability Notes:
+------------------
+Mac OS X:
+To enable error recovery, use /dev/rdisk* instead of /dev/disk*
+
+Windows:
+dc3dd can be compiled using Cygwin, but bad sectors can put the program
+into an infinite loop due to bugs in Cygwin.
+
+Please send all correspondence to: dc3dd at dc3.mil
diff --git a/Sample_Commands.txt b/Sample_Commands.txt
index 4acd6b8..c76ea0e 100644
--- a/Sample_Commands.txt
+++ b/Sample_Commands.txt
@@ -1,49 +1,34 @@
-Examples:
-
-(assumes dc3dd compiled with: ./configure CFLAGS="-O2 -DDEFAULT_HASHCONV_AFTER")
-
-
-Imaging a hard drive to a single image file with logging and hashing:
-dc3dd if=/dev/sda of=suspect.img hash=md5,sha1 log=suspect.txt
-
-Imaging a hard drive to a single image file with logging and hashing, using a large block size:
-dc3dd if=/dev/sda of=suspect.img bs=262144 hash=md5,sha1 log=suspect.txt
-
-Imaging a hard drive with errors to a single image file with logging and hashing:
-dc3dd if=/dev/sda of=suspect.img conv=sync,noerror iflag=direct hash=md5,sha1 log=suspect.txt
-
-
-Imaging a hard drive to CD-sized split images with logging and hashing:
-dc3dd if=/dev/sda of=suspect.img split=650M splitformat=000 hash=md5,sha1 log=suspect.txt
-
-
-
-Verifying an acquired single image file:
-dc3dd if=/dev/sda vf=suspect.img log=suspect.txt
-
-Verifying an acquired split image:
-dc3dd if=/dev/sda vfjoin=suspect.img.000 log=suspect.txt
-
-
-
-Wiping a drive:
-dc3dd wipe=/dev/sdb log=wipe.txt
-
-Verifying a wipe:
-dc3dd pattern=00 vf=/dev/sdb log=wipe.txt
-
-
-
-Restoring a single image file to a blank drive:
-dc3dd if=suspect.img of=/dev/sdb hash=md5,sha1 log=suspect-restore.txt
-
-Restoring a split image to a blank drive:
-dc3dd ifjoin=suspect.img.000 of=/dev/sdb hash=md5,sha1 log=suspect-restore.txt
-
-
-
-Verifying a single image file restore:
-dc3dd if=suspect.img vf=/dev/sdb log=suspect-restore.txt
-
-Verifying a split image restore:
-dc3dd ifjoin=suspect.img.000 vf=/dev/sdb log=suspect-restore.txt
+Examples:
+--------
+Imaging a device to a single output file with generation of md5 and sha1
+hashes of the device:
+
+$ ./dc3dd if=/dev/sda of=suspect.img hash=md5 hash=sha1 log=suspect.txt
+
+Imaging a device to a set of CD-sized output files with generation of 
+md5 and and sha1 hashes of the device:
+
+$ ./dc3dd if=/dev/sda ofs=suspect.img.000 ofsz=650M hash=md5 hash=sha1
+log=suspect.txt
+
+Imaging a device to both a single output file and to a set of CD-sized
+output files with generation of md5 and sha1 hashes of the hard device:
+
+$ ./dc3dd if=/dev/sda of=suspect.img of=suspect.img ofs=suspect.img.000
+ofsz=650M hash=md5 hash=sha1 log=suspect.txt
+
+Imaging a device to both a single output file and to a set of CD-sized
+output files with generation of md5 and sha1 hashes of the hard device
+and md5 and sha1 hashes of the outputs:
+
+$ ./dc3dd if=/dev/sda of=suspect.img hof=suspect.img hofs=suspect.img.000
+ofsz=650M hash=md5 hash=sha1 log=suspect.txt
+
+Restoring a set of image files to a blank drive with verification hashes of the drive after it is written:
+$ ./dc3dd ifs=suspect.img.000 hof=/dev/sdb hash=md5 hash=sha1 log=suspect-restore.txt
+
+Wiping a drive:
+$ ./dc3dd wipe=/dev/sdb log=wipe.txt
+
+Wiping a drive with verification:
+$ ./dc3dd vwipe=/dev/sdb hash=md5 hash=sha1 log=wipe.txt
diff --git a/aclocal.m4 b/aclocal.m4
index 433fb40..bc45115 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1010,6 +1010,7 @@ m4_include([m4/gnulib-common.m4])
 m4_include([m4/gnulib-comp.m4])
 m4_include([m4/hard-locale.m4])
 m4_include([m4/hash.m4])
+m4_include([m4/hdparm.m4])
 m4_include([m4/host-os.m4])
 m4_include([m4/human.m4])
 m4_include([m4/iconv.m4])
diff --git a/configure b/configure
index d56c571..333de10 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61 for dc3dd 6.12.3.
+# Generated by GNU Autoconf 2.61 for dc3dd 7.0.0.
 #
 # Report bugs to <dc3dd at dc3.mil>.
 #
@@ -574,8 +574,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='dc3dd'
 PACKAGE_TARNAME='dc3dd'
-PACKAGE_VERSION='6.12.3'
-PACKAGE_STRING='dc3dd 6.12.3'
+PACKAGE_VERSION='7.0.0'
+PACKAGE_STRING='dc3dd 7.0.0'
 PACKAGE_BUGREPORT='dc3dd at dc3.mil'
 
 ac_unique_file="src/dc3dd.c"
@@ -1045,6 +1045,9 @@ ANSI2KNR
 LIBOBJS
 LIB_FDATASYNC
 SEQ_LIBM
+COND_USE_HDPARM_TRUE
+COND_USE_HDPARM_FALSE
+USE_HDPARM
 LIB_CRYPT
 INSTALL_SU
 OPTIONAL_BIN_PROGS
@@ -1583,7 +1586,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures dc3dd 6.12.3 to adapt to many kinds of systems.
+\`configure' configures dc3dd 7.0.0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1653,7 +1656,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of dc3dd 6.12.3:";;
+     short | recursive ) echo "Configuration of dc3dd 7.0.0:";;
    esac
   cat <<\_ACEOF
 
@@ -1665,6 +1668,7 @@ Optional Features:
   --disable-assert        turn off assertions
   --disable-rpath         do not hardcode runtime library paths
   --disable-largefile     omit support for large files
+  --enable-hdparm         use hdparm code to check for HPA/DCO on ATA drives
   --disable-nls           do not use Native Language Support
 
 Optional Packages:
@@ -1766,7 +1770,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-dc3dd configure 6.12.3
+dc3dd configure 7.0.0
 generated by GNU Autoconf 2.61
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1780,7 +1784,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by dc3dd $as_me 6.12.3, which was
+It was created by dc3dd $as_me 7.0.0, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   $ $0 $@
@@ -2590,7 +2594,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='dc3dd'
- VERSION='6.12.3'
+ VERSION='7.0.0'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -59289,6 +59293,28 @@ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
 
 
 
+  { echo "$as_me:$LINENO: checking whether hdparm support is requested" >&5
+echo $ECHO_N "checking whether hdparm support is requested... $ECHO_C" >&6; }
+    # Check whether --enable-hdparm was given.
+if test "${enable_hdparm+set}" = set; then
+  enableval=$enable_hdparm; USE_HDPARM=$enableval
+else
+  USE_HDPARM=no
+fi
+
+   if test x$USE_HDPARM == xyes; then
+  COND_USE_HDPARM_TRUE=
+  COND_USE_HDPARM_FALSE='#'
+else
+  COND_USE_HDPARM_TRUE='#'
+  COND_USE_HDPARM_FALSE=
+fi
+
+  { echo "$as_me:$LINENO: result: $USE_HDPARM" >&5
+echo "${ECHO_T}$USE_HDPARM" >&6; }
+
+
+
 
 for ac_header in vfork.h
 do
@@ -64278,6 +64304,16 @@ _ACEOF
 
 
 
+
+  if test "$USE_HDPARM" = "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_HDPARM 1
+_ACEOF
+
+  fi
+
+
 # For a test of uniq: it uses the $LOCALE_FR envvar.
 
 
@@ -64561,6 +64597,13 @@ fi
     gltests_LTLIBOBJS=$gltests_ltlibobjs
 
 
+if test -z "${COND_USE_HDPARM_TRUE}" && test -z "${COND_USE_HDPARM_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"COND_USE_HDPARM\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"COND_USE_HDPARM\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
 
 : ${CONFIG_STATUS=./config.status}
 ac_clean_files_save=$ac_clean_files
@@ -64861,7 +64904,7 @@ exec 6>&1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by dc3dd $as_me 6.12.3, which was
+This file was extended by dc3dd $as_me 7.0.0, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -64914,7 +64957,7 @@ Report bugs to <bug-autoconf at gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-dc3dd config.status 6.12.3
+dc3dd config.status 7.0.0
 configured by $0, generated by GNU Autoconf 2.61,
   with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
@@ -65696,6 +65739,9 @@ ANSI2KNR!$ANSI2KNR$ac_delim
 LIBOBJS!$LIBOBJS$ac_delim
 LIB_FDATASYNC!$LIB_FDATASYNC$ac_delim
 SEQ_LIBM!$SEQ_LIBM$ac_delim
+COND_USE_HDPARM_TRUE!$COND_USE_HDPARM_TRUE$ac_delim
+COND_USE_HDPARM_FALSE!$COND_USE_HDPARM_FALSE$ac_delim
+USE_HDPARM!$USE_HDPARM$ac_delim
 LIB_CRYPT!$LIB_CRYPT$ac_delim
 INSTALL_SU!$INSTALL_SU$ac_delim
 OPTIONAL_BIN_PROGS!$OPTIONAL_BIN_PROGS$ac_delim
@@ -65721,7 +65767,7 @@ gltests_LIBOBJS!$gltests_LIBOBJS$ac_delim
 gltests_LTLIBOBJS!$gltests_LTLIBOBJS$ac_delim
 _ACEOF
 
-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 62; then
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 65; then
     break
   elif $ac_last_try; then
     { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
diff --git a/configure.ac b/configure.ac
index be07e9b..5d1870a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -43,6 +43,7 @@ AC_PROG_LN_S
 gl_EARLY
 gl_INIT
 coreutils_MACROS
+DC3_HDPARM
 
 AC_FUNC_FORK
 
@@ -334,6 +335,8 @@ AC_SUBST([CONFIG_STATUS_DEPENDENCIES])
 AM_GNU_GETTEXT([external], [need-formatstring-macros])
 AM_GNU_GETTEXT_VERSION([0.15])
 
+DC3_HDPARM_SET
+
 # For a test of uniq: it uses the $LOCALE_FR envvar.
 gt_LOCALE_FR
 
diff --git a/lib/Makefile.in b/lib/Makefile.in
index c0a08f9..68318e3 100644
--- a/lib/Makefile.in
+++ b/lib/Makefile.in
@@ -99,9 +99,10 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/alloca.m4 \
 	$(top_srcdir)/m4/gnulib-common.m4 \
 	$(top_srcdir)/m4/gnulib-comp.m4 \
 	$(top_srcdir)/m4/hard-locale.m4 $(top_srcdir)/m4/hash.m4 \
-	$(top_srcdir)/m4/host-os.m4 $(top_srcdir)/m4/human.m4 \
-	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/iconv_h.m4 \
-	$(top_srcdir)/m4/iconv_open.m4 $(top_srcdir)/m4/idcache.m4 \
+	$(top_srcdir)/m4/hdparm.m4 $(top_srcdir)/m4/host-os.m4 \
+	$(top_srcdir)/m4/human.m4 $(top_srcdir)/m4/iconv.m4 \
+	$(top_srcdir)/m4/iconv_h.m4 $(top_srcdir)/m4/iconv_open.m4 \
+	$(top_srcdir)/m4/idcache.m4 \
 	$(top_srcdir)/m4/include-exclude-prog.m4 \
 	$(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/inline.m4 \
 	$(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax_t.m4 \
@@ -630,6 +631,7 @@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
 U = @U@
 UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@
 UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@
+USE_HDPARM = @USE_HDPARM@
 USE_NLS = @USE_NLS@
 VERSION = @VERSION@
 VOID_UNSETENV = @VOID_UNSETENV@
diff --git a/lib/config.hin b/lib/config.hin
index 109c1e6..a8f1008 100644
--- a/lib/config.hin
+++ b/lib/config.hin
@@ -1721,6 +1721,9 @@
 /* Define to 1 if unlink (dir) cannot possibly succeed. */
 #undef UNLINK_CANNOT_UNLINK_DIR
 
+/* Define if hdparm is requested for detecting HPA/DCO. */
+#undef USE_HDPARM
+
 /* Define to 1 if you want getc etc. to use unlocked I/O if available.
    Unlocked I/O can improve performance in unithreaded apps, but it is not
    safe for multithreaded apps. */
diff --git a/lib/iconv_open-aix.h b/lib/iconv_open-aix.h
index 0ffc3fe..5b8c7dc 100644
--- a/lib/iconv_open-aix.h
+++ b/lib/iconv_open-aix.h
@@ -1,4 +1,4 @@
-/* ANSI-C code produced by gperf version 3.0.3 */
+/* ANSI-C code produced by gperf version 3.0.1 */
 /* Command-line: gperf -m 10 ./iconv_open-aix.gperf  */
 /* Computed positions: -k'4,$' */
 
@@ -229,9 +229,6 @@ static const struct mapping mappings[] =
 
 #ifdef __GNUC__
 __inline
-#ifdef __GNUC_STDC_INLINE__
-__attribute__ ((__gnu_inline__))
-#endif
 #endif
 const struct mapping *
 mapping_lookup (register const char *str, register unsigned int len)
diff --git a/lib/iconv_open-irix.h b/lib/iconv_open-irix.h
index 1f03ab9..404b8c2 100644
--- a/lib/iconv_open-irix.h
+++ b/lib/iconv_open-irix.h
@@ -1,4 +1,4 @@
-/* ANSI-C code produced by gperf version 3.0.3 */
+/* ANSI-C code produced by gperf version 3.0.1 */
 /* Command-line: gperf -m 10 ./iconv_open-irix.gperf  */
 /* Computed positions: -k'1,$' */
 
@@ -172,9 +172,6 @@ static const struct mapping mappings[] =
 
 #ifdef __GNUC__
 __inline
-#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
-__attribute__ ((__gnu_inline__))
-#endif
 #endif
 const struct mapping *
 mapping_lookup (register const char *str, register unsigned int len)
diff --git a/lib/iconv_open-osf.h b/lib/iconv_open-osf.h
index c2730c2..0187f23 100644
--- a/lib/iconv_open-osf.h
+++ b/lib/iconv_open-osf.h
@@ -1,4 +1,4 @@
-/* ANSI-C code produced by gperf version 3.0.3 */
+/* ANSI-C code produced by gperf version 3.0.1 */
 /* Command-line: gperf -m 10 ./iconv_open-osf.gperf  */
 /* Computed positions: -k'4,$' */
 
@@ -251,9 +251,6 @@ static const struct mapping mappings[] =
 
 #ifdef __GNUC__
 __inline
-#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
-__attribute__ ((__gnu_inline__))
-#endif
 #endif
 const struct mapping *
 mapping_lookup (register const char *str, register unsigned int len)
diff --git a/man/Makefile.in b/man/Makefile.in
index e306640..a0b34ff 100644
--- a/man/Makefile.in
+++ b/man/Makefile.in
@@ -97,9 +97,10 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/alloca.m4 \
 	$(top_srcdir)/m4/gnulib-common.m4 \
 	$(top_srcdir)/m4/gnulib-comp.m4 \
 	$(top_srcdir)/m4/hard-locale.m4 $(top_srcdir)/m4/hash.m4 \
-	$(top_srcdir)/m4/host-os.m4 $(top_srcdir)/m4/human.m4 \
-	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/iconv_h.m4 \
-	$(top_srcdir)/m4/iconv_open.m4 $(top_srcdir)/m4/idcache.m4 \
+	$(top_srcdir)/m4/hdparm.m4 $(top_srcdir)/m4/host-os.m4 \
+	$(top_srcdir)/m4/human.m4 $(top_srcdir)/m4/iconv.m4 \
+	$(top_srcdir)/m4/iconv_h.m4 $(top_srcdir)/m4/iconv_open.m4 \
+	$(top_srcdir)/m4/idcache.m4 \
 	$(top_srcdir)/m4/include-exclude-prog.m4 \
 	$(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/inline.m4 \
 	$(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax_t.m4 \
@@ -592,6 +593,7 @@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
 U = @U@
 UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@
 UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@
+USE_HDPARM = @USE_HDPARM@
 USE_NLS = @USE_NLS@
 VERSION = @VERSION@
 VOID_UNSETENV = @VOID_UNSETENV@
diff --git a/man/dc3dd.1 b/man/dc3dd.1
index 26693e9..6b07a43 100644
--- a/man/dc3dd.1
+++ b/man/dc3dd.1
@@ -1,218 +1,12 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
-.TH DC3DD "1" "March 2009" "dc3dd 6.12.3" "User Commands"
+.TH DC3DD "1" "February 2010" "dc3dd 7.0.0" "User Commands"
 .SH NAME
 dc3dd \- convert and copy a file
-.SH SYNOPSIS
-.B dc3dd
-[\fIOPERAND\fR]...
-.br
-.B dc3dd
-\fIOPTION\fR
 .SH DESCRIPTION
 .\" Add any additional description here
-.PP
-Copy a file, converting and formatting according to the operands.
-.TP
-bs=BYTES
-force ibs=BYTES and obs=BYTES
-.TP
-cbs=BYTES
-convert BYTES bytes at a time
-.TP
-conv=CONVS
-convert the file as per the comma separated symbol list
-.TP
-count=SECTORS
-copy only SECTORS input sectors
-.TP
-ibs=BYTES
-read BYTES bytes at a time (must be a multiple of input sector size)
-.TP
-if=FILE
-read from FILE instead of stdin
-.TP
-ifjoin=BASE.FMT
-read from split files with name BASE and splitformat FMT
-.TP
-iflag=FLAGS
-read as per the comma separated symbol list
-.TP
-pattern=HEX
-write HEX to every byte of the output
-.TP
-textpattern=TEXT
-write the string TEXT repeatedly to the output
-.TP
-obs=BYTES
-write BYTES bytes at a time
-.TP
-of=FILE
-write to FILE instead of stdout
-.TP
-of:=COMMAND
-pipe output to the given command
-.TP
-oflag=FLAGS
-write as per the comma separated symbol list
-.TP
-wipe=FILE
-wipe device FILE with zeros (or specify pattern/textpattern)
-.TP
-seek=SECTORS
-skip SECTORS input sectors at start of output
-.TP
-skip=SECTORS
-skip SECTORS input sectors at start of input
-.TP
-status=noxfer
-suppress transfer statistics
-.TP
-split=BYTES
-split the output into pieces of size BYTES
-.TP
-splitformat=FMT
-create extensions for split pieces using FMT
-.IP
-Extensions can be numerical starting at zero,
-numerical starting at one, or alphabetical.
-These options are selected by using a series of
-zeros, ones, or a's, respectively. The number
-of characters used indicates the desired length of
-the extensions. For example, splitformat=1111
-indicates four character numerical extensions
-starting with 0001.
-.TP
-progress=on
-displays a progress meter
-.TP
-progresscount=NUM
-number of blocks processed between each progress update
-.TP
-sizeprobe=on
-estimates size of input file for use with status
-.TP
-hash=ALGORITHM
-computes ALGORITHM hashes of the input data
-.TP
-hashconv=WHEN
-determines when data should be hashed, either before
-or after conversions
-.TP
-hashwindow=BYTES
-number of bytes for piecewise hashing
-.TP
-hashlog=FILE
-appends piecewise hashes to the log file
-.TP
-errlog=FILE
-appends errors to the log file
-.TP
-log=FILE
-appends hashes and errors to the same file
-.TP
-errors=group
-group read errors together
-.TP
-vf=FILE
-verify the input against FILE
-.IP
-vfjoin=BASE.FMT verify the input against split files with name BASE and splitformat FMT
-verifylog=FILE  write the results of the verify to the given file
-.PP
-ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512
-.PP
-BLOCKS and BYTES may be followed by the following multiplicative suffixes:
-xM M, c 1, w 2, b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,
-GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.
-.PP
-Each CONV symbol may be:
-.TP
-ascii
-from EBCDIC to ASCII
-.TP
-ebcdic
-from ASCII to EBCDIC
-.TP
-ibm
-from ASCII to alternate EBCDIC
-.TP
-block
-pad newline\-terminated records with spaces to cbs\-size
-.TP
-unblock
-replace trailing spaces in cbs\-size records with newline
-.TP
-lcase
-change upper case to lower case
-.TP
-nocreat
-do not create the output file
-.TP
-excl
-fail if the output file already exists
-.TP
-notrunc
-do not truncate the output file
-.TP
-ucase
-change lower case to upper case
-.TP
-swab
-swap every pair of input bytes
-.TP
-noerror
-continue after read errors
-.TP
-sync
-pad every input block with NULs to ibs\-size; when used
-with block or unblock, pad with spaces rather than NULs
-.TP
-fdatasync
-physically write output file data before finishing
-.TP
-fsync
-likewise, but also write metadata
-.PP
-Each FLAG symbol may be:
-.TP
-append
-append mode (makes sense only for output; conv=notrunc suggested)
-.TP
-direct
-use direct I/O for data
-.IP
-directory fail unless a directory
-dsync     use synchronized I/O for data
-sync      likewise, but also for metadata
-nonblock  use non\-blocking I/O
-noatime   do not update access time
-noctty    do not assign controlling terminal from file
-nofollow  do not follow symlinks
-.PP
-Sending a USR1 signal to a running `dd' process makes it
-print I/O statistics to standard error and then resume copying.
-.IP
-\f(CW$ dd if=/dev/zero of=/dev/null& pid=$!\fR
-.br
-\f(CW$ kill -USR1 $pid; sleep 1; kill $pid\fR
-.IP
-18335302+0 sectors in
-18335302+0 sectors out
-9387674624 bytes (9.4 GB) copied, 34.6279 seconds, 271 MB/s
-.PP
-Options are:
-.TP
-\fB\-\-help\fR
-display this help and exit
-.TP
-\fB\-\-version\fR
-output version information and exit
-.TP
-\fB\-\-flags\fR
-display compile\-time flags
 .SH AUTHOR
 Written by Paul Rubin, David MacKenzie, Stuart Kemp,
-and patched for DC3 by Jesse Kornblum and Andrew Medico.
+Jesse Kornblum, Andrew Medico, and Richard Cordovano.
 .SH "REPORTING BUGS"
 Report bugs to <dc3dd at dc3.mil>.
 .SH COPYRIGHT
diff --git a/po/af.gmo b/po/af.gmo
index 74725f5..97b3842 100644
Binary files a/po/af.gmo and b/po/af.gmo differ
diff --git a/po/af.po b/po/af.po
index ee5b0cf..fb471d8 100644
--- a/po/af.po
+++ b/po/af.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 5.2.1\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2004-03-17 11:58+0200\n"
 "Last-Translator: Petri Jooste <rkwjpj at puk.ac.za>\n"
 "Language-Team: Afrikaans <i18n at af.org.za>\n"
@@ -16,40 +16,52 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "Kan nie lêergids %s skep nie."
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Probeer `%s --help' vir meer inligting.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, fuzzy, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -58,33 +70,35 @@ msgstr ""
 "Gebruik so: %s [GETAL]... \n"
 "   of:  %s OPSIE\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=LÊER         lees vanaf LÊER in plaas van stdin\n"
 "  obs=GREPE       skryf GREPE(aantal) grepe op 'n slag\n"
@@ -94,52 +108,50 @@ msgstr ""
 "  skip=BLOKKE     slaan BLOKKE(aantal) ibs-grootte blokke oor aan die begin "
 "van toevoer\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -150,35 +162,14 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1129
-#, fuzzy
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     van EBCDIC na ASCII\n"
-"  ebcdic    van ASCII na EBCDIC\n"
-"  ibm       van ASCII na afwisselende EBCDIC\n"
-"  block     vul nuwereël-getermineerde rekords met spasies tot by cbs-"
-"grootte\n"
-"  unblock   vervang spasies agteraan cbs-grootte rekords met "
-"nuwereëlkarakters\n"
-"  lcase     verander bokas na onderkas\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -187,7 +178,7 @@ msgid ""
 "  fsync     likewise, but also write metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -196,52 +187,52 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "%s: hierdie bestemming is nie 'n lêergids nie"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, c-format
 msgid ""
 "\n"
@@ -258,37 +249,30 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Onbekende stelselfout"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, fuzzy, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "afgekapte rekord"
-msgstr[1] "afgekapte rekord"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr ""
 
@@ -302,256 +286,283 @@ msgstr ""
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, c-format
 msgid ", %g s, %s/s        "
 msgstr ""
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ""
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "toevoerlêer %s word toegemaak"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "afvoerlêer %s word toegemaak"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "uitgange vir afvoerlêers is uitgeput"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "%s word oopgemaak"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "GEFAAL"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "besig om te skryf na %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, fuzzy, c-format
 msgid "unrecognized operand %s"
 msgstr "onbekende opsie %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "ongeldige datum `%s'"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "ongeldige datumformaat %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal ifjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "ongeldige datumformaat %s"
+
+#: src/dc3dd.c:2793
+#, c-format
+msgid "Illegal vfjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "ongeldige datumformaat %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "ongeldige omskakeling: %s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "ongeldige nommer by begin van veld"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "ongeldige groep "
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "ongeldige gebruiker %s"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "ongeldige nommer %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#: src/dc3dd.c:2938
+msgid "cannot combine excl and nocreat"
 msgstr ""
 
-#: src/dc3dd.c:2682
+#: src/dc3dd.c:2941
 #, fuzzy
-msgid "cannot combine block and unblock"
+msgid "cannot combine if= and ifjoin="
 msgstr "die gebruikernaam en groepnaam mag nie albei ontbreek nie"
 
-#: src/dc3dd.c:2684
+#: src/dc3dd.c:2944
 #, fuzzy
-msgid "cannot combine lcase and ucase"
+msgid "cannot combine vf= and vfjoin="
 msgstr "die gebruikernaam en groepnaam mag nie albei ontbreek nie"
 
-#: src/dc3dd.c:2686
-msgid "cannot combine excl and nocreat"
+#: src/dc3dd.c:2947
+#, c-format
+msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2950
 #, fuzzy
-msgid "cannot combine if= and ifjoin="
+msgid "cannot combine if= and wipe="
 msgstr "die gebruikernaam en groepnaam mag nie albei ontbreek nie"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2953
 #, fuzzy
-msgid "cannot combine vf= and vfjoin="
+msgid "cannot combine wipe= and ifjoin="
 msgstr "die gebruikernaam en groepnaam mag nie albei ontbreek nie"
 
-#: src/dc3dd.c:2708
-#, c-format
-msgid "error: split size must be a multiple of block size (currently %zd)"
-msgstr ""
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "die gebruikernaam en groepnaam mag nie albei ontbreek nie"
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
 "  of mt_type=0x%0lx -- see <sys/mtio.h> for the list of types"
 msgstr ""
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "besig om %s te lees"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, fuzzy, c-format
 msgid "%s: cannot seek"
 msgstr "%s: kan nie verwyder nie"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 msgid "advance: warning: invalid file offset after failed read"
 msgstr ""
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr ""
 
-#: src/dc3dd.c:3123
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr ""
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, fuzzy, c-format
 msgid "setting flags for %s"
 msgstr "die tyd van %s is verstel"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "lêergids %s word gelees"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "lêergids %s word gelees"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
-msgstr "fout met die skryf na %s"
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "besig om te skryf na %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, fuzzy, c-format
 msgid "fsync failed for %s"
 msgstr "kon nie %s oopmaak nie"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "standaardtoevoer"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "standaard-afvoer"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "kan nie fstat op %s uitvoer nie"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr ""
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#, fuzzy
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     van EBCDIC na ASCII\n"
+#~ "  ebcdic    van ASCII na EBCDIC\n"
+#~ "  ibm       van ASCII na afwisselende EBCDIC\n"
+#~ "  block     vul nuwereël-getermineerde rekords met spasies tot by cbs-"
+#~ "grootte\n"
+#~ "  unblock   vervang spasies agteraan cbs-grootte rekords met "
+#~ "nuwereëlkarakters\n"
+#~ "  lcase     verander bokas na onderkas\n"
+
+#, fuzzy
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "afgekapte rekord"
+#~ msgstr[1] "afgekapte rekord"
+
+#, fuzzy
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "die gebruikernaam en groepnaam mag nie albei ontbreek nie"
+
+#, fuzzy
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "die gebruikernaam en groepnaam mag nie albei ontbreek nie"
+
+#~ msgid "error writing %s"
+#~ msgstr "fout met die skryf na %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "ongeldige parameter %s vir %s"
 
@@ -2552,10 +2563,6 @@ msgstr ""
 #~ msgid "couldn't open temporary file"
 #~ msgstr "kan nie 'n tydelike lêer skep nie"
 
-#, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "Kan nie lêergids %s skep nie."
-
 #~ msgid "write failed"
 #~ msgstr "'write' het gefaal"
 
diff --git a/po/be.gmo b/po/be.gmo
index dc9d4f2..63adb80 100644
Binary files a/po/be.gmo and b/po/be.gmo differ
diff --git a/po/be.po b/po/be.po
index a84a914..13a1eff 100644
--- a/po/be.po
+++ b/po/be.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 5.97\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2006-08-16 03:27+0300\n"
 "Last-Translator: Alexander Nyakhaychyk <nyakhaychyk at gmail.com>\n"
 "Language-Team: Belarusian <i18n at mova.org>\n"
@@ -20,40 +20,52 @@ msgstr ""
 "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "немагчыма стварыць тэчку %s"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Паспрабуйце \"%s --help\" для больш падрабязных зьвестак.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -62,16 +74,15 @@ msgstr ""
 "Выкарыстаньне: %s [АПЭРАНД]...\n"
 "  або:  %s ПАРАМЭТАР\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "    Капуе файл, пераўтварае й фарматуе згодна з выбарамі.\n"
@@ -84,21 +95,24 @@ msgstr ""
 "  count=БЛЁКАЎ    Капіяваць толькі заданую колькасьць блёкаў уводу.\n"
 "  ibs=БАЙТАЎ      Чатаць заданую колькасьць байтаў за раз.\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=ФАЙЛ         Чытаць з файлу замест стандартнага ўводу.\n"
 "  obs=БАЙТАЎ      Пісаць заданую колькасьць байтаў за раз.\n"
@@ -108,52 +122,50 @@ msgstr ""
 "  skip=БЛЁКАЎ     Абмінуць заданую колькасьць блёкаў ад пачатку ў файле "
 "ўводу.\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 #, fuzzy
 msgid ""
 "\n"
@@ -171,31 +183,12 @@ msgstr ""
 "Кожнае ключавое слова можа быць:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-#, fuzzy
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     З EBCDIC у ASCII.\n"
-"  ebcdic    З ASCII ў EBCDIC.\n"
-"  ibm       З ASCII ў альтэрнатыўнае EBCDIC.\n"
-"  block     Замяняць запісы з канцавымі знакамі новага радка на прагалы.\n"
-"  unblock   Замяняць канцавыя прагалы на новыя радкі.\n"
-"  lcase     Зьмяняць вялікія літары на маленькія.\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 #, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  notrunc   Не абразаць файл вываду.\n"
 "  ucase     Зьмяніць маленькія літары на вялікія.\n"
@@ -205,7 +198,7 @@ msgstr ""
 "              выкарыстоўваецца разам з block ці unblock, дадаваць прагалы,\n"
 "              замест нулёў.\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 #, fuzzy
 msgid ""
 "  noerror   continue after read errors\n"
@@ -222,7 +215,7 @@ msgstr ""
 "              выкарыстоўваецца разам з block ці unblock, дадаваць прагалы,\n"
 "              замест нулёў.\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -231,52 +224,52 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "%s: заданая тэчка мэты не зьяўляецца тэчкай"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text      выкарыстоўваць тэкставы ўвод/вывад для даных\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, c-format
 msgid ""
 "\n"
@@ -293,11 +286,11 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Невядомая сістэмная памылка"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -306,20 +299,12 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> запісаў уайшло\n"
 "%<PRIuMAX>+%<PRIuMAX> запісаў выйшла\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> абрэзаны запіс\n"
-msgstr[1] "%<PRIuMAX> абрэзаных запісы\n"
-msgstr[2] "%<PRIuMAX> абрэзаных запісаў\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
@@ -327,7 +312,7 @@ msgstr[0] "%<PRIuMAX> байт (%s) скапіяваны"
 msgstr[1] "%<PRIuMAX> байты (%s) скапіявана"
 msgstr[2] "%<PRIuMAX> байтаў (%s) скапіявана"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "Бясконцасьць"
 
@@ -341,257 +326,285 @@ msgstr "Бясконцасьць"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g сэкунда , %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, fuzzy, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g сэкунда , %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "зачыняецца файл уводу %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "закрываецца файл вываду %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 msgid "Split extensions exhausted"
 msgstr ""
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "адчыняецца %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "ПАМЫЛКА"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "запіс у %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "нераспазнаны апэранд %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "нерэчаісная дата %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "нерэчаісны фармат даты %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "нерэчаісны фармат даты %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "нерэчаісны фармат даты %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "нерэчаіснае ператварэньне: %s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "нерэчаісны сьцяг уводу: %s"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "нерэчаісны сьцяг вываду: %s"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "нерэчаісны сьцяг статусу: %s"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "нерэчаісны нумар %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr ""
-
-#: src/dc3dd.c:2682
-#, fuzzy
-msgid "cannot combine block and unblock"
-msgstr "немагчыма абмінуць разам карыстальніка й групу"
-
-#: src/dc3dd.c:2684
-#, fuzzy
-msgid "cannot combine lcase and ucase"
-msgstr "немагчыма параўнаць назвы файлаў %s і %s"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr ""
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "немагчыма сумясьціць рэжым і парамэтры --reference"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "немагчыма сумясьціць рэжым і парамэтры --reference"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "немагчыма сумясьціць рэжым і парамэтры --reference"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "немагчыма сумясьціць рэжым і парамэтры --reference"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "немагчыма сумясьціць рэжым і парамэтры --reference"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
 "  of mt_type=0x%0lx -- see <sys/mtio.h> for the list of types"
 msgstr ""
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "чытаецца %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: немагчыма перасунуць паказальнік"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "перапаўненьне зруху цягам чытаньня файла %s"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "увага: зрух файла пашкоджаны пасьля памылкі чытаньня"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "немагчыма абмінуць памылку ядра"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "увага: зрух файла пашкоджаны пасьля памылкі чытаньня"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "выстаўленьне сьцягоў для %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "чытаецца дырэкторыя %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "чытаецца дырэкторыя %s"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
-msgstr "памылка запісу %s"
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "запіс у %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "збой fdatasync для %s"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "збой fsync для %s"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "стандартны ўвод"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "стандартны вывад"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "немагчыма выканаць fstat %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, fuzzy, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "дасягнуты %s байтаў у файле вываду %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#, fuzzy
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     З EBCDIC у ASCII.\n"
+#~ "  ebcdic    З ASCII ў EBCDIC.\n"
+#~ "  ibm       З ASCII ў альтэрнатыўнае EBCDIC.\n"
+#~ "  block     Замяняць запісы з канцавымі знакамі новага радка на прагалы.\n"
+#~ "  unblock   Замяняць канцавыя прагалы на новыя радкі.\n"
+#~ "  lcase     Зьмяняць вялікія літары на маленькія.\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> абрэзаны запіс\n"
+#~ msgstr[1] "%<PRIuMAX> абрэзаных запісы\n"
+#~ msgstr[2] "%<PRIuMAX> абрэзаных запісаў\n"
+
+#, fuzzy
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "немагчыма абмінуць разам карыстальніка й групу"
+
+#, fuzzy
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "немагчыма параўнаць назвы файлаў %s і %s"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "увага: зрух файла пашкоджаны пасьля памылкі чытаньня"
+
+#~ msgid "error writing %s"
+#~ msgstr "памылка запісу %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "нерэчаісны довад %s для %s"
 
@@ -3770,10 +3783,6 @@ msgstr ""
 #~ msgid "couldn't open temporary file"
 #~ msgstr "немагчыма стварыць часовы файл"
 
-#, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "немагчыма стварыць тэчку %s"
-
 #~ msgid "write failed"
 #~ msgstr "памылка запісу"
 
diff --git a/po/bg.gmo b/po/bg.gmo
index 1d18939..d806f65 100644
Binary files a/po/bg.gmo and b/po/bg.gmo differ
diff --git a/po/bg.po b/po/bg.po
index c29ef68..b61b7c5 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -14,7 +14,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 6.5\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2006-11-23 22:41+0200\n"
 "Last-Translator: Anton Zinoviev <zinoviev at debian.org>\n"
 "Language-Team: Bulgarian <dict at fsa-bg.org>\n"
@@ -24,41 +24,53 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 #, fuzzy
 msgid "David MacKenzie"
 msgstr "Paul Rubin и David MacKenzie"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "не може да се създаде каталог %s"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Използвайте „%s --help“ за повече информация.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -67,16 +79,15 @@ msgstr ""
 "Използване: %s [ОПЕРАНД]...\n"
 "    или:    %s ОПЦИЯ\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Копира файл, преобразуван и форматиран според посочените опции.\n"
@@ -87,21 +98,24 @@ msgstr ""
 "  count=БЛОКОВЕ   копира само БЛОКОВЕ входни блока\n"
 "  ibs=БАЙТОВЕ     чете на парчета от по БАЙТОВЕ байта\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=ФАЙЛ         чете от ФАЙЛ вместо от стандартния вход\n"
 "  iflag=ФЛАГ,...  чете според посочените флагове\n"
@@ -112,52 +126,50 @@ msgstr ""
 "  skip=БЛОКОВЕ    пропуска БЛОКОВЕ входни блока с размер ibs всеки\n"
 "  status=noxfer   без статистика за трансфера\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -174,32 +186,12 @@ msgstr ""
 "Всяка КЛЮЧДУМА може да бъде:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     от EBCDIC към ASCII\n"
-"  ebcdic    от ASCII към EBCDIC\n"
-"  ibm       от ASCII към алтернативен EBCDIC\n"
-"  block     попълва блоковете, завършващи с нов ред, с интервали до размер "
-"cbs\n"
-"  unblock   заменя крайните интервали във всеки блок с размер cbs с нови "
-"редове\n"
-"  lcase     променя от главни в малки букви\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 #, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   да не се създава изходния файл\n"
 "  excl      да не действа, ако изходния файл вече съществува\n"
@@ -214,7 +206,7 @@ msgstr ""
 "  fdatasync записва физически изходните данни още преди пълното приключване\n"
 "  fsync     подобно, но освен това записва и метаданните\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 #, fuzzy
 msgid ""
 "  noerror   continue after read errors\n"
@@ -236,7 +228,7 @@ msgstr ""
 "  fdatasync записва физически изходните данни още преди пълното приключване\n"
 "  fsync     подобно, но освен това записва и метаданните\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -250,58 +242,58 @@ msgstr ""
 "  append    режим добавяне (смислено само за изхода, препоръчва се "
 "conv=notrunc)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 "  direct    да се използват директни входно/изходни операции за данните\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr "  directory отказва да работи, освен при каталог\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 "  dsync     да се използват синхронизирани входно/изходни операции за "
 "данните\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 "  sync      подобно, но също и за метаданните (напр. на файловата система)\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock  да се използват неблокиращи входно/изходни операции\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noatime   да не се обновява времето за достъп\n"
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr "  noctty    да не се определя управляващ терминал от файл\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow  да не се следват символните връзки\n"
 
 # TODO: наистина ли се имат предвид твърди връзки?
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks   отказва да работи при множество твърди връзки\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 "  binary    да се използват двоични входно/изходни операции за данните\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 "  text      да се използват текстови входно/изходни операции за данните\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -328,11 +320,11 @@ msgstr ""
 "  18335302+0 записани блока\n"
 "  изкопирани са 9387674624 байта (9.4 GB) за 34,6279 секунди с 271 MB/s\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Непозната системна грешка"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -341,26 +333,19 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> прочетени блока\n"
 "%<PRIuMAX>+%<PRIuMAX> записани блока\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> съкратен запис\n"
-msgstr[1] "%<PRIuMAX> съкратени записа\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] "изкопиран е %<PRIuMAX> байт (%s)"
 msgstr[1] "изкопирани са %<PRIuMAX> байта (%s)"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "Безброй"
 
@@ -374,149 +359,157 @@ msgstr "Безброй"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "затваряне на входния файл %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "затваряне на изходния файл %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Изчерпаха се суфиксите за изходни файлове"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "отваряне на %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
 # Не е ясно къде се използва
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "НЕУСПЕШНО"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "запис в %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "непознат операнд %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "неправилна дата %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "неправилен формат за дата %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal ifjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "неправилен формат за дата %s"
+
+#: src/dc3dd.c:2793
+#, c-format
+msgid "Illegal vfjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "неправилен формат за дата %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "неправилно посочено преобразуване: %s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "непознат входен флаг: %s"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "непознат изходен флаг: %s"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "непознат флаг за състояние: %s"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "недопустимо число %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "не може да се комбинират никои две от {ascii,ebcdic,ibm}"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "не може да се комбинират block и unblock"
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "не може да се комбинират lcase и ucase"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "не може да се комбинират excl и nocreat"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "не може да се комбинират опциите -e и -i"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "не може да се комбинират опциите -e и -i"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "не може да се комбинират опциите -e и -i"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "не може да се комбинират опциите -e и -i"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "не може да се комбинират опциите -e и -i"
+
 # Това ме мързи да го превеждам.
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -525,89 +518,74 @@ msgstr ""
 "warning: working around lseek kernel bug for file (%s)\n"
 "  of mt_type=0x%0lx -- see <sys/mtio.h> for the list of types"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "чете се %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: неуспешно позициониране"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "препълване на отместването при четене на файла %s"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "внимание: съмнително отместване във файла след пропаднало четене"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "в крайна сметка не може да се компенсира грешката в ядрото"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "внимание: съмнително отместване във файла след пропаднало четене"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "задействат се флаговете за %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "чете се каталогът %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "чете се каталогът %s"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
-msgstr "грешка при запис в %s"
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "запис в %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "неуспешно извикване на fdatasync за %s"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "неуспешнен запис (fsync) за %s"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "стандартният вход"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "стандартният изход"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -616,20 +594,58 @@ msgstr ""
 "твърде голямо отместване: не може да се отреже до дължината на seek=%"
 "<PRIuMAX> (%lu-byte) блокове"
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "не може да се получи режимът за достъп до %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "съкращаване до %<PRIuMAX> байта в изходния файл %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     от EBCDIC към ASCII\n"
+#~ "  ebcdic    от ASCII към EBCDIC\n"
+#~ "  ibm       от ASCII към алтернативен EBCDIC\n"
+#~ "  block     попълва блоковете, завършващи с нов ред, с интервали до "
+#~ "размер cbs\n"
+#~ "  unblock   заменя крайните интервали във всеки блок с размер cbs с нови "
+#~ "редове\n"
+#~ "  lcase     променя от главни в малки букви\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> съкратен запис\n"
+#~ msgstr[1] "%<PRIuMAX> съкратени записа\n"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "не може да се комбинират никои две от {ascii,ebcdic,ibm}"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "не може да се комбинират block и unblock"
+
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "не може да се комбинират lcase и ucase"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "внимание: съмнително отместване във файла след пропаднало четене"
+
+#~ msgid "error writing %s"
+#~ msgstr "грешка при запис в %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "недопустим аргумент %s за %s"
 
@@ -6620,10 +6636,6 @@ msgstr ""
 #~ msgid "couldn't open temporary file"
 #~ msgstr "не може да се направи временен файл"
 
-#, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "не може да се създаде каталог %s"
-
 #~ msgid "write failed"
 #~ msgstr "неуспешен запис"
 
diff --git a/po/ca.gmo b/po/ca.gmo
index 376e140..d26d26b 100644
Binary files a/po/ca.gmo and b/po/ca.gmo differ
diff --git a/po/ca.po b/po/ca.po
index 29102a5..a48e8d5 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -47,7 +47,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 6.11\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2008-05-03 21:10+0200\n"
 "Last-Translator: Ivan Vilata i Balaguer <ivan at selidor.net>\n"
 "Language-Team: Catalan <ca at dodds.net>\n"
@@ -57,40 +57,53 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+# No usa quote() (afortunadament).  ivb
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "no s’ha pogut crear el procés «%s -d»"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Proveu «%s --help» per a obtenir més informació.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -99,16 +112,15 @@ msgstr ""
 "Forma d’ús: %s [OPERAND]…\n"
 "      o bé: %s OPCIÓ\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Còpia un fitxer, convertint i formatant les dades d’acord amb els operands.\n"
@@ -120,21 +132,24 @@ msgstr ""
 "  count=BLOCS         Només còpia aquest nombre de BLOCS de l’entrada.\n"
 "  ibs=OCTETS          Llegeix aquest nombre d’OCTETS alhora.\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=FITXER           Llegeix del FITXER en lloc de fer‐ho de l’entrada\n"
 "                      estàndard.\n"
@@ -153,52 +168,50 @@ msgstr ""
 "                      de l’entrada.\n"
 "  status=noxfer       No mostra l’estadística de la tranferència.\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -217,33 +230,12 @@ msgstr ""
 "Cada símbol de CONVERSIONS pot ser:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii        D’EBCDIC a ASCII.\n"
-"  ebcdic       D’ASCII a EBCDIC.\n"
-"  ibm          D’ASCII a EBCDIC alternat.\n"
-"  block        Emplena amb espais cada registre acabat en nova línia fins "
-"que\n"
-"               tinga la mida «cbs».\n"
-"  unblock      Substitueix els espais del final de cada registre de mida "
-"«cbs»\n"
-"               per un caràcter de nova línia.\n"
-"  lcase        Transforma les majúscules en minúscules.\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
+#, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat      No crea el fitxer d’eixida.\n"
 "  excl         Falla si el fitxer d’eixida ja existeix.\n"
@@ -251,7 +243,7 @@ msgstr ""
 "  ucase        Transforma les minúscules en majúscules.\n"
 "  swab         Intercanvia cada parell d’octets de l’entrada.\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -269,7 +261,7 @@ msgstr ""
 "               finalitzar.\n"
 "  fsync        El mateix, però també n’escriu les metadades.\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -283,52 +275,52 @@ msgstr ""
 "  append       Mode de només addició (només té sentit per a l’eixida, es\n"
 "               suggereix emprar «conv=notrunc»).\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr "  direct       Empra E/S directa per a les dades.\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr "  directory    Falla si no és un directori.\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr "  dsync        Empra E/S sincronitzada per a les dades.\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync         El mateix, però també per a les metadades.\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock     Empra E/S no blocadora.\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noatime      No actualitza la data d’accés.\n"
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr "  noctty       No assigna el fitxer com a terminal de control.\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow     No segueix els enllaços simbòlics.\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks      Falla si el fitxer té més d’un enllaç.\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr "  binary       Empra E/S binària per a les dades.\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text         Empra E/S textual per a les dades.\n"
 
 # La substitució pot ser «USR1» o «INFO».  ivb
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -359,11 +351,11 @@ msgstr ""
 "\n"
 
 # Amb el mateix format que els errors de la libc.  ivb
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Error desconegut del sistema"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -372,19 +364,12 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> registres llegits\n"
 "%<PRIuMAX>+%<PRIuMAX> registres escrits\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> registre truncat\n"
-msgstr[1] "%<PRIuMAX> registres truncats\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
@@ -392,7 +377,7 @@ msgstr[0] "%<PRIuMAX> octet (%s) copiat"
 msgstr[1] "%<PRIuMAX> octets (%s) copiats"
 
 # Es refereix a octets per segon.  ivb
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "Infinits B"
 
@@ -406,157 +391,161 @@ msgstr "Infinits B"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g s, %s/s\n"
 
 # Usa quote().  ivb
 # Condició d'error.  ivb
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "en tancar el fitxer d’entrada %s"
 
 # Usa quote().  ivb
 # Condició d'error.  ivb
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "en tancar el fitxer d’eixida %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "s’han esgotat els sufixs per als fitxers de sortida"
 
 # Usa quote().  ivb
 # Condició d'error.  ivb
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "en obrir %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "INCORRECTE"
 
 # Usa quote().  ivb
-# Condició d'error.  ivb
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "en escriure %s"
-
-# Usa quote().  ivb
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "l’operand %s no és reconegut"
 
 # Ambdues usen quote().  ivb
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "la data %s no és vàlida"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "el format de data «%s» no és vàlid"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "el format de data «%s» no és vàlid"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "el format de data «%s» no és vàlid"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 msgid "invalid conversion"
 msgstr "la conversió no és vàlida"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 msgid "invalid input flag"
 msgstr "el senyalador d’entrada no és vàlid"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 msgid "invalid output flag"
 msgstr "el senyalador d’eixida no és vàlid"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 msgid "invalid status flag"
 msgstr "el senyalador d’estat no és vàlid"
 
 # Usa quote().  ivb
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "el número %s no és vàlid"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "no es poden combinar «ascii», «ebcdic» o «ibm»"
-
-# Són noms de senyaladors.  ivb
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "no es poden combinar «block» i «unblock»"
-
-# Són noms de senyaladors.  ivb
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "no es poden combinar «lcase» i «ucase»"
-
 # Són noms de senyaladors.  ivb
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "no es poden combinar «excl» i «nocreat»"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "no es poden combinar les opcions «-e» i «-i»"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "no es poden combinar les opcions «-e» i «-i»"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "no es poden combinar les opcions «-e» i «-i»"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "no es poden combinar les opcions «-e» i «-i»"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "no es poden combinar les opcions «-e» i «-i»"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -566,102 +555,87 @@ msgstr ""
 "mt_type=0x%0lx —vegeu <sys/mtio.h> per a la llista de tipus"
 
 # Els 3 usen quote().  ivb
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "s’està llegint %s"
 
 # El primer hauria de ser «no *es pot* desplaçar».  ivb
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: no s’ha pogut desplaçar"
 
 # Usa quote().  ivb
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "s’ha desbordat el desplaçament en llegir el fitxer %s"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr ""
 "avís: després de la lectura fallada el desplaçament de fitxer no és vàlid"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "al final no s’ha pogut evitar l’error del nucli"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr ""
-"avís: després de la lectura fallada el desplaçament de fitxer no és vàlid"
-
 # Usa quote().  ivb
 # Condició d'error.  ivb
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "en establir els senyaladors de %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
 # Els 2 usen quote().  ivb
 # Indica condició d'error.  ivb
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "en llegir el directori %s"
 
 # Els 2 usen quote().  ivb
 # Indica condició d'error.  ivb
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "en llegir el directori %s"
 
-# uniq no usa quote().  ivb
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
-msgstr "error en escriure %s"
-
-#: src/dc3dd.c:3915
+# Usa quote().  ivb
+# Condició d'error.  ivb
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "en escriure %s"
 
 # Usa quote.  ivb
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "ha fallat fdatasync() sobre %s"
 
 # Usa quote().  ivb
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "ha fallat fsync() sobre %s"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "entrada estàndard"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "eixida estàndard"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -671,22 +645,66 @@ msgstr ""
 "<PRIuMAX> blocs de %lu octets"
 
 # Els 4 usen quote().  ivb
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "ha fallat fstat() sobre %s"
 
 # Usa quote().  ivb
 # Condició d'error.  ivb
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "en truncar a %<PRIuMAX> octets al fitxer d’eixida %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii        D’EBCDIC a ASCII.\n"
+#~ "  ebcdic       D’ASCII a EBCDIC.\n"
+#~ "  ibm          D’ASCII a EBCDIC alternat.\n"
+#~ "  block        Emplena amb espais cada registre acabat en nova línia fins "
+#~ "que\n"
+#~ "               tinga la mida «cbs».\n"
+#~ "  unblock      Substitueix els espais del final de cada registre de mida "
+#~ "«cbs»\n"
+#~ "               per un caràcter de nova línia.\n"
+#~ "  lcase        Transforma les majúscules en minúscules.\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> registre truncat\n"
+#~ msgstr[1] "%<PRIuMAX> registres truncats\n"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "no es poden combinar «ascii», «ebcdic» o «ibm»"
+
+# Són noms de senyaladors.  ivb
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "no es poden combinar «block» i «unblock»"
+
+# Són noms de senyaladors.  ivb
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "no es poden combinar «lcase» i «ucase»"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr ""
+#~ "avís: després de la lectura fallada el desplaçament de fitxer no és vàlid"
+
+# uniq no usa quote().  ivb
+#~ msgid "error writing %s"
+#~ msgstr "error en escriure %s"
+
 # Usa quote() en els 2 args.  ivb
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "l’argument %s no és vàlid per a %s"
@@ -7634,10 +7652,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "no s’ha pogut executar «%s -d»"
 
-# No usa quote() (afortunadament).  ivb
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "no s’ha pogut crear el procés «%s -d»"
-
 #~ msgid "write failed"
 #~ msgstr "no s’ha pogut escriure"
 
diff --git a/po/cs.gmo b/po/cs.gmo
index 35211ac..4cec639 100644
Binary files a/po/cs.gmo and b/po/cs.gmo differ
diff --git a/po/cs.po b/po/cs.po
index 31043d4..04158e4 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 6.11\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2008-04-23 17:24+0200\n"
 "Last-Translator: Petr Pisar <petr.pisar at atlas.cz>\n"
 "Language-Team: Czech <translation-team-cs at lists.sourceforge.net>\n"
@@ -18,40 +18,52 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "pro %s -d nelze založit proces"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Více informací získáte příkazem „%s --help“.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -60,16 +72,15 @@ msgstr ""
 "Použití: %s [OPERAND]…\n"
 "   nebo: %s PŘEPÍNAČ\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Kopírování souboru, konverze a formátování. Toto vše lze navolit\n"
@@ -81,21 +92,24 @@ msgstr ""
 "  count=BLOKŮ     zkopíruje pouze BLOKŮ vstupních bloků\n"
 "  ibs=BAJTŮ       čte BAJTŮ bajtů najednou\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=SOUBOR       čte ze souboru SOUBOR místo ze stdin\n"
 "  iflag=PŘÍZNAKY  způsob čtení. PŘÍZNAKY je seznam čárkou oddělených "
@@ -108,52 +122,50 @@ msgstr ""
 "  skip=BLOKŮ      přeskočí prvních BLOKŮ vstupních bloků velikosti „ibs“\n"
 "  status=noxfer   nezobrazí statistické informace o přenosu dat\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -173,32 +185,12 @@ msgstr ""
 "Každá dílčí konverze v seznamu KONVERZÍ může být:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii      z EBCDIC do ASCII\n"
-"  ebcdic     z ASCII do EBCDIC\n"
-"  ibm        z ASCII do pozměněného EBCDIC\n"
-"  block      záznamy ukončené znakem nového řádku vyplní do velikosti „cbs“\n"
-"             mezerami\n"
-"  unblock    koncové mezery v záznamech o velikosti „cbs“ nahradí znakem "
-"nového\n"
-"             řádku\n"
-"  lcase      převede velká písmena na malá\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
+#, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat    nevytváří výstupní soubor\n"
 "  excl       selže, pokud výstupní soubor již existuje\n"
@@ -206,7 +198,7 @@ msgstr ""
 "  ucase      převede malá písmena na velká\n"
 "  swab       zamění bajty v každém páru vstupních bajtů\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -220,7 +212,7 @@ msgstr ""
 "  fdatasync  před ukončením vynutí fyzický zápis dat\n"
 "  fsync      podobně, ale zapíše i metadata\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -234,52 +226,52 @@ msgstr ""
 "  append     připisuje na konec (má smysl pouze pro výstup;\n"
 "             doporučeno s conv=notrunc)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 "  direct     použije přímé vstupně-výstupní operace (V/V) pro práci s daty\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr "  directory  selže, pokud se nejedná o adresář\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr "  dsync      použije synchronní V/V pro práci s daty\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync       podobně, ale také pro metadata\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock   použije neblokující V/V\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noaime     neaktualizuje čas posledního přístupu k souboru\n"
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr "  noctty     nepovažuje soubor za řídící terminál\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow   nesleduje symbolické odkazy\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks    selže, pokud na soubor vede více pevných odkazů\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr "  binary     použije binární V/V pro práci s daty\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text       použije textové V/V pro práci s daty\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -309,11 +301,11 @@ msgstr ""
 "Volby jsou:\n"
 "\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Neznámá chyba systému"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -322,20 +314,12 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> vstoupivších záznamů\n"
 "%<PRIuMAX>+%<PRIuMAX> vystoupivších záznamů\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> zkrácený záznam\n"
-msgstr[1] "%<PRIuMAX> zkrácené záznamy\n"
-msgstr[2] "%<PRIuMAX> zkrácených záznamů\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
@@ -343,7 +327,7 @@ msgstr[0] "%<PRIuMAX> bajt (%s) zkopírován"
 msgstr[1] "%<PRIuMAX> bajty (%s) zkopírovány"
 msgstr[2] "%'<PRIuMAX> bajtů (%s) zkopírováno"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "nekonečno B"
 
@@ -357,143 +341,151 @@ msgstr "nekonečno B"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %'g s, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %'g s, %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "zavírám vstupní soubor %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "zavírám výstupní soubor %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Všechny přípony výstupních souborů vyčerpány"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "otevírám %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "CHYBNÝ"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "zapisuji do %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "neznámý operand %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "chybné datum: %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "neplatný formát data %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "neplatný formát data %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "neplatný formát data %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 msgid "invalid conversion"
 msgstr "neplatná konverze"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 msgid "invalid input flag"
 msgstr "neplatný příznak vstupu"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 msgid "invalid output flag"
 msgstr "neplatný příznak výstupu"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 msgid "invalid status flag"
 msgstr "neplatná hodnota operandu status"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "neplatné číslo %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "tyto konverze nelze kombinovat: ascii, ebcdic, ibm"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "block a unblock nelze použít současně"
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "lcase a ucase nelze použít současně"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "excl a nocreat nelze použít současně"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "přepínače -e a -i nelze kombinovat"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "přepínače -e a -i nelze kombinovat"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "přepínače -e a -i nelze kombinovat"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "přepínače -e a -i nelze kombinovat"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "přepínače -e a -i nelze kombinovat"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -502,89 +494,74 @@ msgstr ""
 "varování: obcházím chybu služby jádra lseek() nad souborem %s\n"
 "  typu mt_type=0x%0lx – seznam typů naleznete v <sys/mtio.h>"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "čtení %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: soubor nelze převíjet"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "během čtení ze souboru %s přetekl offset"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "varování: chybný offset souboru poté, co selhalo čtení"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "stejně se nedokážu vyrovnat s chybou v jádře"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "varování: chybný offset souboru poté, co selhalo čtení"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "nastavuji příznaky pro %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "čtu adresář %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "čtu adresář %s"
 
-#: src/dc3dd.c:3789
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "error writing %s"
-msgstr "chyba při zápisu %s"
-
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "zapisuji do %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "fdatasync na %s selhalo"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "fsync na %s selhalo"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "standardní vstup"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "standardní výstup"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -593,20 +570,61 @@ msgstr ""
 "příliš velký offset: nelze zkrátit na délku seek=%<PRIuMAX> (%lu-bajtových) "
 "bloků"
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "nelze získat informace o souboru %s z deskriptoru"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "na %<PRIuMAX> bajtů zkracuji výstupní soubor %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii      z EBCDIC do ASCII\n"
+#~ "  ebcdic     z ASCII do EBCDIC\n"
+#~ "  ibm        z ASCII do pozměněného EBCDIC\n"
+#~ "  block      záznamy ukončené znakem nového řádku vyplní do velikosti "
+#~ "„cbs“\n"
+#~ "             mezerami\n"
+#~ "  unblock    koncové mezery v záznamech o velikosti „cbs“ nahradí znakem "
+#~ "nového\n"
+#~ "             řádku\n"
+#~ "  lcase      převede velká písmena na malá\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> zkrácený záznam\n"
+#~ msgstr[1] "%<PRIuMAX> zkrácené záznamy\n"
+#~ msgstr[2] "%<PRIuMAX> zkrácených záznamů\n"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "tyto konverze nelze kombinovat: ascii, ebcdic, ibm"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "block a unblock nelze použít současně"
+
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "lcase a ucase nelze použít současně"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "varování: chybný offset souboru poté, co selhalo čtení"
+
+#~ msgid "error writing %s"
+#~ msgstr "chyba při zápisu %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "argument %s je pro %s neplatný"
 
@@ -6823,9 +6841,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "nelze provést %s -d"
 
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "pro %s -d nelze založit proces"
-
 #~ msgid "write failed"
 #~ msgstr "zápis se nezdařil"
 
diff --git a/po/da.gmo b/po/da.gmo
index 5949f7c..d9e407b 100644
Binary files a/po/da.gmo and b/po/da.gmo differ
diff --git a/po/da.po b/po/da.po
index 707e319..acbfc5b 100644
--- a/po/da.po
+++ b/po/da.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 4.5.11\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2003-03-30 19:53+0200\n"
 "Last-Translator: Keld Jørn Simonsen <keld at dkuug.dk>\n"
 "Language-Team: Danish <dansk at klid.dk>\n"
@@ -18,41 +18,53 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 #, fuzzy
 msgid "David MacKenzie"
 msgstr "Paul Rubin og David MacKenzie"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "kan ikke oprette katalog %s"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Prøv '%s --help' for mere information.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, fuzzy, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -61,16 +73,15 @@ msgstr ""
 "Brug:    %s [TAL]...\n"
 "  eller: %s FLAG\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Kopiér en fil med konvertering og formatering som angivet.\n"
@@ -81,21 +92,24 @@ msgstr ""
 "  count=BLOKKE    kopiér kun BLOKKE indblokke\n"
 "  ibs=BYTE        læs BYTE byte ad gangen\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=FIL          læs fra FIL i stedet for stdin\n"
 "  obs=BYTE        skriv BYTE byte ad gangen\n"
@@ -105,52 +119,50 @@ msgstr ""
 "  skip=BLOKKE     udelad BLOKKE blokke med ibs-størrelse fra\n"
 "                  begyndelsen af inddata\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 #, fuzzy
 msgid ""
 "\n"
@@ -168,35 +180,14 @@ msgstr ""
 "Hvert NØGLEORD kan være:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-#, fuzzy
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     fra EBCDIC til ASCII\n"
-"  ebcdic    fra ASCII til EBCDIC\n"
-"  ibm       fra ASCII til alterneret EBCDIC\n"
-"  block     udfyld felter afsluttet med linjeskift med mellemrum til\n"
-"            cbs-størrelse\n"
-"  unblock   erstat mellemrum med linjeskift i blokke med størrelse\n"
-"            som givet i cbs\n"
-"  lcase     lav store bogstaver om til små\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -205,7 +196,7 @@ msgid ""
 "  fsync     likewise, but also write metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -214,52 +205,52 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "%s: angivet målkatalog er ikke et katalog"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, c-format
 msgid ""
 "\n"
@@ -276,37 +267,30 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "ukendt systemfejl"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, fuzzy, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "afkortet blok"
-msgstr[1] "afkortet blok"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr ""
 
@@ -320,150 +304,156 @@ msgstr ""
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, c-format
 msgid ", %g s, %s/s        "
 msgstr ""
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ""
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "lukker indfil %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "lukker uddatafil %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Løbet tør for endelser til uddatafiler"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "åbner %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "MISLYKKEDES"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "skriver til %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, fuzzy, c-format
 msgid "unrecognized operand %s"
 msgstr "ukendt flag %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "ugyldig dato '%s'"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "ugyldigt datoformat %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal ifjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "ugyldigt datoformat %s"
+
+#: src/dc3dd.c:2793
+#, c-format
+msgid "Illegal vfjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "ugyldigt datoformat %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "ugyldig konvertering: %s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "ugyldigt tal ved feltbegyndelsen"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "ugyldig gruppe"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "ugyldig bruger %s"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "ugyldigt antal %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr ""
-
-#: src/dc3dd.c:2682
-#, fuzzy
-msgid "cannot combine block and unblock"
-msgstr "kan ikke undlade både bruger *og* gruppe"
-
-#: src/dc3dd.c:2684
-#, fuzzy
-msgid "cannot combine lcase and ucase"
-msgstr "kan ikke sammenligne filnavnene %s og %s"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 #, fuzzy
 msgid "cannot combine excl and nocreat"
 msgstr "kan ikke kombinere signal med -l eller -t"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "kan ikke kombinere signal med -l eller -t"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "kan ikke kombinere signal med -l eller -t"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "kan ikke kombinere signal med -l eller -t"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "kan ikke kombinere signal med -l eller -t"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "kan ikke kombinere signal med -l eller -t"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -472,109 +462,133 @@ msgstr ""
 "advarsel: omgår lseek-kernefejl for fil (%s)\n"
 "  med mt_type=0x%0lx -- se <sys/mtio.h> for listen af typer"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "læser %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, fuzzy, c-format
 msgid "%s: cannot seek"
 msgstr "%s: kan ikke slette"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "advarsel: ugyldig bredde %lu; bruger %d i stedet"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr ""
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "advarsel: ugyldig bredde %lu; bruger %d i stedet"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, fuzzy, c-format
 msgid "setting flags for %s"
 msgstr "sætter tider for %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "læser katalog %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "læser katalog %s"
 
-#: src/dc3dd.c:3789
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "error writing %s"
-msgstr "fejl ved skrivning til %s"
-
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "skriver til %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "standard-ind"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "standard-ud"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "kan ikke udføre fstat() %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, fuzzy, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "passerer forbi %s byte i uddatafil %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#, fuzzy
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     fra EBCDIC til ASCII\n"
+#~ "  ebcdic    fra ASCII til EBCDIC\n"
+#~ "  ibm       fra ASCII til alterneret EBCDIC\n"
+#~ "  block     udfyld felter afsluttet med linjeskift med mellemrum til\n"
+#~ "            cbs-størrelse\n"
+#~ "  unblock   erstat mellemrum med linjeskift i blokke med størrelse\n"
+#~ "            som givet i cbs\n"
+#~ "  lcase     lav store bogstaver om til små\n"
+
+#, fuzzy
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "afkortet blok"
+#~ msgstr[1] "afkortet blok"
+
+#, fuzzy
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "kan ikke undlade både bruger *og* gruppe"
+
+#, fuzzy
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "kan ikke sammenligne filnavnene %s og %s"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "advarsel: ugyldig bredde %lu; bruger %d i stedet"
+
+#~ msgid "error writing %s"
+#~ msgstr "fejl ved skrivning til %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "ugyldigt argument %s for %s"
 
@@ -5680,10 +5694,6 @@ msgstr ""
 #~ msgid "couldn't open temporary file"
 #~ msgstr "kan ikke oprette midlertidig fil %s"
 
-#, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "kan ikke oprette katalog %s"
-
 #~ msgid "write failed"
 #~ msgstr "fejl ved skrivning"
 
diff --git a/po/dc3dd.pot b/po/dc3dd.pot
index 1b61ddc..e08d4ed 100644
--- a/po/dc3dd.pot
+++ b/po/dc3dd.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -18,120 +18,131 @@ msgstr ""
 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+msgid "Could not allocate space for thread"
+msgstr ""
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr ""
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
 "  or:  %s OPTION\n"
 msgstr ""
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
-msgstr ""
-
-#: src/dc3dd.c:1080
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
+msgstr ""
+
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -142,26 +153,14 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -170,7 +169,7 @@ msgid ""
 "  fsync     likewise, but also write metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -179,51 +178,51 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr ""
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, c-format
 msgid ""
 "\n"
@@ -240,37 +239,30 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr ""
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr ""
 
@@ -284,242 +276,233 @@ msgstr ""
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, c-format
 msgid ", %g s, %s/s        "
 msgstr ""
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ""
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr ""
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr ""
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 msgid "Split extensions exhausted"
 msgstr ""
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr ""
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 msgid "Verify FAILED"
 msgstr ""
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
-msgid "writing to %s"
+msgid "unrecognized operand %s"
 msgstr ""
 
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, c-format
-msgid "unrecognized operand %s"
+msgid "illegal pattern %s"
+msgstr ""
+
+#: src/dc3dd.c:2748
+msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2753
 #, c-format
-msgid "illegal pattern %s"
+msgid "Illegal split format %s"
 msgstr ""
 
-#: src/dc3dd.c:2479
+#: src/dc3dd.c:2768
 #, c-format
-msgid "unknown hash convention %s"
+msgid "Illegal ifjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2500
-msgid "It is pitch dark here. You are likely to be eaten by a grue."
+#: src/dc3dd.c:2773
+#, c-format
+msgid "Illegal ifjoin format %s"
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal split format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2798
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 msgid "invalid conversion"
 msgstr ""
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 msgid "invalid input flag"
 msgstr ""
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 msgid "invalid output flag"
 msgstr ""
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 msgid "invalid status flag"
 msgstr ""
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr ""
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#: src/dc3dd.c:2938
+msgid "cannot combine excl and nocreat"
 msgstr ""
 
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
+#: src/dc3dd.c:2941
+msgid "cannot combine if= and ifjoin="
 msgstr ""
 
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
+#: src/dc3dd.c:2944
+msgid "cannot combine vf= and vfjoin="
 msgstr ""
 
-#: src/dc3dd.c:2686
-msgid "cannot combine excl and nocreat"
+#: src/dc3dd.c:2947
+#, c-format
+msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2690
-msgid "cannot combine if= and ifjoin="
+#: src/dc3dd.c:2950
+msgid "cannot combine if= and wipe="
 msgstr ""
 
-#: src/dc3dd.c:2693
-msgid "cannot combine vf= and vfjoin="
+#: src/dc3dd.c:2953
+msgid "cannot combine wipe= and ifjoin="
 msgstr ""
 
-#: src/dc3dd.c:2708
-#, c-format
-msgid "error: split size must be a multiple of block size (currently %zd)"
+#: src/dc3dd.c:2955
+msgid "cannot combine wipe= and vfjoin="
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
 "  of mt_type=0x%0lx -- see <sys/mtio.h> for the list of types"
 msgstr ""
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, c-format
 msgid "skip: reading %s"
 msgstr ""
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr ""
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 msgid "advance: warning: invalid file offset after failed read"
 msgstr ""
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr ""
 
-#: src/dc3dd.c:3123
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr ""
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr ""
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, c-format
 msgid "reading %s at sector %jd"
 msgstr ""
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr ""
 
-#: src/dc3dd.c:3789
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "error writing %s"
-msgstr ""
-
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
+msgid "writing to %s"
 msgstr ""
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr ""
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr ""
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr ""
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr ""
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
diff --git a/po/de.gmo b/po/de.gmo
index 7effd1b..9f8e9c9 100644
Binary files a/po/de.gmo and b/po/de.gmo differ
diff --git a/po/de.po b/po/de.po
index b7761c1..7176c75 100644
--- a/po/de.po
+++ b/po/de.po
@@ -40,7 +40,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GNU coreutils 6.11\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2008-05-19 14:45+0200\n"
 "Last-Translator: Michael Piefel <piefel at informatik.hu-berlin.de>\n"
 "Language-Team: German <translation-team-de at lists.sourceforge.net>\n"
@@ -50,40 +50,52 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "konnte keinen Prozess für %s -d anlegen"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "„%s --help“ gibt weitere Informationen.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -92,16 +104,15 @@ msgstr ""
 "Aufruf: %s [OPERAND...]\n"
 " oder:  %s OPTION\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Kopieren einer Datei, Konvertierung und Formatierung gemäß der Operanden.\n"
@@ -113,21 +124,24 @@ msgstr ""
 "  count=BLÖCKE    nur BLÖCKE Eingabeblöcke kopieren\n"
 "  ibs=BYTES       Lesen von BYTES Bytes auf einmal\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=DATEI        aus DATEI statt von der Standardeingabe lesen\n"
 "  iflag=FLAGS     anhand der kommagetrennten Symbolliste lesen\n"
@@ -140,52 +154,50 @@ msgstr ""
 "überspringen\n"
 "  status=noxfer   Transferstatistik unterdrücken\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -203,31 +215,12 @@ msgstr ""
 "Jedes CONV‐Symbol kann sein:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     von EBCDIC in ASCII\n"
-"  ebcdic    von ASCII in EBCDIC\n"
-"  ibm       von ASCII in alternatives EBCDIC\n"
-"  block     mit Zeilenumbrüchen terminierte Datensätzen durch\n"
-"              Leerzeichen bis zur cbs‐Größe auffüllen\n"
-"  unblock   nachlaufende Leerzeichen in Datensätzen von\n"
-"              cbs‐Größe mit Zeilenumbrüchen ersetzen\n"
-"  lcase     Großbuchstaben in Kleinbuchstaben ändern\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
+#, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   Ausgabedatei nicht anlegen\n"
 "  excl      wenn Ausgabedatei schon existiert, abbrechen\n"
@@ -235,7 +228,7 @@ msgstr ""
 "  ucase     Kleinbuchstaben in Großbuchstaben ändern\n"
 "  swab      jedes Paar von Eingabebytes vertauschen\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -249,7 +242,7 @@ msgstr ""
 "  fdatasync  vor Beendigung Ausgabedatendatei physisch schreiben\n"
 "  fsync     genauso, zusätzlich auch die Metadaten\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -262,51 +255,51 @@ msgstr ""
 "\n"
 "  append    Anfügemodus (nur für Ausgabe sinnvoll; conv=notrunc empfohlen)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr "  direct    direkte Ein‐/Ausgabe für Daten benutzen\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr "  directory abbrechen, wenn es sich nicht um ein Verzeichnis handelt\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr "  dsync     synchronisierte Ein‐/Ausgabe für Daten benutzen\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync      genauso, aber auch für Metadaten\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock  nicht‐blockierende  Ein‐/Ausgabe benutzen\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noatime   die Zugriffszeit nicht erneuern\n"
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr "  noctty    das kontrollierende Terminal nicht von Datei zuweisen\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow  symbolischen Verknüpfungen nicht folgen\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks   abbrechen, wenn mehrfach verlinkt\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr "  binary    binäre Ein‐/Ausgabe benutzen\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text      textuelle Ein‐/Ausgabe benutzen\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -336,11 +329,11 @@ msgstr ""
 "Optionen sind:\n"
 "\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Unbekannter Systemfehler"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -349,26 +342,19 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> Datensätze ein\n"
 "%<PRIuMAX>+%<PRIuMAX> Datensätze aus\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "ein abgeschnittener Datensatz\n"
-msgstr[1] "%<PRIuMAX> abgeschnittene Datensätze\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] "ein Byte kopiert"
 msgstr[1] "%<PRIuMAX> Bytes (%s) kopiert"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "unendlich B"
 
@@ -382,143 +368,151 @@ msgstr "unendlich B"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "Schließen der Eingabedatei %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "Schließen der Ausgabedatei %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Kein Suffix für Ausgabedateien mehr verfügbar"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "öffne %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "FEHLSCHLAG"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "Schreiben in %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "nicht erkannter Operand %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "ungültiges Datum %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "Ungültiges Datumsformat %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "Ungültiges Datumsformat %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "Ungültiges Datumsformat %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 msgid "invalid conversion"
 msgstr "ungültige Konvertierung"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 msgid "invalid input flag"
 msgstr "ungültiges Eingabeflag"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 msgid "invalid output flag"
 msgstr "ungültiges Ausgabeflag"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 msgid "invalid status flag"
 msgstr "ungültiges Statusflag"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "ungültige Zahl %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "{ascii,ebcdic,ibm} sind in keiner Weise kombinierbar"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "block und unblock sind nicht kombinierbar"
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "lcase und ucase sind nicht kombinierbar"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "excl und nocreat sind nicht kombinierbar"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "Optionen -e und -i können nicht kombiniert werden."
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "Optionen -e und -i können nicht kombiniert werden."
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "Optionen -e und -i können nicht kombiniert werden."
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "Optionen -e und -i können nicht kombiniert werden."
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "Optionen -e und -i können nicht kombiniert werden."
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -528,89 +522,74 @@ msgstr ""
 "  des Typs mt_type=0x%0lx – siehe <sys/mtio.h> für die Liste der Typen"
 
 # XLATE_REMARK: Check this out! is the %s replaced by the name of the directory?
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "Lesen von %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: kann nicht zu Position springen"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "Offset‐Overflow beim Lesen der Datei %s"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "Warnung: ungültiger Datei‐Offset nach fehlgeschlagenem Lesen"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "kann nun einmal nicht um Kernel‐Fehler herumarbeiten"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "Warnung: ungültiger Datei‐Offset nach fehlgeschlagenem Lesen"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "setze Flags für %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "lese Verzeichnis %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "lese Verzeichnis %s"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
-msgstr "Fehler beim Schreiben von %s"
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "Schreiben in %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "fdatasync für %s fehlgeschlagen"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "fsync für %s fehlgeschlagen"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "Standardeingabe"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "Standardausgabe"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -619,20 +598,58 @@ msgstr ""
 "Offset zu groß: kann nicht auf eine Länge von seek=%<PRIuMAX> (%lu‐Byte‐) "
 "Blöcke abschneiden"
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "Aufruf von fstat für %s nicht möglich"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "schneide bei %<PRIuMAX> Bytes in Ausgabedatei %s ab"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     von EBCDIC in ASCII\n"
+#~ "  ebcdic    von ASCII in EBCDIC\n"
+#~ "  ibm       von ASCII in alternatives EBCDIC\n"
+#~ "  block     mit Zeilenumbrüchen terminierte Datensätzen durch\n"
+#~ "              Leerzeichen bis zur cbs‐Größe auffüllen\n"
+#~ "  unblock   nachlaufende Leerzeichen in Datensätzen von\n"
+#~ "              cbs‐Größe mit Zeilenumbrüchen ersetzen\n"
+#~ "  lcase     Großbuchstaben in Kleinbuchstaben ändern\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "ein abgeschnittener Datensatz\n"
+#~ msgstr[1] "%<PRIuMAX> abgeschnittene Datensätze\n"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "{ascii,ebcdic,ibm} sind in keiner Weise kombinierbar"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "block und unblock sind nicht kombinierbar"
+
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "lcase und ucase sind nicht kombinierbar"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "Warnung: ungültiger Datei‐Offset nach fehlgeschlagenem Lesen"
+
+#~ msgid "error writing %s"
+#~ msgstr "Fehler beim Schreiben von %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "ungültiges Argument %s für %s"
 
@@ -6971,9 +6988,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "konnte %s -d nicht ausführen"
 
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "konnte keinen Prozess für %s -d anlegen"
-
 #~ msgid "write failed"
 #~ msgstr "Schreiben fehlgeschlagen"
 
diff --git a/po/el.gmo b/po/el.gmo
index db4a4e0..5111710 100644
Binary files a/po/el.gmo and b/po/el.gmo differ
diff --git a/po/el.po b/po/el.po
index bd8bea0..1fa1f01 100644
--- a/po/el.po
+++ b/po/el.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 6.10\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2008-03-13 11:25+0100\n"
 "Last-Translator: Simos Xenitellis <simos.lists at googlemail.com>\n"
 "Language-Team: Greek <team at lists.gnome.gr>\n"
@@ -15,124 +15,137 @@ msgstr ""
 "Content-Transfer-Encoding: 8-bit\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 #, fuzzy
 msgid "David MacKenzie"
 msgstr "Πωλ Ρούμπιν και Ντέιβιντ Μακένζη"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
 #
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Δοκιμάστε `%s --help' για περισσότερη βοήθεια.\n"
 
 #
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, fuzzy, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
 "  or:  %s OPTION\n"
 msgstr "Χρήση: %s [ΕΠΙΛΟΓΗ]... [ΕΙΣΟΔΟΣ [ΕΞΟΔΟΣ]]\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -143,26 +156,14 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -171,7 +172,7 @@ msgid ""
 "  fsync     likewise, but also write metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -180,53 +181,53 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
 #
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "το `%s' υπάρχει ήδη άλλα δεν είναι κατάλογος"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, c-format
 msgid ""
 "\n"
@@ -244,37 +245,30 @@ msgid ""
 msgstr ""
 
 #
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Άγνωστο σφάλμα συστήματος"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, fuzzy, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "μηδενισμένη εγγραφή και γράψιμο πάνω σε αυτή (truncated)"
-msgstr[1] "μηδενισμένη εγγραφή και γράψιμο πάνω σε αυτή (truncated)"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr ""
 
@@ -288,167 +282,176 @@ msgstr ""
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, c-format
 msgid ", %g s, %s/s        "
 msgstr ""
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ""
 
 #
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, fuzzy, c-format
 msgid "closing input file %s"
 msgstr "δημιουργία αρχείου `%s'\n"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, fuzzy, c-format
 msgid "closing output file %s"
 msgstr "διαγραφή καταλόγου %s\n"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
 #
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "η ιδεατή μνήμη εξαντλήθηκε"
 
 #
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, fuzzy, c-format
 msgid "opening %s"
 msgstr "σφάλμα ανάγνωσης %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
 #
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "ΑΝΕΠΙΤΥΧΕΣ"
 
 #
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, fuzzy, c-format
-msgid "writing to %s"
-msgstr "σφάλμα εγγραφής %s"
-
-#
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, fuzzy, c-format
 msgid "unrecognized operand %s"
 msgstr "απαράδεκτη επιλογή `-%c'"
 
 #
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "μη έγκυρος αριθμός πεδίου: `%s'"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
 #
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "μη έγκυρο όρισμα %s για %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "μη έγκυρο όρισμα %s για %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "μη έγκυρο όρισμα %s για %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
 #
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "μη έγκυρο είδος αλφαριθμητικού `%s'"
 
 #
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "μη έγκυρος αριθμός πεδίου: `%s'"
 
 #
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "μη έγκυρη ομάδα"
 
 #
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "μη έγκυρο όρισμα %s για %s"
 
 #
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, fuzzy, c-format
 msgid "invalid number %s"
 msgstr "μη έγκυρος αριθμός"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr ""
-
 #
-#: src/dc3dd.c:2682
-#, fuzzy
-msgid "cannot combine block and unblock"
-msgstr "δεν είναι δυνατό να παραληφθεί χρήστης και ομάδα"
-
-#: src/dc3dd.c:2684
-#, fuzzy
-msgid "cannot combine lcase and ucase"
-msgstr "δεν είναι δυνατό να δημιουργηθεί το %s `%s' στο `%s'"
-
-#
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 #, fuzzy
 msgid "cannot combine excl and nocreat"
 msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
 
 #
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
 
 #
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
+
+#
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
+
+#
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -456,92 +459,78 @@ msgid ""
 msgstr ""
 
 #
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "σφάλμα ανάγνωσης %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, fuzzy, c-format
 msgid "%s: cannot seek"
 msgstr "%s: δε μπορεί να διαγραφεί"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 msgid "advance: warning: invalid file offset after failed read"
 msgstr ""
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr ""
 
-#: src/dc3dd.c:3123
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr ""
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, fuzzy, c-format
 msgid "setting flags for %s"
 msgstr "διατήρηση ωρών στο %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
 #
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
 
 #
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
 
 #
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
+#, fuzzy, c-format
+msgid "writing to %s"
 msgstr "σφάλμα εγγραφής %s"
 
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
-
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr ""
 
 #
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "κανονική είσοδος"
 
 #
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "κανονική έξοδος"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -549,20 +538,39 @@ msgid ""
 msgstr ""
 
 #
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, fuzzy, c-format
 msgid "cannot fstat %s"
 msgstr "αδύνατη η αλλαγή δικαιωμάτων στο %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, fuzzy, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "διαγραφή καταλόγου %s\n"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#, fuzzy
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "μηδενισμένη εγγραφή και γράψιμο πάνω σε αυτή (truncated)"
+#~ msgstr[1] "μηδενισμένη εγγραφή και γράψιμο πάνω σε αυτή (truncated)"
+
+#
+#, fuzzy
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "δεν είναι δυνατό να παραληφθεί χρήστης και ομάδα"
+
+#, fuzzy
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "δεν είναι δυνατό να δημιουργηθεί το %s `%s' στο `%s'"
+
+#
+#~ msgid "error writing %s"
+#~ msgstr "σφάλμα εγγραφής %s"
+
 #
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "μη έγκυρο όρισμα %s για %s"
@@ -4072,11 +4080,6 @@ msgstr ""
 #~ msgstr "αδύνατη η αλλαγή δικαιωμάτων στο %s"
 
 #
-#, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
-
-#
 #~ msgid "write failed"
 #~ msgstr "αποτυχία εγγραφής"
 
diff --git a/po/es.gmo b/po/es.gmo
index f8a4571..f2fac9a 100644
Binary files a/po/es.gmo and b/po/es.gmo differ
diff --git a/po/es.po b/po/es.po
index b7f7b6b..79bf982 100644
--- a/po/es.po
+++ b/po/es.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GNU coreutils 5.2.1\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2004-11-05 01:11+0100\n"
 "Last-Translator: Santiago Vila Doncel <sanvila at unex.es>\n"
 "Language-Team: Spanish <es at li.org>\n"
@@ -20,41 +20,56 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "no se puede asignar espacio de almacenamiento para %lu pasos"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+#, fuzzy
+msgid "Unable to allocate space for thread buffer"
+msgstr "no se puede asignar espacio de almacenamiento para %lu pasos"
+
+#: src/dc3dd.c:556
+#, fuzzy
+msgid "Unable to allocate space for lock/signals"
+msgstr "no se puede asignar espacio de almacenamiento para %lu pasos"
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 #, fuzzy
 msgid "Unable to allocate space for hashes"
 msgstr "no se puede asignar espacio de almacenamiento para %lu pasos"
 
-#: src/dc3dd.c:680
-#, fuzzy, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+#, fuzzy
+msgid "Unable to allocate space for threads"
 msgstr "no se puede asignar espacio de almacenamiento para %lu pasos"
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Pruebe `%s --help' para más información.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, fuzzy, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -63,16 +78,15 @@ msgstr ""
 "Modo de empleo: %s [NÚMERO]...\n"
 "       o bien:  %s OPCIÓN\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Copia un fichero, convirtiendo y dándole formato de acuerdo con las "
@@ -85,21 +99,24 @@ msgstr ""
 "  count=BLOQUES   copia solamente BLOQUES bloques de entrada\n"
 "  ibs=BYTES       lee BYTES bytes cada vez\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=FICHERO      lee del FICHERO en lugar de la entrada estándar (stdin)\n"
 "  obs=BYTES       escribe BYTES bytes cada vez\n"
@@ -109,52 +126,50 @@ msgstr ""
 "  skip=BLOQUES    se salta BLOQUES bloques de tamaño ibs al comienzo de la\n"
 "                  entrada\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 #, fuzzy
 msgid ""
 "\n"
@@ -174,37 +189,14 @@ msgstr ""
 "Cada PALABRA puede ser:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-#, fuzzy
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     de EBCDIC a ASCII\n"
-"  ebcdic    de ASCII a EBCDIC\n"
-"  ibm       de ASCII a EBCDIC alternado\n"
-"  block     rellena los registros terminados en nueva línea con espacios "
-"hasta\n"
-"            el tamaño de cbs\n"
-"  unblock   sustituye los espacios que sobran en los registros de tamaño "
-"cbs\n"
-"            con un carácter de nueva línea\n"
-"  lcase     cambia las mayúsculas a minúsculas\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -213,7 +205,7 @@ msgid ""
 "  fsync     likewise, but also write metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -222,52 +214,52 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "%s: el directorio objetivo especificado no es un directorio"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -293,37 +285,30 @@ msgstr ""
 "  10899206+0 registros leídos\n"
 "  10899206+0 registros escritos\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Error del sistema desconocido"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, fuzzy, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "registro truncado"
-msgstr[1] "registro truncado"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr ""
 
@@ -337,44 +322,44 @@ msgstr ""
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, c-format
 msgid ", %g s, %s/s        "
 msgstr ""
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ""
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "cerrando el fichero de entrada %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "cerrando el fichero de salida %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 #, fuzzy
 msgid "Unable to allocate filename"
 msgstr "no se puede asignar espacio de almacenamiento para %lu pasos"
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Se han agotado los sufijos para los ficheros de salida"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "abriendo %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 #, fuzzy
 msgid "Unable to allocate memory"
 msgstr "no se puede asignar espacio de almacenamiento para %lu pasos"
@@ -382,112 +367,117 @@ msgstr "no se puede asignar espacio de almacenamiento para %lu pasos"
 # Puestos a simplificar, a lo mejor podrías poner simplemente
 # "coincide" o "no coincide". Cualquiera que use el programa sabe
 # perfectamente qué es lo que coincide y lo que no. sv+
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "La suma no coincide"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "escribiendo en %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, fuzzy, c-format
 msgid "unrecognized operand %s"
 msgstr "opción no reconocida %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "fecha inválida `%s'"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "formato de fecha inválido %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "formato de fecha inválido %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "formato de fecha inválido %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "conversión inválida: %s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "número inválido al comienzo del campo"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "grupo inválido"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "usuario inválido %s"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "número inválido %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr ""
-
-#: src/dc3dd.c:2682
-#, fuzzy
-msgid "cannot combine block and unblock"
-msgstr "no se puede omitir tanto el usuario como el grupo"
-
-# Lo mismo de antes.
-#: src/dc3dd.c:2684
-#, fuzzy
-msgid "cannot combine lcase and ucase"
-msgstr "no se pueden comparar los nombres de fichero %s y %s"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 #, fuzzy
 msgid "cannot combine excl and nocreat"
 msgstr "no se puede combinar la señal con -l o -t"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "no se puede combinar la señal con -l o -t"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "no se puede combinar la señal con -l o -t"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "no se puede combinar la señal con -l o -t"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "no se puede combinar la señal con -l o -t"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "no se puede combinar la señal con -l o -t"
+
 # Se admiten sugerencias.
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -497,109 +487,140 @@ msgstr ""
 "relacionado con lseek para el fichero (%s) de mt_type=0x%0lx;\n"
 "consulte la lista de tipos en <sys/mtio.h>"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "leyendo %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, fuzzy, c-format
 msgid "%s: cannot seek"
 msgstr "%s: no se puede borrar"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "atención: ancho %lu inválido; se usará %d en su lugar"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr ""
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "atención: ancho %lu inválido; se usará %d en su lugar"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, fuzzy, c-format
 msgid "setting flags for %s"
 msgstr "estableciendo la fecha de %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "leyendo el directorio %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "leyendo el directorio %s"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
-msgstr "error al escribir en %s"
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "escribiendo en %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, fuzzy, c-format
 msgid "fsync failed for %s"
 msgstr "No se puede abrir %s"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "entrada estándar"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "salida estándar"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "no se puede efectuar `fstat' sobre %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, fuzzy, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "avanzando %s bytes pasados en el fichero de salida %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#, fuzzy
+#~ msgid "Unable to allocate hashing buffer"
+#~ msgstr "no se puede asignar espacio de almacenamiento para %lu pasos"
+
+#, fuzzy
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     de EBCDIC a ASCII\n"
+#~ "  ebcdic    de ASCII a EBCDIC\n"
+#~ "  ibm       de ASCII a EBCDIC alternado\n"
+#~ "  block     rellena los registros terminados en nueva línea con espacios "
+#~ "hasta\n"
+#~ "            el tamaño de cbs\n"
+#~ "  unblock   sustituye los espacios que sobran en los registros de tamaño "
+#~ "cbs\n"
+#~ "            con un carácter de nueva línea\n"
+#~ "  lcase     cambia las mayúsculas a minúsculas\n"
+
+#, fuzzy
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "registro truncado"
+#~ msgstr[1] "registro truncado"
+
+#, fuzzy
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "no se puede omitir tanto el usuario como el grupo"
+
+# Lo mismo de antes.
+#, fuzzy
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "no se pueden comparar los nombres de fichero %s y %s"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "atención: ancho %lu inválido; se usará %d en su lugar"
+
+#~ msgid "error writing %s"
+#~ msgstr "error al escribir en %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "argumento %s inválido para %s"
 
diff --git a/po/et.gmo b/po/et.gmo
index 9b70f39..d0ed8cc 100644
Binary files a/po/et.gmo and b/po/et.gmo differ
diff --git a/po/et.po b/po/et.po
index c6f4d01..06e7a75 100644
--- a/po/et.po
+++ b/po/et.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 6.5\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2006-11-23 12:07+0200\n"
 "Last-Translator: Toomas Soome <Toomas.Soome at microlink.ee>\n"
 "Language-Team: Estonian <et at li.org>\n"
@@ -16,40 +16,52 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "kataloogi `%s' ei õnnestu luua"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Lisainfo saamiseks proovige `%s --help'.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -58,16 +70,15 @@ msgstr ""
 "Kasutamine: %s [OPERAND]...\n"
 "       või: %s VÕTI\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Kopeeri fail, teisendades ja vormindades seda vastavalt võtmetele.\n"
@@ -78,21 +89,24 @@ msgstr ""
 "  count=PLOKKE    kopeeri ainult PLOKKE sisendplokki\n"
 "  ibs=BAITE       loe BAITI baiti korraga\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=FAIL         loe standardsisendi asemel faili\n"
 "  iflag=LIPUD     loe vastavalt komadega eraldatud võtmetele\n"
@@ -103,52 +117,50 @@ msgstr ""
 "  skip=PLOKKI     jäta PLOKKI ibs mahus plokke sisendist lugemata\n"
 "  status=noxfer   blokeeri ülekande statistika\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -166,30 +178,12 @@ msgstr ""
 "Iga VÕTMESÕNA võib olla:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     tabelist EBCDIC tabelisse ASCII\n"
-"  ebcdic    tabelist ASCII tabelisse EBCDIC\n"
-"  ibm       tabelist ASCII alternatiivsesse EBCDIC tabelisse\n"
-"  block     täienda reavahetusega lõpetatud kirjed tühikutega cbs-mahtu\n"
-"  unblock   asenda cbs-mahus blokkides lõpetavad tühikud reavahetusega\n"
-"  lcase     asenda suurtähed väiketähtedega\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 #, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   ära loo väljundfaili\n"
 "  excl      katkesta, kui väljundfail on juba olemas\n"
@@ -202,7 +196,7 @@ msgstr ""
 "  fdatasync enne lõpetamist kindlusta andmete faili kirjutamine\n"
 "  fsync     nagu eelmine, aga kirjuta ka metainfo\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 #, fuzzy
 msgid ""
 "  noerror   continue after read errors\n"
@@ -222,7 +216,7 @@ msgstr ""
 "  fdatasync enne lõpetamist kindlusta andmete faili kirjutamine\n"
 "  fsync     nagu eelmine, aga kirjuta ka metainfo\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -236,51 +230,51 @@ msgstr ""
 "  append    lisamise mood (omab mõtet ainult väljundil; soovitame "
 "conv=notrunc)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr "  direct    kasuta andmete käsitlemisel puhverdamata S/V\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr "  directory    katkesta kui ei ole kataloog\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr "  dsync     kasuta andmete käsitlemisel sünkroonmoodi S/V\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync      sama, aga ka metainfo korral\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock  kasuta mitteblokeeruvat S/V\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noatime   ära uuenda kasutamise aega\n"
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr "  noctty    ei seosta kontrollivat terminali\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow  ei järgi nimeviiteid\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks   katkesta, kui on viiteid\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr "  binary    kasuta andmete käsitlemisel binaarmoodi\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text      kasuta andmete käsitlemisel tekstimoodi\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -310,11 +304,11 @@ msgstr ""
 "Võtmed on:\n"
 "\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Tundmatu süsteemne viga"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -323,26 +317,19 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> kirjet sisse\n"
 "%<PRIuMAX>+%<PRIuMAX> kirjet välja\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> lühendatud kirje\n"
-msgstr[1] "%<PRIuMAX> lühendatud kirjet\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] "%<PRIuMAX> bait (%s) kopeeritud"
 msgstr[1] "%<PRIuMAX> baiti (%s) kopeeritud"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "Lõpmatu B"
 
@@ -356,147 +343,155 @@ msgstr "Lõpmatu B"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "sulgen sisendfaili %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "sulgen väljundfaili %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Väljundfailide sufiksid said otsa"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "avan %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "EBAÕNNESTUS"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "kirjutan faili %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "tundmatu operand %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "vigane kuupäev %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "vigane kuupäeva vorming %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "vigane kuupäeva vorming %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "vigane kuupäeva vorming %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "vigane teisendus: %s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "vigane sisendi lipp: %s"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "vigane väljundi lipp: %s"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "vigane oleku lipp: %s"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "vigane number %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "hulgast {ascii,ebcdic,ibm} ei saa ühtegi paari kasutada"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "block ja unblock ei saa koos kasutada"
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "lcase ja ucase ei saa koos kasutada"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "excl ja nocreat ei saa koos kasutada"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "-e ja -i võtmeid ei saa kombineerida"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "-e ja -i võtmeid ei saa kombineerida"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "-e ja -i võtmeid ei saa kombineerida"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "-e ja -i võtmeid ei saa kombineerida"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "-e ja -i võtmeid ei saa kombineerida"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -505,89 +500,74 @@ msgstr ""
 "hoiatus: kasutan lseek funktsiooni tuuma vea tõttu alternatiivset meetodit,\n"
 "fail (%s) mt_type=0x%0lx -- tüüpide nimekirja leiate <sys/mtio.h>"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "loen %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: seek ebaõnnestus"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "failiviida ületäitumine %s lugemisel"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "hoiatus: peale lugemisviga ei pruugi failiviit olla õige"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "ei õnnestu tuuma veast mööda minna"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "hoiatus: peale lugemisviga ei pruugi failiviit olla õige"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "sean %s lipud"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "loen kataloogi %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "loen kataloogi %s"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
-msgstr "viga %s kirjutamisel"
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "kirjutan faili %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "fdatasync %s ebaõnnestus"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "fsync %s ebaõnnestus"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "standardsisend"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "standardväljund"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -596,20 +576,56 @@ msgstr ""
 "indeks on liiga suur: ei õnnestu lühendada pikkuseni seek=%<PRIuMAX> (%lu-"
 "baiti) blokki"
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "fstat %s ei õnnestu"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "lühendan %<PRIuMAX> baiti väljundfailis %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     tabelist EBCDIC tabelisse ASCII\n"
+#~ "  ebcdic    tabelist ASCII tabelisse EBCDIC\n"
+#~ "  ibm       tabelist ASCII alternatiivsesse EBCDIC tabelisse\n"
+#~ "  block     täienda reavahetusega lõpetatud kirjed tühikutega cbs-mahtu\n"
+#~ "  unblock   asenda cbs-mahus blokkides lõpetavad tühikud reavahetusega\n"
+#~ "  lcase     asenda suurtähed väiketähtedega\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> lühendatud kirje\n"
+#~ msgstr[1] "%<PRIuMAX> lühendatud kirjet\n"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "hulgast {ascii,ebcdic,ibm} ei saa ühtegi paari kasutada"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "block ja unblock ei saa koos kasutada"
+
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "lcase ja ucase ei saa koos kasutada"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "hoiatus: peale lugemisviga ei pruugi failiviit olla õige"
+
+#~ msgid "error writing %s"
+#~ msgstr "viga %s kirjutamisel"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "vigane argument %s võtmel `%s'"
 
@@ -6275,10 +6291,6 @@ msgstr ""
 #~ msgid "couldn't open temporary file"
 #~ msgstr "ajutist faili ei õnnestu luua"
 
-#, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "kataloogi `%s' ei õnnestu luua"
-
 #~ msgid "write failed"
 #~ msgstr "kirjutamine ebaõnnestus"
 
diff --git a/po/eu.gmo b/po/eu.gmo
index 0073251..0d5f389 100644
Binary files a/po/eu.gmo and b/po/eu.gmo differ
diff --git a/po/eu.po b/po/eu.po
index 8e23e79..e96b5d4 100644
--- a/po/eu.po
+++ b/po/eu.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils-5.2.1\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2005-01-04 20:27+0100\n"
 "Last-Translator: Mikel Olasagasti <hey_neken at mundurat.net>\n"
 "Language-Team: Basque <translation-team-eu at lists.sourceforge.net>\n"
@@ -18,40 +18,52 @@ msgstr ""
 "Plural-Forms:  nplurals=2; plural=(n != 1);\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "ezin da %s direktorioa sortu"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Saiatu `%s --help' erabiltzen informazio gehiagorako.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, fuzzy, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -60,16 +72,15 @@ msgstr ""
 "Erabilera: %s [ZENBAKIA]...\n"
 "  edo:  %s AUKERA\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Kopiatu a eta e\n"
@@ -79,21 +90,24 @@ msgstr ""
 " kopiatu\n"
 " a e"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "FITXATEGIA FITXATEGIA horren ordez -\n"
 " a\n"
@@ -101,52 +115,50 @@ msgstr ""
 " hasi -\n"
 " hasi - e"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 #, fuzzy
 msgid ""
 "\n"
@@ -159,33 +171,14 @@ msgid ""
 msgstr ""
 "eta maiatzak bider M MB M B eta aktibatuta errepikatu arte E Y maiatzak e e"
 
-#: src/dc3dd.c:1129
-#, fuzzy
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"ASCII\n"
-" ASCII\n"
-" ASCII\n"
-" honekin tamaina\n"
-" in tamaina honekin\n"
-" e"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -194,7 +187,7 @@ msgid ""
 "  fsync     likewise, but also write metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -203,52 +196,52 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "da a"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -270,37 +263,30 @@ msgstr ""
 " in\n"
 " e"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Sistema-errore ezezaguna"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr ""
 
@@ -314,150 +300,156 @@ msgstr ""
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, c-format
 msgid ", %g s, %s/s        "
 msgstr ""
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ""
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "%s sarrera fitxategia itxitzen"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "%s irteera fitxategia itxitzen"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Irteera"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "%s irekitzen"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "HUTS EGIN DA"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "%s-ra idazten"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, fuzzy, c-format
 msgid "unrecognized operand %s"
 msgstr "%s: '--%s' aukera ezezaguna\n"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "baliogabea"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "baliogabea"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal ifjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "baliogabea"
+
+#: src/dc3dd.c:2793
+#, c-format
+msgid "Illegal vfjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "baliogabea"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "baliogabea"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "baliogabea hasi"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "baliogabeko taldea"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "baliogabea"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, fuzzy, c-format
 msgid "invalid number %s"
 msgstr "baliogabea"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr ""
-
-#: src/dc3dd.c:2682
-#, fuzzy
-msgid "cannot combine block and unblock"
-msgstr "ezin dira biak, erabiltzailea eta taldea, alde batera utzi"
-
-#: src/dc3dd.c:2684
-#, fuzzy
-msgid "cannot combine lcase and ucase"
-msgstr "eta"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 #, fuzzy
 msgid "cannot combine excl and nocreat"
 msgstr "honekin edo"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "honekin edo"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "honekin edo"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "honekin edo"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "honekin edo"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "honekin edo"
+
+#: src/dc3dd.c:3116
 #, fuzzy, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -466,109 +458,125 @@ msgstr ""
 "errepikatu arte\n"
 " - mota<sys/mtio.h> errepikatu arte zerrenda -"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "%s irakurtzen"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, fuzzy, c-format
 msgid "%s: cannot seek"
 msgstr "%s: ezin da kendu"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "baliogabea zabalera horren ordez"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr ""
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "baliogabea zabalera horren ordez"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, fuzzy, c-format
 msgid "setting flags for %s"
 msgstr "-"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "%s direktorioa irakurtzen"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "%s direktorioa irakurtzen"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
-msgstr "errorea %s idazten"
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "%s-ra idazten"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, fuzzy, c-format
 msgid "fsync failed for %s"
 msgstr "huts egin da %s irekitzen"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "sarrera estandarra"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "irteera estandarra"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr ""
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr ""
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#, fuzzy
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "ASCII\n"
+#~ " ASCII\n"
+#~ " ASCII\n"
+#~ " honekin tamaina\n"
+#~ " in tamaina honekin\n"
+#~ " e"
+
+#, fuzzy
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "ezin dira biak, erabiltzailea eta taldea, alde batera utzi"
+
+#, fuzzy
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "eta"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "baliogabea zabalera horren ordez"
+
+#~ msgid "error writing %s"
+#~ msgstr "errorea %s idazten"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "%s baliogabeko argumentua da %s-(r)entzat"
 
@@ -5398,10 +5406,6 @@ msgstr ""
 #~ msgid "couldn't open temporary file"
 #~ msgstr "ezin izan da abio ordua lortu"
 
-#, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "ezin da %s direktorioa sortu"
-
 #~ msgid "write failed"
 #~ msgstr "idazketak huts egin du"
 
diff --git a/po/fi.gmo b/po/fi.gmo
index bfa1ccf..883c8f0 100644
Binary files a/po/fi.gmo and b/po/fi.gmo differ
diff --git a/po/fi.po b/po/fi.po
index 8b3bca1..f51f8a8 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -21,7 +21,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 6.9.91\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2008-01-03 21:02+0200\n"
 "Last-Translator: Lauri Nurmi <lanurmi at iki.fi>\n"
 "Language-Team: Finnish <translation-team-fi at lists.sourceforge.net>\n"
@@ -31,41 +31,53 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 #, fuzzy
 msgid "David MacKenzie"
 msgstr "Paul Rubin ja David MacKenzie"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "hakemiston %s luominen ei onnistu"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Lisätietoja komennolla ”%s --help”.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -74,16 +86,15 @@ msgstr ""
 "Käyttö: %s [OPERANDI]...\n"
 "  tai:  %s VALITSIN\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Kopioi tiedosto, muuntaen ja muotoillen operandien mukaisesti.\n"
@@ -95,21 +106,24 @@ msgstr ""
 "  count=LOHKOT    kopioi vain LOHKOT-arvon verran lohkoja\n"
 "  ibs=TAVUT       lue TAVUT-arvon verran tavuja kerralla\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=TIEDOSTO     lue TIEDOSTOsta vakiosyötteen sijaan\n"
 "  obs=TAVUT       kirjoita TAVUT-arvon verran tavuja kerralla\n"
@@ -117,52 +131,50 @@ msgstr ""
 "  seek=LOHKOT     ohita tulosteen alussa LOHKOT verran obs-kokoisia lohkoja\n"
 "  skip=LOHKOT     ohita syötteen alusta LOHKOT verran ibs-kokoisia lohkoja\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -180,32 +192,12 @@ msgstr ""
 "Kukin MUUNNOS voi olla:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     EBCDIC -> ASCII\n"
-"  ebcdic    ASCII -> EBCDIC\n"
-"  ibm       ASCII -> muutettu EBCDIC\n"
-"  block     tasaa rivinvaihtoon päättyvät tietueet välilyönneillä cbs-"
-"kokoon\n"
-"  unblock   korvaa välilyönnit cbs-kokoisten tietueiden lopusta "
-"rivinvaihdolla\n"
-"  lcase     muuta isot kirjaimet pieniksi\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 #, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  notrunc   älä typistä tulostiedostoa\n"
 "  ucase     muuta pienet kirjaimet isoiksi\n"
@@ -215,7 +207,7 @@ msgstr ""
 "käytettäessä\n"
 "              avainsanaa block tai unblock, tasataan välilyönneillä\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 #, fuzzy
 msgid ""
 "  noerror   continue after read errors\n"
@@ -232,7 +224,7 @@ msgstr ""
 "käytettäessä\n"
 "              avainsanaa block tai unblock, tasataan välilyönneillä\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -241,52 +233,52 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "kohdehakemisto ei ole sallittu asennettaessa hakemistoa"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -315,11 +307,11 @@ msgstr ""
 "Valitsimet ovat:\n"
 "\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Tuntematon järjestelmävirhe"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -328,26 +320,19 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> tietuetta sisään\n"
 "%<PRIuMAX>+%<PRIuMAX> tietuetta ulos\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, fuzzy, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "typistetty tietue\n"
-msgstr[1] "%<PRIuMAX> typistettyä tietuetta\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] "1 tavu (1 B) kopioitu"
 msgstr[1] "%<PRIuMAX> tavua (%s) kopioitu"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr ""
 
@@ -361,150 +346,156 @@ msgstr ""
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr " %g sekunnissa, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, fuzzy, c-format
 msgid ", %g s, %s/s\n"
 msgstr " %g sekunnissa, %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "suljetaan syötetiedosto %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "suljetaan tulostiedosto %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Tulostiedostojen jälkiliitteet käytetty loppuun"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "tiedoston %s avaaminen"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "EI TÄSMÄÄ"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "kirjoitettaessa tiedostoon %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "tunnistamaton operandi %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "virheellinen päiväys %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "virheellinen päiväyksen muoto %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal ifjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "virheellinen päiväyksen muoto %s"
+
+#: src/dc3dd.c:2793
+#, c-format
+msgid "Illegal vfjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "virheellinen päiväyksen muoto %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "virheellinen muunnos: %s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "virheellinen leveys: %s"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "virheellinen ryhmänimi %s"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "virheellinen päiväyksen muoto %s"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "virheellinen määrä %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr ""
-
-#: src/dc3dd.c:2682
-#, fuzzy
-msgid "cannot combine block and unblock"
-msgstr "sekä käyttäjää että ryhmää ei voi jättää antamatta"
-
-#: src/dc3dd.c:2684
-#, fuzzy
-msgid "cannot combine lcase and ucase"
-msgstr "tiedostonimiä %s ja %s ei voi vertailla"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 #, fuzzy
 msgid "cannot combine excl and nocreat"
 msgstr "signaalin yhdistäminen valitsimen -l tai -t kanssa ei onnistu"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "valitsimia -e ja -i ei voi käyttää yhdessä"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "valitsimia -e ja -i ei voi käyttää yhdessä"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "valitsimia -e ja -i ei voi käyttää yhdessä"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "valitsimia -e ja -i ei voi käyttää yhdessä"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "valitsimia -e ja -i ei voi käyttää yhdessä"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -513,89 +504,74 @@ msgstr ""
 "varoitus: ohitetaan ytimen lseek-ohjelmistovika tiedostolle (%s)\n"
 "  mt_type=0x%0lx -- katso tyyppien luettelo tiedostosta <sys/mtio.h>"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "luettaessa tiedostoa %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, fuzzy, c-format
 msgid "%s: cannot seek"
 msgstr "%s: ei voi poistaa"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "varoitus: lähdetiedosto %s annettu useammin kuin kerran"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr ""
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "varoitus: lähdetiedosto %s annettu useammin kuin kerran"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, fuzzy, c-format
 msgid "setting flags for %s"
 msgstr "asetettaessa tiedoston %s lippuja"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "luetaan hakemistoa %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "luetaan hakemistoa %s"
 
-#: src/dc3dd.c:3789
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "error writing %s"
-msgstr "virhe kirjoitettaessa tiedostoa %s"
-
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "kirjoitettaessa tiedostoon %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, fuzzy, c-format
 msgid "fsync failed for %s"
 msgstr "tiedoston %s avaaminen epäonnistui"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "vakiosyöte"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "vakiotuloste"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -604,20 +580,58 @@ msgstr ""
 
 # On sitten ihan turha tehdä suomennoksissa mitään eroa statin, fstatin, ym.
 # välille, käyttäjää ei kiinnosta.
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "tiedoston %s tilan lukeminen ei onnistu"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, fuzzy, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "edetään %s tavun yli tulostiedostossa %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     EBCDIC -> ASCII\n"
+#~ "  ebcdic    ASCII -> EBCDIC\n"
+#~ "  ibm       ASCII -> muutettu EBCDIC\n"
+#~ "  block     tasaa rivinvaihtoon päättyvät tietueet välilyönneillä cbs-"
+#~ "kokoon\n"
+#~ "  unblock   korvaa välilyönnit cbs-kokoisten tietueiden lopusta "
+#~ "rivinvaihdolla\n"
+#~ "  lcase     muuta isot kirjaimet pieniksi\n"
+
+#, fuzzy
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "typistetty tietue\n"
+#~ msgstr[1] "%<PRIuMAX> typistettyä tietuetta\n"
+
+#, fuzzy
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "sekä käyttäjää että ryhmää ei voi jättää antamatta"
+
+#, fuzzy
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "tiedostonimiä %s ja %s ei voi vertailla"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "varoitus: lähdetiedosto %s annettu useammin kuin kerran"
+
+#~ msgid "error writing %s"
+#~ msgstr "virhe kirjoitettaessa tiedostoa %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "virheellinen argumentti %s %s:lle"
 
@@ -6232,10 +6246,6 @@ msgstr ""
 #~ msgid "couldn't open temporary file"
 #~ msgstr "väliaikaistiedoston luominen ei onnistu"
 
-#, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "hakemiston %s luominen ei onnistu"
-
 #~ msgid "write failed"
 #~ msgstr "kirjoitus epäonnistui"
 
diff --git a/po/fr.gmo b/po/fr.gmo
index 2951d59..9bdb9e0 100644
Binary files a/po/fr.gmo and b/po/fr.gmo differ
diff --git a/po/fr.po b/po/fr.po
index 2e76250..7229862 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils-6.11\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2008-05-31 11:33+0200\n"
 "Last-Translator: kerb <y.kerb at laposte.net>\n"
 "Language-Team: French <traduc at traduc.org>\n"
@@ -20,40 +20,52 @@ msgstr ""
 "X-Generator: KBabel 1.11.4\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "n'a pu créer le process pour %s -d"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Pour en savoir davantage, faites: « %s --help ».\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -62,16 +74,15 @@ msgstr ""
 "Usage: %s [OPÉRANDE]...\n"
 "   ou: %s OPTION\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Copier un fichier en le convertissant et le formatant selon les opérandes.\n"
@@ -83,21 +94,24 @@ msgstr ""
 "  count=N         copier seulement N blocs à partir de l'entrée\n"
 "  ibs=N           lire N octets à la fois\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=FICHIER      lire à partir du FICHIER au lieu de l'entrée standard\n"
 "  iflag=FANIONS   lire à l'aide de LISTE de symboles séparés par des "
@@ -110,52 +124,50 @@ msgstr ""
 "  skip=N          escamoter N blocs de taille « ibs » du fichier d'entrée\n"
 "  status=noxfer   supprimer les statistiques de transfert\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -174,31 +186,12 @@ msgstr ""
 "Chaque mot CLÉ peut être:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     de l'EBCDIC vers l'ASCII\n"
-"  ebcdic    de l'ASCII  vers l'EBCDIC\n"
-"  ibm       de l'ASCII  vers l'EBCDIC en utilisant une table différente\n"
-"  block     remplir les enregistrements terminés par un saut de ligne\n"
-"            par des blancs jusqu'à l'obtention de la taille « cbs »\n"
-"  unblock   remplacer les blancs de la fin des enregistrements\n"
-"            de taille « cbs » par des sauts de ligne\n"
-"  lcase     changer les majuscules en minuscules\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
+#, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   ne pas créer de ficheir de sortie\n"
 "  excl      échoue si le fichier de sortie existe déjà\n"
@@ -206,7 +199,7 @@ msgstr ""
 "  ucase     change les minuscules en majuscules\n"
 "  swab      interchange chaque paire d'octets entrée\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -221,7 +214,7 @@ msgstr ""
 "  fdatasync  écrit physiquement les données en sortie avant la fin\n"
 "  fsync     pareil, mais écrit les métadonnées\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -235,52 +228,52 @@ msgstr ""
 "  append    mode d'accolage (n'a de sens que pour la sortie ; conv=notrunc "
 "suggéré)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr "  direct    utiliser les E/S directes pour les données\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr "  échec de répertoire à moins qu'un répertoire\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr "  dsync     utilise une E/S synchronisée pour les données\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync      identique mais aussi pour les métadonnées\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock  utiliser une E/S non bloquante\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noatime   ne met pas à jour la date d'accès\n"
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 "  noctty    ne pas assigner de terminal contrôleur à partir du fichier\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow  ne pas suivre les liens symboliques\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks   échoue si multiply-linked\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr "  binaire   utiliser les E/S binaires pour les données\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text      utiliser les E/S textuelles pour les données\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -307,11 +300,11 @@ msgstr ""
 "  18335302+0 enregistrements écrits\n"
 "  9387674624 octets (9.4 Go) copiés, 34.6279 secondes, 271 Mo/s\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Erreur système inconnue"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -320,26 +313,19 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> enregistrements lus\n"
 "%<PRIuMAX>+%<PRIuMAX> enregistrements écrits\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> enregistrement tronqué\n"
-msgstr[1] "%<PRIuMAX> enregistrements tronqués\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] "%<PRIuMAX> octet (%s) copié"
 msgstr[1] "%<PRIuMAX> octets (%s) copiés"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "Infinité B"
 
@@ -353,143 +339,151 @@ msgstr "Infinité B"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "fermeture du fichier d'entrée %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "fermeture du fichier de sortie %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Produire les suffixes des fichiers épuisés"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "ouverture de %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "ÉCHEC"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "écriture vers %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "opérande non reconnue %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "date invalide %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "format de date invalide %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal ifjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "format de date invalide %s"
+
+#: src/dc3dd.c:2793
+#, c-format
+msgid "Illegal vfjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "format de date invalide %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 msgid "invalid conversion"
 msgstr "conversion invalide"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 msgid "invalid input flag"
 msgstr "fanion d'entrée invalide"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 msgid "invalid output flag"
 msgstr "fanion de sortie invalide"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 msgid "invalid status flag"
 msgstr "fanion d'état invalide"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "nombre invalide %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "ne peut combiner n'importe quel des deux de: ascii, ebcdic, ibm"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "ne peut combiner les options block t unblock"
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "ne peut combiner les options lcase et ucase"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "ne peut combiner les options excl et nocreat"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "ne peut combiner les options -e et -i"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "ne peut combiner les options -e et -i"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "ne peut combiner les options -e et -i"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "ne peut combiner les options -e et -i"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "ne peut combiner les options -e et -i"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -499,93 +493,76 @@ msgstr ""
 "pour le fichier (%s)\n"
 "de type mt_type=0x%0lx -- voir <sys/mtio.h> pour la liste des types"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "lecture de %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: ne peut retrouver"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "débordement du décalage lors de la lecture du fichier %s"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr ""
 "avertissement : décalage(offset) de fichier invalide suite à un échec de "
 "lecture"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "ne peut après tout contrer une anomalie du kernel"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr ""
-"avertissement : décalage(offset) de fichier invalide suite à un échec de "
-"lecture"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "initialisation des fanions pour %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "lecture du répertoire %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "lecture du répertoire %s"
 
-#: src/dc3dd.c:3789
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "error writing %s"
-msgstr "Erreur lors de l'écriture %s"
-
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "écriture vers %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "fdatasync a échoué pour %s"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "fsync a échoue pour %s"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "entrée standard"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "sortie standard"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -594,20 +571,60 @@ msgstr ""
 "décalage trop grand: ne peut tronquer à la longueur de la recherche=%"
 "<PRIuMAX> (%lu-byte) blocs"
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "ne peut évaluer par fstat() %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "troncation à %<PRIuMAX> octets dans le fichier de sortie %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     de l'EBCDIC vers l'ASCII\n"
+#~ "  ebcdic    de l'ASCII  vers l'EBCDIC\n"
+#~ "  ibm       de l'ASCII  vers l'EBCDIC en utilisant une table différente\n"
+#~ "  block     remplir les enregistrements terminés par un saut de ligne\n"
+#~ "            par des blancs jusqu'à l'obtention de la taille « cbs »\n"
+#~ "  unblock   remplacer les blancs de la fin des enregistrements\n"
+#~ "            de taille « cbs » par des sauts de ligne\n"
+#~ "  lcase     changer les majuscules en minuscules\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> enregistrement tronqué\n"
+#~ msgstr[1] "%<PRIuMAX> enregistrements tronqués\n"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "ne peut combiner n'importe quel des deux de: ascii, ebcdic, ibm"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "ne peut combiner les options block t unblock"
+
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "ne peut combiner les options lcase et ucase"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr ""
+#~ "avertissement : décalage(offset) de fichier invalide suite à un échec de "
+#~ "lecture"
+
+#~ msgid "error writing %s"
+#~ msgstr "Erreur lors de l'écriture %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "argument %s invalide pour %s"
 
@@ -6984,9 +7001,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "n'a pu exécuter %s -d"
 
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "n'a pu créer le process pour %s -d"
-
 #~ msgid "write failed"
 #~ msgstr "Echec d'écriture."
 
diff --git a/po/ga.gmo b/po/ga.gmo
index df89f73..84479fc 100644
Binary files a/po/ga.gmo and b/po/ga.gmo differ
diff --git a/po/ga.po b/po/ga.po
index 8f1221c..5c4c6da 100644
--- a/po/ga.po
+++ b/po/ga.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 6.11\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2008-04-20 12:24-0600\n"
 "Last-Translator: Kevin Scannell <kscanne at gmail.com>\n"
 "Language-Team: Irish <gaeilge-gnulinux at lists.sourceforge.net>\n"
@@ -18,40 +18,52 @@ msgstr ""
 "(n>6 && n<11) ? 3 : 4;\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "níorbh fhéidir próiseas a chruthú le haghaidh %s -d"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Bain triail as `%s --help' chun tuilleadh eolais a fháil.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -60,16 +72,15 @@ msgstr ""
 "Úsáid: %s [OIBREANN]...\n"
 "  nó:  %s ROGHA\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Cóipeáil comhad, ag tiontú agus ag formáidiú dar leis na hoibrinn.\n"
@@ -80,21 +91,24 @@ msgstr ""
 "  count=BLOIC     cóipeáil BLOIC bloc ionchurtha amháin\n"
 "  ibs=BEARTA      léigh BEARTA beart sa turas\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=COMHAD       léigh ó CHOMHAD in ionad an ghnáth-ionchuir\n"
 "  iflag=BRATACH   léigh de réir an liosta siombailí, scartha le camóga\n"
@@ -106,52 +120,50 @@ msgstr ""
 "ionchuir\n"
 "  status=noxfer   ná taispeáin staitistic faoin aistriú\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -169,31 +181,12 @@ msgstr ""
 "Is féidir EOCHAIRFHOCAL a bheith:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     ó EBCDIC go ASCII\n"
-"  ebcdic    ó ASCII go EBCDIC\n"
-"  ibm       ó ASCII go EBCDIC malartach\n"
-"  block     stuáil le spásanna go cbs-size gach taifead atá scortha le líne "
-"nua\n"
-"  unblock   cuir línte nua in ionad spásanna ag deireadh de thaifid de cbs-"
-"size\n"
-"  lcase     athraigh an cás uachtair go dtí an cás íochtair\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
+#, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   ná cruthaigh an t-aschomhad\n"
 "  excl      teip má tá an t-aschomhad ann cheana\n"
@@ -201,7 +194,7 @@ msgstr ""
 "  ucase     athraigh an cás íochtair go dtí an cás uachtair\n"
 "  swab      babhtáil gach cúpla beart san ionchur\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -216,7 +209,7 @@ msgstr ""
 "  fdatasync scríobh ar an aschomhad go fisiceach roimh chríochnú\n"
 "  fsync     mar an gcéanna, ach scríobh meiteashonraí freisin\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -230,51 +223,51 @@ msgstr ""
 "  append    mód iarcheangail (ná húsáid ach le haschur; moltar "
 "conv=notrunc)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr "  direct    úsáid I/A díreach le haghaidh sonraí\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr "  directory teip mura comhadlann é\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr "  dsync     úsáid I/A sioncrónaithe le haghaidh sonraí\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync      mar an gcéanna, ach le haghaidh meiteashonraí fosta\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock  úsáid I/A gan bhacainní\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noatime   ná nuashonraigh an t-am rochtana\n"
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr "  noctty    ná ceap an teirminéal rialaithe ó chomhad\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow  ná lean naisc shiombalacha\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks   teip má tá naisc iomadúla ann\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr "  binary    úsáid I/A dénártha le haghaidh sonraí\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text      úsáid I/A téacs le haghaidh sonraí\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -304,11 +297,11 @@ msgstr ""
 "Roghanna:\n"
 "\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Earráid chórais anaithnid"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -317,22 +310,12 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> taifead isteach\n"
 "%<PRIuMAX>+%<PRIuMAX> taifead amach\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> taifead teasctha\n"
-msgstr[1] "%<PRIuMAX> thaifead teasctha\n"
-msgstr[2] "%<PRIuMAX> thaifead teasctha\n"
-msgstr[3] "%<PRIuMAX> dtaifead teasctha\n"
-msgstr[4] "%<PRIuMAX> taifead teasctha\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
@@ -342,7 +325,7 @@ msgstr[2] "cóipeáladh %<PRIuMAX> bheart (%s)"
 msgstr[3] "cóipeáladh %<PRIuMAX> mbeart (%s)"
 msgstr[4] "cóipeáladh %<PRIuMAX> beart (%s)"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "Éigríoch B"
 
@@ -356,144 +339,154 @@ msgstr "Éigríoch B"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g shoicind, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g shoicind, %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "inchomhad %s á dhúnadh"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "aschomhad %s á dhúnadh"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Iarmhíreanna don aschomhad ídithe"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "%s á oscailt"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "TEIPTHE"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "á scríobh i %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "oibreann anaithnid %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "dáta neamhbhailí %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
 # similar string for time format in ls.c -KPS
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "formáid neamhbhailí ar an dáta: %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+# similar string for time format in ls.c -KPS
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "formáid neamhbhailí ar an dáta: %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+# similar string for time format in ls.c -KPS
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "formáid neamhbhailí ar an dáta: %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 msgid "invalid conversion"
 msgstr "tiontú neamhbhailí"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 msgid "invalid input flag"
 msgstr "bratach neamhbhailí ionchurtha"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 msgid "invalid output flag"
 msgstr "bratach neamhbhailí aschurtha"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 msgid "invalid status flag"
 msgstr "bratach neamhbhailí stádais"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "uimhir neamhbhailí %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "ní féidir aon dá cheann de {ascii,ebcdic,ibm} a úsáid lena chéile"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "ní féidir `block' agus `unblock' a úsáid lena chéile"
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "ní féidir `lcase' agus `ucase' a úsáid lena chéile"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "ní féidir `excl' agus `nocreat' a úsáid lena chéile"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "ní féidir roghanna -e agus -i a chumasc"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "ní féidir roghanna -e agus -i a chumasc"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "ní féidir roghanna -e agus -i a chumasc"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "ní féidir roghanna -e agus -i a chumasc"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "ní féidir roghanna -e agus -i a chumasc"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -502,89 +495,74 @@ msgstr ""
 "rabhadh: ag seachaint fabht eithne `lseek' don chomhad (%s)\n"
 "  de mt_type=0x%0lx -- féach ar <sys/mtio.h> le haghaidh liosta cineálacha"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "%s á léamh"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: ní féidir seek a dhéanamh"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "fritháireamh thar maoil agus comhad %s á léamh"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "rabhadh: fritháireamh neamhbhailí i ndiaidh léamh teipthe"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "tar éis an tsaoil, ní féidir fabht san eithne a sheachaint"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "rabhadh: fritháireamh neamhbhailí i ndiaidh léamh teipthe"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "bratacha á socraithe le haghaidh %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "comhadlann %s á léamh"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "comhadlann %s á léamh"
 
-#: src/dc3dd.c:3789
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "error writing %s"
-msgstr "earráid agus %s á scríobh"
-
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "á scríobh i %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "theip ar fdatasync i gcomhair %s"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "theip ar fsync i gcomhair %s"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "gnáth-ionchur"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "gnáth-aschur"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -592,20 +570,61 @@ msgid ""
 msgstr ""
 "fritháireamh rómhór: ní féidir teascadh go fad %<PRIuMAX> (%lu beart) bloc"
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "ní féidir %s a `fstat'"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "á theascadh ag %<PRIuMAX> beart san aschomhad %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     ó EBCDIC go ASCII\n"
+#~ "  ebcdic    ó ASCII go EBCDIC\n"
+#~ "  ibm       ó ASCII go EBCDIC malartach\n"
+#~ "  block     stuáil le spásanna go cbs-size gach taifead atá scortha le "
+#~ "líne nua\n"
+#~ "  unblock   cuir línte nua in ionad spásanna ag deireadh de thaifid de "
+#~ "cbs-size\n"
+#~ "  lcase     athraigh an cás uachtair go dtí an cás íochtair\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> taifead teasctha\n"
+#~ msgstr[1] "%<PRIuMAX> thaifead teasctha\n"
+#~ msgstr[2] "%<PRIuMAX> thaifead teasctha\n"
+#~ msgstr[3] "%<PRIuMAX> dtaifead teasctha\n"
+#~ msgstr[4] "%<PRIuMAX> taifead teasctha\n"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "ní féidir aon dá cheann de {ascii,ebcdic,ibm} a úsáid lena chéile"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "ní féidir `block' agus `unblock' a úsáid lena chéile"
+
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "ní féidir `lcase' agus `ucase' a úsáid lena chéile"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "rabhadh: fritháireamh neamhbhailí i ndiaidh léamh teipthe"
+
+#~ msgid "error writing %s"
+#~ msgstr "earráid agus %s á scríobh"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "argóint neamhbhailí %s chun %s"
 
@@ -6796,9 +6815,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "níorbh fhéidir %s -d a rith"
 
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "níorbh fhéidir próiseas a chruthú le haghaidh %s -d"
-
 #~ msgid "write failed"
 #~ msgstr "theip ar scríobh"
 
diff --git a/po/gl.gmo b/po/gl.gmo
index 2d0a8e5..d84d22b 100644
Binary files a/po/gl.gmo and b/po/gl.gmo differ
diff --git a/po/gl.po b/po/gl.po
index 50e5fd3..d1d39a8 100644
--- a/po/gl.po
+++ b/po/gl.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: textutils 2.0.22\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2002-07-23 03:07+0200\n"
 "Last-Translator: Jacobo Tarrio <jtarrio at trasno.net>\n"
 "Language-Team: Galician <gpul-traduccion at ceu.fi.udc.es>\n"
@@ -15,41 +15,53 @@ msgstr ""
 "Content-Transfer-Encoding: 8-bit\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 #, fuzzy
 msgid "David MacKenzie"
 msgstr "Paul Rubin e David MacKenzie"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "non se pode crea-lo directorio %s"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Escriba \"%s --help\" para máis información.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, fuzzy, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -58,80 +70,80 @@ msgstr ""
 "Uso: %s [FICHEIRO]...\n"
 " ou: %s [OPCIÓN]\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -142,26 +154,14 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -170,7 +170,7 @@ msgid ""
 "  fsync     likewise, but also write metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -179,52 +179,52 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "%s existe pero non é un directorio"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, c-format
 msgid ""
 "\n"
@@ -241,37 +241,30 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Erro do sistema descoñecido"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, fuzzy, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "rexistro truncado"
-msgstr[1] "rexistro truncado"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr ""
 
@@ -285,259 +278,271 @@ msgstr ""
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, c-format
 msgid ", %g s, %s/s        "
 msgstr ""
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ""
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, fuzzy, c-format
 msgid "closing input file %s"
 msgstr "creando ficheiro \"%s\"\n"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "pechando o ficheiro de saída %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Esgotáronse os sufixos de ficheiros de saída"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, fuzzy, c-format
 msgid "opening %s"
 msgstr "erro lendo %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "FALLA"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, fuzzy, c-format
-msgid "writing to %s"
-msgstr "erro escribindo %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, fuzzy, c-format
 msgid "unrecognized operand %s"
 msgstr "opción descoñecida \"-%c\""
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "anchura non válida: \"%s\""
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "argumento incorrecto %s para %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "argumento incorrecto %s para %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "argumento incorrecto %s para %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "opción de anchura non válida: \"%s\""
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "número non válido ao comezo do campo"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "grupo incorrecto"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "usuario incorrecto"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, fuzzy, c-format
 msgid "invalid number %s"
 msgstr "número incorrecto"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr ""
-
-#: src/dc3dd.c:2682
-#, fuzzy
-msgid "cannot combine block and unblock"
-msgstr "non se poden omiti-lo usuario e o grupo"
-
-#: src/dc3dd.c:2684
-#, fuzzy
-msgid "cannot combine lcase and ucase"
-msgstr "As cadeas que se compararon foron %s e %s"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 #, fuzzy
 msgid "cannot combine excl and nocreat"
 msgstr "non se pode move-lo punteiro do ficheiro de %s"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "non se pode move-lo punteiro do ficheiro de %s"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "non se pode move-lo punteiro do ficheiro de %s"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "non se pode move-lo punteiro do ficheiro de %s"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "non se pode move-lo punteiro do ficheiro de %s"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "non se pode move-lo punteiro do ficheiro de %s"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
 "  of mt_type=0x%0lx -- see <sys/mtio.h> for the list of types"
 msgstr ""
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "erro lendo %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, fuzzy, c-format
 msgid "%s: cannot seek"
 msgstr "%s: non se pode borrar"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "aviso: ancho %lu incorrecto; usando %d na súa vez"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr ""
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "aviso: ancho %lu incorrecto; usando %d na súa vez"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, fuzzy, c-format
 msgid "setting flags for %s"
 msgstr "establecendo a data de %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "non se pode crea-lo directorio %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "non se pode crea-lo directorio %s"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
+#, fuzzy, c-format
+msgid "writing to %s"
 msgstr "erro escribindo %s"
 
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
-
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "entrada estándar"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "saída estándar"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, fuzzy, c-format
 msgid "cannot fstat %s"
 msgstr "non se poden cambia-los permisos de `%s'"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, fuzzy, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "avanzando os pasados %s bytes no ficheiro de saída %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#, fuzzy
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "rexistro truncado"
+#~ msgstr[1] "rexistro truncado"
+
+#, fuzzy
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "non se poden omiti-lo usuario e o grupo"
+
+#, fuzzy
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "As cadeas que se compararon foron %s e %s"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "aviso: ancho %lu incorrecto; usando %d na súa vez"
+
+#~ msgid "error writing %s"
+#~ msgstr "erro escribindo %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "argumento incorrecto %s para %s"
 
@@ -4601,10 +4606,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "non se poden cambia-los permisos de `%s'"
 
-#, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "non se pode crea-lo directorio %s"
-
 #~ msgid "write failed"
 #~ msgstr "erro de escritura"
 
diff --git a/po/hu.gmo b/po/hu.gmo
index 2ed2e21..f94518b 100644
Binary files a/po/hu.gmo and b/po/hu.gmo differ
diff --git a/po/hu.po b/po/hu.po
index 0b1fc0f..735cab3 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 6.11\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2008-05-11 16:25+0200\n"
 "Last-Translator: Gabor Kelemen <kelemeng at gnome.hu>\n"
 "Language-Team: Hungarian <translation-team-hu at lists.sourceforge.net>\n"
@@ -20,40 +20,52 @@ msgstr ""
 "X-Generator: KBabel 1.11.4\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "nem hozható létre folyamat a következőhöz: %s -d"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "További információkért adja ki a(z) „%s --help” parancsot.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -62,16 +74,15 @@ msgstr ""
 "Használat: %s [OPERANDUS]...\n"
 "  vagy:    %s KAPCSOLÓ\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Fájl másolása, az operandusoknak megfelelő átalakítással és formázással.\n"
@@ -83,21 +94,24 @@ msgstr ""
 "  count=BLOKK     csak BLOKK bemeneti blokkot másol\n"
 "  ibs=BÁJT        egyszerre BÁJT bájtot olvas be\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=FÁJL         a FÁJLBÓL olvas a szabványos bemenet helyett\n"
 "  iflag=JELÖLŐK   a vesszővel elválasztott szimbólumlistának megfelelően "
@@ -109,52 +123,50 @@ msgstr ""
 "  skip=BLOKK      ennyi ibs-méretű blokkot hagy ki a bemenet elején\n"
 "  status=noxfer   átviteli statisztika elnyomása\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -172,30 +184,12 @@ msgstr ""
 "KULCSSZÓ szimbólumok az alábbiak lehetnek:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     EBCDIC-ből ASCII-ba\n"
-"  ebcdic    ASCII-ból EBCDIC-be\n"
-"  ibm       ASCII-ból módosított EBCDIC-be\n"
-"  block     az új sorra végződő rekordokat cbs méretűre tölti ki "
-"szóközökkel\n"
-"  unblock   a sorvégi szóközöket cbs méretű rekordokban soremelésre cseréli\n"
-"  lcase     nagybetűről kisbetűre cserél\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
+#, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   ne hozza létre a kimeneti fájlt\n"
 "  excl      a működés visszautasítása, ha kimeneti fájl már létezik\n"
@@ -203,7 +197,7 @@ msgstr ""
 "  ucase     kisbetűről nagybetűre cserél\n"
 "  swab      minden bemeneti bájtpár sorrendjét megcseréli\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -218,7 +212,7 @@ msgstr ""
 "  fdatasync a kimeneti fájladatok kiírása fizikailag a befejezés előtt\n"
 "  fsync     hasonló az előzőhöz, de a metaadatokat is kiírja\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -232,52 +226,52 @@ msgstr ""
 "  append    hozzáfűzési mód (csak kimenet esetén van értelme; javasolt a\n"
 "              conv=notrunc)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr "  direct    közvetlen I/O használata az adatokhoz\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr "  directory működés csak könyvtárakon\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr "  dsync     szinkronizált I/O használata az adatokhoz\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync      hasonló az előzőhöz, de a metaadatok esetén is érvényes\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock  nem blokkoló I/O használata\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noatime   ne frissítse a hozzáférési időt\n"
 
 # fixme
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr "  noctty    ne rendelje hozzá a vezérlő terminált fájlból\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow  ne kövesse a szimbolikus linkeket\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks   többszörös linkek esetén a működés visszautasítása\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr "  binary    bináris I/O használata az adatokhoz\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text      szöveges I/O használata az adatokhoz\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -307,11 +301,11 @@ msgstr ""
 "A kapcsolók:\n"
 "\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Ismeretlen rendszerhiba"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -320,26 +314,19 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> beolvasott rekord\n"
 "%<PRIuMAX>+%<PRIuMAX> kiírt rekord\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> levágott rekord\n"
-msgstr[1] "%<PRIuMAX> levágott rekord\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] "%<PRIuMAX> bájt (%s) másolva"
 msgstr[1] "%<PRIuMAX> bájt (%s) másolva"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "Végtelen B"
 
@@ -353,143 +340,151 @@ msgstr "Végtelen B"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g mp, %s/mp\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g mp, %s/mp\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "%s bemeneti fájl lezárása"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "%s kimeneti fájl lezárása"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "A kimenetifájl-utótagok elfogytak"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "%s megnyitása"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "HIBÁS"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "írás a következőbe: %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "ismeretlen operandus: %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "érvénytelen dátum: %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "érvénytelen dátumformátum: %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "érvénytelen dátumformátum: %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "érvénytelen dátumformátum: %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 msgid "invalid conversion"
 msgstr "érvénytelen átalakítás"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 msgid "invalid input flag"
 msgstr "érvénytelen bemeneti jelölő"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 msgid "invalid output flag"
 msgstr "érvénytelen kimeneti jelölő"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 msgid "invalid status flag"
 msgstr "érvénytelen állapotjelölő"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "érvénytelen szám: %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "az {ascii,ebcdic,ibm} közül csak egy adható meg egyszerre"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "a block és az unblock nem adható meg egyszerre"
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "az lcase és az ucase nem adható meg egyszerre"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "az excl és a nocreat nem adható meg egyszerre"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "a -e és -i kapcsolók nem kombinálhatók"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "a -e és -i kapcsolók nem kombinálhatók"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "a -e és -i kapcsolók nem kombinálhatók"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "a -e és -i kapcsolók nem kombinálhatók"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "a -e és -i kapcsolók nem kombinálhatók"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -499,89 +494,74 @@ msgstr ""
 "%s (mt_type=0x%0lx)\n"
 "A <sys/mtio.h> fájlban megtalálod a típusok listáját"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "%s olvasása"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: nem lehet pozicionálni"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "eltolástúlcsordulás a(z) %s fájl olvasása közben"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "figyelmeztetés: érvénytelen fájleltolás a meghiúsult olvasás után"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "a kernelhiba nem kerülhető meg"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "figyelmeztetés: érvénytelen fájleltolás a meghiúsult olvasás után"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "%s jelölőinek beállítása"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "%s könyvtár olvasása"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "%s könyvtár olvasása"
 
-#: src/dc3dd.c:3789
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "error writing %s"
-msgstr "hiba %s írása közben"
-
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "írás a következőbe: %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "az fdatasync meghiúsult a következőhöz: %s"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "az fsync meghiúsult a következőhöz: %s"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "szabványos bemenet"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "szabványos kimenet"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -590,20 +570,58 @@ msgstr ""
 "Az eltolás túl nagy: nem lehet seek=%<PRIuMAX> (%lu bájt) blokk\n"
 "hosszára csonkítani"
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "fstat %s sikertelen"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "csonkítás a(z) %<PRIuMAX>. bájtnál a következő kimeneti fájlban: %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     EBCDIC-ből ASCII-ba\n"
+#~ "  ebcdic    ASCII-ból EBCDIC-be\n"
+#~ "  ibm       ASCII-ból módosított EBCDIC-be\n"
+#~ "  block     az új sorra végződő rekordokat cbs méretűre tölti ki "
+#~ "szóközökkel\n"
+#~ "  unblock   a sorvégi szóközöket cbs méretű rekordokban soremelésre "
+#~ "cseréli\n"
+#~ "  lcase     nagybetűről kisbetűre cserél\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> levágott rekord\n"
+#~ msgstr[1] "%<PRIuMAX> levágott rekord\n"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "az {ascii,ebcdic,ibm} közül csak egy adható meg egyszerre"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "a block és az unblock nem adható meg egyszerre"
+
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "az lcase és az ucase nem adható meg egyszerre"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "figyelmeztetés: érvénytelen fájleltolás a meghiúsult olvasás után"
+
+#~ msgid "error writing %s"
+#~ msgstr "hiba %s írása közben"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "a(z) „%s” argumentum érvénytelen a következőhöz: %s"
 
@@ -7030,9 +7048,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "nem hajtható végre: %s -d"
 
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "nem hozható létre folyamat a következőhöz: %s -d"
-
 #~ msgid "write failed"
 #~ msgstr "az írás meghiúsult"
 
diff --git a/po/it.gmo b/po/it.gmo
index 16b9560..86cbd84 100644
Binary files a/po/it.gmo and b/po/it.gmo differ
diff --git a/po/it.po b/po/it.po
index 7f78284..8ef8f60 100644
--- a/po/it.po
+++ b/po/it.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 4.5.1\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2002-07-24 18:12+0200\n"
 "Last-Translator: Marco d'Itri <md at linux.it>\n"
 "Language-Team: Italian <tp at lists.linux.it>\n"
@@ -17,41 +17,53 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 #, fuzzy
 msgid "David MacKenzie"
 msgstr "Arnold Robbins and David MacKenzie"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "impossibile creare la directory %s"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Usare `%s --help' per ulteriori informazioni.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, fuzzy, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -60,16 +72,15 @@ msgstr ""
 "Uso: %s [NUMERO]...\n"
 " o:  %s OPZIONE\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Copia un file, convertendolo e formattandolo secondo le opzioni.\n"
@@ -82,21 +93,24 @@ msgstr ""
 "  count=BLOCCHI   copia dall'input solo un certo numero di BLOCCHI\n"
 "  ibs=BYTE        legge BYTE byte per volta\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=FILE         legge da FILE invece che da stdin\n"
 "  obs=BYTE        scrive BYTE byte per volta\n"
@@ -105,52 +119,50 @@ msgstr ""
 "dell'output\n"
 "  skip=BLOCCHI    salta un numero BLOCCHI lunghi ibs all'inizio dell'input\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 #, fuzzy
 msgid ""
 "\n"
@@ -169,34 +181,14 @@ msgstr ""
 "Ogni PAROLA può essere:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-#, fuzzy
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     da EBCDIC a ASCII\n"
-"  ebcdic    da ASCII a EBCDIC\n"
-"  ibm       da ASCII a EBCDIC alternativo\n"
-"  block     completa con spazi fino a cbs i record terminati da newline\n"
-"  unblock   sostituisce con newline gli spazi alla fine di un record lungo "
-"cbs\n"
-"  lcase     cambia le maiuscole in minuscole\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -205,7 +197,7 @@ msgid ""
 "  fsync     likewise, but also write metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -214,52 +206,52 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "%s: la directory obiettivo specificata non è una directory"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, c-format
 msgid ""
 "\n"
@@ -276,37 +268,30 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Errore di sistema sconosciuto"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, fuzzy, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "record troncato"
-msgstr[1] "record troncato"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr ""
 
@@ -320,149 +305,155 @@ msgstr ""
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, c-format
 msgid ", %g s, %s/s        "
 msgstr ""
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ""
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "chiusura del file di input %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "chiusura del file di output %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 msgid "Split extensions exhausted"
 msgstr ""
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "apertura di %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "INATTIVO"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "scrittura di %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, fuzzy, c-format
 msgid "unrecognized operand %s"
 msgstr "opzione %s non riconosciuta"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "data `%s' non valida"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "formato di orario %s non valido"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal ifjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "formato di orario %s non valido"
+
+#: src/dc3dd.c:2793
+#, c-format
+msgid "Illegal vfjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "formato di orario %s non valido"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "conversione non valida: %s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "numero %s non valido"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "gruppo non valido"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "utente %s non valido"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "numero %s non valido"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr ""
-
-#: src/dc3dd.c:2682
-#, fuzzy
-msgid "cannot combine block and unblock"
-msgstr "impossibile omettere sia l'utente che il gruppo"
-
-#: src/dc3dd.c:2684
-#, fuzzy
-msgid "cannot combine lcase and ucase"
-msgstr "impossibile confrontare i nomi di file %s e %s"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 #, fuzzy
 msgid "cannot combine excl and nocreat"
 msgstr "non è possibile combinare i segnali con -l o -t"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "non è possibile combinare i segnali con -l o -t"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "non è possibile combinare i segnali con -l o -t"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "non è possibile combinare i segnali con -l o -t"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "non è possibile combinare i segnali con -l o -t"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "non è possibile combinare i segnali con -l o -t"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -471,107 +462,128 @@ msgstr ""
 "warning: working around lseek kernel bug for file (%s)\n"
 "  of mt_type=0x%0lx -- see <sys/mtio.h> for the list of types"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "lettura di %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, fuzzy, c-format
 msgid "%s: cannot seek"
 msgstr "%s: impossibile rimuoverlo"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 msgid "advance: warning: invalid file offset after failed read"
 msgstr ""
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr ""
 
-#: src/dc3dd.c:3123
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr ""
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, fuzzy, c-format
 msgid "setting flags for %s"
 msgstr "impostazione dell'orario di %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "creazione della directory %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "creazione della directory %s"
 
-#: src/dc3dd.c:3789
-#, fuzzy, c-format
-msgid "error writing %s"
-msgstr "scrittura di %s"
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "scrittura di %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "standard input"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "standard output"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "impossibile fare fstat di %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, fuzzy, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "avanzamento di %s byte nel file di output %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#, fuzzy
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     da EBCDIC a ASCII\n"
+#~ "  ebcdic    da ASCII a EBCDIC\n"
+#~ "  ibm       da ASCII a EBCDIC alternativo\n"
+#~ "  block     completa con spazi fino a cbs i record terminati da newline\n"
+#~ "  unblock   sostituisce con newline gli spazi alla fine di un record "
+#~ "lungo cbs\n"
+#~ "  lcase     cambia le maiuscole in minuscole\n"
+
+#, fuzzy
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "record troncato"
+#~ msgstr[1] "record troncato"
+
+#, fuzzy
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "impossibile omettere sia l'utente che il gruppo"
+
+#, fuzzy
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "impossibile confrontare i nomi di file %s e %s"
+
+#, fuzzy
+#~ msgid "error writing %s"
+#~ msgstr "scrittura di %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "argomento %s non valido per %s"
 
@@ -4536,10 +4548,6 @@ msgstr ""
 #~ msgstr "impossibile creare il file normale %s"
 
 #, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "impossibile creare la directory %s"
-
-#, fuzzy
 #~ msgid "write failed"
 #~ msgstr "strip fallito"
 
diff --git a/po/ja.gmo b/po/ja.gmo
index 0fcc12a..859107e 100644
Binary files a/po/ja.gmo and b/po/ja.gmo differ
diff --git a/po/ja.po b/po/ja.po
index 27b8451..96e15c6 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GNU textutils 2.0.22\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2002-07-27 22:54+0900\n"
 "Last-Translator: Masahito Yamaga <ma at yama-ga.com>\n"
 "Language-Team: Japanese <translation-team-ja at lists.sourceforge.net>\n"
@@ -19,41 +19,53 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 #, fuzzy
 msgid "David MacKenzie"
 msgstr "Paul Rubin と David MacKenzie"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "ディレクトリ %s を作成できません"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "詳しくは `%s --help' を実行して下さい.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, fuzzy, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -62,16 +74,15 @@ msgstr ""
 "使用法: %s [ファイル]...\n"
 "または: %s [オプション]\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "オプション指定に応じた変換・形式でファイルをコピーします。\n"
@@ -82,21 +93,24 @@ msgstr ""
 "  count=BLOCKS    入力ファイルの BLOCKS の分だけコピーする\n"
 "  ibs=BYTES       一度に BYTES バイト分読み込む\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=FILE         標準入力の代りに FILE から読み込む\n"
 "  obs=BYTES       一度に BYTES バイト分書き込む\n"
@@ -104,52 +118,50 @@ msgstr ""
 "  seek=BLOCKS     サイズが obs の BLOCKS 分書込み開始位置をスキップ\n"
 "  skip=BLOCKS     サイズが ibs の BLOCKS 分読込み開始位置をスキップ\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 #, fuzzy
 msgid ""
 "\n"
@@ -167,33 +179,14 @@ msgstr ""
 "KEYWORD には以下のものを使えます:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-#, fuzzy
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     EBCDIC から ASCII へ\n"
-"  ebcdic    ASCII から EBCDIC へ\n"
-"  ibm       ASCII からIBM(alternated) EBCDIC へ\n"
-"  block     改行区切りレコードを cbs サイズの空白を埋める\n"
-"  unblock   末尾の空白列をを改行で置き換える\n"
-"  lcase     英大文字を英小文字に変換する\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -202,7 +195,7 @@ msgid ""
 "  fsync     likewise, but also write metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -211,52 +204,52 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "%s は存在しますがディレクトリではありません"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, c-format
 msgid ""
 "\n"
@@ -273,35 +266,29 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "未知のシステムエラー"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, fuzzy, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "切り詰められた書き込み"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] ""
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr ""
 
@@ -315,150 +302,156 @@ msgstr ""
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, c-format
 msgid ", %g s, %s/s        "
 msgstr ""
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ""
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, fuzzy, c-format
 msgid "closing input file %s"
 msgstr "ファイル `%s' を作成\n"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "出力ファイル %s をクローズ"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "出力ファイルの接尾辞を使い果たしました"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, fuzzy, c-format
 msgid "opening %s"
 msgstr "%s の読み込みエラー"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "失敗"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, fuzzy, c-format
-msgid "writing to %s"
-msgstr "%s の書き込みエラー"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, fuzzy, c-format
 msgid "unrecognized operand %s"
 msgstr "オプション `-%c' を認識できません"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "幅 `%s' が正しくありません"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "`%2$s' に対する引数 %1$s が間違っています"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal ifjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "`%2$s' に対する引数 %1$s が間違っています"
+
+#: src/dc3dd.c:2793
+#, c-format
+msgid "Illegal vfjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "`%2$s' に対する引数 %1$s が間違っています"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "幅のオプション `%s' が正しくありません"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "フィールドの開始点の数字が正しくありません"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "グループ指定が不正"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "ユーザ指定が不正"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, fuzzy, c-format
 msgid "invalid number %s"
 msgstr "%s: 無効な番号表記です"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr ""
-
-#: src/dc3dd.c:2682
-#, fuzzy
-msgid "cannot combine block and unblock"
-msgstr "ユーザとグループの両方を省略することはできません"
-
-#: src/dc3dd.c:2684
-#, fuzzy
-msgid "cannot combine lcase and ucase"
-msgstr "比較した文字列は %s と %s です."
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 #, fuzzy
 msgid "cannot combine excl and nocreat"
 msgstr "-l または -t とシグナルを組み合わせることができません"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "-l または -t とシグナルを組み合わせることができません"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "-l または -t とシグナルを組み合わせることができません"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "-l または -t とシグナルを組み合わせることができません"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "-l または -t とシグナルを組み合わせることができません"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "-l または -t とシグナルを組み合わせることができません"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -467,109 +460,130 @@ msgstr ""
 "警告: lseek のカーネルバグに対処します。\n"
 "   ファイル (%s) の mt_type=0x%0lx -- <sys/mtio.h> のタイプリストを見て下さい"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "%s の読み込みエラー"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, fuzzy, c-format
 msgid "%s: cannot seek"
 msgstr "%s: 削除できません"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "警告: 幅 %lu は無効な値です.  -- 代わりに %d を使用します"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr ""
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "警告: 幅 %lu は無効な値です.  -- 代わりに %d を使用します"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, fuzzy, c-format
 msgid "setting flags for %s"
 msgstr "%s のタイムスタンプを設定中"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "ディレクトリ %s を作成できません"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "ディレクトリ %s を作成できません"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
+#, fuzzy, c-format
+msgid "writing to %s"
 msgstr "%s の書き込みエラー"
 
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
-
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "標準入力"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "標準出力"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, fuzzy, c-format
 msgid "cannot fstat %s"
 msgstr "日時を設定できません"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, fuzzy, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "出力ファイル %s の直前 %s バイトを進めます"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#, fuzzy
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     EBCDIC から ASCII へ\n"
+#~ "  ebcdic    ASCII から EBCDIC へ\n"
+#~ "  ibm       ASCII からIBM(alternated) EBCDIC へ\n"
+#~ "  block     改行区切りレコードを cbs サイズの空白を埋める\n"
+#~ "  unblock   末尾の空白列をを改行で置き換える\n"
+#~ "  lcase     英大文字を英小文字に変換する\n"
+
+#, fuzzy
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "切り詰められた書き込み"
+
+#, fuzzy
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "ユーザとグループの両方を省略することはできません"
+
+#, fuzzy
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "比較した文字列は %s と %s です."
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "警告: 幅 %lu は無効な値です.  -- 代わりに %d を使用します"
+
+#~ msgid "error writing %s"
+#~ msgstr "%s の書き込みエラー"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "`%2$s' に対する引数 %1$s が間違っています"
 
@@ -5723,10 +5737,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "ディレクトリ %s を作成できません"
 
-#, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "ディレクトリ %s を作成できません"
-
 #~ msgid "write failed"
 #~ msgstr "書き込み失敗"
 
diff --git a/po/ko.gmo b/po/ko.gmo
index e454d86..43fc3ec 100644
Binary files a/po/ko.gmo and b/po/ko.gmo differ
diff --git a/po/ko.po b/po/ko.po
index 4f76a19..2e73eaf 100644
--- a/po/ko.po
+++ b/po/ko.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GNU textutils 2.0.22\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2002-07-22 20:02+0900\n"
 "Last-Translator: Changwoo Ryu <cwryu at debian.org>\n"
 "Language-Team: Korean <translation-team-ko at lists.sourceforge.net>\n"
@@ -16,41 +16,53 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 #, fuzzy
 msgid "David MacKenzie"
 msgstr "Paul Rubin 그리고 David MacKenzie"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "%s 디렉토리를 만들 수 없습니다"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "더 많은 정보를 보려면 `%s --help' 하십시오.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, fuzzy, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -59,80 +71,80 @@ msgstr ""
 "사용법: %s [<파일>]...\n"
 " 혹은:  %s [<옵션>]\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -143,26 +155,14 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -171,7 +171,7 @@ msgid ""
 "  fsync     likewise, but also write metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -180,52 +180,52 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "%s이(가) 존재하지만 디렉토리가 아닙니다"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, c-format
 msgid ""
 "\n"
@@ -242,37 +242,30 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "알 수 없는 시스템 오류"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, fuzzy, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "잘린 레코드"
-msgstr[1] "잘린 레코드"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr ""
 
@@ -286,259 +279,271 @@ msgstr ""
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, c-format
 msgid ", %g s, %s/s        "
 msgstr ""
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ""
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, fuzzy, c-format
 msgid "closing input file %s"
 msgstr "파일 `%s'을(를) 만듦\n"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, fuzzy, c-format
 msgid "closing output file %s"
 msgstr "%s를 지웁니다\n"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "출력파일 접미어를 다 썼습니다"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, fuzzy, c-format
 msgid "opening %s"
 msgstr "%s을(를) 읽는 도중 오류 발생"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "실패"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, fuzzy, c-format
-msgid "writing to %s"
-msgstr "%s에 쓰는 도중 오류 발생"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, fuzzy, c-format
 msgid "unrecognized operand %s"
 msgstr "인식할 수 없는 옵션 `-%c'"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "부적절한 폭: `%s'"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "%2$s에 대해 부적절한 인자 %1$s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "%2$s에 대해 부적절한 인자 %1$s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "%2$s에 대해 부적절한 인자 %1$s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "부적절한 폭 옵션 `%s'"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "필드 처음에 부적절한 숫자"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "잘못된 그룹"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "잘못된 사용자"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, fuzzy, c-format
 msgid "invalid number %s"
 msgstr "부적절한 숫자"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr ""
-
-#: src/dc3dd.c:2682
-#, fuzzy
-msgid "cannot combine block and unblock"
-msgstr "사용자와 그룹을 모두 생략할 수는 없습니다"
-
-#: src/dc3dd.c:2684
-#, fuzzy
-msgid "cannot combine lcase and ucase"
-msgstr "비교한 문자열은 %s과(와) %s입니다."
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 #, fuzzy
 msgid "cannot combine excl and nocreat"
 msgstr "%s에 대한 파일 포인터를 재위치할 수 없습니다"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "%s에 대한 파일 포인터를 재위치할 수 없습니다"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "%s에 대한 파일 포인터를 재위치할 수 없습니다"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "%s에 대한 파일 포인터를 재위치할 수 없습니다"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "%s에 대한 파일 포인터를 재위치할 수 없습니다"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "%s에 대한 파일 포인터를 재위치할 수 없습니다"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
 "  of mt_type=0x%0lx -- see <sys/mtio.h> for the list of types"
 msgstr ""
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "%s을(를) 읽는 도중 오류 발생"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, fuzzy, c-format
 msgid "%s: cannot seek"
 msgstr "%s: 지울 수 없습니다"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "경고: 부적절한 폭 %lu; 대신 %d을(를) 사용함"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr ""
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "경고: 부적절한 폭 %lu; 대신 %d을(를) 사용함"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, fuzzy, c-format
 msgid "setting flags for %s"
 msgstr "%s의 시간을 유지합니다"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "%s 디렉토리를 만들 수 없습니다"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "%s 디렉토리를 만들 수 없습니다"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
+#, fuzzy, c-format
+msgid "writing to %s"
 msgstr "%s에 쓰는 도중 오류 발생"
 
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
-
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "표준 입력"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "표준 출력"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, fuzzy, c-format
 msgid "cannot fstat %s"
 msgstr "`%s'의 정보(stat)를 얻을 수 없습니다"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, fuzzy, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "%s를 지웁니다\n"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#, fuzzy
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "잘린 레코드"
+#~ msgstr[1] "잘린 레코드"
+
+#, fuzzy
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "사용자와 그룹을 모두 생략할 수는 없습니다"
+
+#, fuzzy
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "비교한 문자열은 %s과(와) %s입니다."
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "경고: 부적절한 폭 %lu; 대신 %d을(를) 사용함"
+
+#~ msgid "error writing %s"
+#~ msgstr "%s에 쓰는 도중 오류 발생"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "%2$s에 대해 부적절한 인자 %1$s"
 
@@ -4103,10 +4108,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "%s 디렉토리를 만들 수 없습니다"
 
-#, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "%s 디렉토리를 만들 수 없습니다"
-
 #~ msgid "write failed"
 #~ msgstr "파일 쓰기 실패"
 
diff --git a/po/lt.gmo b/po/lt.gmo
index bdd2a7e..cc1a260 100644
Binary files a/po/lt.gmo and b/po/lt.gmo differ
diff --git a/po/lt.po b/po/lt.po
index 74efbd3..dbf1872 100644
--- a/po/lt.po
+++ b/po/lt.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils-6.11\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2008-05-14 03:13+0300\n"
 "Last-Translator: Gintautas Miliauskas <gintas at akl.lt>\n"
 "Language-Team: Lithuanian <komp_lt at konferencijos.lt>\n"
@@ -19,120 +19,131 @@ msgstr ""
 "X-Generator: KBabel 1.11.4\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+msgid "Could not allocate space for thread"
+msgstr ""
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr ""
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
 "  or:  %s OPTION\n"
 msgstr ""
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
-msgstr ""
-
-#: src/dc3dd.c:1080
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
+msgstr ""
+
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -143,26 +154,14 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -171,7 +170,7 @@ msgid ""
 "  fsync     likewise, but also write metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -180,51 +179,51 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr ""
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, c-format
 msgid ""
 "\n"
@@ -241,30 +240,23 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Nežinoma sistemos klaida"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
@@ -272,7 +264,7 @@ msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr ""
 
@@ -286,247 +278,239 @@ msgstr ""
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, c-format
 msgid ", %g s, %s/s        "
 msgstr ""
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ""
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr ""
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr ""
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 msgid "Split extensions exhausted"
 msgstr ""
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr ""
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 msgid "Verify FAILED"
 msgstr ""
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr ""
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr ""
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "%s: neleistinas parametras -- %c\n"
 
-#: src/dc3dd.c:2479
+#: src/dc3dd.c:2748
+msgid "It is pitch dark here. You are likely to be eaten by a grue."
+msgstr ""
+
+#: src/dc3dd.c:2753
 #, c-format
-msgid "unknown hash convention %s"
+msgid "Illegal split format %s"
 msgstr ""
 
-#: src/dc3dd.c:2500
-msgid "It is pitch dark here. You are likely to be eaten by a grue."
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2773
 #, c-format
-msgid "Illegal split format %s"
+msgid "Illegal ifjoin format %s"
+msgstr ""
+
+#: src/dc3dd.c:2793
+#, c-format
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2798
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "netaisyklingas naudotojas"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "netaisyklingas naudotojas"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "netaisyklinga grupė"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "netaisyklingas naudotojas"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr ""
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr ""
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr ""
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr ""
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr ""
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 msgid "cannot combine if= and ifjoin="
 msgstr ""
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 msgid "cannot combine vf= and vfjoin="
 msgstr ""
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "negalima palyginti failų vardų %s ir %s"
+
+#: src/dc3dd.c:2953
+msgid "cannot combine wipe= and ifjoin="
+msgstr ""
+
+#: src/dc3dd.c:2955
+msgid "cannot combine wipe= and vfjoin="
+msgstr ""
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
 "  of mt_type=0x%0lx -- see <sys/mtio.h> for the list of types"
 msgstr ""
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "skaitomas %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr ""
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 msgid "advance: warning: invalid file offset after failed read"
 msgstr ""
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr ""
 
-#: src/dc3dd.c:3123
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr ""
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr ""
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "skaitomas aplankas %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "skaitomas aplankas %s"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
-msgstr ""
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
+msgid "writing to %s"
 msgstr ""
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr ""
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "standartinis išvedimas"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr ""
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr ""
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
@@ -717,9 +701,6 @@ msgstr ""
 #~ msgid "closing directory %s"
 #~ msgstr "užveriamas aplankas %s"
 
-#~ msgid "cannot compare file names %s and %s"
-#~ msgstr "negalima palyginti failų vardų %s ir %s"
-
 #~ msgid "invalid mode"
 #~ msgstr "netaisyklinga veiksena"
 
diff --git a/po/ms.gmo b/po/ms.gmo
index fa57dbb..0eec09a 100644
Binary files a/po/ms.gmo and b/po/ms.gmo differ
diff --git a/po/ms.po b/po/ms.po
index 224f4d6..31735d5 100644
--- a/po/ms.po
+++ b/po/ms.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version:  coreutils 5.0.90\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2003-08-10 16:00+0800\n"
 "Last-Translator: Hasbullah Bin Pit <sebol at ikhlas.com>\n"
 "Language-Team: Malay <translation-team-ms at lists.sourceforge.net>\n"
@@ -15,41 +15,53 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 #, fuzzy
 msgid "David MacKenzie"
 msgstr "Mike Parker and David MacKenzie"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "tak dapat mencipta direktori %s"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Cuba `%s --help' untuk maklumat lanjut .\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, fuzzy, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -58,16 +70,15 @@ msgstr ""
 "Pengunaan: %s [NOMBOR]...\n"
 "    atau: %s OPSYEN\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Salin fail, menukar dan memformat mengikut opsyen.\n"
@@ -78,68 +89,69 @@ msgstr ""
 "  count=BLOK     salin hanya  BLOK blok input\n"
 "  ibs=BAIT       baca BAIT bait dlm satu masa\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -150,26 +162,14 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -178,7 +178,7 @@ msgid ""
 "  fsync     likewise, but also write metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -187,52 +187,52 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "%s: Direktori sasaran yang dinyatakan adalah bukan direktori"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, c-format
 msgid ""
 "\n"
@@ -249,37 +249,30 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Ralat sistem yang tidak diketahui"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr ""
 
@@ -293,256 +286,260 @@ msgstr ""
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, c-format
 msgid ", %g s, %s/s        "
 msgstr ""
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ""
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "menutup fail input %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "menutup fail output %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 msgid "Split extensions exhausted"
 msgstr ""
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "Membuka %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "GAGAL"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "Menulis  ke %s."
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, fuzzy, c-format
 msgid "unrecognized operand %s"
 msgstr "opsyen tidak dikenali %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "tarikh tak sah `%s'"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "format tarikh tidak sah %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal ifjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "format tarikh tidak sah %s"
+
+#: src/dc3dd.c:2793
+#, c-format
+msgid "Illegal vfjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "format tarikh tidak sah %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "penukaran tidak sah: %s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "nombor tidak sah %s"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "kumpulan tidak sah"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "pengguna tidak sah %s"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "nombor tidak sah %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr ""
-
-#: src/dc3dd.c:2682
-#, fuzzy
-msgid "cannot combine block and unblock"
-msgstr "tak dapat omit kedua-dua pengguna dan kumpulan"
-
-#: src/dc3dd.c:2684
-#, fuzzy
-msgid "cannot combine lcase and ucase"
-msgstr "tak boleh banding nama fail %s dan %s"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 #, fuzzy
 msgid "cannot combine excl and nocreat"
 msgstr "tak boleh gabungkan isyarat dengan -l atau -t"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "tak boleh gabungkan isyarat dengan -l atau -t"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "tak boleh gabungkan isyarat dengan -l atau -t"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "tak boleh gabungkan isyarat dengan -l atau -t"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "tak boleh gabungkan isyarat dengan -l atau -t"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "tak boleh gabungkan isyarat dengan -l atau -t"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
 "  of mt_type=0x%0lx -- see <sys/mtio.h> for the list of types"
 msgstr ""
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "membaca %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, fuzzy, c-format
 msgid "%s: cannot seek"
 msgstr "%s: tak dapat buang"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 msgid "advance: warning: invalid file offset after failed read"
 msgstr ""
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr ""
 
-#: src/dc3dd.c:3123
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr ""
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, fuzzy, c-format
 msgid "setting flags for %s"
 msgstr "menetapkan masa untuk %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "membaca direktori %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "membaca direktori %s"
 
-#: src/dc3dd.c:3789
-#, fuzzy, c-format
-msgid "error writing %s"
-msgstr "menulis %s"
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "Menulis  ke %s."
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, fuzzy, c-format
 msgid "fsync failed for %s"
 msgstr "gagal mengekalkan masa bagi %s"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "input piawai"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "output standard"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "tak dapat fstat %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr ""
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#, fuzzy
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "tak dapat omit kedua-dua pengguna dan kumpulan"
+
+#, fuzzy
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "tak boleh banding nama fail %s dan %s"
+
+#, fuzzy
+#~ msgid "error writing %s"
+#~ msgstr "menulis %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "hujah tidak sah %s bagi %s"
 
@@ -3189,10 +3186,6 @@ msgstr ""
 #~ msgstr "tak dapat memcipta fail biasa %s"
 
 #, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "tak dapat mencipta direktori %s"
-
-#, fuzzy
 #~ msgid "write failed"
 #~ msgstr "fail pelik"
 
diff --git a/po/nb.gmo b/po/nb.gmo
index 580817f..e943f90 100644
Binary files a/po/nb.gmo and b/po/nb.gmo differ
diff --git a/po/nb.po b/po/nb.po
index b76d55b..45a9505 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GNU textutils 2.0.20\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2002-01-27 21:35+0100\n"
 "Last-Translator: Eivind Tagseth <eivindt at multinet.no>\n"
 "Language-Team: Norwegian <i18n-nb at lister.ping.uio.no>\n"
@@ -15,41 +15,53 @@ msgstr ""
 "Content-Transfer-Encoding: 8-bit\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 #, fuzzy
 msgid "David MacKenzie"
 msgstr "Paul Rubin og David MacKenzie"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "kan ikke opprette katalog %s"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Prøv med «%s --help» for mer informasjon.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, fuzzy, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -58,80 +70,80 @@ msgstr ""
 "Bruk:  %s [FIL]...\n"
 "eller: %s [FLAGG]\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -142,26 +154,14 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -170,7 +170,7 @@ msgid ""
 "  fsync     likewise, but also write metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -179,52 +179,52 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "%s eksisterer men er ikke en katalog"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, c-format
 msgid ""
 "\n"
@@ -241,37 +241,30 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Ukjent systemfeil"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr ""
 
@@ -285,258 +278,264 @@ msgstr ""
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, c-format
 msgid ", %g s, %s/s        "
 msgstr ""
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ""
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, fuzzy, c-format
 msgid "closing input file %s"
 msgstr "lager filen «%s»\n"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr ""
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 msgid "Split extensions exhausted"
 msgstr ""
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, fuzzy, c-format
 msgid "opening %s"
 msgstr "feil ved lesing av %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "FEIL"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, fuzzy, c-format
-msgid "writing to %s"
-msgstr "feil ved skriving til %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, fuzzy, c-format
 msgid "unrecognized operand %s"
 msgstr "ukjent flagg «-%c»"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "ugyldig bredde: «%s»"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "ugyldig argument %s for %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "ugyldig argument %s for %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "ugyldig argument %s for %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "ugyldig breddespesifikasjon «%s»"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "ugyldig tall i feltstart"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "ugyldig gruppe"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "ugyldig bruker"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, fuzzy, c-format
 msgid "invalid number %s"
 msgstr "ugyldig antall"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr ""
-
-#: src/dc3dd.c:2682
-#, fuzzy
-msgid "cannot combine block and unblock"
-msgstr "kan ikke utelate både bruker og gruppe"
-
-#: src/dc3dd.c:2684
-#, fuzzy
-msgid "cannot combine lcase and ucase"
-msgstr "Strengene som ble sammenlignet var «%s» og «%s»."
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 #, fuzzy
 msgid "cannot combine excl and nocreat"
 msgstr "kan ikke opprette katalog %s"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "kan ikke opprette katalog %s"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "kan ikke opprette katalog %s"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "kan ikke opprette katalog %s"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "kan ikke opprette katalog %s"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "kan ikke opprette katalog %s"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
 "  of mt_type=0x%0lx -- see <sys/mtio.h> for the list of types"
 msgstr ""
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "feil ved lesing av %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, fuzzy, c-format
 msgid "%s: cannot seek"
 msgstr "%s: kan ikke søke til posisjon %s%s"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "advarsel: ugyldig bredde %lu; bruker %d istedet"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr ""
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "advarsel: ugyldig bredde %lu; bruker %d istedet"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, fuzzy, c-format
 msgid "setting flags for %s"
 msgstr "kan ikke endre rettigheter til %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "kan ikke opprette katalog %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "kan ikke opprette katalog %s"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
+#, fuzzy, c-format
+msgid "writing to %s"
 msgstr "feil ved skriving til %s"
 
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
-
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "standard inn"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "standard ut"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr ""
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr ""
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#, fuzzy
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "kan ikke utelate både bruker og gruppe"
+
+#, fuzzy
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "Strengene som ble sammenlignet var «%s» og «%s»."
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "advarsel: ugyldig bredde %lu; bruker %d istedet"
+
+#~ msgid "error writing %s"
+#~ msgstr "feil ved skriving til %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "ugyldig argument %s for %s"
 
@@ -3351,10 +3350,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "kan ikke opprette katalog %s"
 
-#, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "kan ikke opprette katalog %s"
-
 #~ msgid "write failed"
 #~ msgstr "feil ved skriving"
 
diff --git a/po/nl.gmo b/po/nl.gmo
index ac4ff21..b977dd7 100644
Binary files a/po/nl.gmo and b/po/nl.gmo differ
diff --git a/po/nl.po b/po/nl.po
index 5e9e763..5b5dfb9 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils-6.11\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2008-05-30 23:26+0200\n"
 "Last-Translator: Freek de Kruijf <f.de.kruijf at hetnet.nl>\n"
 "Language-Team: Dutch <vertaling at vrijschrift.org>\n"
@@ -21,40 +21,52 @@ msgstr ""
 "X-Generator: KBabel 1.11.4\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "kan het proces %s -d niet aanmaken"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Probeer `%s --help' voor meer informatie.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -63,16 +75,15 @@ msgstr ""
 "Gebruik: %s [OPERAND]...\n"
 "  of:    %s OPTIE\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Kopieer een bestand en converteer en maak deze op volgens de opties.\n"
@@ -85,21 +96,24 @@ msgstr ""
 "  count=BLOKKEN         kopieer alleen BLOKKEN invoer blokken\n"
 "  ibs=BYTES             lees BYTES bytes tegelijk\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=BESTAND      lees van BESTAND in plaats van standaardinvoer\n"
 "  iflag=VLAGGEN   lees volgens de kommagescheiden symbolenlijst\n"
@@ -114,52 +128,50 @@ msgstr ""
 "                    van de invoer\n"
 "  status=noxfer   onderdruk statistieken van de verplaatsing\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -177,31 +189,12 @@ msgstr ""
 "Elk CONVERSIE symbool mag zijn:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     van EBCDIC naar ASCII\n"
-"  ebcdic    van ASCII maar EBCDIC\n"
-"  ibm       van ASCII naar 'alternated EBCDIC'\n"
-"  block     vul met nieuweregel afgesloten regels uit met spaties tot de cbs "
-"lengte\n"
-"  unblock   vervang achterloopspaties in regels met lengte cbs door "
-"nieuweregel\n"
-"  lcase     vervang hoofdletters door kleine letters\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
+#, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   maak geen uitvoerbestand\n"
 "  excl      stop als het uitvoerbestand al bestaat\n"
@@ -209,7 +202,7 @@ msgstr ""
 "  ucase     vervang kleine letters door hoofdletters\n"
 "  swab      verwissel ieder paar bytes uit de invoer\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -225,7 +218,7 @@ msgstr ""
 "beëindigen\n"
 "  fsync     evenzo, maar schrijf ook de metagegevens\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -239,51 +232,51 @@ msgstr ""
 "  append    achtervoegen (alleen zinvol bij uitvoer; suggestie: "
 "conv=notrunc)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr "  direct    gebruik direct-I/O voor de gegevens\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr "  directory stop tenzij een map\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr "  dsync     gebruik synchronized-I/O voor de gegevens\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync      evenzo, maar ook voor de metagegevens\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock  gebruik non-blocking-I/O\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noatime   wijzig het toegangstijdstip niet\n"
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr "  noctty    voeg geen controlerende terminal toe aan bestand\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow  volg geen symbolische koppelingen\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks   stop bij meer dan één symbolische koppeling\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr "  binary    gebruik binary-I/O voor de gegevens\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text      gebruik text-I/O voor de gegevens\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -313,11 +306,11 @@ msgstr ""
 "Opties zijn:\n"
 "\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Onbekende systeemfout"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -326,26 +319,19 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> records in\n"
 "%<PRIuMAX>+%<PRIuMAX> records uit\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> afgebroken record\n"
-msgstr[1] "%<PRIuMAX> afgebroken records\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] "%<PRIuMAX> byte (%s) gekopieerd"
 msgstr[1] "%<PRIuMAX> bytes (%s) gekopieerd"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "Oneindig B"
 
@@ -359,144 +345,151 @@ msgstr "Oneindig B"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "invoerbestand %s sluiten"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "uitvoerbestand %s sluiten"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Alle achtervoegsels voor uitvoerbestanden zijn verbruikt"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "openen van %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "MISLUKT"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "schrijven naar %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "niet-herkende operand %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "ongeldige datum %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "ongeldige opmaak voor datum %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal ifjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "ongeldige opmaak voor datum %s"
+
+#: src/dc3dd.c:2793
+#, c-format
+msgid "Illegal vfjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "ongeldige opmaak voor datum %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 msgid "invalid conversion"
 msgstr "ongeldige conversie"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 msgid "invalid input flag"
 msgstr "ongeldige invoervlag"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 msgid "invalid output flag"
 msgstr "ongeldige uitvoervlag"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 msgid "invalid status flag"
 msgstr "ongeldige statusvlag"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "ongeldig nummer %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "slechts één van deze {ascii,ebcdic,ibm} is mogelijk"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "block en unblock kunnen niet beide"
-
-# idem
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "lcase en ucase kunnen niet beide"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "excl en nocreat kunnen niet beide"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "kan -e en -i opties niet combineren"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "kan -e en -i opties niet combineren"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "kan -e en -i opties niet combineren"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "kan -e en -i opties niet combineren"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "kan -e en -i opties niet combineren"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -506,91 +499,75 @@ msgstr ""
 "bestand (%s)\n"
 "  met mt_type=0x%0lx -- zie <sys/mtio.h> voor de lijst met typen"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "lezen van %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: kan seek-functie niet uitvoeren"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "offset te groot bij het lezen van bestand %s"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr ""
 "waarschuwing: offset in bestand klopt niet meer na een mislukte leesopdracht"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "kan niet om de 'kernel bug' heenwerken"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr ""
-"waarschuwing: offset in bestand klopt niet meer na een mislukte leesopdracht"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "vlaggen van %s zetten"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "map %s lezen"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "map %s lezen"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
-msgstr "fout bij schrijven van %s"
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "schrijven naar %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "'fdatasync' mislukt voor %s"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "'fsync' mislukt voor %s"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "standaardinvoer"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "standaarduitvoer"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -599,20 +576,61 @@ msgstr ""
 "offset te groot: kan niet afkorten tot een lengte van seek=%<PRIuMAX> (%lu-"
 "byte) blokken"
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "kan fstat op %s niet toepassen"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "afkorten op %<PRIuMAX> bytes in uitvoerbestand %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     van EBCDIC naar ASCII\n"
+#~ "  ebcdic    van ASCII maar EBCDIC\n"
+#~ "  ibm       van ASCII naar 'alternated EBCDIC'\n"
+#~ "  block     vul met nieuweregel afgesloten regels uit met spaties tot de "
+#~ "cbs lengte\n"
+#~ "  unblock   vervang achterloopspaties in regels met lengte cbs door "
+#~ "nieuweregel\n"
+#~ "  lcase     vervang hoofdletters door kleine letters\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> afgebroken record\n"
+#~ msgstr[1] "%<PRIuMAX> afgebroken records\n"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "slechts één van deze {ascii,ebcdic,ibm} is mogelijk"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "block en unblock kunnen niet beide"
+
+# idem
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "lcase en ucase kunnen niet beide"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr ""
+#~ "waarschuwing: offset in bestand klopt niet meer na een mislukte "
+#~ "leesopdracht"
+
+#~ msgid "error writing %s"
+#~ msgstr "fout bij schrijven van %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "ongeldig argument %s voor %s"
 
@@ -6914,9 +6932,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "kan %s -d niet uitvoeren"
 
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "kan het proces %s -d niet aanmaken"
-
 #~ msgid "write failed"
 #~ msgstr "schrijven mislukt"
 
diff --git a/po/pl.gmo b/po/pl.gmo
index 41d1b41..ecc2cb6 100644
Binary files a/po/pl.gmo and b/po/pl.gmo differ
diff --git a/po/pl.po b/po/pl.po
index a4dcac1..3271e50 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -17,7 +17,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 6.9.92\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2008-01-12 17:30+0100\n"
 "Last-Translator: Rafał Maszkowski <rzm at icm.edu.pl>\n"
 "Language-Team: Polish <translation-team-pl at lists.sourceforge.net>\n"
@@ -28,40 +28,52 @@ msgstr ""
 "|| n%100>=20) ? 1 : 2);\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "nie udało się uruchomić procesu %s -d"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Spróbuj `%s --help' dla uzyskania informacji.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -70,16 +82,15 @@ msgstr ""
 "Składnia: %s [ARGUMENT]...\n"
 "    albo: %s OPCJA\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Kopiowanie pliku z przekształcaniem i formatowaniem zgodnie z argumentami.\n"
@@ -91,21 +102,24 @@ msgstr ""
 "  count=BLOKÓW    skopiowanie tylko tyle BLOKÓW z wejścia\n"
 "  ibs=BAJTÓW      czytanie tylu BAJTÓW naraz\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=PLIK         czytanie z PLIKU zamiast ze standardowego wejścia\n"
 "  iflag=FLAGI     czytanie zgodnie z podaną listą\n"
@@ -116,52 +130,50 @@ msgstr ""
 "  skip=BLOKÓW     przeskoczenie tylu BLOKÓW o rozmiarze ibs na wejściu\n"
 "  status=noxfer   bez statystyki kopiowania\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -179,31 +191,12 @@ msgstr ""
 "Każde SŁOWO_KL może być:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     z EBCDIC do ASCII\n"
-"  ebcdic    z ASCII do EBCDIC\n"
-"  ibm       z ASCII do alternatywnego EBCDIC\n"
-"  block     wyrównanie rekordów zakończonych znakami nowej linii spacjami\n"
-"              do rozmiaru cbs\n"
-"  unblock   zamiana końcowych spacji w rekordach o rozmiarze cbs na znak\n"
-"              nowej linii\n"
-"  lcase     zamiana wielkich liter na małe\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
+#, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   bez tworzenia pliku wyjściowego\n"
 "  excl      zakończenie jeżeli plik wyjściowy już istnieje\n"
@@ -211,7 +204,7 @@ msgstr ""
 "  ucase     zamiana małych liter na wielkie\n"
 "  swab      zamiana każdej pary bajtów\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -226,7 +219,7 @@ msgstr ""
 "  fdatasync  wymuszenie fizycznego zapisu danych przed zakończeniem\n"
 "  fsync     jak fdatasync, ale też dla metadanych\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -239,51 +232,51 @@ msgstr ""
 "\n"
 "  append    tryb dopisywania (ma sens tylko dla wyjścia)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr "  direct    dane zapisywane przez bezpośrednie I/O\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr "  directory błąd jeżeli nie katalog\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr "  dsync     dane zapisywane przez synchronizowane I/O\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync      podobnie, ale też dla metadanych\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock  użycie nie blokującego I/O\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noatime   bez aktualizacji czasu dostępu\n"
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr "  noctty    bez przyporządkowywania terminala sterującego - pliku\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow  bez rozwijania dowiązań symbolicznych\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks   błąd jeżeli wielokrotnie dołączony\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr "  binary    użycie binarnego I/O dla danych\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text      użycie tekstowego I/O dla danych\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -311,11 +304,11 @@ msgstr ""
 "  9387674624 bytes (9.4 GB) copied, 34.6279 seconds, 271 MB/s\n"
 "\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Nieznany błąd systemu"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -324,20 +317,12 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> przeczytanych recordów\n"
 "%<PRIuMAX>+%<PRIuMAX> zapisanych recordów\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> obcięty rekord\n"
-msgstr[1] "%<PRIuMAX> obcięte rekordy\n"
-msgstr[2] "%<PRIuMAX> obciętych rekordów\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
@@ -345,7 +330,7 @@ msgstr[0] "skopiowany %<PRIuMAX> bajt (%s)"
 msgstr[1] "skopiowane %<PRIuMAX> bajty (%s)"
 msgstr[2] "skopiowane %<PRIuMAX> bajtów (%s)"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "nieskończenie wiele B"
 
@@ -359,147 +344,155 @@ msgstr "nieskończenie wiele B"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "zamykanie pliku wejściowego %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "zamknięcie pliku wyjściowego %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Zabrakło przyrostków plików wyjściowych"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "otwieranie %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "NIEPOWODZENIE"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "zapis do %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "nierozpoznany argument %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "błędna data: %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "błędny format daty %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "błędny format daty %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "błędny format daty %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "błędna konwersja: %s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "błędna flaga wejściowa: %s"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "błędna flaga wyjściowa: %s"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "błędna flaga stanu: %s"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "błędna liczba %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "nie można podawać równocześnie ascii, ebcdic, ibm"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "nie można użyć block i unblock równocześnie"
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "nie można użyć razem lcase i ucase"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "nie można użyć razem excl i nocreat"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "nie można łączyć ustawiania opcji -e i -i"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "nie można łączyć ustawiania opcji -e i -i"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "nie można łączyć ustawiania opcji -e i -i"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "nie można łączyć ustawiania opcji -e i -i"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "nie można łączyć ustawiania opcji -e i -i"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -508,89 +501,74 @@ msgstr ""
 "uwaga: ominięcie błędu działania lseek w jądrze dla pliku (%s)\n"
 "  o mt_type=0x%0lx - zobacz listę typów w <sys/mtio.h>"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "czytanie %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: nie można ustawić pozycji"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "przepełnienie licznika pozycji w czasie czytanie pliku %s"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "uwaga: błędna pozycja w pliku po nieudanym czytaniu"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "nie udało się obejść błędu jądra"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "uwaga: błędna pozycja w pliku po nieudanym czytaniu"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "ustawienie flag dla %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "czytanie katalogu %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "czytanie katalogu %s"
 
-#: src/dc3dd.c:3789
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "error writing %s"
-msgstr "błąd zapisu %s"
-
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "zapis do %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "nieudany fdatasync dla %s"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "nieudany fsync dla %s"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "standardowe wejście"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "standardowe wyjście"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -599,20 +577,60 @@ msgstr ""
 "za duża wartośc pozycji w pliku: nie można obciąć pliku do długości seek=%"
 "<PRIuMAX> (%lu bajtowych) bloków"
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "nie można wykonać fstat na %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "obcięcie pliku do %<PRIuMAX> bajtów w pliku wyjściowym %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     z EBCDIC do ASCII\n"
+#~ "  ebcdic    z ASCII do EBCDIC\n"
+#~ "  ibm       z ASCII do alternatywnego EBCDIC\n"
+#~ "  block     wyrównanie rekordów zakończonych znakami nowej linii "
+#~ "spacjami\n"
+#~ "              do rozmiaru cbs\n"
+#~ "  unblock   zamiana końcowych spacji w rekordach o rozmiarze cbs na znak\n"
+#~ "              nowej linii\n"
+#~ "  lcase     zamiana wielkich liter na małe\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> obcięty rekord\n"
+#~ msgstr[1] "%<PRIuMAX> obcięte rekordy\n"
+#~ msgstr[2] "%<PRIuMAX> obciętych rekordów\n"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "nie można podawać równocześnie ascii, ebcdic, ibm"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "nie można użyć block i unblock równocześnie"
+
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "nie można użyć razem lcase i ucase"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "uwaga: błędna pozycja w pliku po nieudanym czytaniu"
+
+#~ msgid "error writing %s"
+#~ msgstr "błąd zapisu %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "błędny argument %s opcji %s"
 
@@ -6904,9 +6922,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "nie udało się uruchomić %s -d"
 
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "nie udało się uruchomić procesu %s -d"
-
 #~ msgid "write failed"
 #~ msgstr "błąd zapisu"
 
diff --git a/po/pt.gmo b/po/pt.gmo
index 763c5a3..0ae6eb8 100644
Binary files a/po/pt.gmo and b/po/pt.gmo differ
diff --git a/po/pt.po b/po/pt.po
index 0a112a0..03a3307 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 6.11\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2008-04-23 00:02+0100\n"
 "Last-Translator: Helder Correia <helder.pereira.correia at gmail.com>\n"
 "Language-Team: Portuguese <translation-team-pt at lists.sourceforge.net>\n"
@@ -18,40 +18,52 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "impossível criar o processo para %s -d"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Tente '%s --help' para mais informações.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -60,16 +72,15 @@ msgstr ""
 "Utilização: %s [OPERANDO]...\n"
 "  ou:       %s OPÇÃO\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Copiar um ficheiro, convertendo e formatando de acordo com os operandos.\n"
@@ -80,21 +91,24 @@ msgstr ""
 "  count=BLOCOS    copiar apenas BLOCOS blocos de entrada\n"
 "  ibs=BYTES       ler BYTES bytes de cada vez\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=FICHEIRO     ler a partir de FICHEIRO em vez de stdin\n"
 "  iflag=OPÇÕES    ler como lista de símbolos separados por vírgulas\n"
@@ -105,52 +119,50 @@ msgstr ""
 "  skip=BLOCOS     saltar BLOCOS blocos de tamanho ibs no início da entrada\n"
 "  status=noxfer   suprimir estatísticas de transferência\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -168,31 +180,12 @@ msgstr ""
 "Cadda símbolo CONV pode ser:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     de EBCDIC para ASCII\n"
-"  ebcdic    de ASCII para EBCDIC\n"
-"  ibm       de ASCII para EBCDIC alternativo\n"
-"  block     encher campos terminados por nova linha com espaço de tamanho "
-"cbs\n"
-"  unblock   substituir espaços finais em campos de tamanho cbs com nova "
-"linha\n"
-"  lcase     alterar maiúsculas para minúsculas\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
+#, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   não criar o ficheiro de saída\n"
 "  excl      falhar se o ficheiro de saída já existir\n"
@@ -200,7 +193,7 @@ msgstr ""
 "  ucase     alterar minúsculas para maiúsculas\n"
 "  swab      trocar cada par de bytes de entrada\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -215,7 +208,7 @@ msgstr ""
 "terminar\n"
 "  fsync     da mesma forma, mas escrever igualmente os meta-dados\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -228,51 +221,51 @@ msgstr ""
 "\n"
 "  append    modo acrescentar (sentido só para saída; conv=notrunc sugerido)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr "  direct    usar E/S directas para dados\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr "  erro de pasta a menos que seja uma pasta\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr "  dsync     usar E/S sincronizadas para dados\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync      da mesma forma, mas também para meta-dados\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock  usar E/S não-bloquantes\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noatime   não actualizar o tempo de acesso\n"
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr "  noctty    não atribuir terminal de controlo do ficheiro\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow  não seguir ligações simbólicas\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks   falhar se multiplamente ligado\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr "  binary    usar E/S binárias para dados\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text      usar E/S de texto para dados\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -301,11 +294,11 @@ msgstr ""
 "Opções são:\n"
 "\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Erro de sistema desconhecido"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -314,26 +307,19 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> registos dentro\n"
 "%<PRIuMAX>+%<PRIuMAX> registos fora\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> registo truncado\n"
-msgstr[1] "%<PRIuMAX> registos truncados\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] "%<PRIuMAX> byte (%s) copiado"
 msgstr[1] "%<PRIuMAX> bytes (%s) copiados"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "Infinitivo B"
 
@@ -347,143 +333,151 @@ msgstr "Infinitivo B"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "a fechar o ficheiro de entrada %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "a apagar o ficheiro de saída %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Sufixos de ficheiro de saída esgotados"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "a abrir %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "ERRO"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "a escrever em %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "operando desconhecido %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "data inválida %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "formato de data inválido %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "formato de data inválido %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "formato de data inválido %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 msgid "invalid conversion"
 msgstr "conversão inválida"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 msgid "invalid input flag"
 msgstr "opção de entrada inválida"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 msgid "invalid output flag"
 msgstr "opção de saída inválida"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 msgid "invalid status flag"
 msgstr "opção de estado inválida"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "número inválido %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "impossível combinar quaisquer dois de {ascii,ebcdic,ibm}"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "impossível combinar bloquear e desbloquear"
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "impossível combinar letras minúsculas e maiúsculas"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "impossível combinar excl e nocreat"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "impossível combinar as opções -e e -i"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "impossível combinar as opções -e e -i"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "impossível combinar as opções -e e -i"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "impossível combinar as opções -e e -i"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "impossível combinar as opções -e e -i"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -492,89 +486,74 @@ msgstr ""
 "aviso: a contornar erro de lseek do kernel para o ficheiro (%s)\n"
 "  de mt_type=0x%0lx -- ver <sys/mtio.h> para a lista de tipos"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "a ler %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: impossível indexar"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "erro de excesso de índice ao ler o ficheiro %s"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "aviso: índice de ficheiro inválido após erro de leitura"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "impossível contornar erro do kernel"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "aviso: índice de ficheiro inválido após erro de leitura"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "a definir opções para %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "a ler a pasta %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "a ler a pasta %s"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
-msgstr "erro ao escrever %s"
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "a escrever em %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "erro de fdatasync para %s"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "erro de fsync para %s"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "canal de entrada por omissão (stdin)"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "canal de saída padrão (stdout)"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -582,20 +561,58 @@ msgid ""
 msgstr ""
 "índice muito alto: erro ao truncar para seek=%<PRIuMAX> blocos (de %lu bytes)"
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "impossível obter o estado de %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "a truncar aos %<PRIuMAX> bytes no ficheiro de saída %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     de EBCDIC para ASCII\n"
+#~ "  ebcdic    de ASCII para EBCDIC\n"
+#~ "  ibm       de ASCII para EBCDIC alternativo\n"
+#~ "  block     encher campos terminados por nova linha com espaço de tamanho "
+#~ "cbs\n"
+#~ "  unblock   substituir espaços finais em campos de tamanho cbs com nova "
+#~ "linha\n"
+#~ "  lcase     alterar maiúsculas para minúsculas\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> registo truncado\n"
+#~ msgstr[1] "%<PRIuMAX> registos truncados\n"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "impossível combinar quaisquer dois de {ascii,ebcdic,ibm}"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "impossível combinar bloquear e desbloquear"
+
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "impossível combinar letras minúsculas e maiúsculas"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "aviso: índice de ficheiro inválido após erro de leitura"
+
+#~ msgid "error writing %s"
+#~ msgstr "erro ao escrever %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "argumento %s inválido para %s"
 
@@ -6716,9 +6733,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "impossível executar %s -d"
 
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "impossível criar o processo para %s -d"
-
 #~ msgid "write failed"
 #~ msgstr "erro de escrita"
 
diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo
index 1704706..72eca4f 100644
Binary files a/po/pt_BR.gmo and b/po/pt_BR.gmo differ
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 0a7344b..628e411 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 5.0\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2003-06-27 19:20-0300\n"
 "Last-Translator: Juan Carlos Castro y Castro <jcastro at vialink.com.br>\n"
 "Language-Team: Brazilian Portuguese <ldp-br at bazar.conectiva.com.br>\n"
@@ -17,43 +17,56 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 #, fuzzy
 msgid "David MacKenzie"
 msgstr "Stuart Kemp e David MacKenzie"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+# , c-format
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "não é possível criar o diretório %s"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
 # , c-format
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Tente `%s --help' para mais informação.\n"
 
 # , c-format
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, fuzzy, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -62,80 +75,80 @@ msgstr ""
 "Uso: %s [NÚMERO]...\n"
 " ou: %s OPÇÃO\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -146,26 +159,14 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -174,7 +175,7 @@ msgid ""
 "  fsync     likewise, but also write metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -183,52 +184,52 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "%s existe, mas não é um diretório"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, c-format
 msgid ""
 "\n"
@@ -245,37 +246,30 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Erro de sistema desconhecido"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, fuzzy, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "registro truncado"
-msgstr[1] "registro truncado"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr ""
 
@@ -289,159 +283,169 @@ msgstr ""
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, c-format
 msgid ", %g s, %s/s        "
 msgstr ""
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ""
 
 # , c-format
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "fechando arquivo de entrada %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "fechando arquivo de saída %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 msgid "Split extensions exhausted"
 msgstr ""
 
 # , c-format
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "abrindo %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "A soma não coincide"
 
 # , c-format
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "escrevendo em %s"
-
-# , c-format
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, fuzzy, c-format
 msgid "unrecognized operand %s"
 msgstr "opção não reconhecida %s"
 
 # , c-format
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "data inválida `%s'"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
 # , c-format
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "formato de data inválido %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal ifjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+# , c-format
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "formato de data inválido %s"
+
+#: src/dc3dd.c:2793
+#, c-format
+msgid "Illegal vfjoin format %s - missing extension"
+msgstr ""
+
+# , c-format
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "formato de data inválido %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
 # , c-format
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "conversão inválida: %s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "número inválido no início do campo"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "grupo inválido"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "usuário inválido"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "número inválido %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr ""
-
-#: src/dc3dd.c:2682
-#, fuzzy
-msgid "cannot combine block and unblock"
-msgstr "não pode ignorar usuário e grupo"
-
-#: src/dc3dd.c:2684
-#, fuzzy
-msgid "cannot combine lcase and ucase"
-msgstr "não foi possível criar o link %s"
-
 # , c-format
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 #, fuzzy
 msgid "cannot combine excl and nocreat"
 msgstr "não é possível criar o diretório %s"
 
 # , c-format
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "não é possível criar o diretório %s"
 
 # , c-format
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "não é possível criar o diretório %s"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+# , c-format
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "não é possível criar o diretório %s"
+
+# , c-format
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "não é possível criar o diretório %s"
+
+# , c-format
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "não é possível criar o diretório %s"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -449,114 +453,121 @@ msgid ""
 msgstr ""
 
 # , c-format
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "lendo %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, fuzzy, c-format
 msgid "%s: cannot seek"
 msgstr "não foi possível remover `%s'"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
 # , c-format
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "atenção: largura %lu inválida; será usado %d em seu lugar"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr ""
 
-# , c-format
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "atenção: largura %lu inválida; será usado %d em seu lugar"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, fuzzy, c-format
 msgid "setting flags for %s"
 msgstr "configurando data de %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
 # , c-format
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "não é possível criar o diretório %s"
 
 # , c-format
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "não é possível criar o diretório %s"
 
 # , c-format
-#: src/dc3dd.c:3789
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "error writing %s"
-msgstr "erro escrevendo %s"
-
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "escrevendo em %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "entrada padrão"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "saída padrão"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "impossível fazer fstat em %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, fuzzy, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "avançando %s bytes no arquivo de saída %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#, fuzzy
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "registro truncado"
+#~ msgstr[1] "registro truncado"
+
+#, fuzzy
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "não pode ignorar usuário e grupo"
+
+#, fuzzy
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "não foi possível criar o link %s"
+
+# , c-format
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "atenção: largura %lu inválida; será usado %d em seu lugar"
+
+# , c-format
+#~ msgid "error writing %s"
+#~ msgstr "erro escrevendo %s"
+
 # , c-format
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "argumento inválido %s para '%s'"
@@ -3999,11 +4010,6 @@ msgstr ""
 #~ msgid "couldn't open temporary file"
 #~ msgstr "impossível criar arquivo temporário"
 
-# , c-format
-#, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "não é possível criar o diretório %s"
-
 #~ msgid "write failed"
 #~ msgstr "erro de escrita"
 
diff --git a/po/ru.gmo b/po/ru.gmo
index 97ff853..4ae631b 100644
Binary files a/po/ru.gmo and b/po/ru.gmo differ
diff --git a/po/ru.po b/po/ru.po
index 514d9e2..d9df360 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 6.9\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2007-03-27 08:06+0400\n"
 "Last-Translator: Oleg S. Tihonov <ost at tatnipi.ru>\n"
 "Language-Team: Russian <ru at li.org>\n"
@@ -18,40 +18,52 @@ msgstr ""
 "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "невозможно создать процесс для %s -d"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Попробуйте `%s --help' для получения более подробного описания.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -60,16 +72,15 @@ msgstr ""
 "Использование: %s [ОПЕРАНД]...\n"
 "       или:    %s КЛЮЧ\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Копирует файл, преобразует и форматирует в зависимости от операндов.\n"
@@ -81,21 +92,24 @@ msgstr ""
 "  count=ЧИСЛО     копировать только заданное ЧИСЛО входных блоков\n"
 "  ibs=ЧИСЛО       считывать заданное ЧИСЛО байт за раз\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=ФАЙЛ         читать ФАЙЛ, а не стандартный ввод\n"
 "  iflag=СПИСОК    читать в соответствии со СПИСКОМ символов,\n"
@@ -110,52 +124,50 @@ msgstr ""
 "ibs\n"
 "  status=noxfer   не выводить статистику передачи\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -173,32 +185,12 @@ msgstr ""
 "Каждый элемент СПИСКА для conv может быть:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     из EBCDIC в ASCII\n"
-"  ebcdic    из ASCII в EBCDIC\n"
-"  ibm       из ASCII в альтернативную EBCDIC\n"
-"  block     заполнять записи, заканчивающиеся переводом строки, пробелами "
-"до\n"
-"            размера cbs\n"
-"  unblock   заменять завершающие пробелы в записях размера cbs на перевод "
-"строки\n"
-"  lcase     изменять регистр с верхнего на нижний\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
+#, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   не создавать выходной файл\n"
 "  excl      завершаться неуспехом, если выходной файл уже существует\n"
@@ -206,7 +198,7 @@ msgstr ""
 "  ucase     изменять регистр с нижнего на верхний\n"
 "  swab      менять местами каждую пару входных байтов\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -220,7 +212,7 @@ msgstr ""
 "  fdatasync физически записать выходной файл перед завершением\n"
 "  fsync     аналогично, но записать также метаданные\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -234,51 +226,51 @@ msgstr ""
 "  append    режим добавления (имеет смысл для вывода; рекомендуется "
 "conv=notrunc)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr "  direct    использовать прямой ввод/вывод для данных\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr "  directory выдавать ошибку, если это не каталог\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr "  dsync     использовать синхронизированный ввод/вывод для данных\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync      то же, но так же и для метаданных\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock  использовать неблокирующий ввод/вывод\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noatime   не обновлять время последнего доступа\n"
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr "  noctty    не назначать управляющий терминал из файла\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow  не следовать по символьным ссылкам\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks   выдавать ошибку, если найдено несколько ссылок\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr "  binary    использовать бинарный ввод/вывод для данных\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text      использовать текстовый ввод/вывод для данных\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -308,11 +300,11 @@ msgstr ""
 "Ключи:\n"
 "\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Неизвестная системная ошибка"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -321,20 +313,12 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> записей считано\n"
 "%<PRIuMAX>+%<PRIuMAX> записей написано\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> усеченная запись\n"
-msgstr[1] "%<PRIuMAX> усеченные записи\n"
-msgstr[2] "%<PRIuMAX> усеченных записей\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
@@ -342,7 +326,7 @@ msgstr[0] " скопирован %<PRIuMAX> байт (%s)"
 msgstr[1] " скопировано %<PRIuMAX> байта (%s)"
 msgstr[2] " скопировано %<PRIuMAX> байт (%s)"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "Бесконечность"
 
@@ -356,147 +340,155 @@ msgstr "Бесконечность"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g c, %s/c\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g c, %s/c\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "закрытие входного файла %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "закрытие выходного файла %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Исчерпаны суффиксы для выходных файлов"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "открытие %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "НЕУСПЕШНО"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "запись в %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "операнд %s не распознан"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "неверная дата %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "неверный формат даты %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "неверный формат даты %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "неверный формат даты %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "недопустимое преобразование: %s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "недопустимый флаг входа: %s"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "недопустимый флаг выхода: %s"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "недопустимый флаг статуса: %s"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "неверный номер %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "нельзя сочетать любые два из {ascii,ebcdic,ibm}"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "нельзя совмещать block и unblock"
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "нельзя совмещать lcase и ucase"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "нельзя совмещать excl и nocreat"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "нельзя сочетать ключи -e и -i"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "нельзя сочетать ключи -e и -i"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "нельзя сочетать ключи -e и -i"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "нельзя сочетать ключи -e и -i"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "нельзя сочетать ключи -e и -i"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -505,89 +497,74 @@ msgstr ""
 "внимание: обходим ошибку lseek в ядре для файла (%s)\n"
 "  mt_type=0x%0lx -- см. <sys/mtio.h> для списка типов"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "чтение %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: невозможно сместить указатель файла"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "переполнение сдвига при чтении файла %s"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "предупреждение: смещение файла стало неверным после ошибки чтения"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "невозможно обойти ошибку ядра"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "предупреждение: смещение файла стало неверным после ошибки чтения"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "установка флагов для %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "чтение каталога %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "чтение каталога %s"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
-msgstr "ошибка записи %s"
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "запись в %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "операция fdatasync для %s неуспешна"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "операция fsync для %s неуспешна"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "стандартный ввод"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "стандартный вывод"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -596,20 +573,60 @@ msgstr ""
 "смещение слишком велико: невозможно обрезать до величины seek=%<PRIuMAX> (%"
 "lu-байтных) блоков"
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "невозможно выполнить fstat для %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "отсечение на %<PRIuMAX> байт в выходном файле %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     из EBCDIC в ASCII\n"
+#~ "  ebcdic    из ASCII в EBCDIC\n"
+#~ "  ibm       из ASCII в альтернативную EBCDIC\n"
+#~ "  block     заполнять записи, заканчивающиеся переводом строки, пробелами "
+#~ "до\n"
+#~ "            размера cbs\n"
+#~ "  unblock   заменять завершающие пробелы в записях размера cbs на перевод "
+#~ "строки\n"
+#~ "  lcase     изменять регистр с верхнего на нижний\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> усеченная запись\n"
+#~ msgstr[1] "%<PRIuMAX> усеченные записи\n"
+#~ msgstr[2] "%<PRIuMAX> усеченных записей\n"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "нельзя сочетать любые два из {ascii,ebcdic,ibm}"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "нельзя совмещать block и unblock"
+
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "нельзя совмещать lcase и ucase"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "предупреждение: смещение файла стало неверным после ошибки чтения"
+
+#~ msgid "error writing %s"
+#~ msgstr "ошибка записи %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "неверный аргумент %s для %s"
 
@@ -6603,9 +6620,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "невозможно выполнить %s -d"
 
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "невозможно создать процесс для %s -d"
-
 #~ msgid "write failed"
 #~ msgstr "запись неуспешна"
 
diff --git a/po/sk.gmo b/po/sk.gmo
index d6c346d..042e2e5 100644
Binary files a/po/sk.gmo and b/po/sk.gmo differ
diff --git a/po/sk.po b/po/sk.po
index 1e71f21..6e745d0 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 6.10\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2008-04-04 10:01+0100\n"
 "Last-Translator: Ivan Masár <helix84 at centrum.sk>\n"
 "Language-Team: Slovak <sk-i18n at lists.linux.sk>\n"
@@ -18,40 +18,52 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "nie je možné vytvoriť proces pre %s -d"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Viac informácií získate príkazom `%s --help'.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -60,16 +72,15 @@ msgstr ""
 "Použitie: %s [SÚBOR]...\n"
 " alebo:   %s [VOĽBA]\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Kopírovač súbor, pričom sa skonvertuje a sformátuje podľa operandov.\n"
@@ -81,21 +92,24 @@ msgstr ""
 "  count=BLOKOV    skopírovať iba BLOKOV vstupných blokov\n"
 "  ibs=BAJTOV      čítať BAJTOV bajtov naraz\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=SÚBOR        čítať zo SÚBORu namiesto štandardného vstupu\n"
 "  iflag=PRÍZN     čítať podľa tohto zoznamu symbolov oddelených čiarkami\n"
@@ -107,52 +121,50 @@ msgstr ""
 "  skip=BLOKOV     preskočiť BLOKOV s veľkosťou ibs na začiatku vstupu\n"
 "  status=noxfer   potlačiť výpis štatistiky prenosu\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -170,30 +182,12 @@ msgstr ""
 "Každý symbol KONV môže byť:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     z EBCDIC do ASCII\n"
-"  ebcdic    z ASCII do EBCDIC\n"
-"  ibm       z ASCII do alternatívneho EBCDIC\n"
-"  block     vyplniť záznamy ukončené novým riadkom medzerami na veľkosť cbs\n"
-"  unblock   nahradiť medzery na konci záznamov s veľkosťou cbs znakom nového "
-"riadka\n"
-"  lcase     zmeniť veľké písmená na malé\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
+#, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   nevytvárať výstupný súbor\n"
 "  excl      skončiť neúspešne, ak výstupný súbor už existuje\n"
@@ -201,7 +195,7 @@ msgstr ""
 "  ucase     zmeniť malé písmená na veľké\n"
 "  swab      vymeniť každú dvojicu bajtov na vstupe\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -216,7 +210,7 @@ msgstr ""
 "  fdatasync  pred ukončením fyzicky zapísať údaje\n"
 "  fsync     podobne, ale zapísať aj metadáta\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -230,52 +224,52 @@ msgstr ""
 "  append    režim pridávania (zmysluplné iba pre výstup; navrhuje sa "
 "conv=notrunc)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr "  direct    použiť pre dáta priamy V/V\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "%s existuje, ale nie je adresárom"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr "  dsync     použiť pre dáta synchronizovaný V/V\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync      podobne, ale aj pre metadáta\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock  použiť neblokoujúci V/V\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noatime   neaktualizovať čas posledného prístupu\n"
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr "  noctty    nepriraďovať zo súboru riadiaci terminál\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow  nenasledovať symbolické odkazy\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks   skončiť neúspešne pri viacnásobnom odkaze\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr "  binary    použiť pre dáta binárny V/V\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text      použiť pre dáta textový V/V\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -305,11 +299,11 @@ msgstr ""
 "Voľby sú:\n"
 "\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Neznáma systémová chyba"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -318,19 +312,12 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> záznamov prečítaných\n"
 "%<PRIuMAX>+%<PRIuMAX> záznamov zapísaných\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, fuzzy, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "skrátený záznam"
-msgstr[1] "skrátený záznam"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
@@ -338,7 +325,7 @@ msgstr[0] "%<PRIuMAX> byte (%s) copied"
 msgstr[1] "%<PRIuMAX> skopírované bajty (%s)"
 msgstr[2] "%<PRIuMAX> skopírovaných bajtov (%s)"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "nekonečno B"
 
@@ -352,146 +339,154 @@ msgstr "nekonečno B"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, fuzzy, c-format
 msgid "closing input file %s"
 msgstr "vytváram súbor `%s'\n"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "zatváram výstupný súbor %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 msgid "Split extensions exhausted"
 msgstr ""
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "otváram %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "CHYBNÝ"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "zápis do %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "neznámy operand %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "neplatný dátum %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "chybný argument %s pre `%s'"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal ifjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "chybný argument %s pre `%s'"
+
+#: src/dc3dd.c:2793
+#, c-format
+msgid "Illegal vfjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "chybný argument %s pre `%s'"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "neplatná konverzia: %s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "neplatný vstupný prepínač: %s"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "neplatný výstupný prepínač: %sneplatná skupina"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "neplatný stavový prepínač: %s"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "neplatné číslo %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "nie je možné skombinovať dve z {ascii,ebcdic,ibm}"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "nie je možné skombinovať  block a unblock"
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "nie je možné skombinovať lcase a ucase"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "nie je možné skombinovať excl a nocreat"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "nie je možné vytvoriť adresár %s"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "nie je možné vytvoriť adresár %s"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "nie je možné vytvoriť adresár %s"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "nie je možné vytvoriť adresár %s"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "nie je možné vytvoriť adresár %s"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -500,89 +495,74 @@ msgstr ""
 "upozornenie: obchádza sa chyba jadra vo funkcii lseek v súbore (%s)\n"
 "  mt_type=0x%0lx -- pozri zoznam typov v <sys/mtio.h>"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "číta sa %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: nie je možné vyhľadať"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "pretečenie pozície pri čítaní súboru %s"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "upozornenie: chybný ofset v súbore po neúspešnom čítaní"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "nakoniec nie je možné obísť chybu jadra"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "upozornenie: chybný ofset v súbore po neúspešnom čítaní"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "nastavujem príznaky %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "nie je možné vytvoriť adresár %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "nie je možné vytvoriť adresár %s"
 
-#: src/dc3dd.c:3789
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "error writing %s"
-msgstr "chyba pri zápise %s"
-
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "zápis do %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "fdatasync zlyhalo na %s"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "fsync zlyhalo na %s"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "štandardný vstup"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "štandardný výstup"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -591,20 +571,59 @@ msgstr ""
 "hodnota pozície je príliš veľká: nie je možné skrátiť na dĺžku seek=%"
 "<PRIuMAX> (%lu-bajtových) blokov"
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "nie je možné vykonať fstat %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, fuzzy, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "presúvam sa za %s bajtov vo výstupnom súbore %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     z EBCDIC do ASCII\n"
+#~ "  ebcdic    z ASCII do EBCDIC\n"
+#~ "  ibm       z ASCII do alternatívneho EBCDIC\n"
+#~ "  block     vyplniť záznamy ukončené novým riadkom medzerami na veľkosť "
+#~ "cbs\n"
+#~ "  unblock   nahradiť medzery na konci záznamov s veľkosťou cbs znakom "
+#~ "nového riadka\n"
+#~ "  lcase     zmeniť veľké písmená na malé\n"
+
+#, fuzzy
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "skrátený záznam"
+#~ msgstr[1] "skrátený záznam"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "nie je možné skombinovať dve z {ascii,ebcdic,ibm}"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "nie je možné skombinovať  block a unblock"
+
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "nie je možné skombinovať lcase a ucase"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "upozornenie: chybný ofset v súbore po neúspešnom čítaní"
+
+#~ msgid "error writing %s"
+#~ msgstr "chyba pri zápise %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "neplatný argument %s pre %s"
 
@@ -3903,9 +3922,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "nebolo možné vykonať %s -d"
 
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "nie je možné vytvoriť proces pre %s -d"
-
 #~ msgid "write failed"
 #~ msgstr "chyba pri zápise"
 
diff --git a/po/sl.gmo b/po/sl.gmo
index bd48b29..7a5cad8 100644
Binary files a/po/sl.gmo and b/po/sl.gmo differ
diff --git a/po/sl.po b/po/sl.po
index 3869627..61d5097 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GNU coreutils 6.11\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2008-04-23 09:26+0200\n"
 "Last-Translator: Primož Peterlin <primoz.peterlin at biofiz.mf.uni-lj.si>\n"
 "Language-Team: Slovenian <translation-team-sl at lists.sourceforge.net>\n"
@@ -19,41 +19,53 @@ msgstr ""
 "%100==4 ? 3 : 0);\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 #, fuzzy
 msgid "David MacKenzie"
 msgstr "Paul Rubin in David MacKenzie"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "ni mogoče ustvariti procesa za %s -d"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Poskusite »%s --help« za izčrpnejša navodila\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -62,16 +74,15 @@ msgstr ""
 "Uporaba: %s [OPERAND]...\n"
 "  ali:   %s IZBIRA\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Prepiši datoteko in jo pretvori in preoblikuj glede na izbire.\n"
@@ -83,21 +94,24 @@ msgstr ""
 "  count=BLOKOV    pretvori samo zahtevano število vhodnik BLOKOV\n"
 "  ibs=BAJTOV      beri po zahtevano število BAJTOV naenkrat\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=DATOTEKA     beri z navedene DATOTEKE namesto s standardnega vhoda\n"
 "  iflag=ZASTAVICA beri kot z vejicami ločen seznam simbolov\n"
@@ -110,52 +124,50 @@ msgstr ""
 "                    dolžine ibs\n"
 "  status=noxfer   brez statistike prenosa\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -173,29 +185,12 @@ msgstr ""
 "PRETVORBA je lahko (več izbir ločimo z vejico):\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     iz EBCDIC v ASCII\n"
-"  ebcdic    iz ASCII v EBCDIC\n"
-"  ibm       iz ASCII v »alternate EBCDIC«\n"
-"  block     zapise terminirane z NEWLINE zapolni z presledki do dolžine cbs\n"
-"  unblock   sledilne presledke v zapisu dolžine cbs nadomesti z NEWLINE\n"
-"  lcase     velike črke zamenjaj z malimi\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
+#, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   ne zapiši izhodne datoteke\n"
 "  excl      prenehaj z delom, če izhodna datoteka že obstaja\n"
@@ -203,7 +198,7 @@ msgstr ""
 "  ucase     male črke zamenjaj z velikimi\n"
 "  swab      paroma zamenjaj bajte na vhodu\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -218,7 +213,7 @@ msgstr ""
 "  fdatasync fizično zapiši izhodno datoteko pred zaključkom dela\n"
 "  fsync     enako, vendar zapiši tudi metapodatke              \n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -233,52 +228,52 @@ msgstr ""
 "priporočeno\n"
 "            conv=notrunc)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr "  direct    uporabi neposredne vhodno-izhodne funkcije za podatke\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr "  directory opusti, razen če je imenik\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 "  dsync     uporabi sinhronizirane vhodno-izhodne funkcije za podatke\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync      enako, a tudi za metapodatke\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock  uporabi neblokirne vhodno-izhodne funkcije\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noatime   ne ažuriraj časa zadnjega dostopa\n"
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr "  noctty    ne določaj krmilnega terminala iz datoteke\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow  ne sledi simbolnim povezavam\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks   opusti, če je datoteka večkratno povezana\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr "  binary    uporabi binarne vhodno-izhodne funkcije za podatke\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text      uporabi besedilne vhodno-izhodne funkcije za podatke\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -307,11 +302,11 @@ msgstr ""
 "Izbire so:\n"
 "\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Neznana sistemska napaka"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -320,22 +315,12 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> zapisov na vhodu\n"
 "%<PRIuMAX>+%<PRIuMAX> zapisov na izhodu\n"
 
-# ! INEXACT
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> odrezanih zapisov\n"
-msgstr[1] "%<PRIuMAX> odrezan zapis\n"
-msgstr[2] "%<PRIuMAX> odrezana zapisa\n"
-msgstr[3] "%<PRIuMAX> odrezani zapisi\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
@@ -344,7 +329,7 @@ msgstr[1] "%<PRIuMAX> bajt (%s) prepisan"
 msgstr[2] "%<PRIuMAX> bajta (%s) prepisana"
 msgstr[3] "%<PRIuMAX> bajti (%s) prepisani"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "neskončno B"
 
@@ -358,145 +343,152 @@ msgstr "neskončno B"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "zapiramo vhodno datoteko %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "zapiramo izhodno datoteko %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Pripone izhodnih datotek so izčrpane"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "odpiramo %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "NAPAKA"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "pišemo na %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "neprepoznan operand %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "neveljavni datum %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "neveljavna oblika datuma %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal ifjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "neveljavna oblika datuma %s"
+
+#: src/dc3dd.c:2793
+#, c-format
+msgid "Illegal vfjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "neveljavna oblika datuma %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 msgid "invalid conversion"
 msgstr "neveljavna pretvorba"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 msgid "invalid input flag"
 msgstr "neveljavna vhodna zastavica"
 
 # ! INEXACT
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 msgid "invalid output flag"
 msgstr "neveljavno izhodna zastavica"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 msgid "invalid status flag"
 msgstr "neveljavna statusna zastavica"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "neveljavno število %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "pretvorbe ascii, ebcdic in ibm se medsebojno izključujejo"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "pretvorbi block in unblock se medsebojno izključujeta"
-
-# ! INEXACT
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "pretvorbi lcase in ucase se medsebojno izključujeta"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "pretvorbi excl in nocreat se medsebojno izključujeta"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "izbir -e in -i ni mogoče kombinirati"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "izbir -e in -i ni mogoče kombinirati"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "izbir -e in -i ni mogoče kombinirati"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "izbir -e in -i ni mogoče kombinirati"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "izbir -e in -i ni mogoče kombinirati"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -505,89 +497,74 @@ msgstr ""
 "opozorilo: obvoz okoli napake lseek v jedru za datoteko (%s)\n"
 "   vrste mt_type=0x%0lx -- glejte <sys/mtio.h> za seznam zvrsti"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "beremo %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: premik s »seek« ni mogoč"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "prekoračitev odmika pri branju datoteke %s"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "opozorilo: neveljavni odmik datoteke po napaki pri branju"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "napake v jedru ni bilo mogoče zaobiti"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "opozorilo: neveljavni odmik datoteke po napaki pri branju"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "nastavljamo zastavice za %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "beremo imenik %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "beremo imenik %s"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
-msgstr "napaka pri pisanju na %s"
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "pišemo na %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "fdatasync ni uspel za %s"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "fsync ni uspel za %s<"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "standardni vhod"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "standardni izhod"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -596,20 +573,61 @@ msgstr ""
 "odmik prevelik: ni moč odrezati na dolžino seek=%<PRIuMAX> (%lu-bajtnih) "
 "blokov"
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "statusa %s ni moč ugotoviti s fstat"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "napredovali smo prek %<PRIuMAX> bajtov v izhodni datoteki %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     iz EBCDIC v ASCII\n"
+#~ "  ebcdic    iz ASCII v EBCDIC\n"
+#~ "  ibm       iz ASCII v »alternate EBCDIC«\n"
+#~ "  block     zapise terminirane z NEWLINE zapolni z presledki do dolžine "
+#~ "cbs\n"
+#~ "  unblock   sledilne presledke v zapisu dolžine cbs nadomesti z NEWLINE\n"
+#~ "  lcase     velike črke zamenjaj z malimi\n"
+
+# ! INEXACT
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> odrezanih zapisov\n"
+#~ msgstr[1] "%<PRIuMAX> odrezan zapis\n"
+#~ msgstr[2] "%<PRIuMAX> odrezana zapisa\n"
+#~ msgstr[3] "%<PRIuMAX> odrezani zapisi\n"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "pretvorbe ascii, ebcdic in ibm se medsebojno izključujejo"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "pretvorbi block in unblock se medsebojno izključujeta"
+
+# ! INEXACT
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "pretvorbi lcase in ucase se medsebojno izključujeta"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "opozorilo: neveljavni odmik datoteke po napaki pri branju"
+
+#~ msgid "error writing %s"
+#~ msgstr "napaka pri pisanju na %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "neveljavni argument %s za %s"
 
@@ -6827,9 +6845,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "ni mogoče izvesti %s -d"
 
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "ni mogoče ustvariti procesa za %s -d"
-
 #~ msgid "write failed"
 #~ msgstr "pisanje ni uspelo"
 
diff --git a/po/sv.gmo b/po/sv.gmo
index 7c05b29..13c5389 100644
Binary files a/po/sv.gmo and b/po/sv.gmo differ
diff --git a/po/sv.po b/po/sv.po
index bbf4ffc..744d1ba 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -12,7 +12,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 6.11\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2008-05-16 23:07+0200\n"
 "Last-Translator: Göran Uddeborg <goeran at uddeborg.se>\n"
 "Language-Team: Swedish <tp-sv at listor.tp-sv.se>\n"
@@ -22,40 +22,52 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "det gick inte att skapa en process för %s -d"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Försök med \"%s --help\" för mer information.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -64,16 +76,15 @@ msgstr ""
 "Användning: %s [OPERAND]...\n"
 "   eller:   %s FLAGGA\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Kopiera en fil med konvertering och formatering enligt operanderna.\n"
@@ -84,21 +95,24 @@ msgstr ""
 "  count=BLOCK     kopiera endast BLOCK inblock\n"
 "  ibs=BYTE        läs BYTE byte åt gången\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=FIL          läs från FIL istället för standard in\n"
 "  iflag=FLAGGOR   läs enligt den kommaseparerade symbollistan\n"
@@ -109,52 +123,50 @@ msgstr ""
 "  skip=BLOCK      hoppa över BLOCK ibs-stora block från början av infil\n"
 "  status=noxfer   utelämna överföringsstatistik\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -172,29 +184,12 @@ msgstr ""
 "Varje KONV kan vara:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     från EBCDIC till ASCII\n"
-"  ebcdic    från ASCII till EBCDIC\n"
-"  ibm       från ASCII till en annan EBCDIC\n"
-"  block     fyll ut nyradsavslutade poster med blanktecken till cbs-storlek\n"
-"  unblock   ersätt avslutande blanktecken med nyrad i cbs-stora poster\n"
-"  lcase     ändra versaler till gemena\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
+#, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   skapa inte utfilen\n"
 "  excl      misslyckas om utilen redan finns\n"
@@ -202,7 +197,7 @@ msgstr ""
 "  ucase     ändra gemena till versaler\n"
 "  swab      byt plats på varje par av byte i indata\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -217,7 +212,7 @@ msgstr ""
 "  fdatasync  skriv fysiskt data till utfilen före svslut\n"
 "  fsync     d:o, men skriv även metadata\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -231,51 +226,51 @@ msgstr ""
 "  append    lägg-till-läge (meningsfullt endast för utmatning, conv=notrunc\n"
 "              rekommenderas)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr "  direct    använd direkt I/O för data\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr "  directory misslyckas om inte en katalog\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr "  dsync     använd synkroniserad I/O för data\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync      d:o, men även för metadata\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock  använd icke blockerande I/O\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noatime   uppdatera inte åtkomsttiden\n"
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr "  noctty    tilldela inte styrterminal från fil\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow  följ inte symboliska länkar\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks   misslyckas ifall flera länkar\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr "  binary    använd binär I/O för data\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text      använd text-I/O för data\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -302,11 +297,11 @@ msgstr ""
 "  18335302+0 poster ut\n"
 "  9387674624 byte (9.4 GB) kopierade, 34.6279 sekunder, 271 MB/s\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Okänt systemfel"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -315,26 +310,19 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> poster in\n"
 "%<PRIuMAX>+%<PRIuMAX> poster ut\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> avhuggen post\n"
-msgstr[1] "%<PRIuMAX> avhuggna poster\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] "%<PRIuMAX> byte (%s) kopierad"
 msgstr[1] "%<PRIuMAX> byte (%s) kopierade"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "Oändligt B"
 
@@ -348,143 +336,151 @@ msgstr "Oändligt B"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "stänger infil %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "stänger utdatafil %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Slut på utfiländelser"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "öppnar %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "MISSLYCKADES"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "skrivning till %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "okänd operand %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "ogiltigt datum %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "felaktigt datumformat %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "felaktigt datumformat %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "felaktigt datumformat %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 msgid "invalid conversion"
 msgstr "ogiltig konvertering"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 msgid "invalid input flag"
 msgstr "ogiltig inflagga"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 msgid "invalid output flag"
 msgstr "ogiltig utflagga"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 msgid "invalid status flag"
 msgstr "ogiltig statusflagga"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "ogiltigt antal %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "kan inte kombinera något par av {ascii,ebcdic,ibm}"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "kan inte kombinera block och unblock"
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "kan inte kombinera lcase och ucase"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "kan inte kombinera excl och nocreate"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "det går inte att kombinera flaggorna -e och -i"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "det går inte att kombinera flaggorna -e och -i"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "det går inte att kombinera flaggorna -e och -i"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "det går inte att kombinera flaggorna -e och -i"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "det går inte att kombinera flaggorna -e och -i"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -493,89 +489,74 @@ msgstr ""
 "varning: går runt fel i kärnan i lseek för fil (%s)\n"
 "  med mt_type=0x%0lx -- se <sys/mtio.h> för en lista av typer"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "läser %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: kan inte söka"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "spill i filposition vid läsning av filen %s"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "varning: ogiltig filposition efter misslyckad läsning"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "kan inte kringgå fel i kärnan trots allt"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "varning: ogiltig filposition efter misslyckad läsning"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "sätter flaggor för %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "läser katalog %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "läser katalog %s"
 
-#: src/dc3dd.c:3789
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "error writing %s"
-msgstr "fel vid skrivning av %s"
-
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "skrivning till %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "fdatasync misslyckades för %s"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "fsync misslyckades för %s"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "standard in"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "standard ut"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -584,20 +565,57 @@ msgstr ""
 "positionen för stor: kan inte hugga av till en längd av seek=%<PRIuMAX> (%lu-"
 "byte-)block"
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "kan inte göra fstat på %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "hugger av vid %<PRIuMAX> byte i utdatafil %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     från EBCDIC till ASCII\n"
+#~ "  ebcdic    från ASCII till EBCDIC\n"
+#~ "  ibm       från ASCII till en annan EBCDIC\n"
+#~ "  block     fyll ut nyradsavslutade poster med blanktecken till cbs-"
+#~ "storlek\n"
+#~ "  unblock   ersätt avslutande blanktecken med nyrad i cbs-stora poster\n"
+#~ "  lcase     ändra versaler till gemena\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> avhuggen post\n"
+#~ msgstr[1] "%<PRIuMAX> avhuggna poster\n"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "kan inte kombinera något par av {ascii,ebcdic,ibm}"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "kan inte kombinera block och unblock"
+
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "kan inte kombinera lcase och ucase"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "varning: ogiltig filposition efter misslyckad läsning"
+
+#~ msgid "error writing %s"
+#~ msgstr "fel vid skrivning av %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "felaktigt argument %s till %s"
 
@@ -6685,9 +6703,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "det gick inte att köra %s -d"
 
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "det gick inte att skapa en process för %s -d"
-
 #~ msgid "write failed"
 #~ msgstr "misslyckaes skriva"
 
diff --git a/po/tr.gmo b/po/tr.gmo
index cd817e2..0a32105 100644
Binary files a/po/tr.gmo and b/po/tr.gmo differ
diff --git a/po/tr.po b/po/tr.po
index 847fd2b..3315f5f 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 5.3.0\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2005-03-14 04:17+0200\n"
 "Last-Translator: Deniz Akkus Kanca <deniz at arayan.com>\n"
 "Language-Team: Turkish <gnu-tr-u12a at lists.sourceforge.net>\n"
@@ -20,41 +20,53 @@ msgstr ""
 "X-Generator: KBabel 1.9.1\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 #, fuzzy
 msgid "David MacKenzie"
 msgstr "Paul Rubin ve David MacKenzie"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "%s dizini oluşturulamıyor"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Daha fazla bilgi için `%s --help' yazın.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -63,16 +75,15 @@ msgstr ""
 "Kullanımı: %s [İŞLEYEN]...\n"
 "    veya:  %s SEÇENEK\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Seçeneklere göre biçemleme ve dönüştürme yaparak bir dosya kopyalar.\n"
@@ -84,21 +95,24 @@ msgstr ""
 "  count=BLOK      yalnızca BLOK sayıda girdi bloğu kopyalar\n"
 "  ibs=BAYT        bir seferde BAYT bayt okur\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=DOSYA        standart girdi yerine DOSYA'dan okur\n"
 "  iflag=BAYRAK    virgülle ayrılmış sembol listesine uygun olarak okur\n"
@@ -108,52 +122,50 @@ msgstr ""
 "  seek=BLOK       çıktının başında obs boyunda BLOK sayısında blok atlar\n"
 "  skip=BLOK       girdinin başında ibs boyunda BLOK sayısında blok atlar\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -171,32 +183,12 @@ msgstr ""
 "Her CONV sembolü:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     EBCDIC'den ASCII'ye\n"
-"  ebcdic    ASCII'den EBCDIC'ye\n"
-"  ibm       ASCII'den alternatifli EBCDIC'ye\n"
-"  block     satırsonu karakteri ile biten kayıtları cbs boyutuna getirmek\n"
-"            için boşlukla doldurur\n"
-"  unblock   cbs boyutundaki kayıtlarda sonda yer alan boşlukları yenisatır \n"
-"            ile değiştirir\n"
-"  lcase     büyük harfleri küçük harfe dönüştürür\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 #, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   çıktı dosyasını oluşturmaz\n"
 "  excl      çıktı dosyası var ise başarısız olur\n"
@@ -212,7 +204,7 @@ msgstr ""
 "  fdatasync bitirmeden önce çıktı dosya verisini fiziken yazdırır\n"
 "  fsync     fdatasync gibi fakat ek olarak meta veriyi de yazdırır\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 #, fuzzy
 msgid ""
 "  noerror   continue after read errors\n"
@@ -235,7 +227,7 @@ msgstr ""
 "  fdatasync bitirmeden önce çıktı dosya verisini fiziken yazdırır\n"
 "  fsync     fdatasync gibi fakat ek olarak meta veriyi de yazdırır\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 #, fuzzy
 msgid ""
 "\n"
@@ -249,56 +241,56 @@ msgstr ""
 "\n"
 "  append    ekleme kipi (yalnız çıktı için geçerli)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr "  direct    veri için direkt I/O kullanır\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "  direct    veri için direkt I/O kullanır\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr "  dsync    veri için senkron I/O kullanır\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync      önceki gibi fakat meta veri için de geçerli\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock  bloklamayan I/O kullanır\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 "  noctty    dosyadan kontrol eden terminali ayarlamaz\n"
 " terminal from file\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow  sembolik bağları izlemez\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 #, fuzzy
 msgid "  binary    use binary I/O for data\n"
 msgstr "  direct    veri için direkt I/O kullanır\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 #, fuzzy
 msgid "  text      use text I/O for data\n"
 msgstr "  direct    veri için direkt I/O kullanır\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -328,37 +320,30 @@ msgstr ""
 "Seçenekler:\n"
 "\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Bilinmeyen sistem hatası"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, fuzzy, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "budanmış kayıt"
-msgstr[1] "budanmış kayıt"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] "%s bayt (%s) kopyalandı"
 msgstr[1] "%s bayt (%s) kopyalandı"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 #, fuzzy
 msgid "Infinity B"
 msgstr "Sonsuz"
@@ -373,150 +358,155 @@ msgstr "Sonsuz"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g saniye, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, fuzzy, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g saniye, %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "girdi dosyası %s kapatılıyor"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "çıktı dosyası %s kapatılıyor"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "kullanacak parça ismi kalmadı"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "%s açılıyor"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "BAŞARISIZ"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "%s'e yazılıyor"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "geçersiz işleyen %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "`%s' geçerli bir zaman dizgesi değil"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "geçersiz tarih biçemi %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "geçersiz tarih biçemi %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "geçersiz tarih biçemi %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "geçersiz dönüşüm: %s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "geçersiz girdi bayrağı: %s"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "geçersiz çıktı bayrağı: %s"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "geçersiz durum bayrağı: %s"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "geçersiz sayı %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "{ascii, ebcdic, ibm} değerlerinin herhangi ikisi birleştirilemez"
-
-#
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "`block' ve `unblock' seçenekleri aynı anda kullanılamaz"
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr ""
-"`lcase' (küçük harf) ve `ucase' (büyük harf) seçenekleri aynı anda "
-"kullanılamaz"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "`excl' ve `nocreat' seçenekleri birleştirilemez"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "kip ve --reference seçenekleri birleştirilemez"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "kip ve --reference seçenekleri birleştirilemez"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "kip ve --reference seçenekleri birleştirilemez"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "kip ve --reference seçenekleri birleştirilemez"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "kip ve --reference seçenekleri birleştirilemez"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -526,109 +516,138 @@ msgstr ""
 "alternatifler\n"
 "  kullanılıyor -- tür listesi için <sys/mtio.h>'e bakın"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "%s okunuyor"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: aranamadı"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "%s dosya okunurken görece taşması"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "uyarı: başarısız okumadan sonra garip dosya atlaması"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "çekirdek hatası bertaraf edilemedi"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "uyarı: başarısız okumadan sonra garip dosya atlaması"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "%s için seçenekler belirtiliyor"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "dizin %s okunuyor"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "dizin %s okunuyor"
 
-#: src/dc3dd.c:3789
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "error writing %s"
-msgstr "%s'e yazarken hata"
-
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "%s'e yazılıyor"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "%s için fdatasync başarısız"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "%s için fsync başarısız"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "standart girdi"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "standart çıktı"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "%s'nin dosya durumu (fstat) alınamadı"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, fuzzy, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "çıktı dosyasında %s bayt ileriye gidildi %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     EBCDIC'den ASCII'ye\n"
+#~ "  ebcdic    ASCII'den EBCDIC'ye\n"
+#~ "  ibm       ASCII'den alternatifli EBCDIC'ye\n"
+#~ "  block     satırsonu karakteri ile biten kayıtları cbs boyutuna "
+#~ "getirmek\n"
+#~ "            için boşlukla doldurur\n"
+#~ "  unblock   cbs boyutundaki kayıtlarda sonda yer alan boşlukları "
+#~ "yenisatır \n"
+#~ "            ile değiştirir\n"
+#~ "  lcase     büyük harfleri küçük harfe dönüştürür\n"
+
+#, fuzzy
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "budanmış kayıt"
+#~ msgstr[1] "budanmış kayıt"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "{ascii, ebcdic, ibm} değerlerinin herhangi ikisi birleştirilemez"
+
+#
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "`block' ve `unblock' seçenekleri aynı anda kullanılamaz"
+
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr ""
+#~ "`lcase' (küçük harf) ve `ucase' (büyük harf) seçenekleri aynı anda "
+#~ "kullanılamaz"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "uyarı: başarısız okumadan sonra garip dosya atlaması"
+
+#~ msgid "error writing %s"
+#~ msgstr "%s'e yazarken hata"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "%s argümanı `%s' için geçersiz"
 
@@ -6330,10 +6349,6 @@ msgstr ""
 #~ msgid "couldn't open temporary file"
 #~ msgstr "geçici dosya oluşturulamadı"
 
-#, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "%s dizini oluşturulamıyor"
-
 #~ msgid "write failed"
 #~ msgstr "yazma başarısız oldu"
 
diff --git a/po/uk.gmo b/po/uk.gmo
index 8522a5a..b0ad185 100644
Binary files a/po/uk.gmo and b/po/uk.gmo differ
diff --git a/po/uk.po b/po/uk.po
index 6f2b1f3..f73183e 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 6.9.91\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2007-12-17 15:12+0300\n"
 "Last-Translator: Maxim V. Dziumanenko <dziumanenko at gmail.com>\n"
 "Language-Team: Ukrainian <translation-team-uk at lists.sourceforge.net>\n"
@@ -18,40 +18,52 @@ msgstr ""
 "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "неможливо створити процес для %s -d"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Спробуйте `%s --help' для одержання додаткової інформації.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -60,16 +72,15 @@ msgstr ""
 "Використання: %s [ОПЕРАНД]...\n"
 "       або:    %s КЛЮЧ\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Копіює файл, перетворює та форматує у залежності від операндів.\n"
@@ -81,21 +92,24 @@ msgstr ""
 "  count=ЧИСЛО     копіювати лише вказане ЧИСЛО вхідних блоків\n"
 "  ibs=ЧИСЛО       читати вказане ЧИСЛО байт за раз\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=ФАЙЛ         читати ФАЙЛ, а не стандартний ввід\n"
 "  iflag=СПИСОК    читати відповідно до СПИСКУ символів,\n"
@@ -108,52 +122,50 @@ msgstr ""
 "  skip=ЧИСЛО      пропустити з початку вводу ЧИСЛО блоків розміром ibs\n"
 "  status=noxfer   не виводити статистику передачі\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -171,31 +183,12 @@ msgstr ""
 "Кожен елемент СПИСКУ для conv може бути:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     з EBCDIC на ASCII\n"
-"  ebcdic    з ASCII на EBCDIC\n"
-"  ibm       з ASCII на альтернативну EBCDIC\n"
-"  block     заповнювати записи, що закінчуються переносом рядка, пробілами\n"
-"            до розміру cbs\n"
-"  unblock   замінювати кінцеві пробіли у записах з розміром cbs переносом "
-"рядка\n"
-"  lcase     змінювати регістр з верхнього на нижній\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
+#, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   не створювати файл виводу\n"
 "  excl      завершаться помилкою, якщо файл виводу уже існує\n"
@@ -203,7 +196,7 @@ msgstr ""
 "  ucase     змінювати регістр з нижнього на верхній\n"
 "  swab      міняти місцями кожну пару вхідних байтів\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -217,7 +210,7 @@ msgstr ""
 "  fdatasync фізично записати файл виводу перед завершенням\n"
 "  fsync     аналогічно, але записати також метадані\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -231,51 +224,51 @@ msgstr ""
 "  append    режим додавання (має сенс для виводу; рекомендується  "
 "conv=notrunc)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr "  direct    використовувати прямий ввід/вивід для даних\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr "  directory помилка, якщо не є каталогом\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr "  dsync     використовувати синхронізований ввід/вивід для даних\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync      те саме, але також для метаданих\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock  використовувати ввід/вивід без блокування\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noatime   не оновлювати час останнього доступу\n"
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr "  noctty    не призначати керуючий термінал з файлу\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow  не слідувати за символьним посиланням\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks   помилка, якщо знайдено декілька посилань\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr "  binary    використовувати двійковий ввід/вивід для даних\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text      використовувати текстовий ввід/вивід для даних\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -305,11 +298,11 @@ msgstr ""
 "Ключі:\n"
 "\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Невідома системна помилка"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -318,20 +311,12 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> записів прочитано\n"
 "%<PRIuMAX>+%<PRIuMAX> записів записано\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> обрізаний запис\n"
-msgstr[1] "%<PRIuMAX> обрізані записи\n"
-msgstr[2] "%<PRIuMAX> обрізаних записів\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
@@ -339,7 +324,7 @@ msgstr[0] " скопійовано %<PRIuMAX> байт (%s)"
 msgstr[1] " скопійовано %<PRIuMAX> байти (%s)"
 msgstr[2] " скопійовано %<PRIuMAX> байтів (%s)"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "Нескінченість"
 
@@ -353,147 +338,155 @@ msgstr "Нескінченість"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g с, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g с, %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "закриття вхідного файлу %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "закриття файлу виводу %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Вичерпані суфікси для вихідних файлів"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "відкриття %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "ПОМИЛКА"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "запис у %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "операнд %s не розпізнаний"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "неправильна дата %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "неправильний формат дати %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "неправильний формат дати %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "неправильний формат дати %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "неприпустиме перетворення: %s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "неприпустима ознака входу: %s"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "неприпустимий ознака виводу: %s"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "неприпустимий ознака статусу: %s"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "неправильний номер %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "не можна одночасно використовувати будь-які два з {ascii,ebcdic,ibm}"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "не можна одночасно використовувати block та unblock"
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "не можна одночасно використовувати lcase та ucase"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "не можна одночасно використовувати excl та nocreat"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "не можна одночасно використовувати ключі -e та -i"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "не можна одночасно використовувати ключі -e та -i"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "не можна одночасно використовувати ключі -e та -i"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "не можна одночасно використовувати ключі -e та -i"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "не можна одночасно використовувати ключі -e та -i"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -502,89 +495,74 @@ msgstr ""
 "попередження: обходиться помилка lseek у ядрі для файлу (%s)\n"
 "  mt_type=0x%0lx -- см. <sys/mtio.h> для списку типів"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "читання %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: не вдається зсунути вказівник файлу"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "переповнення зсуву при читанні файлу %s"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "попередження: некоректний зсув файлу після помилки читання"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "не вдається обійти помилку ядра"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "попередження: некоректний зсув файлу після помилки читання"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "встановлення ознак для %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "читання каталогу %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "читання каталогу %s"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
-msgstr "помилка запису %s"
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "запис у %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "операція fdatasync для %s завершилась помилкою"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "операція fsync для %s завершилась помилкою"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "стандартний ввід"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "стандартний вивід"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -593,20 +571,61 @@ msgstr ""
 "зсув надто великий: не вдається обрізати до величини seek=%<PRIuMAX> (%lu-"
 "байтних) блоків"
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "не вдається виконати fstat для %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "відсікання на %<PRIuMAX> байт у файлі виводу %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     з EBCDIC на ASCII\n"
+#~ "  ebcdic    з ASCII на EBCDIC\n"
+#~ "  ibm       з ASCII на альтернативну EBCDIC\n"
+#~ "  block     заповнювати записи, що закінчуються переносом рядка, "
+#~ "пробілами\n"
+#~ "            до розміру cbs\n"
+#~ "  unblock   замінювати кінцеві пробіли у записах з розміром cbs переносом "
+#~ "рядка\n"
+#~ "  lcase     змінювати регістр з верхнього на нижній\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> обрізаний запис\n"
+#~ msgstr[1] "%<PRIuMAX> обрізані записи\n"
+#~ msgstr[2] "%<PRIuMAX> обрізаних записів\n"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr ""
+#~ "не можна одночасно використовувати будь-які два з {ascii,ebcdic,ibm}"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "не можна одночасно використовувати block та unblock"
+
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "не можна одночасно використовувати lcase та ucase"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "попередження: некоректний зсув файлу після помилки читання"
+
+#~ msgid "error writing %s"
+#~ msgstr "помилка запису %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "неправильний аргумент %s для %s"
 
@@ -6688,9 +6707,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "неможливо виконати %s -d"
 
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "неможливо створити процес для %s -d"
-
 #~ msgid "write failed"
 #~ msgstr "запис завершився помилкою"
 
diff --git a/po/vi.gmo b/po/vi.gmo
index cd81f54..29cd32b 100644
Binary files a/po/vi.gmo and b/po/vi.gmo differ
diff --git a/po/vi.po b/po/vi.po
index 28a01c2..758f845 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 6.11\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2008-04-23 17:47+0930\n"
 "Last-Translator: Clytie Siddall <clytie at riverland.net.au>\n"
 "Language-Team: Vietnamese <vi-VN at googlegroups.com>\n"
@@ -19,40 +19,52 @@ msgstr ""
 "X-Generator: LocFactoryEditor 1.7b3\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "không tạo được tiến trình cho %s -d"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Hãy thử lệnh trợ giúp « %s --help » để biết thêm thông tin.\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -61,16 +73,15 @@ msgstr ""
 "Sử dụng: %s [TOÁN_HẠNG]...\n"
 "  hoặc:  %s TÙY_CHỌN\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "Sao chép mọt tập tin, chuyển đổi và định dạng theo toán hạng.\n"
@@ -82,21 +93,24 @@ msgstr ""
 "  count=KHỐI      chỉ sao chép KHỐI khối đầu vào\n"
 "  ibs=BYTES       đọc BYTES byte cùng một lúc\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=TẬP_TIN      đọc từ TẬP_TIN thay cho đầu vào tiêu chuẩn\n"
 "  iflag=CỜ        đọc như danh sách các ký hiệu phân cách bởi dấu phẩy\n"
@@ -107,52 +121,50 @@ msgstr ""
 "  skip=KHỐI       bỏ qua KHỐI khối với kích thước ibs ở đầu đầu vào\n"
 "  status=noxfer   bỏ đi thông kê truyền tải\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -170,30 +182,12 @@ msgstr ""
 "Mỗi ký hiệu CONV có thể là:\n"
 "\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     từ EBCDIC tới ASCII\n"
-"  ebcdic    từ ASCII tới EBCDIC\n"
-"  ibm       từ ASCII tới EBCDIC xen kẽ\n"
-"  block     thêm mục ghi dừng dòng mới với khoảng trắng đến kích cỡ cbs\n"
-"  unblock   thay thế khoảng trắng theo sau trong mục ghi kích cỡ cbs bằng "
-"dòng mới\n"
-"  lcase     thay đổi chữ hoa thành chữ thường\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
+#, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   không tạo tập tin kết quả\n"
 "  excl      lỗi nếu tập tin kết quả đã có\n"
@@ -201,7 +195,7 @@ msgstr ""
 "  ucase     thay đổi chữ thường thành chữ hoa\n"
 "  swab      trao đổi mọi cặp byte đưa vào\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 msgid ""
 "  noerror   continue after read errors\n"
 "  sync      pad every input block with NULs to ibs-size; when used\n"
@@ -215,7 +209,7 @@ msgstr ""
 "  fdatasync ghi vật lý dữ liệu tập tin kết quả lên đĩa trước khi thoát\n"
 "  fsync     như trên, nhưng đồng thời ghi cả siêu dữ liệu\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -229,51 +223,51 @@ msgstr ""
 "  append    chế độ phụ thêm\n"
 "              (chỉ có ích cho kết quả ra; cũng đề nghị « conv=notrunc »)\n"
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr "  direct    sử dụng V/R thẳng cho dữ liệu\n"
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 msgid "  directory fail unless a directory\n"
 msgstr "  directory   lỗi nếu không phải thư mục\n"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr "  dsync     dùng V/R đã đồng bộ cho dữ liệu\n"
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr "  sync      như trên, nhưng đồng thời cho cả siêu dữ liệu\n"
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr "  nonblock  sử dụng V/R không đặt khối\n"
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr "  noatime   không cập nhật giờ truy cập\n"
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr "  noctty    không ấn định thiết bị cuối điều khiển từ tập tin\n"
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr "  nofollow  không đi theo liên kết mềm\n"
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr "  nolinks   lỗi nếu có nhiều liên kết\n"
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr "  binary    sử dụng V/R nhị phân cho dữ liệu\n"
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr "  text      sử dụng V/R văn bản cho dữ liệu\n"
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -302,11 +296,11 @@ msgstr ""
 "Tùy chọn:\n"
 "\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "Lỗi hệ thống không rõ"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, fuzzy, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
@@ -315,24 +309,18 @@ msgstr ""
 "%<PRIuMAX>+%<PRIuMAX> mục ghi vào\n"
 "%<PRIuMAX>+%<PRIuMAX> mục ghi ra\n"
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> mục ghi bị cắt ngắn\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] "%<PRIuMAX> byte (%s) đã sao chép"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "B vô cùng"
 
@@ -346,143 +334,151 @@ msgstr "B vô cùng"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ", %g s, %s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "đang đóng tập tin vào %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "đang đóng tập tin ra %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "Hết đuôi (hậu tố) để dùng cho tập tin kết quả"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "đang mở %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "BỊ LỖI"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "đang ghi tới %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "toán hạng không nhận ra %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "ngày sai %s'"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "sai định dạng ngày tháng %s"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "sai định dạng ngày tháng %s"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "sai định dạng ngày tháng %s"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 msgid "invalid conversion"
 msgstr "sai chuyển đổi"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 msgid "invalid input flag"
 msgstr "cờ đầu vào không hợp lệ"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 msgid "invalid output flag"
 msgstr "cờ đầu ra không hợp lệ"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 msgid "invalid status flag"
 msgstr "cờ trạng thái không hợp lệ"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "số không hợp lệ %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "không thể kết hợp hai trong số {ascii,ebcdic,ibm}"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "không thể kết hợp block và unblock"
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "không thể kết hợp lcase (chữ thường) và ucase (chữ hoa)"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "không thể kết hợp excl và nocreat"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "không thể kết hợp hai tùy chọn « -e » và « -i »"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "không thể kết hợp hai tùy chọn « -e » và « -i »"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "không thể kết hợp hai tùy chọn « -e » và « -i »"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "không thể kết hợp hai tùy chọn « -e » và « -i »"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "không thể kết hợp hai tùy chọn « -e » và « -i »"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -491,89 +487,74 @@ msgstr ""
 "cảnh báo : đang gỡ rối lỗi nhân lseek cho tập tin (%s)\n"
 "  có mt_type=0x%0lx -- xem <sys/mtio.h> để biết danh sách các dạng"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "đang đọc %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s: không thể tìm nơi"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr "vùng hiệu bị tràn khi đọc tập tin %s"
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "cảnh báo : vùng hiệu tập tin không hợp lệ sau lỗi đọc"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "vậy không làm việc được với lỗi của nhân"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "cảnh báo : vùng hiệu tập tin không hợp lệ sau lỗi đọc"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr "đang thiết lập cờ cho %s"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "đang đọc thư mục %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "đang đọc thư mục %s"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
-msgstr "lỗi ghi %s"
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "đang ghi tới %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "fdatasync bị lỗi cho %s"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "fsync bị lỗi cho %s"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "đầu vào tiêu chuẩn"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "đầu ra tiêu chuẩn"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, fuzzy, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
@@ -582,20 +563,56 @@ msgstr ""
 "vùng hiệu quá lớn: không thể cắt ngắn thành chiều dài seek=%<PRIuMAX> (%lu-"
 "byte) khối"
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "không fstat được %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "đang cắt ngắn ở %<PRIuMAX> byte trong tập tin kết quả %s"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     từ EBCDIC tới ASCII\n"
+#~ "  ebcdic    từ ASCII tới EBCDIC\n"
+#~ "  ibm       từ ASCII tới EBCDIC xen kẽ\n"
+#~ "  block     thêm mục ghi dừng dòng mới với khoảng trắng đến kích cỡ cbs\n"
+#~ "  unblock   thay thế khoảng trắng theo sau trong mục ghi kích cỡ cbs bằng "
+#~ "dòng mới\n"
+#~ "  lcase     thay đổi chữ hoa thành chữ thường\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> mục ghi bị cắt ngắn\n"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "không thể kết hợp hai trong số {ascii,ebcdic,ibm}"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "không thể kết hợp block và unblock"
+
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "không thể kết hợp lcase (chữ thường) và ucase (chữ hoa)"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "cảnh báo : vùng hiệu tập tin không hợp lệ sau lỗi đọc"
+
+#~ msgid "error writing %s"
+#~ msgstr "lỗi ghi %s"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "đối số sai %s cho %s"
 
@@ -6769,9 +6786,6 @@ msgstr ""
 #~ msgid "couldn't execute %s -d"
 #~ msgstr "không thể thực hiện %s -d"
 
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "không tạo được tiến trình cho %s -d"
-
 #~ msgid "write failed"
 #~ msgstr "lỗi ghi"
 
diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo
index 66f133c..614a083 100644
Binary files a/po/zh_CN.gmo and b/po/zh_CN.gmo differ
diff --git a/po/zh_CN.po b/po/zh_CN.po
index b498d83..a232901 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 6.1\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2006-08-24 23:38+0800\n"
 "Last-Translator: Funda Wang <fundawang at linux.net.cn>\n"
 "Language-Team: Chinese (simplified) <i18n-translation at lists.linux.net.cn>\n"
@@ -19,40 +19,52 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 msgid "David MacKenzie"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "无法创建目录 %s"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "请尝试执行“%s --help”来获取更多信息。\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -61,16 +73,15 @@ msgstr ""
 "用法:%s [操作符]...\n"
 "  或:%s 选项\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "复制文件,并根据以下的选项将数据转换和格式化。\n"
@@ -81,21 +92,24 @@ msgstr ""
 "  count=块数目    只复制指定<块数目>的输入数据\n"
 "  ibs=字节        每次读取指定的<字节>\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=文件         读取<文件>内容而非标准输入的数据\n"
 "  iflag=标志      按照逗号分隔的符号列表读取\n"
@@ -106,52 +120,50 @@ msgstr ""
 "  skip=块数目     先略过以 ibs 为单位的指定<块数目>的输入数据\n"
 "  status=noxfer   禁止传送统计\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 #, fuzzy
 msgid ""
 "\n"
@@ -168,33 +180,12 @@ msgstr ""
 "GB=1000000000,G=1073741824,还有 T、P、E、Z、Y 如此类推。\n"
 "每个<关键字>可以是:\n"
 
-#: src/dc3dd.c:1129
-#, fuzzy
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     由 EBCDIC 转换至 ASCII\n"
-"  ebcdic    由 ASCII 转换至 EBCDIC\n"
-"  ibm       由 ASCII 转换至 alternated EBCDIC\n"
-"  block     将以 newline 作为结束字符的块的 newline 换成空格,直至空格\n"
-"              填满 cbs 表示的大小\n"
-"  unblock   会将 cbs 大小的块中所有结束的空格删除,并转换为一个 newline 字"
-"符\n"
-"  lcase     将大写字符转换为小写\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 #, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  notrunc   不截断输出文件\n"
 "  ucase     将小写字符转换为大写\n"
@@ -203,7 +194,7 @@ msgstr ""
 "  sync      将每个输入数据块以 NUL 字符填满至 ibs 的大小;当配合 block\n"
 "              或 unblock 时,会以空格代替 NUL 字符填充\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 #, fuzzy
 msgid ""
 "  noerror   continue after read errors\n"
@@ -219,7 +210,7 @@ msgstr ""
 "  sync      将每个输入数据块以 NUL 字符填满至 ibs 的大小;当配合 block\n"
 "              或 unblock 时,会以空格代替 NUL 字符填充\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -228,52 +219,52 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "安装目录时不能用 strip 选项"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, c-format
 msgid ""
 "\n"
@@ -290,35 +281,29 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "未知的系统错误"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "%<PRIuMAX> 个被截断了的块\n"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] ""
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 msgid "Infinity B"
 msgstr "无穷 B"
 
@@ -332,148 +317,154 @@ msgstr "无穷 B"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ",%g 秒,%s/秒\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, c-format
 msgid ", %g s, %s/s\n"
 msgstr ",%g 秒,%s/秒\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "正在关闭输入文件 %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "正在关闭输出文件 %s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 msgid "Split extensions exhausted"
 msgstr ""
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "打开 %s"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 msgid "Verify FAILED"
 msgstr ""
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "正在写入 %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "无法识别的操作数 %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "无效的日期 %s"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "日期格式 %s 无效"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
+#, c-format
+msgid "Illegal ifjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "日期格式 %s 无效"
+
+#: src/dc3dd.c:2793
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal vfjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "日期格式 %s 无效"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "转换无效:%s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "无效的输入标志:%s"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "无效的输出标志:%s"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "日期格式 %s 无效"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "无效的号码 %s"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr ""
-
-#: src/dc3dd.c:2682
-#, fuzzy
-msgid "cannot combine block and unblock"
-msgstr "不可同时省略用户和所属组"
-
-#: src/dc3dd.c:2684
-#, fuzzy
-msgid "cannot combine lcase and ucase"
-msgstr "无法比较文件名 %s 和 %s"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 #, fuzzy
 msgid "cannot combine excl and nocreat"
 msgstr "无法决定 %s 所在的设备及 inode"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "无法决定 %s 所在的设备及 inode"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "无法决定 %s 所在的设备及 inode"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "无法决定 %s 所在的设备及 inode"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "无法决定 %s 所在的设备及 inode"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "无法决定 %s 所在的设备及 inode"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -482,109 +473,131 @@ msgstr ""
 "警告:暂时避免有关文件 (%s) 的 lseek 核心错误,文件的 mt_type=0x%0lx --\n"
 "      有关 mt_type 类型的列表请参考 <sys/mtio.h>"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "读入 %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s:无法搜索"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "警告:指定来源文件%s多于一次"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr ""
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "警告:指定来源文件%s多于一次"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, fuzzy, c-format
 msgid "setting flags for %s"
 msgstr "设置 %s 的时间"
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "读取目录 %s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "读取目录 %s"
 
-#: src/dc3dd.c:3789
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "error writing %s"
-msgstr "写入 %s 出错"
-
-#: src/dc3dd.c:3915
-#, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "正在写入 %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr ""
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, fuzzy, c-format
 msgid "fsync failed for %s"
 msgstr "无法保留%s的时间"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "标准输入"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "标准输出"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "无法 fstat %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, fuzzy, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "略过输出文件 %2$s 的最初 %1$s 个字节"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#, fuzzy
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     由 EBCDIC 转换至 ASCII\n"
+#~ "  ebcdic    由 ASCII 转换至 EBCDIC\n"
+#~ "  ibm       由 ASCII 转换至 alternated EBCDIC\n"
+#~ "  block     将以 newline 作为结束字符的块的 newline 换成空格,直至空格\n"
+#~ "              填满 cbs 表示的大小\n"
+#~ "  unblock   会将 cbs 大小的块中所有结束的空格删除,并转换为一个 newline 字"
+#~ "符\n"
+#~ "  lcase     将大写字符转换为小写\n"
+
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "%<PRIuMAX> 个被截断了的块\n"
+
+#, fuzzy
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "不可同时省略用户和所属组"
+
+#, fuzzy
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "无法比较文件名 %s 和 %s"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "警告:指定来源文件%s多于一次"
+
+#~ msgid "error writing %s"
+#~ msgstr "写入 %s 出错"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "%2$s 的参数 %1$s 无效"
 
@@ -3799,10 +3812,6 @@ msgstr ""
 #~ msgid "couldn't open temporary file"
 #~ msgstr "无法创建临时文件"
 
-#, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "无法创建目录 %s"
-
 #~ msgid "write failed"
 #~ msgstr "写入失败"
 
diff --git a/po/zh_TW.gmo b/po/zh_TW.gmo
index 89657c3..e73e469 100644
Binary files a/po/zh_TW.gmo and b/po/zh_TW.gmo differ
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 88a8558..40f5bf5 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -13,7 +13,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: coreutils 5.3.0\n"
 "Report-Msgid-Bugs-To: bug-coreutils at gnu.org\n"
-"POT-Creation-Date: 2008-09-04 16:52-0400\n"
+"POT-Creation-Date: 2009-04-07 16:11-0400\n"
 "PO-Revision-Date: 2005-07-02 04:13+0800\n"
 "Last-Translator: Abel Cheung <abelcheung at gmail.com>\n"
 "Language-Team: Chinese (traditional) <zh-l10n at linux.org.tw>\n"
@@ -23,41 +23,53 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:51
+#: src/dc3dd.c:59
 msgid "Paul Rubin"
 msgstr ""
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:52
+#: src/dc3dd.c:60
 #, fuzzy
 msgid "David MacKenzie"
 msgstr "Stuart Kemp 及 David MacKenzie"
 
 #. This is a proper name. See the gettext manual, section Names.
-#: src/dc3dd.c:53
+#: src/dc3dd.c:61
 msgid "Stuart Kemp"
 msgstr ""
 
-#: src/dc3dd.c:518
+#: src/dc3dd.c:523
+#, fuzzy
+msgid "Could not allocate space for thread"
+msgstr "無法建立目錄%s"
+
+#: src/dc3dd.c:538 src/dc3dd.c:546
+msgid "Unable to allocate space for thread buffer"
+msgstr ""
+
+#: src/dc3dd.c:556
+msgid "Unable to allocate space for lock/signals"
+msgstr ""
+
+#: src/dc3dd.c:714
 #, c-format
 msgid "Unknown hash algorithm %s"
 msgstr ""
 
-#: src/dc3dd.c:536
+#: src/dc3dd.c:730
 msgid "Unable to allocate space for hashes"
 msgstr ""
 
-#: src/dc3dd.c:680
-#, c-format
-msgid "Unable to allocate hashing buffer"
+#: src/dc3dd.c:771 src/dc3dd.c:777 src/dc3dd.c:781
+msgid "Unable to allocate space for threads"
 msgstr ""
 
-#: src/dc3dd.c:1048
+#: src/dc3dd.c:1090
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "請嘗試執行‘%s --help’來獲取更多資訊。\n"
 
-#: src/dc3dd.c:1052
+#: src/dc3dd.c:1094
 #, fuzzy, c-format
 msgid ""
 "Usage: %s [OPERAND]...\n"
@@ -66,16 +78,15 @@ msgstr ""
 "用法:%s [檔案]...\n"
 "  或:%s [選項]\n"
 
-#: src/dc3dd.c:1057
+#: src/dc3dd.c:1099
 #, fuzzy
 msgid ""
 "Copy a file, converting and formatting according to the operands.\n"
 "\n"
-"  bs=BYTES        force ibs=BYTES and obs=BYTES\n"
-"  cbs=BYTES       convert BYTES bytes at a time\n"
-"  conv=CONVS      convert the file as per the comma separated symbol list\n"
-"  count=SECTORS   copy only SECTORS input sectors\n"
-"  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input "
+"  bs=BYTES          force ibs=BYTES and obs=BYTES\n"
+"  conv=CONVS        convert the file as per the comma separated symbol list\n"
+"  count=SECTORS     copy only SECTORS input sectors\n"
+"  ibs=BYTES         read BYTES bytes at a time (must be a multiple of input "
 "sector size)\n"
 msgstr ""
 "複製檔案,並根據以下的選項將資料轉換和格式化。\n"
@@ -86,21 +97,24 @@ msgstr ""
 "  count=區段數目  只複製指定 <區段數目> 的輸入資料\n"
 "  ibs=位元組      每次讀取指定的 <位元組>\n"
 
-#: src/dc3dd.c:1066
+#: src/dc3dd.c:1107
 #, fuzzy
 msgid ""
-"  if=FILE         read from FILE instead of stdin\n"
-"  ifjoin=BASE.FMT read from split files with name BASE and splitformat FMT\n"
-"  iflag=FLAGS     read as per the comma separated symbol list\n"
-"  pattern=HEX     write HEX to every byte of the output\n"
-"  textpattern=TEXT   write the string TEXT repeatedly to the output\n"
-"  obs=BYTES       write BYTES bytes at a time\n"
-"  of=FILE         write to FILE instead of stdout\n"
-"  of:=COMMAND     pipe output to the given command\n"
-"  oflag=FLAGS     write as per the comma separated symbol list\n"
-"  seek=SECTORS    skip SECTORS input sectors at start of output\n"
-"  skip=SECTORS    skip SECTORS input sectors at start of input\n"
-"  status=noxfer   suppress transfer statistics\n"
+"  if=FILE           read from FILE instead of stdin\n"
+"  ifjoin=BASE.FMT   read from split files with name BASE and splitformat "
+"FMT\n"
+"  iflag=FLAGS       read as per the comma separated symbol list\n"
+"  pattern=HEX       write HEX to every byte of the output\n"
+"  textpattern=TEXT  write the string TEXT repeatedly to the output\n"
+"  obs=BYTES         write BYTES bytes at a time\n"
+"  of=FILE           write to FILE instead of stdout\n"
+"  of:=COMMAND       pipe output to the given command\n"
+"  oflag=FLAGS       write as per the comma separated symbol list\n"
+"  wipe=FILE         wipe device FILE with zeros (or specify pattern/"
+"textpattern)\n"
+"  seek=SECTORS      skip SECTORS input sectors at start of output\n"
+"  skip=SECTORS      skip SECTORS input sectors at start of input\n"
+"  status=noxfer     suppress transfer statistics\n"
 msgstr ""
 "  if=檔案         讀取 <檔案> 內容而非標準輸入的資料\n"
 "  obs=位元組      每次寫入指定的 <位元組>\n"
@@ -109,52 +123,50 @@ msgstr ""
 "  skip=區段數目   先略過以 ibs 為單位的指定 <區段數目> 的輸入資料\n"
 "  status=noxfer   不顯示輸入/輸出結果\n"
 
-#: src/dc3dd.c:1080
+#: src/dc3dd.c:1122
 msgid ""
-"  split=BYTES     split the output into pieces of size BYTES\n"
+"  split=BYTES       split the output into pieces of size BYTES\n"
 "  splitformat=FMT   create extensions for split pieces using FMT\n"
-"                  Extensions can be numerical starting at zero,\n"
-"                  numerical starting at one, or alphabetical.\n"
-"                  These options are selected by using a series of\n"
-"                  zeros, ones, or a's, respectively. The number\n"
-"                  of characters used indicates the desired length of\n"
-"                  the extensions. For example, splitformat=1111\n"
-"                  indicates four character numerical extensions\n"
-"                  starting with 0001.\n"
-"  progress=on     displays a progress meter\n"
+"                    Extensions can be numerical starting at zero,\n"
+"                    numerical starting at one, or alphabetical.\n"
+"                    These options are selected by using a series of\n"
+"                    zeros, ones, or a's, respectively. The number\n"
+"                    of characters used indicates the desired length of\n"
+"                    the extensions. For example, splitformat=1111\n"
+"                    indicates four character numerical extensions\n"
+"                    starting with 0001.\n"
+"  progress=on       displays a progress meter\n"
 "  progresscount=NUM  number of blocks processed between each progress "
 "update\n"
-"  sizeprobe=on    estimates size of input file for use with status\n"
-"  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n"
-"  hashconv=WHEN   determines when data should be hashed, either before\n"
-"                  or after conversions\n"
+"  sizeprobe=on      estimates size of input file for use with status\n"
+"  hash=ALGORITHM    computes ALGORITHM hashes of the input data\n"
 msgstr ""
 
-#: src/dc3dd.c:1102
+#: src/dc3dd.c:1142
 msgid ""
 "  hashwindow=BYTES  number of bytes for piecewise hashing\n"
-"  hashlog=FILE    appends piecewise hashes to the log file\n"
-"  errlog=FILE     appends errors to the log file\n"
-"  log=FILE        appends hashes and errors to the same file\n"
-"  errors=group    group read errors together\n"
+"  hashlog=FILE      appends piecewise hashes to the log file\n"
+"  errlog=FILE       appends errors to the log file\n"
+"  log=FILE          appends hashes and errors to the same file\n"
+"  errors=group      group read errors together\n"
 msgstr ""
 
-#: src/dc3dd.c:1109
+#: src/dc3dd.c:1149
 msgid ""
-"  vf=FILE         verify the input against FILE\n"
-"  vfjoin=BASE.FMT verify the input against split files with name BASE and "
+"  vf=FILE           verify the input against FILE\n"
+"  vfjoin=BASE.FMT   verify the input against split files with name BASE and "
 "splitformat FMT\n"
-"  verifylog=FILE  write the results of the verify to the given file\n"
+"  verifylog=FILE    write the results of the verify to the given file\n"
 msgstr ""
 
-#: src/dc3dd.c:1115
+#: src/dc3dd.c:1155
 msgid ""
 "\n"
 "ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n"
 "\n"
 msgstr ""
 
-#: src/dc3dd.c:1120
+#: src/dc3dd.c:1160
 msgid ""
 "\n"
 "BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n"
@@ -170,32 +182,12 @@ msgstr ""
 "GB=1000*1000*1000,G=1024*1024*1024,還有 T/P/E/Z/Y 如此類推。\n"
 "每個 <關鍵字> 可以是:\n"
 
-#: src/dc3dd.c:1129
-msgid ""
-"  ascii     from EBCDIC to ASCII\n"
-"  ebcdic    from ASCII to EBCDIC\n"
-"  ibm       from ASCII to alternate EBCDIC\n"
-"  block     pad newline-terminated records with spaces to cbs-size\n"
-"  unblock   replace trailing spaces in cbs-size records with newline\n"
-"  lcase     change upper case to lower case\n"
-msgstr ""
-"  ascii     由 EBCDIC 轉換至 ASCII\n"
-"  ebcdic    由 ASCII 轉換至 EBCDIC\n"
-"  ibm       由 ASCII 轉換至 alternate EBCDIC\n"
-"  block     將以 newline 作為結束字元的區段的 newline 換成空格,\n"
-"            直至空格填滿 cbs 表示的大小\n"
-"  unblock   會將 cbs 大小的區段中所有結束的空格刪除,\n"
-"            並轉換為一個 newline 字元\n"
-"  lcase     將大寫字元轉換為小寫\n"
-
-#: src/dc3dd.c:1137
+#: src/dc3dd.c:1169
 #, fuzzy
 msgid ""
 "  nocreat   do not create the output file\n"
 "  excl      fail if the output file already exists\n"
 "  notrunc   do not truncate the output file\n"
-"  ucase     change lower case to upper case\n"
-"  swab      swap every pair of input bytes\n"
 msgstr ""
 "  nocreat   輸出檔不存在的話不會寫出結果\n"
 "  excl      如果輸出檔已經存在則作為失敗處理\n"
@@ -208,7 +200,7 @@ msgstr ""
 "  fdatasync 真正將資料寫入磁碟後才結束程式\n"
 "  fsync     類似 fdatasync,並寫入元資料\n"
 
-#: src/dc3dd.c:1144
+#: src/dc3dd.c:1174
 #, fuzzy
 msgid ""
 "  noerror   continue after read errors\n"
@@ -228,7 +220,7 @@ msgstr ""
 "  fdatasync 真正將資料寫入磁碟後才結束程式\n"
 "  fsync     類似 fdatasync,並寫入元資料\n"
 
-#: src/dc3dd.c:1151
+#: src/dc3dd.c:1181
 msgid ""
 "\n"
 "Each FLAG symbol may be:\n"
@@ -237,52 +229,52 @@ msgid ""
 "suggested)\n"
 msgstr ""
 
-#: src/dc3dd.c:1158
+#: src/dc3dd.c:1188
 msgid "  direct    use direct I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1160
+#: src/dc3dd.c:1190
 #, fuzzy
 msgid "  directory fail unless a directory\n"
 msgstr "建立目錄時不能指定目的地目錄"
 
-#: src/dc3dd.c:1162
+#: src/dc3dd.c:1192
 msgid "  dsync     use synchronized I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1164
+#: src/dc3dd.c:1194
 msgid "  sync      likewise, but also for metadata\n"
 msgstr ""
 
-#: src/dc3dd.c:1166
+#: src/dc3dd.c:1196
 msgid "  nonblock  use non-blocking I/O\n"
 msgstr ""
 
-#: src/dc3dd.c:1168
+#: src/dc3dd.c:1198
 msgid "  noatime   do not update access time\n"
 msgstr ""
 
-#: src/dc3dd.c:1170
+#: src/dc3dd.c:1200
 msgid "  noctty    do not assign controlling terminal from file\n"
 msgstr ""
 
-#: src/dc3dd.c:1173
+#: src/dc3dd.c:1203
 msgid "  nofollow  do not follow symlinks\n"
 msgstr ""
 
-#: src/dc3dd.c:1175
+#: src/dc3dd.c:1205
 msgid "  nolinks   fail if multiply-linked\n"
 msgstr ""
 
-#: src/dc3dd.c:1177
+#: src/dc3dd.c:1207
 msgid "  binary    use binary I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1179
+#: src/dc3dd.c:1209
 msgid "  text      use text I/O for data\n"
 msgstr ""
 
-#: src/dc3dd.c:1183
+#: src/dc3dd.c:1213
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -311,35 +303,29 @@ msgstr ""
 "選項包括:\n"
 "\n"
 
-#: src/dc3dd.c:1236
+#: src/dc3dd.c:1266
 msgid "Unknown system error"
 msgstr "不明的系統錯誤"
 
-#: src/dc3dd.c:1733 src/dc3dd.c:1740
+#: src/dc3dd.c:1953 src/dc3dd.c:1960
 #, c-format
 msgid ""
 "%<PRIuMAX>+%<PRIuMAX> sectors in\n"
 "%<PRIuMAX>+%<PRIuMAX> sectors out\n"
 msgstr ""
 
-#: src/dc3dd.c:1748 src/dc3dd.c:1754
-#, fuzzy, c-format
-msgid "%<PRIuMAX> truncated record\n"
-msgid_plural "%<PRIuMAX> truncated records\n"
-msgstr[0] "個被截斷了的區段"
-
-#: src/dc3dd.c:1766
+#: src/dc3dd.c:1971
 #, c-format
 msgid "\n"
 msgstr ""
 
-#: src/dc3dd.c:1788 src/dc3dd.c:1796
+#: src/dc3dd.c:1999 src/dc3dd.c:2007
 #, fuzzy, c-format
 msgid "%<PRIuMAX> byte (%s) %s"
 msgid_plural "%<PRIuMAX> bytes (%s) %s"
 msgstr[0] "複製了 %s 位元組 (%s)"
 
-#: src/dc3dd.c:1830
+#: src/dc3dd.c:2041
 #, fuzzy
 msgid "Infinity B"
 msgstr "無限"
@@ -354,147 +340,155 @@ msgstr "無限"
 #. but that was incorrect for languages like Polish.  To fix this
 #. bug we now use SI symbols even though they're a bit more
 #. confusing in English.
-#: src/dc3dd.c:1843
+#: src/dc3dd.c:2054
 #, fuzzy, c-format
 msgid ", %g s, %s/s        "
 msgstr ",%g 秒,%s/s\n"
 
-#: src/dc3dd.c:1846
+#: src/dc3dd.c:2057
 #, fuzzy, c-format
 msgid ", %g s, %s/s\n"
 msgstr ",%g 秒,%s/s\n"
 
-#: src/dc3dd.c:1903
+#: src/dc3dd.c:2139
 #, c-format
 msgid "closing input file %s"
 msgstr "正在關閉輸入檔 %s"
 
-#: src/dc3dd.c:1910
+#: src/dc3dd.c:2146
 #, c-format
 msgid "closing output file %s"
 msgstr "正在關閉輸出檔%s"
 
-#: src/dc3dd.c:2145
+#: src/dc3dd.c:2399
 msgid "Unable to allocate filename"
 msgstr ""
 
-#: src/dc3dd.c:2175
+#: src/dc3dd.c:2428
 #, fuzzy
 msgid "Split extensions exhausted"
 msgstr "輸出檔的後置字串已用盡"
 
-#: src/dc3dd.c:2196 src/dc3dd.c:2437 src/dc3dd.c:2444 src/dc3dd.c:2452
-#: src/dc3dd.c:2553 src/dc3dd.c:4025 src/dc3dd.c:4067 src/dc3dd.c:4082
-#: src/dc3dd.c:4093
+#: src/dc3dd.c:2449 src/dc3dd.c:2698 src/dc3dd.c:2705 src/dc3dd.c:2713
+#: src/dc3dd.c:2809 src/dc3dd.c:3919 src/dc3dd.c:3970 src/dc3dd.c:3985
+#: src/dc3dd.c:3996
 #, c-format
 msgid "opening %s"
 msgstr "開啟 %s 中"
 
-#: src/dc3dd.c:2209
+#: src/dc3dd.c:2462
 msgid "Unable to allocate memory"
 msgstr ""
 
-#: src/dc3dd.c:2224 src/dc3dd.c:2230
+#: src/dc3dd.c:2478 src/dc3dd.c:2484
 #, fuzzy
 msgid "Verify FAILED"
 msgstr "錯誤"
 
-#: src/dc3dd.c:2284 src/dc3dd.c:3369
-#, c-format
-msgid "writing to %s"
-msgstr "正在寫入 %s"
-
-#: src/dc3dd.c:2411 src/dc3dd.c:2648
+#: src/dc3dd.c:2672 src/dc3dd.c:2908
 #, c-format
 msgid "unrecognized operand %s"
 msgstr "無法識別參數 %s"
 
-#: src/dc3dd.c:2421 src/dc3dd.c:2428 src/dc3dd.c:2573
+#: src/dc3dd.c:2682 src/dc3dd.c:2689 src/dc3dd.c:2829 src/dc3dd.c:2962
 #, fuzzy, c-format
 msgid "illegal pattern %s"
 msgstr "日期無效:‘%s’"
 
-#: src/dc3dd.c:2479
-#, c-format
-msgid "unknown hash convention %s"
-msgstr ""
-
-#: src/dc3dd.c:2500
+#: src/dc3dd.c:2748
 msgid "It is pitch dark here. You are likely to be eaten by a grue."
 msgstr ""
 
-#: src/dc3dd.c:2505
+#: src/dc3dd.c:2753
 #, fuzzy, c-format
 msgid "Illegal split format %s"
 msgstr "%2$s的參數%1$s無效"
 
-#: src/dc3dd.c:2521 src/dc3dd.c:2542
+#: src/dc3dd.c:2768
 #, c-format
-msgid "Illegal join format %s"
+msgid "Illegal ifjoin format %s - missing extension"
 msgstr ""
 
-#: src/dc3dd.c:2557
+#: src/dc3dd.c:2773
+#, fuzzy, c-format
+msgid "Illegal ifjoin format %s"
+msgstr "%2$s的參數%1$s無效"
+
+#: src/dc3dd.c:2793
+#, c-format
+msgid "Illegal vfjoin format %s - missing extension"
+msgstr ""
+
+#: src/dc3dd.c:2798
+#, fuzzy, c-format
+msgid "Illegal vfjoin format %s"
+msgstr "%2$s的參數%1$s無效"
+
+#: src/dc3dd.c:2813
 #, c-format
 msgid "%s not implemented yet"
 msgstr ""
 
-#: src/dc3dd.c:2582
+#: src/dc3dd.c:2847
 #, fuzzy
 msgid "invalid conversion"
 msgstr "轉換用的關鍵字無效:%s"
 
-#: src/dc3dd.c:2585
+#: src/dc3dd.c:2850
 #, fuzzy
 msgid "invalid input flag"
 msgstr "輸入旗標無效:%s"
 
-#: src/dc3dd.c:2588
+#: src/dc3dd.c:2853
 #, fuzzy
 msgid "invalid output flag"
 msgstr "輸出旗標無效:%s"
 
-#: src/dc3dd.c:2591
+#: src/dc3dd.c:2856
 #, fuzzy
 msgid "invalid status flag"
 msgstr "狀態旗標無效:%s"
 
-#: src/dc3dd.c:2653
+#: src/dc3dd.c:2913
 #, c-format
 msgid "invalid number %s"
 msgstr "數字 %s 無效"
 
-#: src/dc3dd.c:2680
-msgid "cannot combine any two of {ascii,ebcdic,ibm}"
-msgstr "不可同時使用 ascii, ebcdic, ibm 中的任何二個"
-
-#: src/dc3dd.c:2682
-msgid "cannot combine block and unblock"
-msgstr "不可同時使用 block 和 unblock"
-
-#: src/dc3dd.c:2684
-msgid "cannot combine lcase and ucase"
-msgstr "不可同時使用 lcase 和 ucase"
-
-#: src/dc3dd.c:2686
+#: src/dc3dd.c:2938
 msgid "cannot combine excl and nocreat"
 msgstr "不可同時使用 excl 和 nocreat"
 
-#: src/dc3dd.c:2690
+#: src/dc3dd.c:2941
 #, fuzzy
 msgid "cannot combine if= and ifjoin="
 msgstr "如果自行指定權限,不可同時配合 --reference 選項一起使用"
 
-#: src/dc3dd.c:2693
+#: src/dc3dd.c:2944
 #, fuzzy
 msgid "cannot combine vf= and vfjoin="
 msgstr "如果自行指定權限,不可同時配合 --reference 選項一起使用"
 
-#: src/dc3dd.c:2708
+#: src/dc3dd.c:2947
 #, c-format
 msgid "error: split size must be a multiple of block size (currently %zd)"
 msgstr ""
 
-#: src/dc3dd.c:2970
+#: src/dc3dd.c:2950
+#, fuzzy
+msgid "cannot combine if= and wipe="
+msgstr "如果自行指定權限,不可同時配合 --reference 選項一起使用"
+
+#: src/dc3dd.c:2953
+#, fuzzy
+msgid "cannot combine wipe= and ifjoin="
+msgstr "如果自行指定權限,不可同時配合 --reference 選項一起使用"
+
+#: src/dc3dd.c:2955
+#, fuzzy
+msgid "cannot combine wipe= and vfjoin="
+msgstr "如果自行指定權限,不可同時配合 --reference 選項一起使用"
+
+#: src/dc3dd.c:3116
 #, c-format
 msgid ""
 "warning: working around lseek kernel bug for file (%s)\n"
@@ -503,109 +497,132 @@ msgstr ""
 "警告:暫時避免有關檔案 (%s) 的 lseek 核心錯誤,檔案的 mt_type=0x%0lx ─\n"
 "      有關 mt_type 類型的清單請參考 <sys/mtio.h>"
 
-#: src/dc3dd.c:3019
+#: src/dc3dd.c:3165
 #, fuzzy, c-format
 msgid "skip: reading %s"
 msgstr "讀取 %s"
 
-#: src/dc3dd.c:3027 src/dc3dd.c:3086 src/dc3dd.c:3133
+#: src/dc3dd.c:3173 src/dc3dd.c:3237
 #, c-format
 msgid "%s: cannot seek"
 msgstr "%s:無法搜尋"
 
-#: src/dc3dd.c:3064 src/dc3dd.c:3109
+#: src/dc3dd.c:3210
 #, c-format
 msgid "offset overflow while reading file %s"
 msgstr ""
 
-#: src/dc3dd.c:3077
+#: src/dc3dd.c:3228
 #, fuzzy
 msgid "advance: warning: invalid file offset after failed read"
 msgstr "警告:寬度 %lu 是無效的;以 %d 代替"
 
-#: src/dc3dd.c:3082 src/dc3dd.c:3129
+#: src/dc3dd.c:3233
 msgid "cannot work around kernel bug after all"
 msgstr "無法避開系統核心的錯誤"
 
-#: src/dc3dd.c:3123
-#, fuzzy
-msgid "rewind: warning: invalid file offset after failed read"
-msgstr "警告:寬度 %lu 是無效的;以 %d 代替"
-
-#: src/dc3dd.c:3272
+#: src/dc3dd.c:3291
 #, c-format
 msgid "setting flags for %s"
 msgstr ""
 
-#: src/dc3dd.c:3284
+#: src/dc3dd.c:3303
 #, c-format
 msgid "Recorded %<PRIuMAX> %s from sector %<PRIuMAX> through %<PRIuMAX>"
 msgstr ""
 
-#: src/dc3dd.c:3507
-#, c-format
-msgid "reading %s at block %jd (sectors %jd-%jd)"
-msgstr ""
-
-#: src/dc3dd.c:3572 src/dc3dd.c:3694
+#: src/dc3dd.c:3337 src/dc3dd.c:3814
 #, fuzzy, c-format
 msgid "reading %s at sector %jd"
 msgstr "無法建立目錄%s"
 
-#: src/dc3dd.c:3574
+#: src/dc3dd.c:3339
 #, fuzzy, c-format
 msgid "reading %s at sectors %jd-%jd"
 msgstr "無法建立目錄%s"
 
-#: src/dc3dd.c:3789
-#, c-format
-msgid "error writing %s"
-msgstr "寫入 %s 時發生錯誤"
-
-#: src/dc3dd.c:3915
+#: src/dc3dd.c:3428 src/dc3dd.c:4155
 #, c-format
-msgid "dd_copy() cleanup: nwritten mismatch writing %s"
-msgstr ""
+msgid "writing to %s"
+msgstr "正在寫入 %s"
 
-#: src/dc3dd.c:3935
+#: src/dc3dd.c:3490
 #, c-format
 msgid "fdatasync failed for %s"
 msgstr "%s 的 fdatasync 失敗"
 
-#: src/dc3dd.c:3945
+#: src/dc3dd.c:3500
 #, c-format
 msgid "fsync failed for %s"
 msgstr "%s 的 fsync 失敗"
 
-#: src/dc3dd.c:4013
+#: src/dc3dd.c:3907
 msgid "standard input"
 msgstr "標準輸出"
 
-#: src/dc3dd.c:4035
+#: src/dc3dd.c:3938
 msgid "standard output"
 msgstr "標準輸出"
 
-#: src/dc3dd.c:4103
+#: src/dc3dd.c:4016
 #, c-format
 msgid ""
 "offset too large: cannot truncate to a length of seek=%<PRIuMAX> (%lu-byte) "
 "sectors"
 msgstr ""
 
-#: src/dc3dd.c:4118
+#: src/dc3dd.c:4031
 #, c-format
 msgid "cannot fstat %s"
 msgstr "無法 fstat %s"
 
-#: src/dc3dd.c:4124
+#: src/dc3dd.c:4037
 #, fuzzy, c-format
 msgid "truncating at %<PRIuMAX> bytes in output file %s"
 msgstr "略過輸出檔%2$s的最初 %1$s 個位元組"
 
-#: src/dc3dd.c:4222
+#: src/dc3dd.c:4131
 msgid "Verify PASSED"
 msgstr ""
 
+#~ msgid ""
+#~ "  ascii     from EBCDIC to ASCII\n"
+#~ "  ebcdic    from ASCII to EBCDIC\n"
+#~ "  ibm       from ASCII to alternate EBCDIC\n"
+#~ "  block     pad newline-terminated records with spaces to cbs-size\n"
+#~ "  unblock   replace trailing spaces in cbs-size records with newline\n"
+#~ "  lcase     change upper case to lower case\n"
+#~ msgstr ""
+#~ "  ascii     由 EBCDIC 轉換至 ASCII\n"
+#~ "  ebcdic    由 ASCII 轉換至 EBCDIC\n"
+#~ "  ibm       由 ASCII 轉換至 alternate EBCDIC\n"
+#~ "  block     將以 newline 作為結束字元的區段的 newline 換成空格,\n"
+#~ "            直至空格填滿 cbs 表示的大小\n"
+#~ "  unblock   會將 cbs 大小的區段中所有結束的空格刪除,\n"
+#~ "            並轉換為一個 newline 字元\n"
+#~ "  lcase     將大寫字元轉換為小寫\n"
+
+#, fuzzy
+#~ msgid "%<PRIuMAX> truncated record\n"
+#~ msgid_plural "%<PRIuMAX> truncated records\n"
+#~ msgstr[0] "個被截斷了的區段"
+
+#~ msgid "cannot combine any two of {ascii,ebcdic,ibm}"
+#~ msgstr "不可同時使用 ascii, ebcdic, ibm 中的任何二個"
+
+#~ msgid "cannot combine block and unblock"
+#~ msgstr "不可同時使用 block 和 unblock"
+
+#~ msgid "cannot combine lcase and ucase"
+#~ msgstr "不可同時使用 lcase 和 ucase"
+
+#, fuzzy
+#~ msgid "rewind: warning: invalid file offset after failed read"
+#~ msgstr "警告:寬度 %lu 是無效的;以 %d 代替"
+
+#~ msgid "error writing %s"
+#~ msgstr "寫入 %s 時發生錯誤"
+
 #~ msgid "invalid argument %s for %s"
 #~ msgstr "%2$s的參數%1$s無效"
 
@@ -5048,10 +5065,6 @@ msgstr ""
 #~ msgid "couldn't open temporary file"
 #~ msgstr "無法建立暫存檔"
 
-#, fuzzy
-#~ msgid "couldn't create process for %s -d"
-#~ msgstr "無法建立目錄%s"
-
 #~ msgid "write failed"
 #~ msgstr "寫入時發生錯誤"
 
diff --git a/src/Makefile.am b/src/Makefile.am
index 23e65ed..8aba745 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,8 +1,13 @@
-
 bin_PROGRAMS = dc3dd
 
 noinst_HEADERS = system.h 
 
+if COND_USE_HDPARM
+dc3dd_SOURCES = dc3dd.c hdparm/hpa_dco.c hdparm/identify.c hdparm/sgio.c
+else
+dc3dd_SOURCES = dc3dd.c
+endif
+
 AM_CPPFLAGS = -I$(top_srcdir)/lib
 
 # Sometimes, the expansion of $(LIBINTL) includes -lc which may
@@ -10,6 +15,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/lib
 # must precede $(LIBINTL) in order to ensure we use GNU getopt.
 # But libcoreutils.a must also follow $(LIBINTL), since libintl uses
 # replacement functions defined in libcoreutils.a.
-LDADD = ../lib/libcoreutils.a $(LIBINTL) ../lib/libcoreutils.a
+# TODO: is this the right place for -lpthread?
+LDADD = ../lib/libcoreutils.a $(LIBINTL) ../lib/libcoreutils.a -lpthread
 
-dc3dd_LDADD = $(LDADD) $(LIB_GETHRXTIME) $(LIB_FDATASYNC)
\ No newline at end of file
+dc3dd_LDADD = $(LDADD) $(LIB_GETHRXTIME) $(LIB_FDATASYNC)
diff --git a/src/Makefile.in b/src/Makefile.in
index 39902a2..a85abf1 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -83,9 +83,10 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/alloca.m4 \
 	$(top_srcdir)/m4/gnulib-common.m4 \
 	$(top_srcdir)/m4/gnulib-comp.m4 \
 	$(top_srcdir)/m4/hard-locale.m4 $(top_srcdir)/m4/hash.m4 \
-	$(top_srcdir)/m4/host-os.m4 $(top_srcdir)/m4/human.m4 \
-	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/iconv_h.m4 \
-	$(top_srcdir)/m4/iconv_open.m4 $(top_srcdir)/m4/idcache.m4 \
+	$(top_srcdir)/m4/hdparm.m4 $(top_srcdir)/m4/host-os.m4 \
+	$(top_srcdir)/m4/human.m4 $(top_srcdir)/m4/iconv.m4 \
+	$(top_srcdir)/m4/iconv_h.m4 $(top_srcdir)/m4/iconv_open.m4 \
+	$(top_srcdir)/m4/idcache.m4 \
 	$(top_srcdir)/m4/include-exclude-prog.m4 \
 	$(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/inline.m4 \
 	$(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax_t.m4 \
@@ -191,8 +192,13 @@ CONFIG_CLEAN_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)"
 binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
 PROGRAMS = $(bin_PROGRAMS)
-dc3dd_SOURCES = dc3dd.c
-dc3dd_OBJECTS = dc3dd.$(OBJEXT)
+am__dc3dd_SOURCES_DIST = dc3dd.c hdparm/hpa_dco.c hdparm/identify.c \
+	hdparm/sgio.c
+ at COND_USE_HDPARM_FALSE@am_dc3dd_OBJECTS = dc3dd.$(OBJEXT)
+ at COND_USE_HDPARM_TRUE@am_dc3dd_OBJECTS = dc3dd.$(OBJEXT) \
+ at COND_USE_HDPARM_TRUE@	hpa_dco.$(OBJEXT) identify.$(OBJEXT) \
+ at COND_USE_HDPARM_TRUE@	sgio.$(OBJEXT)
+dc3dd_OBJECTS = $(am_dc3dd_OBJECTS)
 am__DEPENDENCIES_1 =
 am__DEPENDENCIES_2 = ../lib/libcoreutils.a $(am__DEPENDENCIES_1) \
 	../lib/libcoreutils.a
@@ -205,8 +211,8 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 CCLD = $(CC)
 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = dc3dd.c
-DIST_SOURCES = dc3dd.c
+SOURCES = $(dc3dd_SOURCES)
+DIST_SOURCES = $(am__dc3dd_SOURCES_DIST)
 HEADERS = $(noinst_HEADERS)
 ETAGS = etags
 CTAGS = ctags
@@ -594,6 +600,7 @@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
 U = @U@
 UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@
 UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@
+USE_HDPARM = @USE_HDPARM@
 USE_NLS = @USE_NLS@
 VERSION = @VERSION@
 VOID_UNSETENV = @VOID_UNSETENV@
@@ -661,6 +668,8 @@ target_alias = @target_alias@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 noinst_HEADERS = system.h 
+ at COND_USE_HDPARM_FALSE@dc3dd_SOURCES = dc3dd.c
+ at COND_USE_HDPARM_TRUE@dc3dd_SOURCES = dc3dd.c hdparm/hpa_dco.c hdparm/identify.c hdparm/sgio.c
 AM_CPPFLAGS = -I$(top_srcdir)/lib
 
 # Sometimes, the expansion of $(LIBINTL) includes -lc which may
@@ -668,7 +677,8 @@ AM_CPPFLAGS = -I$(top_srcdir)/lib
 # must precede $(LIBINTL) in order to ensure we use GNU getopt.
 # But libcoreutils.a must also follow $(LIBINTL), since libintl uses
 # replacement functions defined in libcoreutils.a.
-LDADD = ../lib/libcoreutils.a $(LIBINTL) ../lib/libcoreutils.a
+# TODO: is this the right place for -lpthread?
+LDADD = ../lib/libcoreutils.a $(LIBINTL) ../lib/libcoreutils.a -lpthread
 dc3dd_LDADD = $(LDADD) $(LIB_GETHRXTIME) $(LIB_FDATASYNC)
 all: all-am
 
@@ -737,6 +747,9 @@ distclean-compile:
 	-rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dc3dd.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/hpa_dco.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/identify.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/sgio.Po at am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -752,6 +765,48 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
 
+hpa_dco.o: hdparm/hpa_dco.c
+ at am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hpa_dco.o -MD -MP -MF $(DEPDIR)/hpa_dco.Tpo -c -o hpa_dco.o `test -f 'hdparm/hpa_dco.c' || echo '$(srcdir)/'`hdparm/hpa_dco.c
+ at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/hpa_dco.Tpo $(DEPDIR)/hpa_dco.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='hdparm/hpa_dco.c' object='hpa_dco.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hpa_dco.o `test -f 'hdparm/hpa_dco.c' || echo '$(srcdir)/'`hdparm/hpa_dco.c
+
+hpa_dco.obj: hdparm/hpa_dco.c
+ at am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hpa_dco.obj -MD -MP -MF $(DEPDIR)/hpa_dco.Tpo -c -o hpa_dco.obj `if test -f 'hdparm/hpa_dco.c'; then $(CYGPATH_W) 'hdparm/hpa_dco.c'; else $(CYGPATH_W) '$(srcdir)/hdparm/hpa_dco.c'; fi`
+ at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/hpa_dco.Tpo $(DEPDIR)/hpa_dco.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='hdparm/hpa_dco.c' object='hpa_dco.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hpa_dco.obj `if test -f 'hdparm/hpa_dco.c'; then $(CYGPATH_W) 'hdparm/hpa_dco.c'; else $(CYGPATH_W) '$(srcdir)/hdparm/hpa_dco.c'; fi`
+
+identify.o: hdparm/identify.c
+ at am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT identify.o -MD -MP -MF $(DEPDIR)/identify.Tpo -c -o identify.o `test -f 'hdparm/identify.c' || echo '$(srcdir)/'`hdparm/identify.c
+ at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/identify.Tpo $(DEPDIR)/identify.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='hdparm/identify.c' object='identify.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o identify.o `test -f 'hdparm/identify.c' || echo '$(srcdir)/'`hdparm/identify.c
+
+identify.obj: hdparm/identify.c
+ at am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT identify.obj -MD -MP -MF $(DEPDIR)/identify.Tpo -c -o identify.obj `if test -f 'hdparm/identify.c'; then $(CYGPATH_W) 'hdparm/identify.c'; else $(CYGPATH_W) '$(srcdir)/hdparm/identify.c'; fi`
+ at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/identify.Tpo $(DEPDIR)/identify.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='hdparm/identify.c' object='identify.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o identify.obj `if test -f 'hdparm/identify.c'; then $(CYGPATH_W) 'hdparm/identify.c'; else $(CYGPATH_W) '$(srcdir)/hdparm/identify.c'; fi`
+
+sgio.o: hdparm/sgio.c
+ at am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sgio.o -MD -MP -MF $(DEPDIR)/sgio.Tpo -c -o sgio.o `test -f 'hdparm/sgio.c' || echo '$(srcdir)/'`hdparm/sgio.c
+ at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/sgio.Tpo $(DEPDIR)/sgio.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='hdparm/sgio.c' object='sgio.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sgio.o `test -f 'hdparm/sgio.c' || echo '$(srcdir)/'`hdparm/sgio.c
+
+sgio.obj: hdparm/sgio.c
+ at am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sgio.obj -MD -MP -MF $(DEPDIR)/sgio.Tpo -c -o sgio.obj `if test -f 'hdparm/sgio.c'; then $(CYGPATH_W) 'hdparm/sgio.c'; else $(CYGPATH_W) '$(srcdir)/hdparm/sgio.c'; fi`
+ at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/sgio.Tpo $(DEPDIR)/sgio.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='hdparm/sgio.c' object='sgio.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sgio.obj `if test -f 'hdparm/sgio.c'; then $(CYGPATH_W) 'hdparm/sgio.c'; else $(CYGPATH_W) '$(srcdir)/hdparm/sgio.c'; fi`
+
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
diff --git a/src/dc3dd.c b/src/dc3dd.c
index a1de399..5f78239 100644
--- a/src/dc3dd.c
+++ b/src/dc3dd.c
@@ -1,1285 +1,478 @@
-/* dd -- convert a file while copying it.
-   Copyright (C) 85, 90, 91, 1995-2008 Free Software Foundation, Inc.
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/* Written by Paul Rubin, David MacKenzie, and Stuart Kemp. */
-
-#include <config.h>
-
-#define SWAB_ALIGN_OFFSET 2
-
+// dc3dd -- a dd for digital forensics.
+//   Copyright (C) 85, 90, 91, 1995-2009 Free Software Foundation, Inc.
+//
+//   This program is free software: you can redistribute it and/or modify
+//   it under the terms of the GNU General Public License as published by
+//   the Free Software Foundation, either version 3 of the License, or
+//   (at your option) any later version.
+//
+//   This program is distributed in the hope that it will be useful,
+//   but WITHOUT ANY WARRANTY; without even the implied warranty of
+//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//   GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+//-------------------------
+// INCLUDES
+//-------------------------
+
+#include <config.h> // NOTE: "config.h" must be first include
 #include <sys/types.h>
 #include <signal.h>
 #include <getopt.h>
-
+#include <stdarg.h>
+#include <pthread.h>
 #include "system.h"
 #include "error.h"
-#include "fd-reopen.h"
-#include "gethrxtime.h"
+#include "gethrxtime.h"     
 #include "human.h"
 #include "long-options.h"
 #include "quote.h"
 #include "quotearg.h"
 #include "xstrtol.h"
 #include "xtime.h"
-
 #include "md5.h"
 #include "sha1.h"
 #include "sha256.h"
 #include "sha512.h"
 
-#include <stdarg.h>
+#ifdef __linux__
+   #include <sys/mount.h>
+   # include <sys/mtio.h>
+   #ifdef USE_HDPARM
+      #include <linux/types.h>
+      #include "hdparm/hpa_dco.h"
+   #endif
+#elif defined (__APPLE__)
+   #include <sys/disk.h>
+   #include <sys/ioctl.h>
+#elif defined (__CYGWIN__)
+   #include <sys/ioctl.h>
+   #include <cygwin/types.h>
+   #include <cygwin/fs.h>
+#endif
 
-static void process_signals (void);
+//-------------------------
+// #DEFINES
+//-------------------------
 
-/* The official name of this program (e.g., no `g' prefix).  */
 #define PROGRAM_NAME "dc3dd"
 
 #define AUTHORS \
-  proper_name ("Paul Rubin"), \
-  proper_name ("David MacKenzie"), \
-  proper_name ("Stuart Kemp"), \
-  "patched for DC3 by Jesse Kornblum and Andrew Medico"
-
-/* Use SA_NOCLDSTOP as a proxy for whether the sigaction machinery is
-   present.  SA_NODEFER and SA_RESETHAND are XSI extensions.  */
-#ifndef SA_NOCLDSTOP
-# define SA_NOCLDSTOP 0
-# define sigprocmask(How, Set, Oset) /* empty */
-# define sigset_t int
-# if ! HAVE_SIGINTERRUPT
-#  define siginterrupt(sig, flag) /* empty */
-# endif
-#endif
-#ifndef SA_NODEFER
-# define SA_NODEFER 0
-#endif
-#ifndef SA_RESETHAND
-# define SA_RESETHAND 0
-#endif
-
-#ifndef SIGINFO
-# define SIGINFO SIGUSR1
-#endif
-
-#if ! HAVE_FDATASYNC
-# define fdatasync(fd) (errno = ENOSYS, -1)
-#endif
-
-#define max(a, b) ((a) > (b) ? (a) : (b))
-#define output_char(c)				\
-  do						\
-    {						\
-      obuf[oc++] = (c);				\
-      if (oc >= output_blocksize)		\
-	write_output ();			\
-    }						\
-  while (0)
-
-/* Default input and output blocksize. */
-#ifndef DEFAULT_BLOCKSIZE
-# define DEFAULT_BLOCKSIZE 32768
-#endif
-
-/* How many bytes to add to the input and output block sizes before invoking
-   malloc.  See dd_copy for details.  INPUT_BLOCK_SLOP must be no less than
-   OUTPUT_BLOCK_SLOP.  */
-#define INPUT_BLOCK_SLOP (2 * SWAB_ALIGN_OFFSET + 2 * page_size - 1)
-#define OUTPUT_BLOCK_SLOP (page_size - 1)
-
-/* Maximum blocksize for the given SLOP.
-   Keep it smaller than SIZE_MAX - SLOP, so that we can
-   allocate buffers that size.  Keep it smaller than SSIZE_MAX, for
-   the benefit of system calls like "read".  And keep it smaller than
-   OFF_T_MAX, for the benefit of the large-offset seek code.  */
-#define MAX_BLOCKSIZE(slop) MIN (SIZE_MAX - (slop), MIN (SSIZE_MAX, OFF_T_MAX))
-
-/* Conversions bit masks. */
-enum
-  {
-    C_ASCII = 01,
-
-    C_EBCDIC = 02,
-    C_IBM = 04,
-    C_BLOCK = 010,
-    C_UNBLOCK = 020,
-    C_LCASE = 040,
-    C_UCASE = 0100,
-    C_SWAB = 0200,
-    C_NOERROR = 0400,
-    C_NOTRUNC = 01000,
-    C_SYNC = 02000,
-
-    /* Use separate input and output buffers, and combine partial
-       input blocks. */
-    C_TWOBUFS = 04000,
-
-    C_NOCREAT = 010000,
-    C_EXCL = 020000,
-    C_FDATASYNC = 040000,
-    C_FSYNC = 0100000,
-
-    C_DYNAMIC = 0200000
-  };
-
-/* Status bit masks.  */
-enum
-  {
-    STATUS_NOXFER = 01
-  };
-
-/* The name this program was run with. */
-char *program_name;
-
-// TODO: need to resolve the desire for input_file/output_file to be
-// const, with the fact that split/join modify the values
-/* The name of the input file, or NULL for the standard input. */
-static char /*const*/ *input_file = NULL;
-
-/* The name of the output file, or NULL for the standard output. */
-static char /*const*/ *output_file = NULL;
-
-/* The page size on this host.  */
-static size_t page_size;
-
-/* The number of bytes in which atomic reads are done. */
-static size_t input_blocksize = 0;
-
-/* The number of bytes in which atomic writes are done. */
-static size_t output_blocksize = 0;
-
-/* The sector size of the applicable device
- * (input device normally; output device when in pattern mode) */
-static size_t dc3_sectorsize = 0;
-
-static size_t dc3_small_read = 0;
-
-/* Conversion buffer size, in bytes.  0 prevents conversions. */
-static size_t conversion_blocksize = 0;
-
-/* Skip this many records of `input_blocksize' bytes before input. */
-static uintmax_t skip_sectors = 0;
-
-/* Skip this many records of `output_blocksize' bytes before output. */
-static uintmax_t seek_sectors = 0;
+  proper_name("Paul Rubin"), \
+  proper_name("David MacKenzie"), \
+  proper_name("Stuart Kemp"), \
+  proper_name("Jesse Kornblum"), \
+  proper_name("Andrew Medico"), \
+  proper_name("Richard Cordovano")
+
+// Keep it smaller than SIZE_MAX - alignment add-on bytes, to allow
+// allocating buffers that size. Keep it smaller than SSIZE_MAX, for the
+// benefit of system calls like read(). And keep it smaller than OFF_T_MAX,
+// for the benefit of lseek().
+#define MAX_BLOCKSIZE() MIN (SIZE_MAX - (2 * getpagesize() - 1), MIN (SSIZE_MAX, OFF_T_MAX))
+
+#define STRINGIFY(s) #s
+#define AS_STRING(s) STRINGIFY(s)
+
+#define DC3DD_ASSERT(c) {if (!(c)) report_program_error((#c));}
+
+//-------------------------
+// CONSTANTS
+//-------------------------
+
+static const size_t DEFAULT_SECTOR_SIZE = 512;
+static const size_t DEFAULT_BUFFER_SIZE = 32768;
+static const uint8_t NUM_BUFFERS = 64;
+static const uint8_t NUM_HASHES = 4;
+static const uintmax_t INFINITE_BYTES = (uintmax_t)-1;
+static const uintmax_t INFINITE_SECTORS = (uintmax_t)-1;
+static const mode_t OUTPUT_FILE_PERMS = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
+static const int FILE_DESCRIPTOR_NOT_SET = -2;
+static const size_t DISPLAY_MESSAGE_LENGTH = 4096; 
+static const long int JOB_PROGRESS_INTERVAL_MILLISECS = 100; 
+
+//-------------------------
+// ENUMS
+//-------------------------
+
+enum IO_STATE
+{
+   PENDING,
+   OPEN,
+   COMPLETE,
+   FATAL_ERROR
+};
 
-/* Copy only this many records.  The default is effectively infinity.  */
-static uintmax_t max_sectors = (uintmax_t) -1;
+enum EXIT_CODE
+{
+   DC3DD_EXIT_CODE_NOT_SET = -1,
+   DC3DD_EXIT_COMPLETED,
+   DC3DD_EXIT_ABORTED,
+   DC3DD_EXIT_FAILED,
+};
 
-/* Bit vector of conversions to apply. */
-static int conversions_mask = 0;
+//-------------------------
+// TYPEDEFS
+//-------------------------
 
-/* Open flags for the input and output files.  */
-static int input_flags = 0;
-static int output_flags = 0;
+typedef struct _file_t 
+{
+   char* unparsed_name;
+   char* name;
+   uintmax_t number;
+   int flags;
+   int descriptor;
+   bool probed;
+   intmax_t offset;
+   bool is_device;
+   bool is_block_device;
+   uintmax_t probed_size_in_bytes;
+   uintmax_t probed_size_in_sectors;
+   size_t probed_sector_size;
+   uintmax_t size_in_bytes;
+   bool part_of_set;
+   bool verify_requested;
+   struct _file_t* next_file;
+} 
+file_t;
+
+typedef struct _settings_t
+{
+   char* input_pattern_string;
+   char* input_pattern;
+   size_t input_pattern_length;
+   file_t* input_file;
+   file_t* output_files;
+   file_t* wipe_target;
+   size_t sector_size;
+   const char* sector_size_source;
+   size_t buffer_size;
+   uintmax_t input_sectors_to_skip;
+   uintmax_t output_sectors_to_skip;
+   uintmax_t max_sectors_to_input;
+   uintmax_t max_output_file_size;
+   bool recover_errors; 
+   bool splitting_output;
+   bool verifying_output;
+   bool append_output;
+   bool corrupt_output;
+} 
+settings_t;
+
+typedef void hash_init_func_t(void* ctx);
+typedef void hash_update_func_t(const void* buf, size_t len, void* ctx);
+typedef void hash_finish_func_t(void* ctx, void* buf);
+
+typedef struct _hash_algorithm_t
+{
+   bool active;
+   char* name;
+   size_t context_size;
+   size_t sum_size;
+   hash_init_func_t* init;
+   hash_update_func_t* update;
+   hash_finish_func_t* finish;
+}
+hash_algorithm_t;
 
-/* Status flags for what is printed to stderr.  */
-static int status_flags = 0;
+typedef struct _hash_t
+{
+   hash_algorithm_t* algorithm;
+   void* context;
+   char* sum;
+   char* result;
+   uintmax_t bytes_hashed;
+   struct _hash_t* current_piece;
+   struct _hash_t* pieces;
+   uintmax_t piecewise_hash_length;
+   struct _hash_t* next_hash;
+}
+hash_t;
 
-/* If nonzero, filter characters through the translation table.  */
-static bool translation_needed = false;
+typedef struct _buffer_t
+{
+   char* data;
+   size_t length;
+}
+buffer_t;
 
-/* Number of partial blocks read. */
-static uintmax_t r_partial = 0;
+typedef struct _buffer_queue_t
+{
+   buffer_t* buffers;
+   uint number_of_buffers;
+   uint buffers_used;
+   uint next_available_buffer;
+   pthread_mutex_t* lock;
+   pthread_cond_t* not_empty;
+   pthread_cond_t* not_full;
+   bool done_buffering;
+}
+buffer_queue_t;
 
-/* Number of full blocks read. */
-static uintmax_t r_full = 0;
+typedef struct _input_t
+{
+   enum IO_STATE state;
+   size_t buffer_size;
+   buffer_t buffer;
+   size_t sector_size;
+   uintmax_t max_sectors_to_input; 
+   uintmax_t bytes_to_input;
+   uintmax_t bytes_input;
+   file_t* current_file;
+   file_t* files;   
+   uintmax_t sectors_to_skip;
+   uintmax_t current_sector;
+   bool recover_errors;
+   int current_errno;
+   uintmax_t current_errno_count;
+   uintmax_t current_errno_start_sector;
+   uintmax_t bad_sectors;   
+   char* pattern_string;
+   char* pattern;
+   size_t pattern_length;
+   void (*open)(struct _input_t* input);
+   void (*produce_bytes)(struct _input_t* input);
+   void (*close)(struct _input_t* input);
+}
+input_t;
 
-/* Number of bytes written.  */
-static uintmax_t w_bytes = 0;
+typedef struct _output_t
+{
+   enum IO_STATE state; 
+   pthread_t thread;
+   size_t sector_size;
+   uintmax_t buffer_size;
+   buffer_queue_t* buffer_queue;
+   uintmax_t bytes_output;
+   hash_t* hash;
+   file_t* current_file;
+   file_t* files;
+   uintmax_t max_file_size;
+   uintmax_t sectors_to_skip;
+   bool append_garbage_bytes;
+   void (*open)(struct _output_t* output);
+   void (*consume_bytes)(struct _output_t* output, buffer_t* buffer);
+   void (*close)(struct _output_t* output);
+   struct _output_t* expected_hashes;
+   struct _output_t* actual_hashes;
+   struct _output_t* next_output;   
+}
+output_t;
 
-/* Number of bytes in input file */
-static uintmax_t input_bytes = 0;
+typedef struct _task_t
+{
+   pthread_t thread;
+   pthread_mutex_t* signalling_lock;
+   input_t* input;
+   output_t* outputs;
+   bool completed;
+   bool aborted;
+   enum EXIT_CODE exit_code;
+   struct _task_t* next_task;   
+}
+task_t;
 
-static uintmax_t dc3_sectors_w_partial = 0;
-static uintmax_t dc3_sectors_w_full    = 0;
-static uintmax_t dc3_sectors_r_partial = 0;
-static uintmax_t dc3_sectors_r_full    = 0;
+typedef struct _job_t
+{
+   pthread_t monitor_thread;
+   task_t* tasks;
+   long int progress_interval_in_ms;
+   void (*report_progress)(struct _job_t* job, bool final);
+   enum EXIT_CODE exit_code;
+   struct _job_t* next_job;
+}
+job_t;
 
-/* Whether or not we should probe the input file and get its size */
-#ifdef DEFAULT_SIZEPROBE
-  static bool dc3_sizeprobe = true;
-#else
-  static bool dc3_sizeprobe = false;
-#endif
+//-------------------------
+// GLOBAL VARIABLES
+//-------------------------
 
-/* Time that dd started.  */
+char* program_name = NULL;
 static xtime_t start_time;
-
-/* True if input is seekable.  */
-static bool input_seekable;
-
-/* True if we're wiping a device */
-static bool dc3_mode_wipe = false;
-
-/* True if we're verifying the output file */
-static bool dc3_mode_verify = false;
-
-
-/* True if we should be combining error messages */
-static bool dc3_group_errors = false;
-
-/* True if the last read was an error */
-static bool dc3_previous_error = false;
-
-/* Number of previous reads that were errors */
-static uintmax_t dc3_previous_error_count = 0;
-
-/* Previous error encountered */
-static int dc3_previous_error_errno = 0;
-
-
-/* True if we're piping the output to another process */
-static bool dc3_pipe_output = false;
-
-/* True if we are splitting the output file */
-static bool dc3_split = false;
-
-/* Number of bytes that should be written to each split file */
-uintmax_t dc3_split_bytes = 0;
-
-/* Number of bytes written to the current split file */
-uintmax_t dc3_split_current = 0;
-
-/* Format for split files */
-char * dc3_split_format = "000";
-
-/* Current number of split files */
-uintmax_t dc3_split_number = 0;
-
-/* Current filename being written to */
-char * dc3_split_filename = NULL;
-
-// ifjoin state
-static bool dc3_ifjoin        = false; // Are we reading in split files?
-char*       dc3_ifjoin_base   = NULL;  // Base name for reading in split files
-char*       dc3_ifjoin_ext    = NULL;  // splitformat for reading in split files
-uintmax_t   dc3_ifjoin_number = 0;     // Current index of input split file
-static bool dc3_ifjoin_done   = false; // True if we closed the last input split file
-
-// vfjoin state
-static bool dc3_vfjoin        = false; // Are we verifying split files?
-char*       dc3_vfjoin_base   = NULL;  // Base name for verifying split files
-char*       dc3_vfjoin_ext    = NULL;  // splitformat for verifying split files
-uintmax_t   dc3_vfjoin_number = 0;     // Current index of verify split file
-
-/* True if we need to compute hashes */
-static bool dc3_hash = false;
-
-/* True if the user has already specified a hash algorithm to use */
-static bool dc3_hash_manual = false;
-
-/* Bytes to use for each piecewise hash */
-uintmax_t dc3_hash_window = 0;
-
-/* Bytes read in the current piecewise hash */
-uintmax_t dc3_hash_current = 0;
-
-/* True if we need to compute hashes before copy (hashconv=before) */
-#ifdef DEFAULT_HASHCONV_BEFORE
-  static bool dc3_hash_before = true;
-#else 
-# ifdef DEFAULT_HASHCONV_AFTER
-   static bool dc3_hash_before = false;
-#  else
-   static bool dc3_hash_before = true;
-# endif
+static FILE* log = NULL;
+static FILE* hash_log = NULL;
+static bool progress_displayed = false;
+static pthread_mutex_t signalling_lock;
+static pthread_cond_t* interrupted = 0;
+
+#ifdef DEFAULT_VERBOSE_REPORTING
+static bool verbose_reporting = true;
+#else
+static bool verbose_reporting = false;
 #endif
 
-/* Holds data used to update each hash */
-static char * dc3_hash_buffer;
-
-
-/* External log for hashes */
-FILE * hash_log = NULL;
-
-/* External log for errors */
-FILE * error_log = NULL;
-
-
-/* True if we need to display status messages */
-#ifdef DEFAULT_PROGRESS
- static bool dc3_progress = true;
+#ifdef DEFAULT_COMPACT_REPORTING
+static bool compact_reporting = true;
 #else
- static bool dc3_progress = false;
+static bool compact_reporting = false;
 #endif
 
-/* Becomes true once a progress message has been printed */
-static bool dc3_progress_printed = false;
-
-/* Number of blocks counted before a progress count is displayed */
-#ifdef DEFAULT_PROGRESSCOUNT
-  static uintmax_t dc3_progress_count   = (uintmax_t)DEFAULT_PROGRESSCOUNT;
+#ifdef DEFAULT_BASE_TEN_BYTES_REPORTING
+static int progress_bytes_reporting_flag = 0;
 #else
-  static uintmax_t dc3_progress_count   = 0;
+static int progress_bytes_reporting_flag = human_base_1024;
 #endif
 
-/* Number of blocks read since the last progress message was displayed */
-static uintmax_t dc3_progress_current = 0;
+// A single lock is used for both the logs and the console so that the order of 
+// output will be the same everywhere.  
+static pthread_mutex_t reporting_lock;
 
-
-/* True if we're using a pattern as input */
-static bool dc3_use_pattern = false;
-
-enum
-  {
-    DC3_EXIT_COMPLETE = 01,
-    DC3_EXIT_ABORTED  = 02,
-    DC3_EXIT_FAILED   = 04
-  };
-
-static int dc3_exit_reason = 0;
-
-
-/* We use the following datatype to keep track of the state of
-   the various hashing algorithms. 
-
-   To add a new algorithm:
-
-   1. Increment DC3_NUM_HASHES
-
-   2. Add the appropriate definition to dc3_hashinfo.
-      This includes the size of the hash sum (i.e. the size 
-      of the hash in bytes, bit length divided by eight),
-      the size of the internal hash state structure,
-      and the functions necessary to initialize, update,
-      and finalize the hash. 
-*/
-
-
-/* State for hashing algorihtms */
-typedef struct _dc3_hashtype_t {
-  bool    inuse;
-
-  /* The name of the hash algorithm, e.g. "md5" */
-  char  * name;
-
-  /* We have to keep separate contexts for the current window of
-     data being hashed and the overall file. These blocks start
-     at different points. */
-  void  * ctx_window;
-  void  * ctx_total;
-
-  /* We can get away with just one sum and result buffer, however,
-     as these get computed at separate times for the current window
-     and the file as a whole. */
-  char  * sum;
-  char  * result;
-
-  /* The sum_size is used to compute the size of the result. 
-     Size of Result = 2 * sum_size */
-  size_t  sum_size;
-  
-  /* Size of the internal data structures stored in ctx_window and
-     and ctx_total. This is used to allocate memory. */
-  size_t  ctx_size;
-
-  /* Number of bytes processed in total. Used to compute the 
-     start and stop points for each hash window. */
-  uintmax_t total;
-  
-  void (*init)(void *);
-  void (*update)(const void *, size_t, void *);
-  void (*final)(void *, void *);
-
-} dc3_hashtype_t;
-
-
-#define DC3_NUM_HASHES   4
-
-static dc3_hashtype_t dc3_hashinfo[DC3_NUM_HASHES] = 
-  {
-    { 
-#ifdef DEFAULT_HASH_MD5
+static hash_algorithm_t hash_algorithms[] = 
+{
+   { 
+      #ifdef DEFAULT_HASH_MD5
       true,
-#else
+      #else
       false,
-#endif
+      #endif
       "md5",
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      16,
       sizeof(struct md5_ctx),
-      0,
-      (void (*)(void *))md5_init_ctx,
-      (void (*)(const void *, size_t, void *))md5_process_bytes,
-      (void (*)(void *, void *))md5_finish_ctx},
+      16,
+      (hash_init_func_t*)md5_init_ctx,
+      (hash_update_func_t*)md5_process_bytes,
+      (hash_finish_func_t*)md5_finish_ctx,
+    },
     
     {
-#ifdef DEFAULT_HASH_SHA1
+      #ifdef DEFAULT_HASH_SHA1
       true,
-#else
+      #else
       false,
-#endif
+      #endif
       "sha1",
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      20,
       sizeof(struct sha1_ctx),
-      0,
-      (void (*)(void *))sha1_init_ctx,
-      (void (*)(const void *, size_t, void *))sha1_process_bytes,
-      (void (*)(void *, void *))sha1_finish_ctx},
+      20,
+      (hash_init_func_t*)sha1_init_ctx,
+      (hash_update_func_t*)sha1_process_bytes,
+      (hash_finish_func_t*)sha1_finish_ctx,
+    },
     
     {
-#ifdef DEFAULT_HASH_SHA256
+      #ifdef DEFAULT_HASH_SHA256
       true,
-#else
+      #else
       false,
-#endif
+      #endif
       "sha256",
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      32,
       sizeof(struct sha256_ctx),
-      0,
-      (void (*)(void *))sha256_init_ctx,
-      (void (*)(const void *, size_t, void *))sha256_process_bytes,
-      (void (*)(void *, void *))sha256_finish_ctx},
+      32,
+      (hash_init_func_t*)sha256_init_ctx,
+      (hash_update_func_t*)sha256_process_bytes,
+      (hash_finish_func_t*)sha256_finish_ctx,
+    },
     
     {
-#ifdef DEFAULT_HASH_SHA512
+      #ifdef DEFAULT_HASH_SHA512
       true,
-#else
+      #else
       false,
-#endif
+      #endif
      "sha512",
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      64,
       sizeof(struct sha512_ctx),
-      0,
-      (void (*)(void *))sha512_init_ctx,
-      (void (*)(const void *, size_t, void *))sha512_process_bytes,
-      (void (*)(void *, void *))sha512_finish_ctx}
-  };
-
-
-static void 
-dc3_error(int status, int errnum, const char *message, ...);
-
-void dc3_exit_msg();
-
-static void dc3_parse_hash(const char *val)
-{
-  bool done = false;
-  uint8_t i;
-  char *new;
-
-  /* If there have been algorithms specified using the configure 
-     script (e.g. -DDEFAULT_HASH_MD5), we want to clear those
-     *unless* this is the second time through this function. 
-     (e.g. the user called hash=md5 hash=sha1). */
-  if (!dc3_hash_manual)
-    {
-      for (i = 0 ; i < DC3_NUM_HASHES ; i++)
-	dc3_hashinfo[i].inuse = false;
-    }
-  dc3_hash_manual = true;
-  
-  do {
-    new = strchr(val,',');
-    if (NULL == new)
-      done = true;
-    else
-      *new = 0;
-    
-    for (i = 0 ; i < DC3_NUM_HASHES ; i++)
-      {
-	if (STREQ(dc3_hashinfo[i].name,val))
-	  {
-	    dc3_hashinfo[i].inuse = true;
-	    break;
-	  }
-      }
-    if (DC3_NUM_HASHES == i)
-      dc3_error(EXIT_FAILURE,0,_("Unknown hash algorithm %s"), quote(val));
-    
-    val = new+1;
-  } while (!done);
-}
-
-static void
-dc3_hash_init_algorithm(uint8_t i)
-{
-  dc3_hashinfo[i].ctx_window = malloc(dc3_hashinfo[i].ctx_size);
-  dc3_hashinfo[i].ctx_total  = malloc(dc3_hashinfo[i].ctx_size);
-  dc3_hashinfo[i].sum        = malloc(dc3_hashinfo[i].sum_size);
-  dc3_hashinfo[i].result     = malloc(2 * dc3_hashinfo[i].sum_size + 1);
-
-  if (NULL == dc3_hashinfo[i].ctx_window ||
-      NULL == dc3_hashinfo[i].ctx_total  ||
-      NULL == dc3_hashinfo[i].sum        ||
-      NULL == dc3_hashinfo[i].result)
-    dc3_error(EXIT_FAILURE,0,_("Unable to allocate space for hashes"));
-
-  dc3_hash_current = 0;
-
-  dc3_hashinfo[i].init(dc3_hashinfo[i].ctx_window);
-  dc3_hashinfo[i].init(dc3_hashinfo[i].ctx_total);
-}
-
-
-static void
-dc3_hash_init(void)
-{
-  uint8_t i;
-
-  if (NULL == hash_log)
-    hash_log = stderr;
-
-  for (i = 0 ; i < DC3_NUM_HASHES ; ++i)
-    {
-      if (dc3_hashinfo[i].inuse)
-	dc3_hash_init_algorithm(i);
-    }
-}
-
-
-
-static void
-dc3_hash_update_total(uint8_t i, char *buf, size_t len)
-{
-  memcpy(dc3_hash_buffer,buf,len);
-  dc3_hashinfo[i].update(dc3_hash_buffer,len,dc3_hashinfo[i].ctx_total);
-}
-
-
-static void
-dc3_hash_result(uint8_t i)
-{
-  size_t p;
-  static char hex[] = "0123456789abcdef";
-
-  for (p = 0; p < dc3_hashinfo[i].sum_size ; p++)
-    {
-      dc3_hashinfo[i].result[2 * p] = hex[(dc3_hashinfo[i].sum[p] >> 4) & 0xf];
-      dc3_hashinfo[i].result[2 * p + 1] = hex[dc3_hashinfo[i].sum[p] & 0xf];
-    }
-
-  dc3_hashinfo[i].result[2 * dc3_hashinfo[i].sum_size] = 0;
-}
-
-static void
-dc3_hash_display_window_print(uint8_t i, FILE* file)
-{
-  fprintf(file,"%s %"PRIuMAX"- %"PRIuMAX": %s\n",
-	  dc3_hashinfo[i].name,
-	  dc3_hashinfo[i].total - dc3_hash_current,
-	  dc3_hashinfo[i].total,
-	  dc3_hashinfo[i].result);
-  fflush(file);
-}
-
-static void
-dc3_hash_display_window(uint8_t i)
-{ 
-  dc3_hash_result(i);
-
-  // TODO: really, this only needs to be done before the *first* hash line, but it shouldn't hurt to do it for each one
-  fprintf(stderr, "                                                                   \r");
-  dc3_hash_display_window_print(i, stderr);
-  if (hash_log != stderr)
-    dc3_hash_display_window_print(i, hash_log);
-}
-
-static void
-dc3_hash_display_final_print(uint8_t i, FILE* file)
-{
-  fprintf(file,"%s TOTAL: %s\n",  
-	  dc3_hashinfo[i].name,
-	  dc3_hashinfo[i].result);
-  fflush(file);
-}
-
-static void
-dc3_hash_display_final(uint8_t i)
-{
-  dc3_hash_result(i);
-
-  dc3_hash_display_final_print(i, stderr);
-  if (hash_log != stderr)
-    dc3_hash_display_final_print(i, hash_log);
-}
-
-static void
-dc3_hash_update_window(char *buf, size_t len)
-{
-  uint8_t i;
-  uintmax_t left = dc3_hash_window - dc3_hash_current;
-
-  //fprintf(stderr, "dc3_hash_display_window() called with len=%zd, dc3_hash_current=%zd\n", len, dc3_hash_current);
-
-  if (0 == left)
-    {
-      for (i = 0 ; i < DC3_NUM_HASHES ; ++i)
-	{
-	  if (dc3_hashinfo[i].inuse)
-	    {
-	      dc3_hashinfo[i].final(dc3_hashinfo[i].ctx_window,
-				    dc3_hashinfo[i].sum);
-	      dc3_hash_display_window(i);
-	      dc3_hashinfo[i].init(dc3_hashinfo[i].ctx_window);
-	    }
-	}
-
-      //fprintf(stderr, "dc3_hash_update_window() resetting dc3_hash_current to 0\n");
-
-      dc3_hash_current = 0;
-      left = dc3_hash_window;
-    }
-
-  memcpy(dc3_hash_buffer,buf,len);
-
-  if (len <= left)
-    {
-      for (i = 0 ; i < DC3_NUM_HASHES ; ++i)
-	{
-	  if (dc3_hashinfo[i].inuse)
-	    {
-	      dc3_hashinfo[i].update(dc3_hash_buffer,
-				     len,
-				     dc3_hashinfo[i].ctx_window);
-
-	      // RBF - Should total calculations to be moved total_update function?
-	      dc3_hashinfo[i].total   += len;
-	    }
-	}
-
-      //fprintf(stderr, "dc3_hash_update_window() 1 incrementing dc3_hash_current by len %zd\n", len);
-      dc3_hash_current += len;
-
-    }
-  else
-    {
-      for (i = 0 ; i < DC3_NUM_HASHES ; ++i)
-	{
-	  if (dc3_hashinfo[i].inuse)
-	    {
-	      dc3_hashinfo[i].update(dc3_hash_buffer,
-				     left,
-				     dc3_hashinfo[i].ctx_window);
-	      // RBF - Should total calculations to be moved total_update function?
-	      dc3_hashinfo[i].total   += left;
-	    }
-	}
-
-      //fprintf(stderr, "dc3_hash_update_window() 2 incrementing dc3_hash_current by left %zd\n", left);
-      dc3_hash_current += left;
-      dc3_hash_update_window(buf+left,len-left);
+      64,
+      (hash_init_func_t*)sha512_init_ctx,
+      (hash_update_func_t*)sha512_process_bytes,
+      (hash_finish_func_t*)sha512_finish_ctx,
     }
+  };
 
-  //fprintf(stderr, "dc3_hash_update_window() final: dc3_hash_current now %zd\n", dc3_hash_current);
-}
+//-------------------------
+// FUNCTIONS
+//-------------------------
 
+void usage(int status);
 
 static void
-dc3_hash_update(char *buf, size_t len)
+flush_logs()
 {
-  uint8_t i;
-  
-  dc3_hash_buffer = malloc(len);
-  if (NULL == dc3_hash_buffer)
-    error(EXIT_FAILURE,0,_("Unable to allocate hashing buffer"));
-
-  //fprintf(stderr, "dc3_hash_update: called with len=%zd\n", len);
-
-  /* It's easy to update the total hash, so we do that first. */
-
-  for (i = 0 ; i < DC3_NUM_HASHES ; ++i)
-    {
-      if (dc3_hashinfo[i].inuse)
-	dc3_hash_update_total(i,buf,len);
-    }  
-
-  if (dc3_hash_window != 0)
-    dc3_hash_update_window(buf,len);
-
-  free(dc3_hash_buffer);
+   fflush(stderr);
+   if (log != NULL)
+   {
+      fflush(log);
+   }   
+   if (hash_log != NULL)
+   {
+      fflush(hash_log);
+   }   
 }
 
 static void
-dc3_hash_final(void)
+terminate_logging()
 {
-  //fprintf(stderr, "dc3_hash_final called\n");
-  uint8_t i;
-
-  fprintf(stderr, "                                                                   \r");
-
-  /* We want to display all of the piecewise hashes before we
-     display any of the total hashes */
-  if (dc3_hash_window != 0)
-    {
-      for (i = 0 ; i < DC3_NUM_HASHES ; ++i)
-	{
-	  if (dc3_hashinfo[i].inuse)
-	    {
-	      dc3_hashinfo[i].final(dc3_hashinfo[i].ctx_window,
-				    dc3_hashinfo[i].sum);
-	      dc3_hash_display_window(i);
-	    }
-	}
-    }  
-  
-  for (i = 0 ; i < DC3_NUM_HASHES ; ++i)
-    {
-      if (dc3_hashinfo[i].inuse)
-	{
-          //fprintf(stderr, "dc3_hash_final(): calling final() for hash %d, ctx_total=%zd\n", i, dc3_hashinfo[i].ctx_total);
-	  dc3_hashinfo[i].final(dc3_hashinfo[i].ctx_total,
-				dc3_hashinfo[i].sum);
-	  dc3_hash_display_final(i);
-	}
-    }  
-}
-
-/* Get current time as a string
- * Format: 'YYYY-MM-DD HH:MM:SS -0000'
- */
-char*
-dc3_time()
-{
-  const size_t len = 32; // more than enough to hold 'YYYY-MM-DD HH:MM:SS -0000'
-  time_t t;
-  struct tm tm;
-  char* time_str = xmalloc(len);
-
-  t = time(NULL);
-  struct tm* ret = localtime_r(&t, &tm);
-
-  if (ret == NULL)
-    dc3_error(EXIT_FAILURE, errno, "localtime");
-
-  if (strftime(time_str, len, "%F %T %z", &tm) == 0)
-    dc3_error(EXIT_FAILURE, 0, "strftime returned 0");
-
-  return time_str;
-}
-
-// return the extension of the given filename, after splitting
-// on the given delimiter
-const char*
-dc3_fileext(const char* filename, const char* delim)
-{
-    const char* next = filename;
-    const char* ext = NULL;
-
-    while ((next = strstr(next, delim)) != NULL)
-    {
-        next = ext = next + 1;
-    }
-
-    return ext;
-}
-
-const char*
-dc3_filebase(const char* filename, const char* delim)
-{
-    const char* next = filename;
-    const char* ext = NULL;
-
-    while ((next = strstr(next, delim)) != NULL)
-    {
-        next = ext = next + 1;
-    }
-
-    if (ext == NULL)
-	return NULL;
-
-    int offset = (ext-1) - filename;
-
-    char* base = xstrdup(filename);
-    base[offset] = '\0';
-
-    return base;
-}
-
-bool dc3_validate_splitformat(const char* pattern)
-{
-    size_t pos, len = strlen(pattern);
-    char first      = tolower(pattern[0]);
-
-    for (pos = 0; pos < len; ++pos)
-    {
-        if ((tolower(pattern[pos]) != 'a' &&
-                    tolower(pattern[pos]) != '1' &&
-                    tolower(pattern[pos]) != '0') ||
-                tolower(pattern[pos]) != first)
-            return false;
-    }
-
-    return true;
+   // Close the logs and tear down the reporting mutex. 
+   pthread_mutex_lock(&reporting_lock);
+   flush_logs();
+   if (log)
+   {
+      fclose(log);
+   }
+   if (hash_log)
+   {
+      fclose(hash_log);
+   }
+   pthread_mutex_unlock(&reporting_lock);
+   pthread_mutex_destroy(&reporting_lock);
 }
 
-/* Pattern used as input */
-char * dc3_pattern_value;
-
-/* Length of the pattern being used */
-uintmax_t dc3_pattern_len;
-
-/* Error number corresponding to initial attempt to lseek input.
-   If ESPIPE, do not issue any more diagnostics about it.  */
-static int input_seek_errno;
-
-/* File offset of the input, in bytes, along with a flag recording
-   whether it overflowed.  The offset is valid only if the input is
-   seekable and if the offset has not overflowed.  */
-static uintmax_t input_offset;
-static bool input_offset_overflow;
-
-/* Records truncated by conv=block. */
-static uintmax_t r_truncate = 0;
-
-/* Output representation of newline and space characters.
-   They change if we're converting to EBCDIC.  */
-static char newline_character = '\n';
-static char space_character = ' ';
-
-/* Output buffer. */
-static char *obuf;
-
-/* Current index into `obuf'. */
-static size_t oc = 0;
-
-/* Index into current line, for `conv=block' and `conv=unblock'.  */
-static size_t col = 0;
-
-/* The set of signals that are caught.  */
-static sigset_t caught_signals;
-
-/* If nonzero, the value of the pending fatal signal.  */
-static sig_atomic_t volatile interrupt_signal;
-
-/* A count of the number of pending info signals that have been received.  */
-static sig_atomic_t volatile info_signal_count;
-
-/* A longest symbol in the struct symbol_values tables below.  */
-#define LONGEST_SYMBOL "fdatasync"
-
-/* A symbol and the corresponding integer value.  */
-struct symbol_value
-{
-  char symbol[sizeof LONGEST_SYMBOL];
-  int value;
-};
-
-/* Conversion symbols, for conv="...".  */
-static struct symbol_value const conversions[] =
-{
-  {"ascii", C_ASCII | C_TWOBUFS},	/* EBCDIC to ASCII. */
-  {"ebcdic", C_EBCDIC | C_TWOBUFS},	/* ASCII to EBCDIC. */
-  {"ibm", C_IBM | C_TWOBUFS},	/* Slightly different ASCII to EBCDIC. */
-  {"block", C_BLOCK | C_TWOBUFS},	/* Variable to fixed length records. */
-  {"unblock", C_UNBLOCK | C_TWOBUFS},	/* Fixed to variable length records. */
-  {"lcase", C_LCASE | C_TWOBUFS},	/* Translate upper to lower case. */
-  {"ucase", C_UCASE | C_TWOBUFS},	/* Translate lower to upper case. */
-  {"swab", C_SWAB | C_TWOBUFS},	/* Swap bytes of input. */
-  {"noerror", C_NOERROR},	/* Ignore i/o errors. */
-  {"nocreat", C_NOCREAT},	/* Do not create output file.  */
-  {"excl", C_EXCL},		/* Fail if the output file already exists.  */
-  {"notrunc", C_NOTRUNC},	/* Do not truncate output file. */
-  {"sync", C_SYNC},		/* Pad input records to ibs with NULs. */
-  {"fdatasync", C_FDATASYNC},	/* Synchronize output data before finishing.  */
-  {"fsync", C_FSYNC},		/* Also synchronize output metadata.  */
-  //{"dynamic", C_DYNAMIC},       /* When read errors occur on input, try to
-  //                                 re-read smaller pieces of the block to
-  //                                 maximize data recovery */
-  {"", 0}
-};
-
-/* Flags, for iflag="..." and oflag="...".  */
-static struct symbol_value const flags[] =
-{
-  {"append",	O_APPEND},
-  {"binary",	O_BINARY},
-  {"direct",	O_DIRECT},
-  {"directory",	O_DIRECTORY},
-  {"dsync",	O_DSYNC},
-  {"noatime",	O_NOATIME},
-  {"noctty",	O_NOCTTY},
-  {"nofollow",	HAVE_WORKING_O_NOFOLLOW ? O_NOFOLLOW : 0},
-  {"nolinks",	O_NOLINKS},
-  {"nonblock",	O_NONBLOCK},
-  {"sync",	O_SYNC},
-  {"text",	O_TEXT},
-  {"",		0}
-};
-
-/* Status, for status="...".  */
-static struct symbol_value const statuses[] =
-{
-  {"noxfer",	STATUS_NOXFER},
-  {"",		0}
-};
-
-/* Translation table formed by applying successive transformations. */
-static unsigned char trans_table[256];
-
-static char const ascii_to_ebcdic[] =
-{
-  '\000', '\001', '\002', '\003', '\067', '\055', '\056', '\057',
-  '\026', '\005', '\045', '\013', '\014', '\015', '\016', '\017',
-  '\020', '\021', '\022', '\023', '\074', '\075', '\062', '\046',
-  '\030', '\031', '\077', '\047', '\034', '\035', '\036', '\037',
-  '\100', '\117', '\177', '\173', '\133', '\154', '\120', '\175',
-  '\115', '\135', '\134', '\116', '\153', '\140', '\113', '\141',
-  '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
-  '\370', '\371', '\172', '\136', '\114', '\176', '\156', '\157',
-  '\174', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
-  '\310', '\311', '\321', '\322', '\323', '\324', '\325', '\326',
-  '\327', '\330', '\331', '\342', '\343', '\344', '\345', '\346',
-  '\347', '\350', '\351', '\112', '\340', '\132', '\137', '\155',
-  '\171', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
-  '\210', '\211', '\221', '\222', '\223', '\224', '\225', '\226',
-  '\227', '\230', '\231', '\242', '\243', '\244', '\245', '\246',
-  '\247', '\250', '\251', '\300', '\152', '\320', '\241', '\007',
-  '\040', '\041', '\042', '\043', '\044', '\025', '\006', '\027',
-  '\050', '\051', '\052', '\053', '\054', '\011', '\012', '\033',
-  '\060', '\061', '\032', '\063', '\064', '\065', '\066', '\010',
-  '\070', '\071', '\072', '\073', '\004', '\024', '\076', '\341',
-  '\101', '\102', '\103', '\104', '\105', '\106', '\107', '\110',
-  '\111', '\121', '\122', '\123', '\124', '\125', '\126', '\127',
-  '\130', '\131', '\142', '\143', '\144', '\145', '\146', '\147',
-  '\150', '\151', '\160', '\161', '\162', '\163', '\164', '\165',
-  '\166', '\167', '\170', '\200', '\212', '\213', '\214', '\215',
-  '\216', '\217', '\220', '\232', '\233', '\234', '\235', '\236',
-  '\237', '\240', '\252', '\253', '\254', '\255', '\256', '\257',
-  '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
-  '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
-  '\312', '\313', '\314', '\315', '\316', '\317', '\332', '\333',
-  '\334', '\335', '\336', '\337', '\352', '\353', '\354', '\355',
-  '\356', '\357', '\372', '\373', '\374', '\375', '\376', '\377'
-};
-
-static char const ascii_to_ibm[] =
-{
-  '\000', '\001', '\002', '\003', '\067', '\055', '\056', '\057',
-  '\026', '\005', '\045', '\013', '\014', '\015', '\016', '\017',
-  '\020', '\021', '\022', '\023', '\074', '\075', '\062', '\046',
-  '\030', '\031', '\077', '\047', '\034', '\035', '\036', '\037',
-  '\100', '\132', '\177', '\173', '\133', '\154', '\120', '\175',
-  '\115', '\135', '\134', '\116', '\153', '\140', '\113', '\141',
-  '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
-  '\370', '\371', '\172', '\136', '\114', '\176', '\156', '\157',
-  '\174', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
-  '\310', '\311', '\321', '\322', '\323', '\324', '\325', '\326',
-  '\327', '\330', '\331', '\342', '\343', '\344', '\345', '\346',
-  '\347', '\350', '\351', '\255', '\340', '\275', '\137', '\155',
-  '\171', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
-  '\210', '\211', '\221', '\222', '\223', '\224', '\225', '\226',
-  '\227', '\230', '\231', '\242', '\243', '\244', '\245', '\246',
-  '\247', '\250', '\251', '\300', '\117', '\320', '\241', '\007',
-  '\040', '\041', '\042', '\043', '\044', '\025', '\006', '\027',
-  '\050', '\051', '\052', '\053', '\054', '\011', '\012', '\033',
-  '\060', '\061', '\032', '\063', '\064', '\065', '\066', '\010',
-  '\070', '\071', '\072', '\073', '\004', '\024', '\076', '\341',
-  '\101', '\102', '\103', '\104', '\105', '\106', '\107', '\110',
-  '\111', '\121', '\122', '\123', '\124', '\125', '\126', '\127',
-  '\130', '\131', '\142', '\143', '\144', '\145', '\146', '\147',
-  '\150', '\151', '\160', '\161', '\162', '\163', '\164', '\165',
-  '\166', '\167', '\170', '\200', '\212', '\213', '\214', '\215',
-  '\216', '\217', '\220', '\232', '\233', '\234', '\235', '\236',
-  '\237', '\240', '\252', '\253', '\254', '\255', '\256', '\257',
-  '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
-  '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
-  '\312', '\313', '\314', '\315', '\316', '\317', '\332', '\333',
-  '\334', '\335', '\336', '\337', '\352', '\353', '\354', '\355',
-  '\356', '\357', '\372', '\373', '\374', '\375', '\376', '\377'
-};
-
-static char const ebcdic_to_ascii[] =
-{
-  '\000', '\001', '\002', '\003', '\234', '\011', '\206', '\177',
-  '\227', '\215', '\216', '\013', '\014', '\015', '\016', '\017',
-  '\020', '\021', '\022', '\023', '\235', '\205', '\010', '\207',
-  '\030', '\031', '\222', '\217', '\034', '\035', '\036', '\037',
-  '\200', '\201', '\202', '\203', '\204', '\012', '\027', '\033',
-  '\210', '\211', '\212', '\213', '\214', '\005', '\006', '\007',
-  '\220', '\221', '\026', '\223', '\224', '\225', '\226', '\004',
-  '\230', '\231', '\232', '\233', '\024', '\025', '\236', '\032',
-  '\040', '\240', '\241', '\242', '\243', '\244', '\245', '\246',
-  '\247', '\250', '\133', '\056', '\074', '\050', '\053', '\041',
-  '\046', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
-  '\260', '\261', '\135', '\044', '\052', '\051', '\073', '\136',
-  '\055', '\057', '\262', '\263', '\264', '\265', '\266', '\267',
-  '\270', '\271', '\174', '\054', '\045', '\137', '\076', '\077',
-  '\272', '\273', '\274', '\275', '\276', '\277', '\300', '\301',
-  '\302', '\140', '\072', '\043', '\100', '\047', '\075', '\042',
-  '\303', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
-  '\150', '\151', '\304', '\305', '\306', '\307', '\310', '\311',
-  '\312', '\152', '\153', '\154', '\155', '\156', '\157', '\160',
-  '\161', '\162', '\313', '\314', '\315', '\316', '\317', '\320',
-  '\321', '\176', '\163', '\164', '\165', '\166', '\167', '\170',
-  '\171', '\172', '\322', '\323', '\324', '\325', '\326', '\327',
-  '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
-  '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
-  '\173', '\101', '\102', '\103', '\104', '\105', '\106', '\107',
-  '\110', '\111', '\350', '\351', '\352', '\353', '\354', '\355',
-  '\175', '\112', '\113', '\114', '\115', '\116', '\117', '\120',
-  '\121', '\122', '\356', '\357', '\360', '\361', '\362', '\363',
-  '\134', '\237', '\123', '\124', '\125', '\126', '\127', '\130',
-  '\131', '\132', '\364', '\365', '\366', '\367', '\370', '\371',
-  '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
-  '\070', '\071', '\372', '\373', '\374', '\375', '\376', '\377'
-};
-
-/* True if we need to close the standard output *stream*.  */
-static bool close_stdout_required = true;
-
-/* The only reason to close the standard output *stream* is if
-   parse_long_options fails (as it does for --help or --version).
-   In any other case, dd uses only the STDOUT_FILENO file descriptor,
-   and the "cleanup" function calls "close (STDOUT_FILENO)".
-   Closing the file descriptor and then letting the usual atexit-run
-   close_stdout function call "fclose (stdout)" would result in a
-   harmless failure of the close syscall (with errno EBADF).
-   This function serves solely to avoid the unnecessary close_stdout
-   call, once parse_long_options has succeeded.  */
-static void
-maybe_close_stdout (void)
-{
-  if (close_stdout_required)
-    close_stdout ();
-}
-
-void
-usage (int status)
-{
-  if (status != EXIT_SUCCESS)
-    fprintf (stderr, _("Try `%s --help' for more information.\n"),
-	     program_name);
-  else
-    {
-      printf (_("\
-Usage: %s [OPERAND]...\n\
-  or:  %s OPTION\n\
-"),
-	      program_name, program_name);
-      fputs (_("\
-Copy a file, converting and formatting according to the operands.\n\
-\n\
-  bs=BYTES        force ibs=BYTES and obs=BYTES\n\
-  cbs=BYTES       convert BYTES bytes at a time\n\
-  conv=CONVS      convert the file as per the comma separated symbol list\n\
-  count=SECTORS   copy only SECTORS input sectors\n\
-  ibs=BYTES       read BYTES bytes at a time (must be a multiple of input sector size)\n\
-"), stdout);
-      fputs (_("\
-  if=FILE         read from FILE instead of stdin\n\
-  ifjoin=BASE.FMT   read from split files with name BASE and splitformat FMT\n\
-  iflag=FLAGS     read as per the comma separated symbol list\n\
-  pattern=HEX     write HEX to every byte of the output\n\
-  textpattern=TEXT   write the string TEXT repeatedly to the output\n\
-  obs=BYTES       write BYTES bytes at a time\n\
-  of=FILE         write to FILE instead of stdout\n\
-  of:=COMMAND     pipe output to the given command\n\
-  oflag=FLAGS     write as per the comma separated symbol list\n\
-  wipe=FILE       wipe device FILE with zeros (or specify pattern/textpattern)\n\
-  seek=SECTORS    skip SECTORS input sectors at start of output\n\
-  skip=SECTORS    skip SECTORS input sectors at start of input\n\
-  status=noxfer   suppress transfer statistics\n\
-"), stdout);
-      fputs (_("\
-  split=BYTES     split the output into pieces of size BYTES\n\
-  splitformat=FMT   create extensions for split pieces using FMT\n\
-                  Extensions can be numerical starting at zero,\n\
-                  numerical starting at one, or alphabetical.\n\
-                  These options are selected by using a series of\n\
-                  zeros, ones, or a's, respectively. The number\n\
-                  of characters used indicates the desired length of\n\
-                  the extensions. For example, splitformat=1111\n\
-                  indicates four character numerical extensions\n\
-                  starting with 0001.\n\
-  progress=on     displays a progress meter\n\
-  progresscount=NUM  number of blocks processed between each progress update\n\
-  sizeprobe=on    estimates size of input file for use with status\n\
-  hash=ALGORITHM  computes ALGORITHM hashes of the input data\n\
-  hashconv=WHEN   determines when data should be hashed, either before\n\
-                  or after conversions\n\
-"), stdout);
-      /*
-  hashformat=FORMAT         format for writing piecewise hashes\n\
-  totalhashformat=FORMAT    format for writing overall hashes\n\
-      */
-      fputs (_("\
-  hashwindow=BYTES  number of bytes for piecewise hashing\n\
-  hashlog=FILE    appends piecewise hashes to the log file\n\
-  errlog=FILE     appends errors to the log file\n\
-  log=FILE        appends hashes and errors to the same file\n\
-  errors=group    group read errors together\n\
-"), stdout);  
-      fputs (_("\
-  vf=FILE         verify the input against FILE\n\
-  vfjoin=BASE.FMT verify the input against split files with name BASE and splitformat FMT\n\
-  verifylog=FILE  write the results of the verify to the given file\n\
-"), stdout);
-
-      fputs (_("\
-\n\
-ALGORITHM can be a comma separated list of md5, sha1, sha256, and sha512\n\
-\n\
-"), stdout);  
-      fputs (_("\
-\n\
-BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n\
-xM M, c 1, w 2, b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,\n\
-GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.\n\
-\n\
-Each CONV symbol may be:\n\
-\n\
-"), stdout);
-      fputs (_("\
-  ascii     from EBCDIC to ASCII\n\
-  ebcdic    from ASCII to EBCDIC\n\
-  ibm       from ASCII to alternate EBCDIC\n\
-  block     pad newline-terminated records with spaces to cbs-size\n\
-  unblock   replace trailing spaces in cbs-size records with newline\n\
-  lcase     change upper case to lower case\n\
-"), stdout);
-      fputs (_("\
-  nocreat   do not create the output file\n\
-  excl      fail if the output file already exists\n\
-  notrunc   do not truncate the output file\n\
-  ucase     change lower case to upper case\n\
-  swab      swap every pair of input bytes\n\
-"), stdout);
-      fputs (_("\
-  noerror   continue after read errors\n\
-  sync      pad every input block with NULs to ibs-size; when used\n\
-            with block or unblock, pad with spaces rather than NULs\n\
-  fdatasync  physically write output file data before finishing\n\
-  fsync     likewise, but also write metadata\n\
-"), stdout);
-      fputs (_("\
-\n\
-Each FLAG symbol may be:\n\
-\n\
-  append    append mode (makes sense only for output; conv=notrunc suggested)\n\
-"), stdout);
-      if (O_DIRECT)
-	fputs (_("  direct    use direct I/O for data\n"), stdout);
-      if (O_DIRECTORY)
-	fputs (_("  directory fail unless a directory\n"), stdout);
-      if (O_DSYNC)
-	fputs (_("  dsync     use synchronized I/O for data\n"), stdout);
-      if (O_SYNC)
-	fputs (_("  sync      likewise, but also for metadata\n"), stdout);
-      if (O_NONBLOCK)
-	fputs (_("  nonblock  use non-blocking I/O\n"), stdout);
-      if (O_NOATIME)
-	fputs (_("  noatime   do not update access time\n"), stdout);
-      if (O_NOCTTY)
-	fputs (_("  noctty    do not assign controlling terminal from file\n"),
-	       stdout);
-      if (HAVE_WORKING_O_NOFOLLOW)
-	fputs (_("  nofollow  do not follow symlinks\n"), stdout);
-      if (O_NOLINKS)
-	fputs (_("  nolinks   fail if multiply-linked\n"), stdout);
-      if (O_BINARY)
-	fputs (_("  binary    use binary I/O for data\n"), stdout);
-      if (O_TEXT)
-	fputs (_("  text      use text I/O for data\n"), stdout);
-
-      {
-	char const *siginfo_name = (SIGINFO == SIGUSR1 ? "USR1" : "INFO");
-	printf (_("\
-\n\
-Sending a %s signal to a running `dd' process makes it\n\
-print I/O statistics to standard error and then resume copying.\n\
-\n\
-  $ dd if=/dev/zero of=/dev/null& pid=$!\n\
-  $ kill -%s $pid; sleep 1; kill $pid\n\
-  18335302+0 sectors in\n\
-  18335302+0 sectors out\n\
-  9387674624 bytes (9.4 GB) copied, 34.6279 seconds, 271 MB/s\n\
-\n\
-Options are:\n\
-\n\
-"),
-		siginfo_name, siginfo_name);
-      }
-
-      fputs (HELP_OPTION_DESCRIPTION, stdout);
-      fputs (VERSION_OPTION_DESCRIPTION, stdout);
-      fputs ("      --flags    display compile-time flags\n", stdout);
-      emit_bug_reporting_address ();
-    }
-  exit (status);
-}
-
-
-
-
-/** Begin code copied (and modified) from ../lib/error.c **/
+// Begin code copied (and modified) from ../lib/error.c 
 
 #define __strerror_r strerror_r
 
 static void
-print_errno_message (int errnum)
+report_errno_message(int errnum)
 {
-  char const *s;
+   char const *s;
 
 #if defined HAVE_STRERROR_R || _LIBC
-  char errbuf[1024];
-# if STRERROR_R_CHAR_P || _LIBC
-  s = __strerror_r (errnum, errbuf, sizeof errbuf);
+   char errbuf[DISPLAY_MESSAGE_LENGTH];
+#if STRERROR_R_CHAR_P || _LIBC
+   s = __strerror_r(errnum, errbuf, sizeof errbuf);
 # else
-  if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0)
-    s = errbuf;
-  else
-    s = 0;
+   if (__strerror_r(errnum, errbuf, sizeof errbuf) == 0)
+   {
+      s = errbuf;
+   }
+   else
+   {
+      s = 0;
+   }
 # endif
 #else
-  s = strerror (errnum);
+   s = strerror(errnum);
 #endif
 
 #if !_LIBC
-  if (! s)
-    s = _("Unknown system error");
+   if (!s)
+   {
+      s = _("system error");
+   }
 #endif
 
 #if _LIBC
-  __fxprintf (NULL, ": %s", s);
+   __fxprintf(NULL, ": %s", s);
 #else
-  fprintf (stderr, ": %s", s);
-  if (error_log != NULL)
-    fprintf (error_log, ": %s", s);
+   fprintf(stderr, ": %s", s);
+   if (log != NULL)
+   {
+      fprintf(log, ": %s", s);
+   }
 #endif
 }
 
-
-
 static void
-dc3_error_tail(int status, int errnum, const char *message, va_list args)
+report_error_tail(int status, int errnum, const char *message, va_list args)
 {
-  va_list arg2;
-  va_copy(arg2,args);
+   va_list arg2;
+   va_copy(arg2, args);
 
 #if _LIBC
-  if (_IO_fwide (stderr, 0) > 0)
-    {
+   if (_IO_fwide (stderr, 0) > 0)
+   {
 # define ALLOCA_LIMIT 2000
-      size_t len = strlen (message) + 1;
+      size_t len = strlen(message) + 1;
       wchar_t *wmessage = NULL;
       mbstate_t st;
       size_t res;
@@ -1287,3034 +480,4017 @@ dc3_error_tail(int status, int errnum, const char *message, va_list args)
       bool use_malloc = false;
       
       while (1)
-        {
-          if (__libc_use_alloca (len * sizeof (wchar_t)))
-            wmessage = (wchar_t *) alloca (len * sizeof (wchar_t));
-          else
+      {
+         if (__libc_use_alloca(len * sizeof (wchar_t)))
+         {
+            wmessage = (wchar_t *)alloca(len * sizeof (wchar_t));
+         }
+         else
+         {
+            if (!use_malloc)
             {
-              if (!use_malloc)
-                wmessage = NULL;
-	      
-              wchar_t *p = (wchar_t *) realloc (wmessage,
-                                                len * sizeof (wchar_t));
-              if (p == NULL)
-                {
-                  free (wmessage);
-                  fputws_unlocked (L"out of memory\n", stderr);
-                  return;
-                }
-              wmessage = p;
-              use_malloc = true;
+               wmessage = NULL;
             }
-	  memset (&st, '\0', sizeof (st));
-          tmp = message;
-
-          res = mbsrtowcs (wmessage, &tmp, len, &st);
-          if (res != len)
-            break;
 
-          if (__builtin_expect (len >= SIZE_MAX / 2, 0))
+            wchar_t *p = (wchar_t *)realloc(wmessage, len * sizeof (wchar_t));
+            if (p == NULL)
             {
-              /* This really should not happen if everything is fine.  */
-              res = (size_t) -1;
-              break;
+               free (wmessage);
+               fputws_unlocked(L"out of memory\n", stderr);
+               return;
             }
+            wmessage = p;
+            use_malloc = true;
+         }
+         memset(&st, '\0', sizeof (st));
+         tmp = message;
+
+         res = mbsrtowcs(wmessage, &tmp, len, &st);
+         if (res != len)
+         {
+            break;
+         }
 
-          len *= 2;
-        }
-
-      if (res == (size_t) -1)
-        {
-          /* The string cannot be converted.  */
-          if (use_malloc)
-            {
-              free (wmessage);
-              use_malloc = false;
-            }
-          wmessage = (wchar_t *) L"???";
-        }
+         if (__builtin_expect(len >= SIZE_MAX / 2, 0))
+         {
+            res = (size_t)-1;
+            break;
+         }
 
-      __vfwprintf (stderr, wmessage, args);
-      if (error_log != NULL)
-	__vfwprintf (error_log, wmessage, arg2);
+            len *= 2;
+      }
 
+      if (res == (size_t)-1)
+      {
+         // The string cannot be converted. 
+         if (use_malloc)
+         {
+            free (wmessage);
+            use_malloc = false;
+         }
+         wmessage = (wchar_t *) L"???";
+      }
 
+      __vfwprintf(stderr, wmessage, args);
+      if (log != NULL)
+      {
+         __vfwprintf(log, wmessage, arg2);
+      }
+      
       if (use_malloc)
-        free (wmessage);
-    }
-  else
+      {
+         free(wmessage);
+      }
+   }
+   else
 #endif
-    {
-      vfprintf (stderr, message, args);
-      if (error_log != NULL)
-	vfprintf (error_log, message, arg2);
-    }
+   {
+      vfprintf(stderr, message, args);
+      if (log != NULL)
+      {
+         vfprintf(log, message, arg2);
+      }
+   }
 
-  va_end (args);
+  va_end(args);
   
-  ++error_message_count;
-  if (errnum)
-    print_errno_message (errnum);
+   ++error_message_count;
+   if (errnum)
+   {
+      report_errno_message(errnum);
+   }
+   
 #if _LIBC
-  __fxprintf (NULL, "\n");
+      __fxprintf(NULL, "\n");
 #else
-  putc ('\n', stderr);
-  if (error_log != NULL)
-    {
-      putc ('\n', error_log);
-      fflush(error_log);
-    }
+   putc('\n', stderr);
+   if (log != NULL)
+   {
+      putc('\n', log);
+      fflush(log);
+   }
 #endif
-  fflush (stderr);
-  if (status)
-    exit (status); 
-}
-
-
 
+   fflush(stderr);
+   if(status)
+   {
+      usage(status); 
+   }
+}
 
 static void 
-dc3_error(int status, int errnum, const char *message, ...)
+report_error(int status, int errnum, const char *message, ...)
 {
-  va_list args;
-  
+   pthread_mutex_lock(&reporting_lock);
+
 #if defined _LIBC && defined __libc_ptf_call
-  /* We do not want this call to be cut short by a thread
-     cancellation.  Therefore disable cancellation for now.  */
-  int state = PTHREAD_CANCEL_ENABLE;
-  __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state),
-                   0);
+   int state = PTHREAD_CANCEL_ENABLE;
+   __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), 0);
 #endif
-  
-  fflush (stdout);
+
+   fflush (stdout);
+   
 #ifdef _LIBC
-  _IO_flockfile (stderr);
+   _IO_flockfile (stderr);
 #endif
 #if _LIBC
-  __fxprintf (NULL, "%s%s: ", (dc3_progress_printed?"\n":""),program_name);
+   __fxprintf (NULL, "%s[!!] ", progress_displayed ? "\n" : "");
 #else
-  fprintf (stderr, "%s%s: ", (dc3_progress_printed?"\n":""),program_name);
+   fprintf (stderr, "%s[!!] ", progress_displayed ? "\n" : "");
 #endif
 
-  if (error_log != NULL)
-    fprintf (error_log, "%s: ", program_name);
+   if (log)
+   {
+      fputs("[!!] ", log);
+   }
+
+   va_list args;
+   va_start(args, message);
+   report_error_tail(status, errnum, message, args);
 
-  va_start (args, message);
-  dc3_error_tail(status,errnum,message,args);
-  
 #ifdef _LIBC
-  _IO_funlockfile (stderr);
+   _IO_funlockfile (stderr);
 # ifdef __libc_ptf_call
-  __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0);
-# endif
-#endif
-}
-
-/** End code copied (and modified) from ../lib/error.c **/
- 
-
-/** Begin code copied (and modified) from md5deep helpers.c **/
-
-#ifdef __linux__
-
-#ifdef HAVE_SYS_IOCTL_H
-#ifdef HAVE_SYS_MOUNT_H
-
-# include <sys/mount.h>
-
+   __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0);
 #endif
 #endif
 
-static void 
-dc3_probe_file(int fd)
-{
-  uintmax_t num_sectors = 0, sector_size = 0;
-  struct stat sb;
-
-  if (fstat(fd,&sb))
-    return;
-
-  if (S_ISREG(sb.st_mode) || S_ISDIR(sb.st_mode))
-    {
-      input_bytes = sb.st_size;
-      return;
-    }
-
-#ifdef HAVE_SYS_IOCTL_H
-#ifdef HAVE_SYS_MOUNT_H
-
-  if (S_ISCHR(sb.st_mode) || S_ISBLK(sb.st_mode))
-  {
-#if defined(_IO) && defined(BLKGETSIZE)
-    if (ioctl(fd, BLKGETSIZE, &num_sectors))
-      return;
-#else
-    // If we can't run the ioctl call, we can't do anything here
-    return;
-#endif // ifdefined _IO and BLKGETSIZE
-
-
-
-#if defined(_IO) && defined(BLKSSZGET)
-
-    if (ioctl(fd, BLKSSZGET, &sector_size))
-      return;
-
-
-    if (sector_size != 0)
-    {
-      //fprintf(stderr, "dc3_probe_file: probed sector size to be %d\n", sector_size);
-      dc3_sectorsize = sector_size;
-    }
-
-    if (0 == sector_size)
-      sector_size = 512;
-    else if (sector_size != 512)
-        // fixup num_sectors if necessary
-        num_sectors = num_sectors * 512 / sector_size;
-#else
-    sector_size = 512;
-#endif  // ifdef _IO and BLKSSZGET
-
-    input_bytes = (num_sectors * sector_size);
-
-    //fprintf(stderr, "dc3_probe_file: input_bytes = %jd (%jd * %jd)\n", input_bytes, num_sectors, sector_size);
-  }
-
-
-
-#endif // #ifdef HAVE_SYS_MOUNT_H
-#endif // #ifdef HAVE_SYS_IOCTL_H
-}  
+   pthread_mutex_unlock(&reporting_lock);
+}
 
+// End code copied (and modified) from ../lib/error.c 
 
-static void 
-dc3_probe_sectorsize(int fd)
+static void
+report_to_log(const char* message)
 {
-  uintmax_t sector_size = 0;
-  struct stat sb;
+   pthread_mutex_lock(&reporting_lock);
 
-  if (fstat(fd,&sb))
-    return;
+   // Write the message to the console and to the log, if it exists.
+   fputs(message, stderr);   
+   if (log)
+   {
+      fputs(message, log);
+   }
 
-  if (S_ISREG(sb.st_mode) || S_ISDIR(sb.st_mode))
-    {
-      input_bytes = sb.st_size;
-      return;
-    }
-
-#ifdef HAVE_SYS_IOCTL_H
-#ifdef HAVE_SYS_MOUNT_H
-
-  if (S_ISCHR(sb.st_mode) || S_ISBLK(sb.st_mode))
-  {
-#if defined(_IO) && defined(BLKSSZGET)
-
-    if (ioctl(fd, BLKSSZGET, &sector_size))
-      return;
-
-    if (sector_size != 0)
-    {
-      //fprintf(stderr, "dc3_probe_sectorsize: probed sector size to be %d\n", sector_size);
-      dc3_sectorsize = sector_size;
-    }
-
-#endif  // ifdef _IO and BLKSSZGET
-  }
-
-#endif // #ifdef HAVE_SYS_MOUNT_H
-#endif // #ifdef HAVE_SYS_IOCTL_H
+   pthread_mutex_unlock(&reporting_lock);
 }
 
-
-
-#elif defined (__APPLE__)
-
-#ifdef HAVE_SYS_IOCTL_H
-# include <sys/disk.h>
-# include <sys/ioctl.h>
-#endif
-
-static void 
-dc3_probe_file(int fd)
-{
-  struct stat info;
-  off_t total = 0;
-  /* RBF - Is there a better way to emulate ftell? */
-  off_t original = lseek(fd,0,SEEK_CUR);
-  uint32_t blocksize = 0;
-  uint64_t blockcount = 0;
-
-  /* I'd prefer not to use fstat as it will follow symbolic links. We don't
-     follow symbolic links. That being said, all symbolic links *should*
-     have been caught before we got here. */
-
-  if (fstat(fd, &info))
-    return;
-
-#ifdef HAVE_SYS_IOCTL_H
-  /* Block devices, like /dev/hda, don't return a normal filesize.
-     If we are working with a block device, we have to ask the operating
-     system to tell us the true size of the device. 
-     
-     This isn't the recommended way to do check for block devices, 
-     but using S_ISBLK(info.stmode) wasn't working. */
-  if (info.st_mode & S_IFBLK)
-  {    
-    /* Get the block size */
-    if (ioctl(fd, DKIOCGETBLOCKSIZE,&blocksize) < 0) 
-      return;
-
-  /* Get the number of blocks */
-    if (ioctl(fd, DKIOCGETBLOCKCOUNT, &blockcount) < 0) 
-      return;
- 
-    if (blocksize != 0)
-    {
-      //fprintf(stderr, "dc3_probe_file: probed sector size to be %d\n", blocksize);
-      dc3_sectorsize = blocksize;
-    }
-
-    total = blocksize * blockcount;
-  }
-#endif     // ifdef HAVE_IOCTL_H
-
-  else 
-  {
-    total = lseek(fd,0,SEEK_END);
-    if ((lseek(fd,original,SEEK_SET)))
-      return;
-  }
-
-  input_bytes = (total - original);
+static void
+report_to_hash_log_or_log(char* message)
+{
+   pthread_mutex_lock(&reporting_lock);
+
+   // Write the message to the console, and to the hash log, if it exists.
+   // If the hash log does not exist, write the message to the log,
+   // if it exists.
+   fputs(message, stderr);   
+   if (hash_log)
+   {
+      fputs(message, hash_log);
+   }
+   else if (log)
+   {
+      fputs(message, log);
+   }
+
+   pthread_mutex_unlock(&reporting_lock);
 }
 
-
-static void 
-dc3_probe_sectorsize(int fd)
-{
-  struct stat info;
-  uint32_t blocksize = 0;
-
-  /* I'd prefer not to use fstat as it will follow symbolic links. We don't
-     follow symbolic links. That being said, all symbolic links *should*
-     have been caught before we got here. */
-
-  if (fstat(fd, &info))
-    return;
-
-#ifdef HAVE_SYS_IOCTL_H
-  /* Block devices, like /dev/hda, don't return a normal filesize.
-     If we are working with a block device, we have to ask the operating
-     system to tell us the true size of the device. 
-     
-     This isn't the recommended way to do check for block devices, 
-     but using S_ISBLK(info.stmode) wasn't working. */
-  if (info.st_mode & S_IFBLK)
-  {    
-    /* Get the block size */
-    if (ioctl(fd, DKIOCGETBLOCKSIZE,&blocksize) < 0) 
-      return;
-  
-    if (blocksize != 0)
-    {
-      //fprintf(stderr, "dc3_probe_sectorsize: probed sector size to be %d\n", blocksize);
-      dc3_sectorsize = blocksize;
-    }
-    //else { fprintf(stderr, "dc3_probe_sectorsize: failed to probe sector size\n"); }
-  }
-#endif     // ifdef HAVE_IOCTL_H
+static void
+report_to_all(char* message)
+{
+   pthread_mutex_lock(&reporting_lock);
+
+   // Write the message to the console, and to the log and hash log,
+   // if they exist.
+   fputs(message, stderr);   
+   if (log)
+   {
+      fputs(message, log);
+   }
+   if (hash_log)
+   {
+      fputs(message, hash_log);
+   }
+
+   pthread_mutex_unlock(&reporting_lock);
 }
 
-#elif defined (__CYGWIN__) // ifdef __APPLE__
-
-#include <sys/ioctl.h>
-#include <cygwin/types.h>
-#include <cygwin/fs.h>
-
-
-static void 
-dc3_probe_file(int fd)
+static char*
+get_formatted_time_string()
 {
-  uintmax_t num_sectors = 0, sector_size = 0;
-  struct stat sb;
-
-  if (fstat(fd,&sb))
-    return;
-
-  if (S_ISREG(sb.st_mode) || S_ISDIR(sb.st_mode))
-    {
-      input_bytes = sb.st_size;
-      return;
-    }
-
-  if (S_ISCHR(sb.st_mode) || S_ISBLK(sb.st_mode))
-  {
-    if (ioctl(fd, BLKGETSIZE, &num_sectors))
-      return;
-
-    if (ioctl(fd, BLKSSZGET, &sector_size))
-      return;
-
-    if (sector_size != 0)
-      dc3_sectorsize = sector_size;
-
-    if (0 == sector_size)
-      sector_size = 512;
-    else if (sector_size != 512) // fixup num_sectors if necessary
-        num_sectors = num_sectors * 512 / sector_size;
-
-    input_bytes = (num_sectors * sector_size);
-
-    //fprintf(stderr, "dc3_probe_file: input_bytes = %jd (%jd * %jd)\n",
-    //        input_bytes, num_sectors, sector_size);
-  }
-}  
+   // Get the current local time.
+   time_t t = time(NULL);
+   struct tm tm;
+   struct tm* ret = localtime_r(&t, &tm);
+   if (ret == NULL)
+   {
+      report_error(DC3DD_EXIT_ABORTED, errno, "localtime() failed");
+   }
+
+   // Put it in string form.
+   const size_t len = 32; // More than enough to hold 'YYYY-MM-DD HH:MM:SS -0000'
+   char* time_str = (char*)malloc(len);
+   if (strftime(time_str, len, "%F %T %z", &tm) == 0)
+   {
+      report_error(DC3DD_EXIT_ABORTED, 0, "strftime() returned 0");
+   }
+   return time_str;
+}
 
-static void 
-dc3_probe_sectorsize(int fd)
+static void
+report_exit_message(int exit_code)
 {
-  uintmax_t sector_size = 0;
-  struct stat sb;
-
-  if (fstat(fd,&sb))
-    return;
-
-  if (S_ISREG(sb.st_mode) || S_ISDIR(sb.st_mode))
-    {
-      input_bytes = sb.st_size;
-      return;
-    }
-
-  if (S_ISCHR(sb.st_mode) || S_ISBLK(sb.st_mode))
-  {
-    if (ioctl(fd, BLKSSZGET, &sector_size))
-      return;
-
-    if (sector_size != 0)
-      dc3_sectorsize = sector_size;
-
-    //fprintf(stderr, "dc3_probe_sectorsize: probed sector size to be %d\n", sector_size);
-  }
+   // Translate the exit code into a printable word.
+   const char* verb = NULL;
+   switch (exit_code)
+   {
+      case DC3DD_EXIT_COMPLETED:
+          verb = _("completed");
+          break;
+      case DC3DD_EXIT_ABORTED:
+          verb = _("aborted");
+          break;
+      case DC3DD_EXIT_FAILED:
+      case DC3DD_EXIT_CODE_NOT_SET: 
+      default:
+          verb = _("failed");
+          break;
+   }
+
+   // Write the exit message to all logs (i.e., console, log, hash log).
+   // The message acts as a sort of footer for the run.
+   char* formatted_stop_time = get_formatted_time_string();
+   char message[DISPLAY_MESSAGE_LENGTH];
+   sprintf(message, _("%s %s at %s\n\n"), PROGRAM_NAME, verb, formatted_stop_time);
+   free(formatted_stop_time);
+   report_to_all(message);
+   flush_logs();
 }
 
-#else // ifdef __CYGWIN__ 
-
-/* This is code for general UNIX systems 
-   (e.g. NetBSD, FreeBSD, OpenBSD, etc) */
-
-static off_t
-midpoint (off_t a, off_t b, long blksize)
+static void
+report_program_error(const char* assertion)
 {
-  off_t aprime = a / blksize;
-  off_t bprime = b / blksize;
-  off_t c, cprime;
-
-  cprime = (bprime - aprime) / 2 + aprime;
-  c = cprime * blksize;
-
-  return c;
+   char internal_error[DISPLAY_MESSAGE_LENGTH];
+   sprintf(internal_error, _("%s: internal error %s at line %d"), program_name, assertion, __LINE__);
+   report_to_log(internal_error);
+   report_exit_message(DC3DD_EXIT_ABORTED);
+   terminate_logging();
+   emit_bug_reporting_address();
+   exit(DC3DD_EXIT_ABORTED);
 }
 
-
-off_t find_dev_size(int fd, int blk_size)
+static void
+report_output_hashes(output_t* output)
 {
+   // Report the parallel hash lists stashed in the output struct.
+   char message[DISPLAY_MESSAGE_LENGTH];
+   output_t* actual_hash_output = output->actual_hashes;
+   output_t* expected_hash_output = output->expected_hashes;
+   while (actual_hash_output && expected_hash_output)
+   { 
+      hash_t* actual_hash = actual_hash_output->hash;
+      hash_t* expected_hash = expected_hash_output->hash;
+
+      // Report total hash match/mismatch.
+      sprintf(message, _("   %s %s (%s)\n"), 
+	 STREQ(actual_hash->result, expected_hash->result) ?  _("[ok]") : _("[MISMATCH]"),
+	 actual_hash->result,
+	 actual_hash->algorithm->name);
+      report_to_all(message);
+
+     // Report piecewise hashes of files, if any.
+     if (output->files)
+     {
+	uintmax_t start_sector = 0;
+	file_t* file = output->files;
+	hash_t* actual_piece = actual_hash->pieces;
+	hash_t* expected_piece = expected_hash->pieces;
+	while (file && actual_piece && expected_piece)         
+	{
+	   // For a file set, report piecewise hash matches/mismatches,
+	   // indented two levels.
+	   sprintf(message, _("      %s %s, sectors %"PRIuMAX" - %"PRIuMAX", %s\n"), 
+	      STREQ(actual_piece->result, expected_piece->result) ?  _("[ok]") : _("[MISMATCH]"),
+	      actual_piece->result,
+	      start_sector,
+	      start_sector + actual_piece->bytes_hashed / output->sector_size - 1,
+	      quote(file->name));
+	   report_to_hash_log_or_log(message);
+
+	   start_sector += actual_piece->bytes_hashed / output->sector_size;
+	   file = file->next_file;
+	   actual_piece = actual_piece->next_hash;
+	   expected_piece = expected_piece->next_hash;
+	}
+     }
 
-  off_t curr = 0, amount = 0;
-  void *buf;
-  
-  if (blk_size == 0)
-    return 0;
-  
-  buf = malloc(blk_size);
-  
-  for (;;) {
-    ssize_t nread;
-    
-    lseek(fd, curr, SEEK_SET);
-    nread = read(fd, buf, blk_size);
-    if (nread < blk_size) 
-    {
-      if (nread <= 0) 
-        {
-          if (curr == amount) 
-          {
-            free(buf);
-            lseek(fd, 0, SEEK_SET);
-            return amount;
-          }
-          curr = midpoint(amount, curr, blk_size);
-        }
-      else 
-        { /* 0 < nread < blk_size */
-          free(buf);
-          lseek(fd, 0, SEEK_SET);
-          return amount + nread;
-        }
-    } 
-    else 
-    {
-      amount = curr + blk_size;
-      curr = amount * 2;
-    }
-  }
-
-  free(buf);
-  lseek(fd, 0, SEEK_SET);
-  return amount;
+     actual_hash_output = actual_hash_output->next_output;
+     expected_hash_output = expected_hash_output->next_output;
+   }
 }
 
-
-static void 
-dc3_probe_file(int fd)
+static void
+report_input_hashes(output_t* output)
 {
-  struct stat sb;
-  
-  if (fstat(fd,&sb))
-    return;
-
-  if (S_ISREG(sb.st_mode) || S_ISDIR(sb.st_mode))
-    input_bytes = sb.st_size;
-  else if (S_ISCHR(sb.st_mode) || S_ISBLK(sb.st_mode))
-    input_bytes = find_dev_size(fd,sb.st_blksize);
-}  
-
-#endif // ifdef __LINUX__
-
-
-/** End code copied (and modified) from md5deep helpers.c **/
-
+   char message[DISPLAY_MESSAGE_LENGTH];
+   sprintf(message, _("   %s (%s)\n"),
+      output->hash->result, output->hash->algorithm->name);
+   report_to_all(message);
+
+   if (output->hash->pieces != NULL)
+   {
+      uintmax_t start_sector = 0;
+      hash_t* piece = output->hash->pieces;
+      while (piece)
+      {
+         sprintf(message, _("      %s, sectors %"PRIuMAX" - %"PRIuMAX"\n"),
+            piece->result,
+            start_sector,
+            start_sector + piece->bytes_hashed / output->sector_size - 1);
+         report_to_hash_log_or_log(message);
+         start_sector += piece->bytes_hashed / output->sector_size;
+         piece = piece->next_hash;
+      }
+   }
+}
 
 static void
-dc3_reprobe()
+report_files_IO(file_t* files, size_t sector_size, bool is_input)
 {
-    uintmax_t save = input_bytes;
-    input_bytes = 0;
-    dc3_probe_file(STDIN_FILENO);
-    input_bytes += save;
+   char message[DISPLAY_MESSAGE_LENGTH];
+   file_t* file = files;
+   while (file)
+   {
+      uintmax_t sectors = file->size_in_bytes / sector_size;
+      uintmax_t leftover_bytes = file->size_in_bytes % sector_size;
+      if (leftover_bytes == 0)
+      {
+	 sprintf(message,
+             _("      %"PRIuMAX" sectors %s %s\n"),
+            sectors, is_input ? _("in from") : _("out to"),
+            quote(file->name));
+      } 
+      else
+      {
+	 sprintf(message,
+             _("      %"PRIuMAX" sectors + %"PRIuMAX" bytes %s %s\n"), 
+	    sectors, leftover_bytes, 
+            is_input ?  _("in from") : _("out to"), quote(file->name));
+      }
+      report_to_log(message);
+      file = file->next_file;
+   }
 }
 
-
 static void
-translate_charset (char const *new_trans)
+report_file_IO(file_t* file, uintmax_t bytes, size_t sector_size, bool is_input)
 {
-  int i;
-
-  for (i = 0; i < 256; i++)
-    trans_table[i] = new_trans[trans_table[i]];
-  translation_needed = true;
+   // Write the file name.
+   char message[DISPLAY_MESSAGE_LENGTH];
+   sprintf(message, "%s results for %s %s:\n",
+      is_input ? _("input") : _("output"),
+      file->is_device ? _("device") : file->part_of_set ? _("files") : _("file"),
+      quote(file->unparsed_name));   
+   report_to_all(message);
+   
+   // Write the number of the sectors read or written.
+   uintmax_t sectors = bytes / sector_size;
+   uintmax_t leftover_bytes = bytes % sector_size;
+   if (leftover_bytes == 0)
+   {
+      sprintf(message, _("   %"PRIuMAX" sectors %s\n"), sectors, is_input ? _("in") : _("out"));
+   } 
+   else
+   {
+      sprintf(message, _("   %"PRIuMAX" sectors + %"PRIuMAX" bytes %s\n"), 
+         sectors, leftover_bytes, is_input ? _("in") : _("out"));
+   }
+   report_to_log(message);
 }
 
-/* Return true if I has more than one bit set.  I must be nonnegative.  */
-
-static inline bool
-multiple_bits_set (int i)
+static void 
+report_file_output(output_t* output)
 {
-  return (i & (i - 1)) != 0;
+   report_file_IO(output->current_file, output->bytes_output, output->sector_size, false);
+   if (verbose_reporting)
+   {
+      report_files_IO(output->files, output->sector_size, false);
+   }
 }
 
-/* Print transfer statistics.  */
-static void dc3_display_progress(int print_to_log);
-
-/* Options we use repeatedly whend displaying units */ 
-static int dc3_human_opts = \
-    (human_autoscale | human_round_to_nearest | human_suppress_point_zero 
-     | human_space_before_unit | human_SI | human_base_1024);
-
-static void
-print_stats (void)
-{
-  fprintf (stderr,
-	   _("%"PRIuMAX"+%"PRIuMAX" sectors in\n"
-	     "%"PRIuMAX"+%"PRIuMAX" sectors out\n"),
-	   dc3_sectors_r_full, dc3_sectors_r_partial,
-           dc3_sectors_w_full, dc3_sectors_w_partial);
-
-  if (error_log != NULL)
-    fprintf (error_log,
-	     _("%"PRIuMAX"+%"PRIuMAX" sectors in\n"
-	       "%"PRIuMAX"+%"PRIuMAX" sectors out\n"),
-	     dc3_sectors_r_full, dc3_sectors_r_partial,
-             dc3_sectors_w_full, dc3_sectors_w_partial);
-
-  if (r_truncate != 0)
-    {
-      fprintf (stderr,
-	       ngettext ("%"PRIuMAX" truncated record\n",
-			 "%"PRIuMAX" truncated records\n",
-			 select_plural (r_truncate)),
-	       r_truncate);
-      if (error_log != NULL)
-	fprintf (error_log,
-		 ngettext ("%"PRIuMAX" truncated record\n",
-			   "%"PRIuMAX" truncated records\n",
-			   select_plural (r_truncate)),
-		 r_truncate);
-    }
-
-  if (status_flags & STATUS_NOXFER)
-    return;
-
-  dc3_display_progress(true);
+static void 
+report_input(input_t* input)
+{
+   char message[DISPLAY_MESSAGE_LENGTH];   
+   if (input->current_file)
+   {
+      report_file_IO(input->current_file, input->bytes_input, input->sector_size, true);
+      if (input->current_file->is_device)
+      {
+	 sprintf(message, _("   %"PRIuMAX" bad sectors replaced by zeros\n"), input->bad_sectors);
+	 report_to_log(message);
+      }
 
-  /* Added to clear line now that dc3_display_progress uses \r */
-  fprintf(stderr,_("\n"));
+      if (verbose_reporting)
+      {
+         report_files_IO(input->files, input->sector_size, true);
+      }
+   }
+   else
+   {
+      sprintf(message, _("input results for pattern %s:\n"), quote(input->pattern_string));
+      report_to_all(message);
+      sprintf(message, _("   %"PRIuMAX" sectors in\n"), input->bytes_input / input->sector_size); 
+      report_to_all(message);
+   }
 }
 
+static void 
+report_results(job_t* jobs)
+{
+   pthread_mutex_lock(&reporting_lock);
+
+   // The first job is the imaging (or wiping) job, and there is only
+   // one task in an imaging job.
+   job_t* imaging_job = jobs;
+   task_t* imaging_task = jobs->tasks;
+   job_t* verification_job = imaging_job->next_job;
+
+   // Report progress, this time setting the final flag so it 
+   // is terminated with a newline character instead of a carriage
+   // return character and is written to the log (if present)
+   // as well as the console.
+   imaging_job->report_progress(imaging_job, true);
+   if (verification_job)
+   {
+      verification_job->report_progress(verification_job, true);
+   }
+   if (!compact_reporting) report_to_all("\n");
+
+   // Report input stats and hashes.
+   report_input(imaging_task->input);   
+   output_t* output = imaging_task->outputs;
+   while (output)
+   {
+      if (output->hash)
+      {
+	 report_input_hashes(output);
+      }
+      output = output->next_output;
+   }   
+   if (!compact_reporting) report_to_all("\n");
+
+   // Report output stats and hashes. 
+   output = imaging_task->outputs;
+   while (output)
+   {
+      if (output->current_file)
+      {
+	 report_file_output(output);
+	 if (output->current_file->verify_requested &&
+	     verification_job &&
+	     verification_job->exit_code == DC3DD_EXIT_COMPLETED)         
+	 {
+	    report_output_hashes(output);
+	 }             
+	 if (!compact_reporting) report_to_all("\n");
+      }
+      output = output->next_output;
+   }   
+   
+   pthread_mutex_unlock(&reporting_lock);
+}
 
-/* This function used to be part of print_stats. We need
-   to print this information as a progress meter, so I
-   moved it to a separate function - J Kornblum */
-static void dc3_display_progress(int print_to_log)
+static void
+report_verification_progress(job_t* job, bool final)
 {
-  char hbuf[LONGEST_HUMAN_READABLE + 1];
-  int human_opts = dc3_human_opts;
-  xtime_t now = gethrxtime ();
-  double delta_s;
-  char const *bytes_per_second;
-  float percent_done;
-  
-  /* Use integer arithmetic to compute the transfer rate,
-     since that makes it easy to use SI abbreviations.  */
-
-  const char* verb = NULL;
-  if (dc3_mode_verify)
-      verb = "compared";
-  else if (dc3_mode_wipe)
-      verb = "wiped";
-  else
-      verb = "copied";
-
-  fprintf (stderr,
-	   ngettext ("%"PRIuMAX" byte (%s) %s",
-		     "%"PRIuMAX" bytes (%s) %s",
-		     select_plural (w_bytes)),
-	   w_bytes,
-	   human_readable (w_bytes, hbuf, human_opts, 1, 1),
-           verb);
-  if (error_log != NULL && print_to_log)
-    fprintf (error_log,
-	     ngettext ("%"PRIuMAX" byte (%s) %s",
-		       "%"PRIuMAX" bytes (%s) %s",
-		       select_plural (w_bytes)),
-	     w_bytes,
-	     human_readable (w_bytes, hbuf, human_opts, 1, 1),
-             verb);
-
-  if (input_bytes != 0)
-    {
-      percent_done = 100 * (w_bytes / (float)input_bytes);
+   uintmax_t bytes_input = 0;
+   uintmax_t bytes_to_input = 0;
+   task_t* task = job->tasks;
+   while (task)
+   {
+      // Synchronization of this read-only access to the task thread data is not required
+      // since exact calculations are not required for the progress bar.
+      bytes_input += task->input->bytes_input;
+      bytes_to_input += task->input->bytes_to_input;
+      task = task->next_task;
+   }
+   float percent_complete = bytes_to_input ? 100.0f * (float)bytes_input / (float)bytes_to_input : 100.0f;
+
+   pthread_mutex_lock(&reporting_lock);
+   fprintf(stderr, "%79s", "\r");
+   if (bytes_to_input > 0)
+   {
+      fprintf(stderr, _("output hashing (%2.0f%%)%s"), percent_complete, final ? "\n" : "\r");
+      if (log && final)
+      {
+         fprintf(log, _("output hashing (%2.0f%%)\n"), percent_complete);
+      }
+   }
+   else
+   {
+      fprintf(stderr, _("output hashing (??%%)%s"), final ? "\n" : "\r");
+      if (log && final)
+      {
+         fputs(_("output hashing (??%%)\n"), log);
+      }
+   }
+   progress_displayed = true;
+   pthread_mutex_unlock(&reporting_lock);
+}
 
-      fprintf (stderr," (%2.0f%%)", percent_done);
-      if (error_log != NULL && print_to_log)
-          fprintf (error_log," (%2.0f%%)", percent_done);
-    }
-  else
-    {
-      fprintf (stderr," (??%%)");
-      if (error_log != NULL && print_to_log)
-          fprintf (error_log," (??%%)");
-    }
+static void
+report_imaging_progress(job_t* job, bool final)
+{
+   // There is only one task in an imaging job.
+   task_t* task = job->tasks;
+
+   int human_opts = (human_autoscale | human_round_to_nearest | human_suppress_point_zero | 
+      human_space_before_unit | human_SI | progress_bytes_reporting_flag);
+   char stats[DISPLAY_MESSAGE_LENGTH]; 
+   char hbuf[LONGEST_HUMAN_READABLE + 1];
+
+   pthread_mutex_lock(&reporting_lock);
+   fprintf(stderr, "%79s", "\r");
+
+   sprintf(stats, _("%"PRIuMAX" bytes (%s) copied"),
+      task->input->bytes_input,
+      human_readable(task->input->bytes_input, hbuf, human_opts, 1, 1));
+   fputs(stats, stderr);
+   if (log && final)
+   {
+      fputs(stats, log);
+   }
+   
+   if (task->input->bytes_to_input != INFINITE_BYTES)
+   {
+      // Oddly, the %% format specifier has no effect if this is done with sprintf(). 
+      float percent_complete =
+         100.0f * ((float)task->input->bytes_input / (float)task->input->bytes_to_input);
+      fprintf(stderr, " (%2.0f%%)", percent_complete);   
+      if (log && final)
+      {
+         fprintf(log, " (%2.0f%%)", percent_complete);
+      }
+   }
+   else
+   {
+      fputs(" (??%)", stderr);   
+      if (log && final)
+      {
+         fputs(" (??%)", log);
+      }
+   }
 
-  if (start_time < now)
-    {
+   double delta_s = 0.0;
+   char const *bytes_per_second = NULL;
+   xtime_t now = gethrxtime();
+   if (start_time < now)
+   {
       double XTIME_PRECISIONe0 = XTIME_PRECISION;
       uintmax_t delta_xtime = now;
       delta_xtime -= start_time;
       delta_s = delta_xtime / XTIME_PRECISIONe0;
-      bytes_per_second = human_readable (w_bytes, hbuf, human_opts,
-					 XTIME_PRECISION, delta_xtime);
-    }
-  else
-    {
-      delta_s = 0;
+      bytes_per_second =
+         human_readable(task->input->bytes_input, hbuf, human_opts, XTIME_PRECISION, delta_xtime);
+   }
+   else
+   {
+      delta_s = 0.0;
       bytes_per_second = _("Infinity B");
-    }
-
-  /* TRANSLATORS: The two instances of "s" in this string are the SI
-     symbol "s" (meaning second), and should not be translated.
-
-     This format used to be:
-
-     ngettext (", %g second, %s/s\n", ", %g seconds, %s/s\n", delta_s == 1)
-
-     but that was incorrect for languages like Polish.  To fix this
-     bug we now use SI symbols even though they're a bit more
-     confusing in English.  */
-  fprintf (stderr, _(", %g s, %s/s        "), delta_s, bytes_per_second);
-  fprintf (stderr,"\r");
-  if (error_log != NULL && print_to_log)
-    fprintf (error_log, _(", %g s, %s/s\n"), delta_s, bytes_per_second);
+   }
+
+   // TRANSLATORS: The two instances of "s" in this string are the SI
+   //   symbol "s" (meaning second), and should not be translated.
+   //
+   //  This format used to be:
+   //
+   //  ngettext (", %g second, %s/s\n", ", %g seconds, %s/s\n", delta_s == 1)
+   //
+   //  but that was incorrect for languages like Polish.  To fix this
+   //  bug we now use SI symbols even though they're a bit more
+   //  confusing in English.
+   fprintf (stderr, _(", %g s, %s/s        %s"), delta_s, bytes_per_second, final ? "\n" : "\r");
+   if (log && final)
+   {
+      fprintf (log, _(", %g s, %s/s\n"), delta_s, bytes_per_second);
+   }
+
+   progress_displayed = true;
+   pthread_mutex_unlock(&reporting_lock);
 }
 
-int hex2char(char *hstr)
+static void
+add_to_task_list(task_t** head, task_t* new_task)
 {
-    int retval;
-    
-    if (strlen(hstr) != 2)
-        return -1;
-    if (EOF == sscanf(hstr, "%x", &retval))
-        return -1;
-    return retval;
+   if (*head)
+   {
+      task_t* task = *head;
+      while (task)
+      {
+         if (task->next_task == NULL)
+         {
+            task->next_task = new_task;
+            break;
+         }
+         task = task->next_task;
+      }
+   }
+   else
+   {
+      *head = new_task;
+   }
 }
 
-
-char * make_pattern(const char *pattern)
+static void
+add_to_output_list(output_t** head, output_t* new_output)
 {
-  size_t plen, numbytes, i;
-  char * buffer;
-
-  plen = strlen(pattern);
-  if (plen == 0 || plen % 2 != 0)
-    return NULL;
-  
-  numbytes = plen / 2;
-  buffer = malloc(numbytes);
-  
-  for (i = 0; i < numbytes; i++) {
-    char tmpstring[3];
-    int byteval;
-    strncpy(tmpstring, &pattern[i*2], 2);
-    tmpstring[2] = '\0';
-    byteval = hex2char(tmpstring);
-    
-    if (byteval == -1) {
-      free(buffer);
-      return NULL;
-    }
-    buffer[i] = (char)byteval;
-  }
-
-  dc3_pattern_len = numbytes;
-  
-  return buffer;
+   if (*head)
+   {
+      output_t* output = *head;
+      while (output)
+      {
+         if (output->next_output == NULL)
+         {
+            output->next_output = new_output;
+            break;
+         }
+         output = output->next_output;
+      }
+   }
+   else
+   {
+      *head = new_output;
+   }
 }
 
-
 static void
-cleanup (void)
+add_to_file_list(file_t** head, file_t* new_file)
 {
-  if (dc3_progress)
-    {
-      fprintf(stderr,"                                                                   \r");
-    }
-
-  if (dc3_ifjoin_done == false && close (STDIN_FILENO) < 0)
-    dc3_error (EXIT_FAILURE, errno,
-	   _("closing input file %s"), quote (input_file));
-
-  /* Don't remove this call to close, even though close_stdout
-     closes standard output.  This close is necessary when cleanup
-     is called as part of a signal handler.  */
-  if (close (STDOUT_FILENO) < 0)
-    dc3_error (EXIT_FAILURE, errno,
-	   _("closing output file %s"), quote (output_file));
+   if (*head)
+   {
+      file_t* file = *head;
+      while (file)
+      {
+         if (file->next_file == NULL)
+         {
+            file->next_file = new_file;
+            break;
+         }
+         file = file->next_file;
+      }
+   }
+   else
+   {
+      *head = new_file;
+   }
 }
 
-static inline void ATTRIBUTE_NORETURN
-quit (int code)
+static void
+add_to_hash_list(hash_t** head, hash_t* new_hash)
 {
-  cleanup ();
-
-  if (!dc3_mode_verify)
-    print_stats ();
-
-  if (code != EXIT_SUCCESS)
-      dc3_exit_reason = DC3_EXIT_FAILED;
-
-  dc3_exit_msg();
-
-  if (hash_log)
-    fclose(hash_log);
-
-  process_signals ();
-  exit (code);
+   if (*head)
+   {
+      hash_t* hash = *head;
+      while (hash)
+      {
+         if (hash->next_hash == NULL)
+         {
+            hash->next_hash = new_hash;
+            break;
+         }
+         hash = hash->next_hash;
+      }
+   }
+   else
+   {
+      *head = new_hash;
+   }
 }
 
-void dc3_exit_msg()
+static void
+start_thread(pthread_t* thread, void*(*thread_func)(void*), void* thread_func_args)
 {
-  // print hash so far if we were interrupted
-  if (dc3_hash && !dc3_mode_verify && interrupt_signal)
-  {
-    dc3_hash_final();
-  }
+   pthread_attr_t attr;
+   pthread_attr_init(&attr);
+   pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+   pthread_create(thread, &attr, thread_func, thread_func_args);
+}
 
-  const char* verb = NULL;
-  switch (dc3_exit_reason)
-  {
-      case DC3_EXIT_ABORTED:
-          verb = "aborted";
-          break;
-      case DC3_EXIT_FAILED:
-          verb = "failed";
-          break;
-      default:
-          verb = "completed";
-          break;
-  }
+static bool 
+is_valid_file_ext_fmt(const char* pattern)
+{
+   size_t pos, len = strlen(pattern);
+   char first = tolower(pattern[0]);
 
-  char* dc3_stop_time = dc3_time();
-  fprintf(stderr, "dc3dd %s at %s\n", verb, dc3_stop_time);
-  if (error_log != NULL)
-    fprintf(error_log, "dc3dd %s at %s\n", verb, dc3_stop_time);
+   for (pos = 0; pos < len; ++pos)
+   {
+      if ((tolower(pattern[pos]) != 'a' && tolower(pattern[pos]) != '1' && tolower(pattern[pos]) != '0') || 
+           tolower(pattern[pos]) != first)
+      {
+         return false;
+      }
+   }
 
-  if (error_log != NULL)
-    fflush(error_log);
+   return true;
 }
 
-/* An ordinary signal was received; arrange for the program to exit.  */
-
-static void
-interrupt_handler (int sig)
+static const char*
+get_file_ext(const char* filename, const char* delim)
 {
-  if (! SA_RESETHAND)
-    signal (sig, SIG_DFL);
-  interrupt_signal = sig;
+   const char* next = filename;
+   const char* ext = NULL;
+   while ((next = strstr(next, delim)) != NULL)
+   {
+      next = ext = next + 1;
+   }
+   return ext;
 }
 
-/* An info signal was received; arrange for the program to print status.  */
-
-static void
-siginfo_handler (int sig)
+static const char*
+get_file_base_name(const char* filename, const char* delim)
 {
-  if (! SA_NOCLDSTOP)
-    signal (sig, siginfo_handler);
-  info_signal_count++;
-}
+   const char* next = filename;
+   const char* ext = NULL;
+   while ((next = strstr(next, delim)) != NULL)
+   {
+      next = ext = next + 1;
+   }
+
+   if (ext == NULL)
+   {
+      return NULL;
+   }
 
-/* Install the signal handlers.  */
+   size_t offset = (ext-1) - filename;
 
-static void
-install_signal_handlers (void)
-{
-  bool catch_siginfo = ! (SIGINFO == SIGUSR1 && getenv ("POSIXLY_CORRECT"));
+   char* base = xstrdup(filename);
+   base[offset] = '\0';
 
-#if SA_NOCLDSTOP
+   return base;
+}
 
-  struct sigaction act;
-  sigemptyset (&caught_signals);
-  if (catch_siginfo)
-    {
-      sigaction (SIGINFO, NULL, &act);
-      if (act.sa_handler != SIG_IGN)
-	sigaddset (&caught_signals, SIGINFO);
-    }
-  sigaction (SIGINT, NULL, &act);
-  if (act.sa_handler != SIG_IGN)
-    sigaddset (&caught_signals, SIGINT);
-  act.sa_mask = caught_signals;
+static char* 
+generate_file_name(const char* unparsed_name, uint file_number)
+{
+   static char *digits = "0123456789";
+   static char *letters = "abcdefghijklmnopqrstuvwxyz";
 
-  if (sigismember (&caught_signals, SIGINFO))
-    {
-      act.sa_handler = siginfo_handler;
-      act.sa_flags = 0;
-      sigaction (SIGINFO, &act, NULL);
-    }
+   const char* base_name = get_file_base_name(unparsed_name, ".");
+   if (base_name == NULL)
+   {
+      return NULL;
+   }
 
-  if (sigismember (&caught_signals, SIGINT))
-    {
-      /* POSIX 1003.1-2001 says SA_RESETHAND implies SA_NODEFER,
-	 but this is not true on Solaris 8 at least.  It doesn't
-	 hurt to use SA_NODEFER here, so leave it in.  */
-      act.sa_handler = interrupt_handler;
-      act.sa_flags = SA_NODEFER | SA_RESETHAND;
-      sigaction (SIGINT, &act, NULL);
-    }
+   const char* file_ext_fmt = get_file_ext(unparsed_name, ".");
+   if (strlen(file_ext_fmt) == 0 || !is_valid_file_ext_fmt(file_ext_fmt))
+   {
+      return NULL;
+   }
+      
+   size_t fmt_len = strlen(file_ext_fmt);
+   size_t base_len = strlen(base_name);
+   size_t len  = base_len + fmt_len + 2;
+   char* file_name = (char*)malloc(len);
+   snprintf(file_name, base_len + 2, "%s.", base_name);
 
-#else
+   // In case starting with .001 
+   uintmax_t num = file_number + (file_ext_fmt[0] == '1' ? 1 : 0);
 
-  if (catch_siginfo && signal (SIGINFO, SIG_IGN) != SIG_IGN)
-    {
-      signal (SIGINFO, siginfo_handler);
-      siginterrupt (SIGINFO, 1);
-    }
-  if (signal (SIGINT, SIG_IGN) != SIG_IGN)
-    {
-      signal (SIGINT, interrupt_handler);
-      siginterrupt (SIGINT, 1);
-    }
-#endif
+   for (int i = fmt_len - 1; i >= 0 ; i--)
+   {
+      uintmax_t x;
+
+      if ('a' == file_ext_fmt[0])
+      {
+         x = num % 26;
+         (file_name)[base_len + 1 + i] = letters[x];
+         num /= 26;
+      }
+      else
+      {
+         x = num % 10;
+         (file_name)[base_len + 1 + i] = digits[x];
+         num /= 10;
+      }
+   }
+
+   if (num > 0)
+   {
+      free(file_name);
+      file_name = NULL;
+   }
+   else
+   {
+      (file_name)[len - 1] = 0;
+   } 
+   
+   return file_name;
 }
 
-/* Process any pending signals.  If signals are caught, this function
-   should be called periodically.  Ideally there should never be an
-   unbounded amount of time when signals are not being processed.  */
+static file_t*
+make_file(const char* name, int number, int flags, bool part_of_set, bool verify_requested)
+{
+   file_t* file = NULL;
+   char* file_name = part_of_set ? generate_file_name(name, number) : strdup(name);
+   if (file_name)
+   {
+      file = (file_t*)malloc(sizeof(file_t));
+      file->unparsed_name = strdup(name);
+      file->name = file_name;
+      file->number = number;
+      file->flags = flags;
+      file->descriptor = FILE_DESCRIPTOR_NOT_SET;
+      file->offset = 0;
+      file->is_device = false;
+      file->is_block_device = false;
+      file->size_in_bytes = 0;
+      file->probed = false;
+      file->probed_size_in_bytes = 0;
+      file->probed_size_in_sectors = 0;
+      file->probed_sector_size = 0;
+      file->part_of_set= part_of_set;
+      file->verify_requested= verify_requested;
+      file->next_file = NULL;
+   }
+   return file;
+}
 
 static void
-process_signals (void)
+close_file_output(output_t* output)
 {
-  while (interrupt_signal | info_signal_count)
-    {
-      int interrupt;
-      int infos;
-      sigset_t oldset;
-
-      sigprocmask (SIG_BLOCK, &caught_signals, &oldset);
-
-      /* Reload interrupt_signal and info_signal_count, in case a new
-	 signal was handled before sigprocmask took effect.  */
-      interrupt = interrupt_signal;
-      infos = info_signal_count;
+   pthread_mutex_destroy(output->buffer_queue->lock);
 
-      if (infos)
-	info_signal_count = infos - 1;
-
-      sigprocmask (SIG_SETMASK, &oldset, NULL);
+   if (output->current_file->descriptor >=0)
+   {
+      if (output->append_garbage_bytes)
+      {
+         memset(output->buffer_queue->buffers[0].data, '\0', output->buffer_size);
+         ssize_t bytes_written = write(output->current_file->descriptor,
+            output->buffer_queue->buffers[0].data,  output->buffer_size);
+         if (bytes_written <= 0)
+         {
+            report_error(0, errno,  _("corrupting %s"), quote(output->current_file->name));
+         }
+      }
 
-      if (interrupt)
-	cleanup ();
-      print_stats ();
-      if (interrupt)
+      if (close(output->current_file->descriptor) == 0)
       {
-        dc3_exit_reason = DC3_EXIT_ABORTED;
-	dc3_exit_msg();
-	raise (interrupt);
+         if (output->state != FATAL_ERROR)
+         {
+            // If not already in an error state, the output was completed.
+            output->state = COMPLETE;
+         }
       }
-    }
+      else
+      {
+         report_error(0, errno, _("closing %s"), quote(output->current_file->name));
+         output->state = FATAL_ERROR;
+      }
+   }
 }
 
-/* Read from FD into the buffer BUF of size SIZE, processing any
-   signals that arrive before bytes are read.  Return the number of
-   bytes read if successful, -1 (setting errno) on failure.  */
-
-static ssize_t
-iread (int fd, char *buf, size_t size)
+static void
+open_next_output_file(output_t* output)
 {
-  for (;;)
-    {
-      ssize_t nread;
-      process_signals ();
-      nread = read (fd, buf, size);
-      if (! (nread < 0 && errno == EINTR))
-	return nread;
-    }
+   if (close(output->current_file->descriptor) == 0)
+   {
+      output->current_file->descriptor = FILE_DESCRIPTOR_NOT_SET;
+      
+      file_t* next_file = make_file(
+         output->current_file->unparsed_name, 
+         output->current_file->number + 1, 
+         output->current_file->flags, 
+         true,
+         output->current_file->verify_requested);
+      if (next_file)
+      {
+         next_file->descriptor = open(next_file->name, next_file->flags, OUTPUT_FILE_PERMS);
+         if (next_file->descriptor >= 0)
+         {
+            output->current_file = next_file;
+            add_to_file_list(&output->files, next_file);
+         }
+         else
+         {
+            report_error(0, errno, _("opening %s"), quote(next_file->name));
+            output->state = FATAL_ERROR;
+         }
+      }
+      else
+      {
+         report_error(0, 0 , _("file extensions exhausted for %s"), output->current_file->unparsed_name);
+         output->state = FATAL_ERROR;
+      }
+   }
+   else
+   {
+      output->current_file->descriptor = FILE_DESCRIPTOR_NOT_SET;
+      report_error(0, errno, _("closing %s"), quote(output->current_file->name));
+      output->state = FATAL_ERROR;
+   }
 }
 
-/* Write to FD the buffer BUF of size SIZE, processing any signals
-   that arrive.  Return the number of bytes written, setting errno if
-   this is less than SIZE.  Keep trying if there are partial
-   writes.  */
-
 static size_t
-dc3_iwrite (int fd, char const *buf, size_t size)
+write_bytes_to_file(output_t* output, char const *buffer, size_t bytes_to_write)
 {
-  size_t total_written = 0;
-
-  while (total_written < size)
-    {
-      ssize_t nwritten;
-      process_signals ();
-      nwritten = write (fd, buf + total_written, size - total_written);
-      if (nwritten < 0)
-	{
-	  if (errno != EINTR)
-	    break;
-	}
-      else if (nwritten == 0)
-	{
-	  /* Some buggy drivers return 0 when one tries to write beyond
-	     a device's end.  (Example: Linux 1.2.13 on /dev/fd0.)
-	     Set errno to ENOSPC so they get a sensible diagnostic.  */
-	  errno = ENOSPC;
-	  break;
-	}
+   size_t total_bytes_written = 0;
+
+   while (total_bytes_written < bytes_to_write)
+   {
+      ssize_t bytes_written = write(
+         output->current_file->descriptor, 
+         buffer + total_bytes_written, 
+         bytes_to_write - total_bytes_written);
+         
+      if (bytes_written < 0)
+      {
+         if (errno != EINTR)
+         {
+            report_error(0, errno, _("writing to %s"), quote(output->current_file->name));
+            output->state = FATAL_ERROR;
+            break;
+         }
+      }
+      else if (bytes_written == 0)
+      {
+         // Some buggy drivers return 0 when one tries to write beyond
+         // a device's end.  (Example: Linux 1.2.13 on /dev/fd0.)
+         // Set errno to ENOSPC for a sensible diagnostic. 
+         errno = ENOSPC;
+         report_error(0, errno, _("writing to %s"), quote(output->current_file->name));
+         output->state = FATAL_ERROR;
+         break;
+      }
       else
-	total_written += nwritten;
-    }
+      {
+         total_bytes_written += (size_t)bytes_written;
+         output->current_file->size_in_bytes += (size_t)total_bytes_written;
+      }
+   }
 
-  return total_written;
+   return total_bytes_written;
 }
 
-static char *dc3_split_numbers = "0123456789";
-#define DC3_SPLIT_NUM_NUMBERS  10
-static char *dc3_split_letters = "abcdefghijklmnopqrstuvwxyz";
-#define DC3_SPLIT_NUM_LETTERS  26
-
-static int
-dc3_generate_split_filename(const char* base, const char* fmt, uintmax_t n, char** result)
+static size_t
+write_bytes_to_files(output_t* output, char const *buffer, size_t bytes_to_write)
 {
-  /* The extra two bytes accounts for the dot between the filename
-     and the extension and then for the trailing \0 */
-  size_t fmt_len = strlen(fmt);
-  size_t base_len = strlen(base);
-  size_t len  = base_len + fmt_len + 2;
+   size_t bytes_written = 0;
+
+   intmax_t bytes_left_for_file = output->max_file_size - output->current_file->size_in_bytes;
+   if (bytes_to_write <= bytes_left_for_file)
+   {
+      // Write all of the bytes in the buffer to the current file.
+      bytes_written += write_bytes_to_file(output, buffer, bytes_to_write);
+   }
+   else
+   {
+      if (bytes_left_for_file > 0)
+      {
+         // Write the bytes that will fit in the current file. 
+         bytes_written += write_bytes_to_file(output, buffer, bytes_left_for_file);
+      }
+      
+      // Write the remaining bytes to the next file(s).
+      open_next_output_file(output);
+      if (output->state != FATAL_ERROR)
+      {
+         bytes_written += 
+            write_bytes_to_files(output, buffer + bytes_written, bytes_to_write - bytes_written);
+      }
+   }
 
-  if (NULL == *result)
-    {
-      *result = (char *)malloc(len);
-      if (NULL == *result)
-	dc3_error(EXIT_FAILURE, 0, _("Unable to allocate filename"));
-    }
+   return bytes_written;
+}
 
-  snprintf(*result, base_len+2, "%s.", base);
+static void
+write_bytes_to_image(output_t* output, buffer_t* buffer)
+{
+   if (output->current_file->part_of_set)
+   {
+      output->bytes_output += write_bytes_to_files(output, buffer->data, buffer->length);  
+   }
+   else
+   {
+      output->bytes_output += write_bytes_to_file(output, buffer->data, buffer->length);
+   }
+}
 
-  /* In case we're starting with .001 */
-  uintmax_t num = n + (fmt[0] == '1' ? 1 : 0);
-  
-  int i;
-  for (i = fmt_len - 1; i >= 0 ; i--)
-    {
-      uintmax_t x;
+static ssize_t
+read_bytes(int file_descriptor, char *buffer, size_t bytes_to_read)
+{
+   for (;;)
+   {
+      ssize_t bytes_read;
+      bytes_read = read(file_descriptor, buffer, bytes_to_read);
+      if (!(bytes_read < 0 && errno == EINTR))
+      {
+         return bytes_read;
+      }
+   }
+}
 
-      if ('a' == fmt[0])
-	{
-	  x = num % DC3_SPLIT_NUM_LETTERS;
-          (*result)[base_len+1+i] = dc3_split_letters[x];
-	  num /= DC3_SPLIT_NUM_LETTERS;
-	}
+static void
+skip_output_sectors(output_t* output)
+{
+   if (output->sectors_to_skip > 0)
+   {
+      uintmax_t bytes_to_skip = output->sectors_to_skip * output->sector_size;
+      if (bytes_to_skip <= OFF_T_MAX) 
+      {
+         if (lseek(output->current_file->descriptor, bytes_to_skip, SEEK_CUR) < 0)
+         {
+	    report_error(0, errno, _("lseek() on %s failed while skipping sectors"),
+	       quote(output->current_file->name));
+	    output->state = FATAL_ERROR;
+         }
+      }
       else
-	{
-	  x = num % DC3_SPLIT_NUM_NUMBERS;
-	  (*result)[base_len+1+i] = dc3_split_numbers[x];
-	  num /= DC3_SPLIT_NUM_NUMBERS;
-	}
-    }
-  
-  (*result)[len-1] = 0;
-
-  if (num > 0)
-    dc3_error(EXIT_FAILURE,0,_("Split extensions exhausted"));
-
-  return false;
+      {
+         // The desired skip is not representable as an off_t, so try
+         // doing the skip using read() calls.
+         char* buffer = (char*)malloc(output->buffer_size);
+	 while (bytes_to_skip)
+	 {
+	    size_t bytes_to_read =
+	       bytes_to_skip >= output->buffer_size ? output->buffer_size : bytes_to_skip; 
+	    ssize_t bytes_read = 
+	       read_bytes(output->current_file->descriptor, buffer, bytes_to_read);
+	    if (bytes_read > 0)
+	    {
+	       bytes_to_skip -= bytes_read;
+	    }
+	    else if (bytes_read == 0)
+	    {
+	       char message[DISPLAY_MESSAGE_LENGTH];
+	       sprintf(message,  _("encountered end of file reading %s to skip sectors"),
+		  quote(output->current_file->name));
+	       report_error(0, 0, message); 
+	       output->state = FATAL_ERROR;         
+	       break;
+	    }
+	    else
+	    {
+	      report_error(0, errno, _("reading %s  while skipping sectors"),
+		 quote(output->current_file->name));
+	       output->state = FATAL_ERROR;
+	       break;
+	    }         
+	 }
+         free(buffer);
+      }
+   }
 }
 
-
-static void dc3_open_split(void)
+static void
+open_file_output(output_t* output)
 {
-  close(STDOUT_FILENO);
-
-  dc3_split_number++;
-  dc3_generate_split_filename(output_file, dc3_split_format, dc3_split_number, &dc3_split_filename);
-
-  mode_t perms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
-  int opts
-    = (output_flags
-       | (conversions_mask & C_NOCREAT ? 0 : O_CREAT)
-       | (conversions_mask & C_EXCL ? O_EXCL : 0)
-       | (seek_sectors || (conversions_mask & C_NOTRUNC) ? 0 : O_TRUNC));
-  
-  if (fd_reopen(STDOUT_FILENO, dc3_split_filename, O_WRONLY | opts, perms) < 0)
-    dc3_error(EXIT_FAILURE, errno, _("opening %s"), quote(dc3_split_filename));
-
-  dc3_split_current = 0;
+   pthread_mutex_init(output->buffer_queue->lock, NULL);
+
+   output->current_file->descriptor = 
+      open(output->current_file->name, output->current_file->flags, OUTPUT_FILE_PERMS); 
+   if (output->current_file->descriptor >= 0) 
+   {
+      output->state = OPEN;
+      skip_output_sectors(output);      
+   }
+   else
+   {
+      report_error(0, errno,_("opening %s"), quote(output->current_file->name));
+      output->state = FATAL_ERROR;
+   }   
 }
 
-
-static size_t
-dc3_verify (int fd, char const *src_buf, size_t size)
+static void
+disconnect_from_std_out(output_t* output)
 {
-  char * dest_buf;
-
-  dest_buf = (char *)malloc(size);
-  if (NULL == dest_buf)
-    dc3_error(EXIT_FAILURE,errno,_("Unable to allocate memory"));
+   output->state = COMPLETE;
+   pthread_mutex_destroy(output->buffer_queue->lock);
+}
 
-  ssize_t n = iread(fd,dest_buf,size);
+static void
+connect_to_std_out(output_t* output)
+{
+   pthread_mutex_init(output->buffer_queue->lock, NULL);
+   output->current_file->descriptor = STDOUT_FILENO;
+   output->state = OPEN;
+}
 
-  // TODO: could enable block below to give better reporting of the
-  //       reason why a verify failed (was it input or output that couldn't be read)
-  /*
-  if (n < 0)
-      fprintf(stderr, "unrecoverable error reading verify file %s\n", output_file);
-  else*/ if (dc3_vfjoin && 0 <= n && n < size)
-  {
-      //fprintf(stderr, "opening next vfjoin piece\n");
-      dc3_vfjoin_number++;
-      dc3_generate_split_filename(dc3_vfjoin_base, dc3_vfjoin_ext, dc3_vfjoin_number, &output_file);
+static void
+get_hash_result(hash_t* hash)
+{
+   static char hex[] = "0123456789abcdef";
 
-      if (fd_reopen(STDOUT_FILENO, output_file, O_RDONLY, 0) < 0)
-          dc3_error(EXIT_FAILURE, 0, _("Verify FAILED"));
-      else
-         iread(fd, dest_buf+n, size-n);
-  }
- 
-  if (memcmp(dest_buf,src_buf,size))
-    dc3_error(EXIT_FAILURE,0,_("Verify FAILED"));
+   for (size_t p = 0; p < hash->algorithm->sum_size ; p++)
+   {
+      hash->result[2 * p] = hex[(hash->sum[p] >> 4) & 0xf];
+      hash->result[2 * p + 1] = hex[hash->sum[p] & 0xf];
+   }
 
-  free(dest_buf);
-  return size;
+   hash->result[2 * hash->algorithm->sum_size] = 0;
 }
 
-	   
-
+static void
+close_hash(output_t* output)
+{
+   output->hash->algorithm->finish(output->hash->context, output->hash->sum);
+   get_hash_result(output->hash);
+   if (output->hash->current_piece != NULL)
+   {
+      output->hash->current_piece->algorithm->finish(output->hash->current_piece->context,
+         output->hash->current_piece->sum);
+      get_hash_result(output->hash->current_piece);
+   }
+
+   pthread_mutex_destroy(output->buffer_queue->lock);
+   output->state = COMPLETE;
+}
 
-static size_t
-iwrite (int fd, char const *buf, size_t size)
+static hash_t*
+make_hash(hash_algorithm_t* algorithm)
 {
-  if (dc3_mode_verify)
-    return dc3_verify(fd,buf,size);
+   hash_t* hash = (hash_t*)malloc(sizeof(hash_t));
+   hash->algorithm = algorithm;
+   hash->context = malloc(algorithm->context_size);
+   hash->sum = (char*)malloc(algorithm->sum_size);
+   hash->result = (char*)malloc(2 * algorithm->sum_size + 1);
+   hash->result[0] = 0;
+   hash->bytes_hashed = 0;
+   hash->current_piece = NULL;
+   hash->pieces = NULL;
+   hash->piecewise_hash_length = 0;
+   hash->next_hash = NULL;
+   return hash;
+}
 
-  if (! dc3_split )
-    return dc3_iwrite(fd,buf,size);
+static void
+piecewise_hash_bytes(output_t* output, const char* buf, size_t buf_length)
+{
+   uintmax_t bytes_left_for_piece = 
+      output->hash->piecewise_hash_length - output->hash->current_piece->bytes_hashed;
+
+   if (bytes_left_for_piece == 0)
+   {
+      output->hash->current_piece->algorithm->finish(output->hash->current_piece->context,
+         output->hash->current_piece->sum);
+      get_hash_result(output->hash->current_piece);
+      output->hash->current_piece = make_hash(output->hash->current_piece->algorithm);
+      add_to_hash_list(&output->hash->pieces, output->hash->current_piece);
+      output->hash->current_piece->algorithm->init(output->hash->current_piece->context);
+      bytes_left_for_piece = output->hash->piecewise_hash_length;
+   }
+
+   if (buf_length <= bytes_left_for_piece)
+   {
+      output->hash->current_piece->algorithm->update(buf, buf_length, output->hash->current_piece->context);
+      output->hash->current_piece->bytes_hashed += buf_length;
+   }
+   else
+   {
+      output->hash->current_piece->algorithm->update(buf, bytes_left_for_piece,
+         output->hash->current_piece->context);
+      output->hash->current_piece->bytes_hashed += bytes_left_for_piece;
+      piecewise_hash_bytes(output, buf + bytes_left_for_piece, buf_length - bytes_left_for_piece);
+   }
+}
 
-  uintmax_t left = dc3_split_bytes - dc3_split_current;
-  size_t nwritten;
+static void
+hash_bytes(output_t* output, buffer_t* buffer)
+{
+   output->hash->algorithm->update(buffer->data, buffer->length, output->hash->context);
+   if (output->hash->current_piece != NULL)
+   {   
+      piecewise_hash_bytes(output, buffer->data, buffer->length);
+   }
+}
 
-  if (0 == left)
-    {
-      dc3_open_split();
-      left = dc3_split_bytes;
-    }
+static void
+open_hash(output_t* output)
+{
+   pthread_mutex_init(output->buffer_queue->lock, NULL);
 
-  if (size <= left)
-    {
-      nwritten           = dc3_iwrite(fd,buf,size);
-      dc3_split_current += nwritten;
-    }
-  else
-    {
-      nwritten = dc3_iwrite(fd,buf,left);
-      dc3_split_current += nwritten;
-      nwritten = dc3_iwrite(fd,buf+nwritten,size-nwritten);
-      dc3_split_current += nwritten;
-    }
+   output->hash->algorithm->init(output->hash->context);
+   if (output->hash->current_piece != NULL)
+   {
+      output->hash->current_piece->algorithm->init(output->hash->current_piece->context);
+   } 
 
-  return nwritten;
+   output->state = OPEN;
 }
 
-void
-dc3_write_stats(size_t n)
+static bool 
+wait_for_buffer(buffer_queue_t* buffer_queue)
 {
-    if (n <= 0)
-        return;
-
-    w_bytes += n;
+   // This function is called by an output thread each time it
+   // finishes consuming some input bytes furnished by an input (i.e., task) thread.
+   pthread_mutex_lock(buffer_queue->lock);
+   if (buffer_queue->buffers_used == 0 && !buffer_queue->done_buffering)
+   {
+      pthread_cond_wait(buffer_queue->not_empty, buffer_queue->lock);
+   }   
+   pthread_mutex_unlock(buffer_queue->lock);
+   return buffer_queue->buffers_used > 0;
+}
 
-    dc3_sectors_w_full += n / dc3_sectorsize;
+static void* 
+produce_output(void* arg)
+{
+   // This is the thread function for output threads.
+   output_t* output = (output_t*)arg;
+      
+   size_t next_buffer = 0;
+   while (wait_for_buffer(output->buffer_queue))
+   {
+      if (output->state == OPEN)
+      {
+         // Output the next buffer in the buffer queue.
+         output->consume_bytes(output, &output->buffer_queue->buffers[next_buffer]);     
+      }
 
-    if (n % dc3_sectorsize)
-        dc3_sectors_w_partial++;
+      // Update the count of buffers in use and notify the task
+      // thread that the buffer queue is not full. This will release
+      // the input (i.e., task) thread if it is blocked waiting to add a
+      // buffer of input bytes to this queue.
+      next_buffer = (next_buffer + 1) % NUM_BUFFERS;
+      pthread_mutex_lock(output->buffer_queue->lock);
+      --output->buffer_queue->buffers_used;
+      pthread_cond_signal(output->buffer_queue->not_full);
+      pthread_mutex_unlock(output->buffer_queue->lock);
+   }
+
+   pthread_exit(NULL);
 }
 
-/* Write, then empty, the output buffer `obuf'. */
-
 static void
-write_output (void)
+close_file_input(input_t* input)
 {
-  size_t nwritten = iwrite (STDOUT_FILENO, obuf, output_blocksize);
-  dc3_write_stats(nwritten);
-
-  //fprintf(stderr, "write_output: wrote %zd bytes, total %zd\n", nwritten, w_bytes);
-  if (nwritten != output_blocksize)
-  {
-      if (dc3_mode_wipe && errno == ENOSPC)
+   if (input->current_file->descriptor >= 0)
+   {
+      if (close(input->current_file->descriptor) == 0)
       {
-          quit (EXIT_SUCCESS);
+         if (input->state != FATAL_ERROR)
+         {
+            // If not already in an error state, the input was completed.
+            input->state = COMPLETE;
+         }
       }
       else
       {
-          dc3_error (0, errno, _("writing to %s"), quote (output_file));
-          quit (EXIT_FAILURE);
+         report_error(0, errno, _("closing %s"), quote(input->current_file->name));
+         input->state = FATAL_ERROR;
       }
-  }
-
-  //fprintf(stderr, "write_output: sector count now %jd + %jd\n", dc3_sectors_w_full, dc3_sectors_w_partial);
-  oc = 0;
+   }
 }
 
-/* Return true if STR is of the form "PATTERN" or "PATTERNDELIM...".  */
+static void
+advance_input(input_t* input, uintmax_t bytes_read)
+{
+   // Update the input counters.
+   if (input->current_file)
+   {
+      input->current_file->offset += bytes_read;
+      input->current_file->size_in_bytes += bytes_read;
+      input->current_sector += bytes_read / input->sector_size;
+   }
+   input->bytes_input += bytes_read;
+}
 
 static bool
-operand_matches (char const *str, char const *pattern, char delim)
+advance_input_after_sector_read_error(input_t* input)
 {
-  while (*pattern)
-    if (*str++ != *pattern++)
-      return false;
-  return !*str || *str == delim;
+   advance_input(input, input->sector_size);
+
+   // Get the actual offset of the file pointer.
+   off_t offset = lseek(input->current_file->descriptor, 0, SEEK_CUR);
+   
+   if (offset >= 0)
+   {
+      if (offset != input->current_file->offset)
+      {
+	 // Advance the actual offset to the desired offset.
+	 if (lseek(input->current_file->descriptor, input->current_file->offset - offset, SEEK_CUR) < 0)
+	 {
+	    report_error(0, errno, _("lseek() on %s failed, cannot advance input past read error"),
+	       quote(input->current_file->name));
+	    input->state = FATAL_ERROR;
+	 }
+      }
+   }
+   else
+   {
+      report_error(0, errno, _("lseek() on %s failed, cannot advance input past read error"),
+	 quote(input->current_file->name));
+      input->state = FATAL_ERROR;
+   }
+
+   return input->state != FATAL_ERROR;
 }
 
-/* Interpret one "conv=..." or similar operand STR according to the
-   symbols in TABLE, returning the flags specified.  If the operand
-   cannot be parsed, use ERROR_MSGID to generate a diagnostic.  */
-
-static int
-parse_symbols (char const *str, struct symbol_value const *table,
-	       char const *error_msgid)
+static void
+flush_grouped_read_errors(input_t* input, bool skipping)
 {
-  int value = 0;
-
-  for (;;)
-    {
-      char const *strcomma = strchr (str, ',');
-      struct symbol_value const *entry;
-
-      for (entry = table;
-	   ! (operand_matches (str, entry->symbol, ',') && entry->value);
-	   entry++)
-	{
-	  if (! entry->symbol[0])
-	    {
-	      size_t slen = strcomma ? strcomma - str : strlen (str);
-	      dc3_error (0, 0, "%s: %s", _(error_msgid),
-		     quotearg_n_style_mem (0, locale_quoting_style, str, slen));
-
-	      usage (EXIT_FAILURE);
-	    }
-	}
-
-      value |= entry->value;
-      if (!strcomma)
-	break;
-      str = strcomma + 1;
-
-    }
-
-  return value;
+   if (input->current_errno_count > 1)
+   {
+      report_error(0, input->current_errno,
+         _("%"PRIuMAX" occurences while reading %s from sector %"PRIuMAX" to sector %"PRIuMAX" %s"), 
+         input->current_errno_count,
+         quote(input->current_file->name),
+         input->current_errno_start_sector,
+         input->current_errno_start_sector + input->current_errno_count - 1,
+         skipping ? _("while skipping sectors") : "");
+
+   }
+   else if (input->current_errno_count == 1)
+   {
+      report_error(0, input->current_errno, _("reading %s at sector %"PRIuMAX" %s"),
+         quote(input->current_file->name), input->current_errno_start_sector,
+         skipping ? _("while skipping sectors") : "");
+   }
+
+   input->current_errno = 0;
+   input->current_errno_count = 0;
+   input->current_errno_start_sector = 0;
 }
 
-/* Return the value of STR, interpreted as a non-negative decimal integer,
-   optionally multiplied by various values.
-   Set *INVALID if STR does not represent a number in this format.  */
-
-static uintmax_t
-parse_integer (const char *str, bool *invalid)
+static void
+report_grouped_read_error(input_t* input, uintmax_t sector_number, bool skipping)
 {
-  uintmax_t n;
-  char *suffix;
-  enum strtol_error e = xstrtoumax (str, &suffix, 10, &n, "bcEGkKMPTwYZ0");
-
-  if (e == LONGINT_INVALID_SUFFIX_CHAR && *suffix == 'x')
-    {
-      uintmax_t multiplier = parse_integer (suffix + 1, invalid);
+   if (input->current_errno_count > 0 && input->current_errno != errno)
+   {
+      flush_grouped_read_errors(input, skipping);
+   }
+
+   if (input->current_errno_count == 0)
+   {
+      input->current_errno_start_sector = sector_number;
+   }
+
+   input->current_errno = errno;
+   ++input->current_errno_count;
+}
 
-      if (multiplier != 0 && n * multiplier / multiplier != n)
-	{
-	  *invalid = true;
-	  return 0;
-	}
+static void
+report_read_error(input_t* input, size_t read_size, bool skipping)
+{
+   if (read_size == input->sector_size)
+   {
+      report_error(0, errno, _("reading %s at sector %"PRIuMAX" %s"),
+         quote(input->current_file->name), input->current_sector,
+         skipping ? _("while skipping sectors") : "");
+   }
+   else
+   {
+      report_error(0, errno, _("reading %s in sector range %"PRIuMAX"-%"PRIuMAX" %s"),
+         quote(input->current_file->name),
+         input->current_sector,
+         input->current_sector + read_size / input->sector_size - 1,
+         skipping ? _("while skipping sectors") : "");
+   }
+}
 
-      n *= multiplier;
-    }
-  else if (e != LONGINT_OK)
-    {
-      *invalid = true;
-      return 0;
-    }
+static void 
+recover_sectors(input_t* input, size_t bytes_to_read)
+{
+   pthread_mutex_lock(&reporting_lock);
+
+   // Clear the progress display to report the recovery effort.
+   fprintf(stderr, "%79s", "\r");
+
+   size_t sectors_to_read = bytes_to_read / input->sector_size;
+   size_t sectors_read = 0;   
+   while (sectors_to_read > sectors_read)
+   {
+      // This is a slow loop, so let the user know what's going on.
+      fprintf(stderr, "trying to recover sector %"PRIuMAX"", input->current_sector);
+
+      // Obtain a pointer into the buffer corresponding to the position of the
+      // current sector and attempt to read into that location.
+      char* sector_buffer = input->buffer.data + sectors_read * input->sector_size; 
+      ssize_t bytes_read = 
+         read_bytes(input->current_file->descriptor, sector_buffer, input->sector_size);
+      fprintf(stderr, "%79s", "\r");
+      if (bytes_read > 0)
+      {
+	 flush_grouped_read_errors(input, false);
+         if ((size_t)bytes_read == input->sector_size)
+         {
+	    // The sector was read.
+	    advance_input(input, input->sector_size);
+	    ++sectors_read;
+         }
+         else
+         {
+	    // Either more or fewer bytes than a sector was read. 
+	    report_error(0, 0, _("reading %s, unexpected read size of %zd at sector %"PRIuMAX""), 
+	       quote(input->current_file->name),
+	       bytes_read, 
+	       input->current_sector);
+	    input->state = FATAL_ERROR;
+	    break;
+         }
+      }
+      else if (bytes_read == 0 || errno == ENOSPC)
+      {
+         // End of device.
+         flush_grouped_read_errors(input, false);
+         input->state = COMPLETE;
+         break;
+      }
+      else 
+      {
+         // Cannot read the sector. Write zeros into the buffer in place of the bad sector.
+         memset(sector_buffer, '\0', input->sector_size);
+         ++sectors_read;
+         ++input->bad_sectors;
+         report_grouped_read_error(input, input->current_sector, false);
+         if (!advance_input_after_sector_read_error(input))
+         {
+	    flush_grouped_read_errors(input, false);
+            break;
+         }       
+      }
+   } 
+   input->buffer.length = sectors_read * input->sector_size;
 
-  return n;
+   pthread_mutex_unlock(&reporting_lock);
 }
 
-/* OPERAND is of the form "X=...".  Return true if X is NAME.  */
-
-static bool
-operand_is (char const *operand, char const *name)
+static size_t
+calculate_bytes_to_read(input_t* input)
 {
-  return operand_matches (operand, name, '=');
+   uintmax_t bytes_remaining = input->bytes_to_input - input->bytes_input;   
+   return bytes_remaining >= input->buffer_size ? input->buffer_size : bytes_remaining; 
 }
 
 static void
-scanargs (int argc, char *const *argv)
+read_bytes_from_device(input_t* input)
 {
-  int i;
-  size_t blocksize = 0;
-
-  for (i = optind; i < argc; i++)
-    {
-      char const *name = argv[i];
-      char const *val = strchr (name, '=');
-
-      if (val == NULL)
-	{
-	  dc3_error (0, 0, _("unrecognized operand %s"), quote (name));
-	  usage (EXIT_FAILURE);
-	}
-      val++;
-
-      if (operand_is (name,"pattern"))
-	{
-	  dc3_use_pattern   = true;
-	  dc3_pattern_value = make_pattern(val);
-	  if (NULL == dc3_pattern_value)
-	    dc3_error(EXIT_FAILURE, 0, _("illegal pattern %s"), quote(val));
-	}
-
-      else if (operand_is (name,"textpattern"))
-	{
-	  dc3_pattern_value = strdup(val);
-	  if (NULL == dc3_pattern_value)
-	    dc3_error(EXIT_FAILURE, 0, _("illegal pattern %s"), quote(val));
-	  dc3_use_pattern   = true;
-	  dc3_pattern_len   = strlen(dc3_pattern_value);
-	}
+   memset(input->buffer.data, '\0', input->buffer_size);
+   input->buffer.length = 0;
+
+   size_t bytes_to_read = calculate_bytes_to_read(input);
+   if (bytes_to_read > 0)
+   {
+      ssize_t bytes_read = read_bytes(input->current_file->descriptor, input->buffer.data, bytes_to_read); 
+      if (bytes_read > 0)
+      {  
+         // The read was successful. 
+         input->buffer.length = (size_t)bytes_read;
+         flush_grouped_read_errors(input, false);
+         advance_input(input, (size_t)bytes_read);
+      }
+      else if (bytes_read == 0 || (errno == ENOSPC && bytes_to_read == input->sector_size))
+      {
+         // The read was an attempt to read past the end of the device. If 
+         // doing sector-size reads, this is not an error, just the end of the device.
+         flush_grouped_read_errors(input, false);
+         input->state = COMPLETE;
+      }
+      else
+      {
+	 if (input->recover_errors)
+	 {
+	    recover_sectors(input, bytes_to_read);
+	 }
+	 else
+	 {
+	    report_read_error(input, bytes_to_read, false);
+	    input->state = FATAL_ERROR;
+	 }
+      }      
+   }
+}
 
-      else if (operand_is (name,"errlog"))
-	{
-	  error_log = fopen(val,"a");
-	  if (NULL == error_log)
-	    dc3_error (EXIT_FAILURE, errno, _("opening %s"), quote (val));
-	}
+static void
+read_bytes_from_file(input_t* input)
+{
+   memset(input->buffer.data, '\0', input->buffer_size);
+   input->buffer.length = 0;
 
-      else if (operand_is (name,"hashlog"))
-	{
-	  hash_log = fopen(val,"a");
-	  if (NULL == hash_log)
-	    dc3_error (EXIT_FAILURE, errno, _("opening %s"), quote (val));
-	  dc3_hash = true;
-	}
+   size_t bytes_to_read = calculate_bytes_to_read(input);
+   if (bytes_to_read > 0)
+   {
+      ssize_t bytes_read = read_bytes(input->current_file->descriptor, input->buffer.data, bytes_to_read);
 
-      else if (operand_is (name,"log"))
-	{
-	  hash_log = fopen(val,"a");
-	  if (NULL == hash_log)
-	    dc3_error (EXIT_FAILURE, errno, _("opening %s"), quote (val));
-	  error_log = hash_log;
-	  dc3_hash = true;
-	}
-      else if (operand_is (name,"errors"))
-	{
-	  dc3_group_errors = true;
-	}
-	
+      if (bytes_read > 0)
+      {
+	 input->buffer.length = (size_t)bytes_read;
+         advance_input(input, bytes_read);
+      }
+      else if (bytes_read == 0)
+      {
+         input->state = COMPLETE;
+      }
+      else if (bytes_read < 0)
+      {
+         report_read_error(input, bytes_to_read, false);
+         input->state = FATAL_ERROR;
+      }
+   }
+}
 
-      else if (operand_is (name,"hash"))
-	{
-	  dc3_parse_hash(val);
-	  dc3_hash = true;
-	  if (NULL == hash_log)
-	    hash_log = stderr;
-	}
+static void
+open_next_input_file(input_t* input)
+{
+   if (close(input->current_file->descriptor) == 0)
+   {
+      input->current_file->descriptor = FILE_DESCRIPTOR_NOT_SET;
+
+      file_t* next_file = make_file(
+         input->current_file->unparsed_name, 
+         input->current_file->number + 1, 
+         input->current_file->flags, 
+         true,
+         false);
+
+      if (next_file)
+      {
+         next_file->descriptor = open(next_file->name, next_file->flags, 0);
+         if (next_file->descriptor >= 0)
+         {
+            // There is another file in the set.
+            input->current_file = next_file;
+            add_to_file_list(&input->files, next_file);
+            input->state = OPEN;
+         }
+      }
+   }
+   else
+   {
+      input->current_file->descriptor = FILE_DESCRIPTOR_NOT_SET;
+      report_error(0, errno, _("closing %s"), quote(input->current_file->name));
+      input->state = FATAL_ERROR;
+   }
+}
 
-      else if (operand_is (name,"hashconv"))
-	{
-	  if (STREQ (val, "before"))
-	    dc3_hash_before = true;
-	  else if (STREQ (val, "after"))
-	    dc3_hash_before = false;
-	  else
-	    dc3_error (EXIT_FAILURE, 0, _("unknown hash convention %s"), 
-		   quote(val));
-	}
-      
-      /*
-      else if (operand_is (name,"hashformat"))
-	dc3_error (EXIT_FAILURE, 0, _("not implemented yet %s"), quote(name));
-      else if (operand_is (name,"totalhashformat"))
-	dc3_error (EXIT_FAILURE, 0, _("not implemented yet %s"), quote(name));
-      else if (operand_is (name,"rate"))
-	dc3_error (0, 0, _("%s is not implemented, ignored"), quote(name));
-      */
-     
-
-      else if (operand_is (name,"progress"))
-	dc3_progress = true;
-
-      else if (operand_is (name,"sizeprobe"))
-	dc3_sizeprobe = true;
-
-      else if (operand_is (name,"zork"))
-	dc3_error (EXIT_FAILURE, 0, _("It is pitch dark here. You are likely to be eaten by a grue."));
-
-      else if (operand_is (name,"splitformat"))
-	{
-          if (!dc3_validate_splitformat(val))
-            dc3_error(EXIT_FAILURE, 0, _("Illegal split format %s"), quote(val));
+static void
+read_bytes_from_files(input_t* input)
+{
+   read_bytes_from_file(input);
+   if (input->state == COMPLETE)
+   {
+      open_next_input_file(input);
+   }
+}
 
-	  dc3_split_format = val;
-	  if (!dc3_split)
+static void
+skip_device_input_sectors(input_t* input)
+{
+   pthread_mutex_lock(&reporting_lock);
+
+   // Skip a sector at a time to allow for error recovery.
+   uintmax_t sectors_to_skip = input->sectors_to_skip;
+   do
+   {
+      // This is a slow loop, so let the user know what's going on.
+      fprintf(stderr, "trying to skip sector %"PRIuMAX"", input->current_sector);
+
+      ssize_t bytes_read = 
+	 read_bytes(input->current_file->descriptor, input->buffer.data, input->sector_size);
+      fprintf(stderr, "%79s", "\r");
+      if (bytes_read > 0)
+      {
+         // Sucessfully skipped the sector.
+	 if (input->recover_errors)
+	 {
+            flush_grouped_read_errors(input, true);
+         }
+	 advance_input(input, bytes_read);                        
+
+         // Correct bytes input, since bytes skipped, not input
+         input->bytes_input -= input->sector_size;
+         input->current_file->size_in_bytes -= input->sector_size;
+      }
+      else if (bytes_read == 0 || errno == ENOSPC)
+      {
+         // End of device.
+	 if (input->recover_errors)
+	 {
+            flush_grouped_read_errors(input, true);
+         }
+         char message[DISPLAY_MESSAGE_LENGTH];
+         sprintf(message,  _("encountered end of device reading %s to skip sectors"),
+	    quote(input->current_file->name));
+	 report_error(0, 0, message); 
+	 input->state = FATAL_ERROR;         
+	 break;
+      }
+      else
+      {
+         // Hit a bad sector.
+	 if (input->recover_errors)
+	 {
+            // Try to jump past the bad sector.
+	    report_grouped_read_error(input, input->current_sector, true);
+	    if (!advance_input_after_sector_read_error(input)) 
 	    {
-	      dc3_split       = true;
-	      dc3_split_bytes = blocksize;
-	    }
-	}
-
-      else if (operand_is(name, "ifjoin"))
-        {
-          const char* base = dc3_filebase(val, ".");
-
-          if (base == NULL)
-            dc3_error(EXIT_FAILURE, 0, _("Illegal ifjoin format %s - missing extension"), quote(val));
-
-          const char* ext  = dc3_fileext(val, ".");
+               flush_grouped_read_errors(input, true);
+	       break;
+	    }      
+            else
+            {
+	       // Correct bytes input, since bytes skipped, not input
+	       input->bytes_input -= input->sector_size;
+	       input->current_file->size_in_bytes -= input->sector_size;
+            } 
+	 }
+	 else
+	 {
+            report_read_error(input, input->sector_size, true);
+	    input->state = FATAL_ERROR;
+	    break;
+	 }
+      }         
+   }
+   while (--sectors_to_skip);      
 
-          if (strlen(ext) == 0 || !dc3_validate_splitformat(ext))
-            dc3_error(EXIT_FAILURE, 0, _("Illegal ifjoin format %s"), quote(ext));
-         
-          dc3_ifjoin_base = strdup(base);
-          dc3_ifjoin_ext  = strdup(ext);
-          dc3_ifjoin      = true;
+   pthread_mutex_unlock(&reporting_lock);
+}
 
-          conversions_mask |= C_TWOBUFS;
-        }
+static void
+skip_file_input_sectors(input_t* input)
+{
+   uintmax_t bytes_to_skip = input->sectors_to_skip * input->sector_size;
+   while (bytes_to_skip)
+   {
+      size_t bytes_to_read =
+         bytes_to_skip >= input->buffer_size ? input->buffer_size : bytes_to_skip; 
+      ssize_t bytes_read = 
+         read_bytes(input->current_file->descriptor, input->buffer.data, bytes_to_read);
+      if (bytes_read > 0)
+      {
+	 advance_input(input, bytes_read);                        
 
-      else if (operand_is (name,"vf"))
-	{
-	  output_file = val;
-	  dc3_mode_verify = true;
-	}
+         // Correct bytes input, since bytes skipped, not input
+         input->bytes_input -= bytes_read;
+         input->current_file->size_in_bytes -= bytes_read;
 
-      else if (operand_is(name, "vfjoin"))
-        {
-          const char* base = dc3_filebase(val, ".");
+         bytes_to_skip -= bytes_read;
+      }
+      else if (bytes_read == 0)
+      {
+         char message[DISPLAY_MESSAGE_LENGTH];
+         sprintf(message,  _("encountered end of file reading %s to skip sectors"),
+	    quote(input->current_file->name));
+	 report_error(0, 0, message); 
+	 input->state = FATAL_ERROR;         
+	 break;
+      }
+      else
+      {
+         report_read_error(input, input->sector_size, true);
+	 input->state = FATAL_ERROR;
+	 break;
+      }         
+   }
+}
 
-          if (base == NULL)
-            dc3_error(EXIT_FAILURE, 0, _("Illegal vfjoin format %s - missing extension"), quote(val));
+static void
+skip_input_sectors(input_t* input)
+{
+   if (input->sectors_to_skip > 0)
+   {
+      // Attempt to perform the skip with lseek(). If the skip is
+      // too large or the lseek() call fails, resort to using read()
+      // for the skip.
+      uintmax_t bytes_to_skip = input->sectors_to_skip * input->sector_size;
+      if (bytes_to_skip <= OFF_T_MAX &&
+          lseek(input->current_file->descriptor, bytes_to_skip, SEEK_CUR) >= 0)
+      {
+         advance_input(input, bytes_to_skip);
 
-          const char* ext  = dc3_fileext(val, ".");
+         // Correct bytes input, since bytes skipped, not input
+         input->bytes_input -= bytes_to_skip;
+         input->current_file->size_in_bytes -= bytes_to_skip;
+      }
+      else
+      {
+         if (input->current_file->is_device)
+         {
+            skip_device_input_sectors(input);
+         }
+         else
+         {
+            skip_file_input_sectors(input);
+         }
+      }
+   }
+}
 
-          if (strlen(ext) == 0 || !dc3_validate_splitformat(ext))
-            dc3_error(EXIT_FAILURE, 0, _("Illegal vfjoin format %s"), quote(ext));
+// Begin code copied (and modified) from md5deep helpers.c 
 
-          dc3_vfjoin_base = strdup(base);
-          dc3_vfjoin_ext  = strdup(ext);
-          dc3_vfjoin      = true;
-        }
+#ifdef __linux__
 
-      else if (operand_is (name,"verifylog"))
-	{
-	  error_log = fopen(val,"a");
-	  if (NULL == error_log)
-	    dc3_error (EXIT_FAILURE, errno, _("opening %s"), quote (val));
-	}
+static void 
+get_file_stats(file_t* file)
+{
+   file->probed = false;
+   file->is_device = false;
+   file->is_block_device = false;
+   file->probed_sector_size = 0;
+   file->probed_size_in_sectors= 0;
+   file->probed_size_in_bytes = 0;
+
+   struct stat file_info;
+   if (fstat(file->descriptor, &file_info) == 0)
+   {
+      if (S_ISCHR(file_info.st_mode) || S_ISBLK(file_info.st_mode))
+      {
+         // The file is a character device or a block device. It is necessary to
+         // use ioctl to query the OS to get the data to compute the size of the 
+         // device.
+         file->is_device = true;
+         file->is_block_device = S_ISBLK(file_info.st_mode);
+         
+         uintmax_t size_in_sectors = 0;
+         uintmax_t sector_size = 0;
+         if (ioctl(file->descriptor, BLKGETSIZE, &size_in_sectors) == 0 && 
+             ioctl(file->descriptor, BLKSSZGET, &sector_size) == 0)
+         {
+            file->probed_sector_size = sector_size;
+            if (sector_size == 512)
+            {
+               file->probed_size_in_sectors = size_in_sectors;
+            }
+            else
+            {
+               // ioctl() reports device size in terms of 512 byte sectors, 
+               // regardless of actual sector size.
+               file->probed_size_in_sectors = size_in_sectors * 512 / sector_size; 
+            }
+            file->probed_size_in_bytes = file->probed_size_in_sectors * file->probed_sector_size;
+            file->probed = true;
+         }
+      }
+      else if (S_ISREG(file_info.st_mode))
+      {
+         // The file is a file (an image), so fstat returns a valid file size.   
+         file->probed_size_in_bytes = file_info.st_size;
+         file->probed = true;
+      }
+   }
+}  
 
-      else if (operand_is (name,"verifylog:"))
-	dc3_error (EXIT_FAILURE, 0, _("%s not implemented yet"), quote(name));
+#elif defined (__APPLE__)
 
-      else if (operand_is (name,"of:"))
-	{
-	  output_file = val;
-	  dc3_pipe_output = true;
-	}
-      
-      else if (operand_is (name, "if"))
-	{
-	  /* To save I/O time, we replace if=/dev/zero with pattern=00 */
-	  if (STREQ (val,"/dev/zero"))
-	    {
-	      dc3_use_pattern   = true;
-	      dc3_pattern_value = make_pattern("00");
-	      if (NULL == dc3_pattern_value)
-		dc3_error(EXIT_FAILURE,0, _("illegal pattern %s"), quote(val));
-	    }
-	  else
-	    input_file = val;
-	}
-      else if (operand_is (name, "of"))
-	output_file = val;
-      else if (operand_is (name, "wipe"))
-      {
-	  // wipe a device:
-	  // use pattern=00 [unless overridden]
-	  // use count=(sizeprobe output_device) [unless overridden]
-	  // if, for some reason, sizeprobe is unavailable, run until end of device reported (ENOSPC) and report completion
-	  output_file = val;
-	  dc3_mode_wipe = true;
+static void 
+get_file_stats(file_t* file)
+{
+   file->probed = false;
+   file->is_device = false;
+   file->is_block_device = false;
+   file->probed_sector_size = 0;
+   file->probed_size_in_sectors= 0;
+   file->probed_size_in_bytes = 0;
+
+   struct stat file_info;
+   if (fstat(file->descriptor, &file_info) == 0)
+   {
+      if (file_info.st_mode & S_IFBLK)
+      {
+         // The file is a character device or a block device. It is necessary to
+         // use ioctl to query the OS to get the data to compute the size of the 
+         // device.
+         file->is_device = true;
+         file->is_block_device = true;
+         
+         uint32_t sector_size = 0;
+         uint64_t size_in_sectors = 0;
+         if (ioctl(file->descriptor, DKIOCGETBLOCKSIZE, &sector_size) >= 0 &&
+             ioctl(file->descriptor, DKIOCGETBLOCKCOUNT, &size_in_sectors) >= 0)
+         {
+            file->probed_size_in_sectors = (uintmax_t)size_in_sectors;
+            file->probed_sector_size = (uintmax_t)sector_size;
+            file->probed_size_in_bytes = file->probed_size_in_sectors * file->probed_sector_size;
+            file->probed = true;
+         }
       }
-      else if (operand_is (name, "conv"))
-	conversions_mask |= parse_symbols (val, conversions,
-					   N_("invalid conversion"));
-      else if (operand_is (name, "iflag"))
-	input_flags |= parse_symbols (val, flags,
-				      N_("invalid input flag"));
-      else if (operand_is (name, "oflag"))
-	output_flags |= parse_symbols (val, flags,
-				       N_("invalid output flag"));
-      else if (operand_is (name, "status"))
-	status_flags |= parse_symbols (val, statuses,
-				       N_("invalid status flag"));
       else
-	{
-	  bool invalid = false;
-	  uintmax_t n = parse_integer (val, &invalid);
+      {
+         // The file is a file (an image).   
+         off_t start_of_file = lseek(file->descriptor, 0 , SEEK_CUR);
+         off_t end_of_file = lseek(file->descriptor, 0, SEEK_END);
+         if (lseek(file->descriptor, start_of_file, SEEK_SET) == 0)
+         {
+            file->probed_size_in_bytes = end_of_file - start_of_file;
+            file->probed = true;
+         }
+      }
+   }
+}
 
-	  if (operand_is (name,"hashwindow"))
-	    {
-	      invalid |= ( 0 == n);
-	      dc3_hash_window = n;
-	      dc3_hash        = true;
-	    }
+#elif defined (__CYGWIN__) 
 
-	  else if (operand_is (name,"progresscount"))
-	    {
-	      invalid |= (0 == n);
-	      dc3_progress_count = n;
-	      dc3_progress = true;
-	    }
+static void 
+get_file_stats(file_t* file)
+{
+   file->probed = false;
+   file->is_device = false;
+   file->is_block_device = false;
+   file->probed_sector_size = 0;
+   file->probed_size_in_sectors= 0;
+   file->probed_size_in_bytes = 0;
+
+   struct stat file_info;
+   if (fstat(file->descriptor, &file_info) == 0)
+   {
+      if (S_ISCHR(file_info.st_mode) || S_ISBLK(file_info.st_mode))
+      {
+         // The file is a character device or a block device. It is necessary to
+         // use ioctl to query the OS to get the data to compute the size of the 
+         // device.
+         file->is_device = true;
+         file->is_block_device = S_ISBLK(file_info.st_mode);
+         
+         // Use temp variables to guarantee file->size_in_sectors and file->sector_size
+         // are unchanged if the ioctl calls fail.
+         uintmax_t size_in_sectors = 0;
+         uintmax_t sector_size = 0;
+         if (ioctl(file->descriptor, BLKGETSIZE, &size_in_sectors) == 0 && 
+             ioctl(file->descriptor, BLKSSZGET, &sector_size) == 0)
+         {
+            file->probed_size_in_sectors = size_in_sectors;
+            file->probed_sector_size = sector_size;
+            file->probed_size_in_bytes = file->probed_size_in_sectors * file->probed_sector_size;
+            file->probed = true;
+         }
+      }
+      else if (S_ISREG(file_info.st_mode))
+      {
+         // The file is a file (an image), so fstat returns a valid file size.   
+         file->probed_size_in_bytes = file_info.st_size;
+         file->probed = true;
+      }
+   }
+}
 
-	  else if (operand_is (name,"split"))
-	    {
-	      invalid |= ( 0 == n);
-	      dc3_split_bytes = n;
-	      dc3_split = true;
-	    }
+#endif // ifdef __LINUX__
 
-	  else if (operand_is (name, "ibs"))
-	    {
-	      invalid |= ! (0 < n && n <= MAX_BLOCKSIZE (INPUT_BLOCK_SLOP));
-	      input_blocksize = n;
-	      conversions_mask |= C_TWOBUFS;
-	    }
-	  else if (operand_is (name, "obs"))
-	    {
-	      invalid |= ! (0 < n && n <= MAX_BLOCKSIZE (OUTPUT_BLOCK_SLOP));
-	      output_blocksize = n;
-	      conversions_mask |= C_TWOBUFS;
-	    }
-	  else if (operand_is (name, "bs"))
-	    {
-	      invalid |= ! (0 < n && n <= MAX_BLOCKSIZE (INPUT_BLOCK_SLOP));
-	      blocksize = n;
-	    }
-	  else if (operand_is (name, "cbs"))
+// End code copied (and modified) from md5deep helpers.c
+   
+static bool 
+probe_file(file_t* file)
+{
+   if (!file->probed)
+   {
+      get_file_stats(file);
+      if (file->probed && file->part_of_set)
+      {
+	 // Generate the set of potential file names and attempt to
+	 // open the set of files. Stop when file extensions are exhausted 
+	 // or the next file does not exist. Note that there is an assumption
+	 // here that the set of files was generated by this program, so
+	 // exhaustion of file extensions should not be an issue.   
+	 file_t next_file; 
+	 next_file.number = file->number;
+         next_file.probed = false;
+	 next_file.probed_size_in_bytes = 0;
+	 next_file.probed_sector_size = 0;
+	 next_file.name = generate_file_name(file->unparsed_name, ++next_file.number); 
+	 while (next_file.name)
+	 {
+	    next_file.descriptor = open(next_file.name, O_RDONLY, 0);
+	    if (next_file.descriptor >= 0)
 	    {
-	      invalid |= ! (0 < n && n <= SIZE_MAX);
-	      conversion_blocksize = n;
+	       // This is another file in the set, get its size.
+	       get_file_stats(&next_file);
+	       if (next_file.probed)
+	       {
+		  file->probed_size_in_bytes += next_file.probed_size_in_bytes;
+	       }
+	       else
+	       {
+		  report_error(0, 0, _("probe of %s failed"), quote(next_file.name));
+		  file->probed = false;
+	       }
+
+	       if (close(next_file.descriptor) != 0)
+	       {
+		  report_error(0, errno, _("closing %s after size probe"), quote(next_file.name));
+		  file->probed = false;
+	       }
+
+	       free(next_file.name);
+               if (!file->probed)
+               {
+                  break;
+               }
 	    }
-	  else if (operand_is (name, "skip"))
-            skip_sectors = n;
-	  else if (operand_is (name, "seek"))
-            seek_sectors = n;
-	  else if (operand_is (name, "count"))
-            max_sectors = n;
-	  else
+	    else
 	    {
- 	      dc3_error (0, 0, _("unrecognized operand %s"), quote (name));
-	      usage (EXIT_FAILURE);
+	       // The next file does not exist, which is not an error (see comment above).
+	       free(next_file.name);
+	       break;
 	    }
 
-	  if (invalid)
-	    dc3_error (EXIT_FAILURE, 0, _("invalid number %s"), quote (val));
-	}
-    }
-
-  if (blocksize)
-    input_blocksize = output_blocksize = blocksize;
-
-  /* If bs= was given, both `input_blocksize' and `output_blocksize' will
-     have been set to positive values.  If either has not been set,
-     bs= was not given, so make sure two buffers are used. */
-  if (input_blocksize == 0 || output_blocksize == 0)
-    conversions_mask |= C_TWOBUFS;
-  if (input_blocksize == 0)
-    input_blocksize = DEFAULT_BLOCKSIZE;
-  if (output_blocksize == 0)
-    output_blocksize = DEFAULT_BLOCKSIZE;
-  if (conversion_blocksize == 0)
-    conversions_mask &= ~(C_BLOCK | C_UNBLOCK);
-
-  // automatically enable "dynamic" error recovery when conv=noerror,sync specified
-  if (conversions_mask & (C_SYNC | C_NOERROR))
-    conversions_mask |= C_DYNAMIC;
-
-  if (input_flags & (O_DSYNC | O_SYNC))
-    input_flags |= O_RSYNC;
-
-  if (multiple_bits_set (conversions_mask & (C_ASCII | C_EBCDIC | C_IBM)))
-    dc3_error (EXIT_FAILURE, 0, _("cannot combine any two of {ascii,ebcdic,ibm}"));
-  if (multiple_bits_set (conversions_mask & (C_BLOCK | C_UNBLOCK)))
-    dc3_error (EXIT_FAILURE, 0, _("cannot combine block and unblock"));
-  if (multiple_bits_set (conversions_mask & (C_LCASE | C_UCASE)))
-    dc3_error (EXIT_FAILURE, 0, _("cannot combine lcase and ucase"));
-  if (multiple_bits_set (conversions_mask & (C_EXCL | C_NOCREAT)))
-    dc3_error (EXIT_FAILURE, 0, _("cannot combine excl and nocreat"));
-
-  if (input_file != NULL && dc3_ifjoin)
-    dc3_error (EXIT_FAILURE, 0, _("cannot combine if= and ifjoin="));
-
-  if (dc3_mode_verify && dc3_vfjoin)
-    dc3_error (EXIT_FAILURE, 0, _("cannot combine vf= and vfjoin="));
-
-  if (dc3_split && (dc3_split_bytes % input_blocksize != 0))
-    dc3_error (EXIT_FAILURE, 0, _("error: split size must be a multiple of block size (currently %zd)"), input_blocksize);
-
-  if (input_file != NULL && dc3_mode_wipe)
-      dc3_error (EXIT_FAILURE, 0, _("cannot combine if= and wipe="));
-  // TODO: should check for wipe= and of=
-  if (dc3_mode_wipe && dc3_ifjoin)
-      dc3_error (EXIT_FAILURE, 0, _("cannot combine wipe= and ifjoin="));
-  if (dc3_mode_wipe && dc3_vfjoin)
-      dc3_error (EXIT_FAILURE, 0, _("cannot combine wipe= and vfjoin="));
-
-  if (dc3_mode_wipe && !dc3_use_pattern)
-  {
-      dc3_use_pattern   = true;
-      dc3_pattern_value = make_pattern("00");
-      if (NULL == dc3_pattern_value)
-          dc3_error(EXIT_FAILURE,0, _("illegal pattern %s"), quote("00"));
-  }
-
-
-  if (dc3_ifjoin)
-    dc3_generate_split_filename(dc3_ifjoin_base, dc3_ifjoin_ext, dc3_ifjoin_number, &input_file);
-
-  if (dc3_vfjoin)
-  {
-    dc3_generate_split_filename(dc3_vfjoin_base, dc3_vfjoin_ext, dc3_vfjoin_number, &output_file);
-    dc3_mode_verify = true;
-  }
-}
-
-/* Convert argv array to a single string
- */
-
-static char*
-dc3_save_cmdline(int argc, char** argv)
-{
-  size_t len = 1; // at least 1, for terminating NUL
-
-  for (int i=0; i<argc; i++)
-  {
-    len += strlen(argv[i]);
-    if (i<(argc-1))
-      len += 1;
-  }
-
-  char* cmdline = NULL;
-  cmdline = xmalloc(len);
-
-  char* cmdline_orig = cmdline;
-
-  for (int i=0; i<argc; i++)
-  {
-    for (size_t j=0; j<strlen(argv[i]); j++)
-    {
-      *cmdline = argv[i][j];
-      cmdline++;
-    }
-    if (i<(argc-1))
-    {
-      *cmdline = ' ';
-      cmdline++;
-    }
-  }
-
-  *cmdline = '\0';
-
-  return cmdline_orig;
+	    next_file.name = generate_file_name(file->unparsed_name, ++next_file.number); 
+	 }
+      }
+   }
+   return file->probed;
 }
 
-void dc3_print_flags(FILE* stream, bool newlines)
+static void
+open_file_input(input_t* input)
 {
-#ifdef DEFAULT_BLOCKSIZE
-        fprintf(stream, " DEFAULT_BLOCKSIZE=%d", DEFAULT_BLOCKSIZE);
-        if (newlines) fprintf(stream, "\n");
-#endif
-
-
-#ifdef DEFAULT_HASH_MD5
-        fprintf(stream, " DEFAULT_HASH_MD5");
-        if (newlines) fprintf(stream, "\n");
-#endif
-
-#ifdef DEFAULT_HASH_SHA1
-        fprintf(stream, " DEFAULT_HASH_SHA1");
-        if (newlines) fprintf(stream, "\n");
-#endif
-
-#ifdef DEFAULT_HASH_SHA256
-        fprintf(stream, " DEFAULT_HASH_SHA256");
-        if (newlines) fprintf(stream, "\n");
-#endif
-
-#ifdef DEFAULT_HASH_512
-        fprintf(stream, " DEFAULT_HASH_512");
-        if (newlines) fprintf(stream, "\n");
-#endif
-
-
-#ifdef DEFAULT_HASHCONV_BEFORE
-        fprintf(stream, " DEFAULT_HASHCONV_BEFORE");
-        if (newlines) fprintf(stream, "\n");
-#endif
-
-#ifdef DEFAULT_HASHCONV_AFTER
-        fprintf(stream, " DEFAULT_HASHCONV_AFTER");
-        if (newlines) fprintf(stream, "\n");
-#endif
-
-
-#ifdef DEFAULT_PROGRESS
-        fprintf(stream, " DEFAULT_PROGRESS");
-        if (newlines) fprintf(stream, "\n");
-#endif
-
-#ifdef DEFAULT_PROGRESSCOUNT
-        fprintf(stream, " DEFAULT_PROGRESSCOUNT=%d", DEFAULT_PROGRESSCOUNT);
-        if (newlines) fprintf(stream, "\n");
-#endif
-
-#ifdef DEFAULT_IFLAG_DIRECT
-        fprintf(stream, " DEFAULT_IFLAG_DIRECT");
-        if (newlines) fprintf(stream, "\n");
-#endif
-
-#ifdef DEFAULT_SIZEPROBE
-        fprintf(stream, " DEFAULT_SIZEPROBE");
-        if (newlines) fprintf(stream, "\n");
-#endif
-
-    fprintf(stream, "\n");
+   input->current_file->descriptor = open(input->current_file->name, input->current_file->flags, 0); 
+   if (input->current_file->descriptor >= 0)
+   {
+      if (probe_file(input->current_file))
+      {
+	 input->state = OPEN;            
+	 input->bytes_to_input = input->current_file->probed_size_in_bytes; 
+	 if (input->max_sectors_to_input != INFINITE_SECTORS)
+	 {
+	    uintmax_t max_bytes_to_input = input->max_sectors_to_input * input->sector_size;
+	    if (max_bytes_to_input < input->bytes_to_input)
+	    {
+	       input->bytes_to_input = max_bytes_to_input;
+	    }
+	 }
+	 skip_input_sectors(input);      
+      }
+      else
+      {
+	 report_error(0, errno, _("probing %s for bytes to input"), quote(input->current_file->name)); 
+	 input->state = FATAL_ERROR;
+      }
+   }
+   else 
+   {
+      report_error(0, errno, _("opening %s"), quote(input->current_file->name)); 
+      input->state = FATAL_ERROR;
+   }
 }
 
-/* Fix up translation table. */
-
 static void
-apply_translations (void)
+disconnect_from_std_in(input_t* input)
 {
-  int i;
-
-  if (conversions_mask & C_ASCII)
-    translate_charset (ebcdic_to_ascii);
-
-  if (conversions_mask & C_UCASE)
-    {
-      for (i = 0; i < 256; i++)
-	trans_table[i] = toupper (trans_table[i]);
-      translation_needed = true;
-    }
-  else if (conversions_mask & C_LCASE)
-    {
-      for (i = 0; i < 256; i++)
-	trans_table[i] = tolower (trans_table[i]);
-      translation_needed = true;
-    }
-
-  if (conversions_mask & C_EBCDIC)
-    {
-      translate_charset (ascii_to_ebcdic);
-      newline_character = ascii_to_ebcdic['\n'];
-      space_character = ascii_to_ebcdic[' '];
-    }
-  else if (conversions_mask & C_IBM)
-    {
-      translate_charset (ascii_to_ibm);
-      newline_character = ascii_to_ibm['\n'];
-      space_character = ascii_to_ibm[' '];
-    }
+   input->state = COMPLETE;
+   input->current_file->descriptor = FILE_DESCRIPTOR_NOT_SET; 
 }
 
-/* Apply the character-set translations specified by the user
-   to the NREAD bytes in BUF.  */
-
 static void
-translate_buffer (char *buf, size_t nread)
+connect_to_std_in(input_t* input)
 {
-  char *cp;
-  size_t i;
-
-  for (i = nread, cp = buf; i; i--, cp++)
-    *cp = trans_table[to_uchar (*cp)];
+   input->current_file->descriptor = STDIN_FILENO; 
+   input->bytes_to_input = INFINITE_BYTES;
+   input->state = OPEN;
 }
 
-/* If true, the last char from the previous call to `swab_buffer'
-   is saved in `saved_char'.  */
-static bool char_is_saved = false;
-
-/* Odd char from previous call.  */
-static char saved_char;
-
-/* Swap NREAD bytes in BUF, plus possibly an initial char from the
-   previous call.  If NREAD is odd, save the last char for the
-   next call.   Return the new start of the BUF buffer.  */
-
-static char *
-swab_buffer (char *buf, size_t *nread)
+static void
+close_pattern_input(input_t* input)
 {
-  char *bufstart = buf;
-  char *cp;
-  size_t i;
-
-  /* Is a char left from last time?  */
-  if (char_is_saved)
-    {
-      *--bufstart = saved_char;
-      (*nread)++;
-      char_is_saved = false;
-    }
-
-  if (*nread & 1)
-    {
-      /* An odd number of chars are in the buffer.  */
-      saved_char = bufstart[--*nread];
-      char_is_saved = true;
-    }
-
-  /* Do the byte-swapping by moving every second character two
-     positions toward the end, working from the end of the buffer
-     toward the beginning.  This way we only move half of the data.  */
-
-  cp = bufstart + *nread;	/* Start one char past the last.  */
-  for (i = *nread / 2; i; i--, cp -= 2)
-    *cp = *(cp - 2);
-
-  return ++bufstart;
+   input->state = COMPLETE;
 }
 
-/* Add OFFSET to the input offset, setting the overflow flag if
-   necessary.  */
-
 static void
-advance_input_offset (uintmax_t offset)
+read_bytes_from_pattern(input_t* input)
 {
-  input_offset += offset;
-  if (input_offset < offset)
-    input_offset_overflow = true;
+   // The pattern is already loaded into the buffer, so only bookkeeping is required.
+   size_t bytes_read = calculate_bytes_to_read(input);
+   input->buffer.length = bytes_read;
+   advance_input(input, bytes_read);
 }
 
-/*
 static void
-dc3_rewind_input_offset (uintmax_t offset)
+open_pattern_input(input_t* input)
 {
-  //fprintf(stderr, "dc3_rewind_input_offset called with offset=%16jx\n", offset);
-  //fprintf(stderr, "dc3_rewind_input_offset input_offset was %16jx\n", input_offset);
-  uintmax_t old = input_offset;
-  input_offset -= offset;
-  //if (input_offset > offset)
-  if (input_offset > old)
-    input_offset_overflow = true;
-  //fprintf(stderr, "dc3_rewind_input_offset input_offset now %16jx\n", input_offset);
+   // Load the pattern into the input buffer.
+   for (uintmax_t i = 0; i < input->buffer_size; ++i)
+   {
+      input->buffer.data[i] = input->pattern[i % input->pattern_length];
+   }      
+   input->buffer.length = input->buffer_size;   
+
+   input->bytes_to_input = input->sector_size * input->max_sectors_to_input;
+   input->state = OPEN;
 }
-*/
-
-/* This is a wrapper for lseek.  It detects and warns about a kernel
-   bug that makes lseek a no-op for tape devices, even though the kernel
-   lseek return value suggests that the function succeeded.
-
-   The parameters are the same as those of the lseek function, but
-   with the addition of FILENAME, the name of the file associated with
-   descriptor FDESC.  The file name is used solely in the warning that's
-   printed when the bug is detected.  Return the same value that lseek
-   would have returned, but when the lseek bug is detected, return -1
-   to indicate that lseek failed.
-
-   The offending behavior has been confirmed with an Exabyte SCSI tape
-   drive accessed via /dev/nst0 on both Linux-2.2.17 and Linux-2.4.16.  */
 
-#ifdef __linux__
-
-# include <sys/mtio.h>
-
-# define MT_SAME_POSITION(P, Q) \
-   ((P).mt_resid == (Q).mt_resid \
-    && (P).mt_fileno == (Q).mt_fileno \
-    && (P).mt_blkno == (Q).mt_blkno)
-
-static off_t
-skip_via_lseek (char const *filename, int fdesc, off_t offset, int whence)
+static void 
+set_exit_code(task_t* task)
 {
-  struct mtget s1;
-  struct mtget s2;
-  bool got_original_tape_position = (ioctl (fdesc, MTIOCGET, &s1) == 0);
-  /* known bad device type */
-  /* && s.mt_type == MT_ISSCSI2 */
-
-  off_t new_position = lseek (fdesc, offset, whence);
-  if (0 <= new_position
-      && got_original_tape_position
-      && ioctl (fdesc, MTIOCGET, &s2) == 0
-      && MT_SAME_POSITION (s1, s2))
-    {
-      dc3_error (0, 0, _("warning: working around lseek kernel bug for file (%s)\n\
-  of mt_type=0x%0lx -- see <sys/mtio.h> for the list of types"),
-	     filename, s2.mt_type);
-      errno = 0;
-      new_position = -1;
-    }
-
-  return new_position;
+   pthread_mutex_lock(task->signalling_lock);
+   task->completed = true;
+   if (task->aborted)
+   {
+      task->exit_code = DC3DD_EXIT_ABORTED;
+   }
+
+   if (task->exit_code != DC3DD_EXIT_ABORTED)
+   {
+      task->exit_code = DC3DD_EXIT_COMPLETED;
+
+      if (task->input->state != COMPLETE)
+      {
+         task->exit_code = DC3DD_EXIT_FAILED;
+      }
+      else
+      {
+         output_t* output = task->outputs;
+         while (output)
+         {
+            if (output->state != COMPLETE)
+            {
+               task->exit_code = DC3DD_EXIT_FAILED;
+               break;
+            }
+            output = output->next_output;
+         }
+      }
+   }
+   pthread_mutex_unlock(task->signalling_lock);
 }
-#else
-# define skip_via_lseek(Filename, Fd, Offset, Whence) lseek (Fd, Offset, Whence)
-#endif
 
-/* Throw away RECORDS blocks of BLOCKSIZE bytes on file descriptor FDESC,
-   which is open with read permission for FILE.  Store up to BLOCKSIZE
-   bytes of the data at a time in BUF, if necessary.  RECORDS must be
-   nonzero.  If fdesc is STDIN_FILENO, advance the input offset.
-   Return the number of records remaining, i.e., that were not skipped
-   because EOF was reached.  */
-
-static uintmax_t
-skip (int fdesc, char const *file, uintmax_t records, size_t blocksize,
-      char *buf)
+static void
+close_IO(task_t* task)
 {
-  uintmax_t offset = records * blocksize;
-
-  /* Try lseek and if an error indicates it was an inappropriate operation --
-     or if the file offset is not representable as an off_t --
-     fall back on using read.  */
-
-  errno = 0;
-  if (records <= OFF_T_MAX / blocksize
-      && 0 <= skip_via_lseek (file, fdesc, offset, SEEK_CUR))
-    {
-      if (fdesc == STDIN_FILENO)
-	advance_input_offset (offset);
-      return 0;
-    }
-  else
-    {
-      int lseek_errno = errno;
-
-      do
-	{
-	  ssize_t nread = iread (fdesc, buf, blocksize);
-	  if (nread < 0)
-	    {
-	      if (fdesc == STDIN_FILENO)
-		{
-		  dc3_error (0, errno, _("skip: reading %s"), quote (file));
-		  if (conversions_mask & C_NOERROR)
-		    {
-		      print_stats ();
-		      continue;
-		    }
-		}
-	      else
-		dc3_error (0, lseek_errno, _("%s: cannot seek"), quote (file));
-	      quit (EXIT_FAILURE);
-	    }
-
-	  if (nread == 0)
-	    break;
-	  if (fdesc == STDIN_FILENO)
-	    advance_input_offset (nread);
-	}
-      while (--records != 0);
-
-      return records;
-    }
+   task->input->close(task->input);
+   
+   output_t* output = task->outputs;
+   while (output)
+   {
+      output->close(output);
+      output = output->next_output;
+   }      
 }
 
-/* Advance the input by NBYTES if possible, after a read error.
-   The input file offset may or may not have advanced after the failed
-   read; adjust it to point just after the bad record regardless.
-   Return true if successful, or if the input is already known to not
-   be seekable.  */
-
-static bool
-advance_input_after_read_error (size_t nbytes)
+static void
+wait_for_output_threads(task_t* task)
 {
-  if (! input_seekable)
-    {
-      if (input_seek_errno == ESPIPE)
-	return true;
-      errno = input_seek_errno;
-    }
-  else
-    {
-      off_t offset;
-      advance_input_offset (nbytes);
-      input_offset_overflow |= (OFF_T_MAX < input_offset);
-      if (input_offset_overflow)
-	{
-	  dc3_error (0, 0, _("offset overflow while reading file %s"),
-		 quote (input_file));
-
-          /* Suppress duplicate diagnostics.  */
-          input_seekable = false;
-          input_seek_errno = ESPIPE;
-
-	  return false;
-	}
-      offset = lseek (STDIN_FILENO, 0, SEEK_CUR);
-      if (0 <= offset)
-	{
-	  off_t diff;
-	  if (offset == input_offset)
-	    return true;
-	  diff = input_offset - offset;
-	  if (! (0 <= diff && diff <= nbytes))
-          {
-	    dc3_error (0, 0, _("advance: warning: invalid file offset after failed read"));
-          }
-	  if (0 <= skip_via_lseek (input_file, STDIN_FILENO, diff, SEEK_CUR))
-	    return true;
-	  if (errno == 0)
-	    dc3_error (0, 0, _("cannot work around kernel bug after all"));
-	}
-    }
-
-  dc3_error (0, errno, _("%s: cannot seek"), quote (input_file));
-
-  /* Suppress duplicate diagnostics.  */
-  input_seekable = false;
-  input_seek_errno = ESPIPE;
+   output_t* output = task->outputs;
+   while (output)
+   {
+      // Set the done buffering flag on the output buffer queue and
+      // signal not empty to release the output thread, since it may be 
+      // blocked waiting for the next buffer to be copied into the
+      // output buffer queue.
+      pthread_mutex_lock(output->buffer_queue->lock);
+      output->buffer_queue->done_buffering = true;
+      pthread_cond_signal(output->buffer_queue->not_empty);
+      pthread_mutex_unlock(output->buffer_queue->lock);
+
+      pthread_join(output->thread, NULL);
+      output = output->next_output;
+   }   
+}
 
-  return false;
+static void
+produce_bytes(task_t* task)
+{
+   input_t* input = task->input;
+         // Produce an input buffer and copy it to each output buffer queue.
+         input->produce_bytes(input); 
+         if (input->buffer.length > 0)
+         {
+            output_t* output = task->outputs;
+            while (output)
+            {
+	       // Wait for an empty buffer in the buffer buffer queue for this
+	       // output.
+               buffer_queue_t* buffer_queue = output->buffer_queue;
+	       pthread_mutex_lock(buffer_queue->lock);
+	       if (buffer_queue->buffers_used == buffer_queue->number_of_buffers)
+	       {
+		  pthread_cond_wait(buffer_queue->not_full, buffer_queue->lock);
+	       }
+	       pthread_mutex_unlock(buffer_queue->lock);
+
+	       // Copy the input buffer into the buffer queue. 
+	       memcpy(buffer_queue->buffers[buffer_queue->next_available_buffer].data,
+		  input->buffer.data, input->buffer.length);
+	       buffer_queue->buffers[buffer_queue->next_available_buffer].length = input->buffer.length;
+
+	       // Notify the output thread that another buffer is available.
+	       // This will release the output thread if it is blocked waiting
+	       // for bytes to output.
+	       pthread_mutex_lock(buffer_queue->lock);
+	       buffer_queue->next_available_buffer = 
+		  (buffer_queue->next_available_buffer + 1) % buffer_queue->number_of_buffers;
+	       ++buffer_queue->buffers_used;
+	       pthread_cond_signal(buffer_queue->not_empty);
+	       pthread_mutex_unlock(buffer_queue->lock);
+
+               output = output->next_output;
+            }
+         }
 }
 
-/*
 static bool
-dc3_rewind_input_after_read_error (size_t nbytes)
+is_task_completed(task_t* task)
 {
-  if (nbytes == 0) // no-op
-    return true;
-
-  if (! input_seekable)
-    {
-      if (input_seek_errno == ESPIPE)
-	return true;
-      errno = input_seek_errno;
-    }
-  else
-    {
-      off_t offset;
-      dc3_rewind_input_offset (nbytes);
-      input_offset_overflow |= (OFF_T_MAX < input_offset);
-      if (input_offset_overflow)
-	{
-	  dc3_error (0, 0, _("offset overflow while reading file %s"),
-		 quote (input_file));
-	  return false;
-	}
-      offset = lseek (STDIN_FILENO, 0, SEEK_CUR);
-      if (0 <= offset)
-	{
-	  off_t diff;
-	  if (offset == input_offset)
-	    return true;
-	  diff = input_offset - offset;
-	  //if (! (0 <= diff && diff <= nbytes))
-	  if (! (diff <= 0 && (-1*nbytes) <= diff) )
-          {
-	    dc3_error (0, 0, _("rewind: warning: invalid file offset after failed read"));
-          }
-
-	  if (0 <= skip_via_lseek (input_file, STDIN_FILENO, diff, SEEK_CUR))
-	    return true;
-	  if (errno == 0)
-	    dc3_error (0, 0, _("cannot work around kernel bug after all"));
-	}
-    }
+   pthread_mutex_lock(task->signalling_lock);
+   
+   // Check for task killed.
+   task->completed = task->aborted;
+   
+   // Check for bytes to input reached.
+   if (!task->completed && task->input->bytes_to_input != INFINITE_BYTES)
+   {
+      task->completed = task->input->bytes_to_input - task->input->bytes_input <= 0;
+   }
+
+   // Check for input completed or in an error state.
+   if (!task->completed)
+   {
+      task->completed = task->input->state == COMPLETE || task->input->state == FATAL_ERROR;
+   }
+
+   // Check for an output in  an error state.
+   if (!task->completed)
+   {
+      output_t* output = task->outputs;
+      while (output)
+      {
+         if (output->state == FATAL_ERROR)
+         {
+            task->completed = true;
+            break;
+         }
+         output = output->next_output;
+      }
+   }
 
-  dc3_error (0, errno, _("%s: cannot seek"), quote (input_file));
-  return false;
+   pthread_mutex_unlock(task->signalling_lock);
+   
+   return task->completed;
 }
-*/
-
-/* Copy NREAD bytes of BUF, with no conversions.  */
 
 static void
-copy_simple (char const *buf, size_t nread)
+start_output_threads(task_t* task)
 {
-  const char *start = buf;	/* First uncopied char in BUF.  */
-
-  do
-    {
-      size_t nfree = MIN (nread, output_blocksize - oc);
-
-      memcpy (obuf + oc, start, nfree);
-
-      nread -= nfree;		/* Update the number of bytes left to copy. */
-      start += nfree;
-      oc += nfree;
-      if (oc >= output_blocksize)
-	write_output ();
-    }
-  while (nread != 0);
+   output_t* output = task->outputs;
+   while (output)
+   {
+      start_thread(&output->thread, produce_output, output);
+      output = output->next_output;
+   }
+   
+   usleep(10*1000);
 }
 
-/* Copy NREAD bytes of BUF, doing conv=block
-   (pad newline-terminated records to `conversion_blocksize',
-   replacing the newline with trailing spaces).  */
-
-static void
-copy_with_block (char const *buf, size_t nread)
+static bool
+open_IO(task_t* task)
 {
-  size_t i;
-
-  for (i = nread; i; i--, buf++)
-    {
-      if (*buf == newline_character)
-	{
-	  if (col < conversion_blocksize)
-	    {
-	      size_t j;
-	      for (j = col; j < conversion_blocksize; j++)
-		output_char (space_character);
-	    }
-	  col = 0;
-	}
-      else
-	{
-	  if (col == conversion_blocksize)
-	    r_truncate++;
-	  else if (col < conversion_blocksize)
-	    output_char (*buf);
-	  col++;
-	}
-    }
+   task->input->open(task->input);
+   if (task->input->state == OPEN)
+   {      
+      output_t* output = task->outputs;
+      while (output)
+      {
+         output->open(output);
+         if (output->state != OPEN)
+         {
+            close_IO(task);
+            return false;
+         }
+         output = output->next_output;
+      }   
+   }
+   else
+   {
+      return false;
+   }
+   
+   return true;
 }
 
-/* Copy NREAD bytes of BUF, doing conv=unblock
-   (replace trailing spaces in `conversion_blocksize'-sized records
-   with a newline).  */
-
-static void
-copy_with_unblock (char const *buf, size_t nread)
+static void* 
+execute_task(void* arg)
 {
-  size_t i;
-  char c;
-  static size_t pending_spaces = 0;
-
-  for (i = 0; i < nread; i++)
-    {
-      c = buf[i];
-
-      if (col++ >= conversion_blocksize)
-	{
-	  col = pending_spaces = 0; /* Wipe out any pending spaces.  */
-	  i--;			/* Push the char back; get it later. */
-	  output_char (newline_character);
-	}
-      else if (c == space_character)
-	pending_spaces++;
-      else
-	{
-	  /* `c' is the character after a run of spaces that were not
-	     at the end of the conversion buffer.  Output them.  */
-	  while (pending_spaces)
-	    {
-	      output_char (space_character);
-	      --pending_spaces;
-	    }
-	  output_char (c);
-	}
-    }
+   // This is the thread function for task (i.e., input) threads.
+   task_t* task = (task_t*)arg;
+   if (open_IO(task))
+   {
+      start_output_threads(task);
+      while (!is_task_completed(task))
+      {
+         produce_bytes(task);
+      } 
+      wait_for_output_threads(task);   
+      close_IO(task);
+   }
+   set_exit_code(task);
+   pthread_exit(NULL);
 }
 
-/* Set the file descriptor flags for FD that correspond to the nonzero bits
-   in ADD_FLAGS.  The file's name is NAME.  */
-
 static void
-set_fd_flags (int fd, int add_flags, char const *name)
+abort_job(job_t* job)
 {
-  /* Ignore file creation flags that are no-ops on file descriptors.  */
-  add_flags &= ~ (O_NOCTTY | O_NOFOLLOW);
-
-  if (add_flags)
-    {
-      int old_flags = fcntl (fd, F_GETFL);
-      int new_flags = old_flags | add_flags;
-      bool ok = true;
-      if (old_flags < 0)
-	ok = false;
-      else if (old_flags != new_flags)
-	{
-	  if (new_flags & (O_DIRECTORY | O_NOLINKS))
-	    {
-	      /* NEW_FLAGS contains at least one file creation flag that
-		 requires some checking of the open file descriptor.  */
-	      struct stat st;
-	      if (fstat (fd, &st) != 0)
-		ok = false;
-	      else if ((new_flags & O_DIRECTORY) && ! S_ISDIR (st.st_mode))
-		{
-		  errno = ENOTDIR;
-		  ok = false;
-		}
-	      else if ((new_flags & O_NOLINKS) && 1 < st.st_nlink)
-		{
-		  errno = EMLINK;
-		  ok = false;
-		}
-	      new_flags &= ~ (O_DIRECTORY | O_NOLINKS);
-	    }
-
-	  if (ok && old_flags != new_flags
-	      && fcntl (fd, F_SETFL, new_flags) == -1)
-	    ok = false;
-	}
+   task_t* task = job->tasks;
+   while (task)
+   {
+      pthread_mutex_lock(task->signalling_lock);
+      task->aborted = true;
+      pthread_mutex_unlock(task->signalling_lock);         
+      task = task->next_task;
+   }
+}
 
-      if (!ok)
-	dc3_error (EXIT_FAILURE, errno, _("setting flags for %s"), quote (name));
-    }
+static bool 
+job_is_active(job_t* job)
+{
+   bool is_active = false;
+   
+   task_t* task = job->tasks;
+   while (task)
+   {
+      pthread_mutex_lock(task->signalling_lock);
+      is_active = !task->completed && !task->aborted;
+      pthread_mutex_unlock(task->signalling_lock);               
+   
+      if (is_active)
+      {
+         break;
+      }
+      
+      task = task->next_task;
+   }
+   
+   return is_active;
 }
 
-static void
-dc3_record_previous_errors(void)
+static void*
+monitor_job(void *arg)
 {
-  uintmax_t start_sec = dc3_sectors_r_full + dc3_sectors_r_partial - dc3_previous_error_count;
-  uintmax_t end_sec   = dc3_sectors_r_full + dc3_sectors_r_partial - 1;
+   // This is the thread function for a job monitoring thread.
+   // The thread detects when the job is completed and emits progress reports.
+   job_t* job = (job_t*)arg;
+
+   struct timeval time_now;
+   struct timespec next_progress_check_time;
+   while (true)
+   {
+      // Compute the absolute time of next job progress check.
+      gettimeofday(&time_now, NULL);
+      next_progress_check_time.tv_sec = time_now.tv_sec + job->progress_interval_in_ms / 1000;
+      next_progress_check_time.tv_nsec = 
+         time_now.tv_usec * 1000 + (job->progress_interval_in_ms % 1000) * 1000000;
+      if (next_progress_check_time.tv_nsec >= 1000000000)
+      {
+         next_progress_check_time.tv_nsec -= 1000000000;
+         ++next_progress_check_time.tv_sec;
+      }
+      
+      // Wait until either the signal handling thread receives an interrupt or
+      // it's time for another progress check and report. 
+      pthread_mutex_lock(&signalling_lock);
+      if (pthread_cond_timedwait(interrupted, &signalling_lock, &next_progress_check_time) == ETIMEDOUT)
+      {
+         pthread_mutex_unlock(&signalling_lock);      
+         job->report_progress(job, false);
+         if (!job_is_active(job))
+         {
+            break;
+         }
+      }
+      else
+      {
+         abort_job(job);
+         break;
+      }
+   }
 
-  dc3_error(0,
-	    0,
-	    _("Recorded %"PRIuMAX" %s from sector %"PRIuMAX" through %"PRIuMAX),
-	    dc3_previous_error_count,
-	    quote(strerror(dc3_previous_error_errno)),
-            skip_sectors+start_sec, skip_sectors+end_sec);
+   pthread_exit(NULL);   
 }
 
-
-void
-dc3_read_error(void)
+static void*
+await_interrupt_signal(void* arg)
 {
-    if (dc3_group_errors)
-    {
-        if (!dc3_previous_error)
-        {
-            dc3_previous_error = true;
-        }
-        else if (errno != dc3_previous_error_errno)
-        {
-            /* We have to display the old errors before
-               starting to record this new series */
-            dc3_record_previous_errors();
-            dc3_previous_error_count = 0;
-        }
-
-        dc3_previous_error_errno = errno;
-        dc3_previous_error_count++;
-    }
-    else
-    {
-        uintmax_t block = r_full + r_partial;
-        uintmax_t start_sec = block     * (input_blocksize/dc3_sectorsize);
-        uintmax_t end_sec   = (block+1) * (input_blocksize/dc3_sectorsize) - 1;
-
-        if (start_sec == end_sec)
-            dc3_error( 0, errno, _("reading %s at sector %jd"), quote (input_file), skip_sectors+start_sec);
-        else
-            dc3_error( 0, errno, _("reading %s at sectors %jd-%jd"), quote (input_file), skip_sectors+start_sec, skip_sectors+end_sec );
-    }
+   // This is the thread function for a thread that merely waits for an
+   // interrupt signal.
+   arg = arg; // Avoid a warning from the compiler when compiling with -Wextra, -Wall flags.
+
+   // Wait for an interrupt signal.
+   int sig = 0;
+   sigset_t set;
+   sigemptyset(&set);
+   sigaddset(&set, SIGINT);
+   sigwait(&set, &sig);
+   
+   pthread_mutex_lock(&signalling_lock);
+   pthread_cond_signal(interrupted);
+   pthread_mutex_unlock(&signalling_lock);
+
+   pthread_exit(NULL);
 }
 
-void
-dc3_do_progress(void)
+static int
+execute_job(job_t* job)
 {
-    if (    (dc3_progress_count != 0 && dc3_progress_count == dc3_progress_current)
-         || 0 == dc3_progress_count )
-    {
-        dc3_display_progress(false);
-        dc3_progress_printed = true;
-        dc3_progress_current = 0;
-    }
-    else
-        ++dc3_progress_current;
+   // Start a thread for each task in the job, plus a progress
+   // monitoring thread.
+   task_t* task = job->tasks;
+   while (task)
+   {
+      pthread_mutex_init(task->signalling_lock, NULL);
+      start_thread(&task->thread, execute_task, task);
+      task = task->next_task;
+   }
+   start_thread(&job->monitor_thread, monitor_job, job);
+
+   // Now the main thread blocks until the monitoring and
+   // task threads finish.
+   pthread_join(job->monitor_thread, NULL);
+   task = job->tasks;
+   while (task)
+   {
+      pthread_join(task->thread, NULL);
+      pthread_mutex_destroy(task->signalling_lock);
+      task = task->next_task;
+   }
+
+   // Assign an exit code by rolling up the task results.
+   job->exit_code = DC3DD_EXIT_COMPLETED;
+   task = job->tasks;
+   while (task)
+   {
+      if (task->exit_code != DC3DD_EXIT_COMPLETED)
+      {
+         job->exit_code = task->exit_code;
+         break;
+      }
+      task = task->next_task;
+   }
+   return job->exit_code;
 }
 
-int dc3_recover_block(char* ibuf, ssize_t read_size, bool* eof, ssize_t* bytes_read);
-
-/* The main loop.  */
-
 static int
-dd_copy (void)
-{
-  char *ibuf, *bufstart;	/* Input buffer. */
-  /* These are declared static so that even though we don't free the
-     buffers, valgrind will recognize that there is no "real" leak.  */
-  static char *real_buf;	/* real buffer address before alignment */
-  static char *real_obuf;
-  ssize_t nread = 0;		/* Bytes read in the current block.  */
-
-  /* If nonzero, then the previously read block was partial and
-     PARTREAD was its size.  */
-  size_t partread = 0;
-
-  int exit_status = EXIT_SUCCESS;
-  size_t n_bytes_read;
-
-  /* Leave at least one extra byte at the beginning and end of `ibuf'
-     for conv=swab, but keep the buffer address even.  But some peculiar
-     device drivers work only with word-aligned buffers, so leave an
-     extra two bytes.  */
-
-  /* Some devices require alignment on a sector or page boundary
-     (e.g. character disk devices).  Align the input buffer to a
-     page boundary to cover all bases.  Note that due to the swab
-     algorithm, we must have at least one byte in the page before
-     the input buffer;  thus we allocate 2 pages of slop in the
-     real buffer.  8k above the blocksize shouldn't bother anyone.
-
-     The page alignment is necessary on any linux system that supports
-     either the SGI raw I/O patch or Steven Tweedies raw I/O patch.
-     It is necessary when accessing raw (i.e. character special) disk
-     devices on Unixware or other SVR4-derived system.  */
-
-  real_buf = xmalloc (input_blocksize + INPUT_BLOCK_SLOP);
-  ibuf = real_buf;
-  ibuf += SWAB_ALIGN_OFFSET;	/* allow space for swab */
-
-  ibuf = ptr_align (ibuf, page_size);
-
-  if (conversions_mask & C_TWOBUFS)
-    {
-      /* Page-align the output buffer, too.  */
-      real_obuf = xmalloc (output_blocksize + OUTPUT_BLOCK_SLOP);
-      obuf = ptr_align (real_obuf, page_size);
-    }
-  else
-    {
-      real_obuf = NULL;
-      obuf = ibuf;
-    }
-
-  if (!dc3_use_pattern && skip_sectors != 0)
-  {
-    skip (STDIN_FILENO, input_file, skip_sectors, dc3_sectorsize, ibuf);
-    /* POSIX doesn't say what to do when dd detects it has been
-       asked to skip past EOF, so I assume it's non-fatal if the
-       call to 'skip' returns nonzero.  FIXME: maybe give a warning.  */
-  }
-
-  if (seek_sectors != 0)
-    {
-      uintmax_t write_records = skip (STDOUT_FILENO, output_file,
-				      seek_sectors, dc3_sectorsize, obuf);
-
-      if (write_records != 0)
-	{
-	  memset (obuf, 0, output_blocksize);
-
-	  do
-	    if (iwrite(STDOUT_FILENO, obuf, output_blocksize) != output_blocksize)
-	      {
-		dc3_error (0, errno, _("writing to %s"), quote (output_file));
-		quit (EXIT_FAILURE);
-	      }
-	  while (--write_records != 0);
-	}
-    }
-
-  if (max_sectors == 0)
-    return exit_status;
-
-  if (dc3_use_pattern) 
-    {
-      size_t tmp;
-      for (tmp = 0 ; tmp < input_blocksize ; ++tmp)
-	ibuf[tmp] = dc3_pattern_value[tmp % dc3_pattern_len];
-      nread = n_bytes_read = input_blocksize;
-    }
-
-  size_t read_size = input_blocksize;
+execute_jobs(job_t* jobs)
+{
+   // Block interrupt (SIGINT) signals so that threads created after this point, 
+   // INCLUDING the interrupt signal handling thread, will also have interrupt signals blocked. 
+   // The signal handling thread will get signals from the sigwait() function, 
+   // instead of directly from the operating system.  
+   sigset_t set;
+   sigemptyset(&set);
+   sigaddset(&set, SIGINT);
+   pthread_sigmask(SIG_BLOCK, &set, 0);
+
+   // Set up synchronization for signal handling and kick off the signal handling thread.
+   pthread_mutex_init(&signalling_lock, NULL);      
+   interrupted = (pthread_cond_t*)malloc(sizeof(pthread_cond_t));
+   pthread_cond_init(interrupted, NULL);
+   pthread_t signal_handling_thread;
+   start_thread(&signal_handling_thread, await_interrupt_signal, NULL);
+   
+   int exit_code = DC3DD_EXIT_CODE_NOT_SET;      
+   job_t* job = jobs;
+   while (job)
+   {
+      exit_code = execute_job(job);
+      if (exit_code != DC3DD_EXIT_COMPLETED)
+      {
+         break;
+      }
+      job = job->next_job;
+   } 
+
+   // Shut down the signal handling thread and tear down synchronization.      
+   pthread_cancel(signal_handling_thread);
+   pthread_mutex_destroy(&signalling_lock);
+   
+   return exit_code;
+}
 
-  // TODO: this flag is kind of a lame way to keep track
-  // of whether the block has been hashed yet or not, but it works.
-  // now that proper tests exist, it can be refactored when time permits
-  bool block_hashed = true;
+static job_t* 
+make_job(task_t* tasks, void (*report_progress)(job_t*, bool))
+{
+   job_t* job = (job_t*)malloc(sizeof(job_t)); 
+   job->tasks = tasks;
+   job->progress_interval_in_ms = JOB_PROGRESS_INTERVAL_MILLISECS;
+   job->report_progress = report_progress;
+   job->exit_code = DC3DD_EXIT_CODE_NOT_SET;
+   job->next_job = NULL;
+   return job;
+}
 
-  while (1)
-    {
-      if (dc3_sectors_r_partial + dc3_sectors_r_full >= max_sectors)
-	break;
+static task_t*
+make_task(input_t* input, output_t* outputs)
+{
+   task_t* task = (task_t*)malloc(sizeof(task_t)); 
+   task->signalling_lock = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t));
+   task->input = input;   
+   task->outputs = outputs;
+   task->completed = false;
+   task->aborted = false;
+   task->exit_code = DC3DD_EXIT_CODE_NOT_SET;
+   task->next_task = NULL;   
+   return task;
+}
 
+static buffer_queue_t*
+make_buffer_queue(size_t size_in_bytes, size_t number_of_buffers)
+{
+   buffer_queue_t* buffer_queue = (buffer_queue_t*)malloc(sizeof(buffer_queue_t));
+   buffer_queue->buffers = (buffer_t*)malloc(number_of_buffers * sizeof(buffer_t));
+   for (size_t i = 0; i < number_of_buffers; ++i)
+   {
+      buffer_queue->buffers[i].length = 0;
+      buffer_queue->buffers[i].data = (char*)malloc(size_in_bytes * sizeof(char));
+   }
+   buffer_queue->number_of_buffers = number_of_buffers;
+   buffer_queue->buffers_used = 0;
+   buffer_queue->next_available_buffer = 0;
+   buffer_queue->lock = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t));
+   buffer_queue->not_empty = (pthread_cond_t*)malloc(sizeof(pthread_cond_t));
+   pthread_cond_init(buffer_queue->not_empty, NULL);
+   buffer_queue->not_full = (pthread_cond_t*)malloc(sizeof(pthread_cond_t));
+   pthread_cond_init(buffer_queue->not_full,  NULL);
+   buffer_queue->done_buffering = false;
+   return buffer_queue;
+}
 
-      // if reading a full block would go past EOF, reduce read_size to
-      // fit remaining data exactly
-      if (dc3_sectors_r_partial + dc3_sectors_r_full + input_blocksize/dc3_sectorsize >= max_sectors)
-          read_size = (max_sectors - dc3_sectors_r_partial - dc3_sectors_r_full) * dc3_sectorsize;
+static output_t*
+make_output(settings_t* settings)
+{
+   output_t* output = (output_t*)malloc(sizeof(output_t));
+   output->state = PENDING;
+   output->sector_size = settings->sector_size;
+   output->buffer_size = settings->buffer_size;
+   output->buffer_queue = make_buffer_queue(output->buffer_size, NUM_BUFFERS);
+   output->bytes_output = 0;
+   output->hash = NULL;
+   output->current_file = NULL;
+   output->files = NULL;
+   output->max_file_size = settings->max_output_file_size;
+   output->sectors_to_skip = settings->output_sectors_to_skip;
+   output->append_garbage_bytes = settings->corrupt_output;
+   output->open = NULL;
+   output->consume_bytes = NULL;
+   output->close = NULL;
+   output->expected_hashes = NULL;
+   output->actual_hashes = NULL;
+   output->next_output = NULL;
+   return output;
+}
 
-      /* Zero the buffer before reading, so that if we get a read error,
-	 whatever data we are able to read is followed by zeros.
-	 This minimizes data loss. */
-      if (!dc3_use_pattern)
-	{
-	  if ((conversions_mask & C_SYNC) && (conversions_mask & C_NOERROR))
-	    memset (ibuf,
-		    (conversions_mask & (C_BLOCK | C_UNBLOCK)) ? ' ' : '\0',
-		    input_blocksize);
-	
-          //fprintf(stderr, "dd_copy: calling iread(%d, %08x, %zd), input_offset %16jx\n", STDIN_FILENO, ibuf, read_size, input_offset);  
-	  nread = iread (STDIN_FILENO, ibuf, read_size);
-
-          //if (nread != read_size)
-          //  fprintf(stderr, "dd_copy: called iread(%d, %08x, %zd), input_offset %16jx, nread=%d, errno=%d\n", STDIN_FILENO, ibuf, read_size, input_offset, nread, errno);
-	}
-      else
-        {
-          nread = n_bytes_read = read_size;
-        }
+static output_t*
+make_file_output(settings_t* settings, file_t* file, output_t* expected_hashes)
+{
+   output_t* output = make_output(settings);
+   output->current_file = file;
+   output->files = output->current_file->part_of_set? file : NULL;
+   if (settings->append_output || settings->output_sectors_to_skip)
+   {
+      output->current_file->flags |= O_APPEND;
+   }
+   else
+   {
+      output->current_file->flags |= (O_CREAT | O_TRUNC);
+   }
+   output->consume_bytes = write_bytes_to_image;
+   if (STREQ(output->current_file->name, "stdout"))
+   {
+      output->open = connect_to_std_out;
+      output->close = disconnect_from_std_out;
+   }
+   else
+   {
+      output->open = open_file_output;
+      output->close = close_file_output;
+   }
+   output->expected_hashes = expected_hashes;
+   return output;
+}
 
-      bool eof = false;
+static output_t*
+make_hash_output(settings_t* settings, hash_algorithm_t* algorithm)
+{
+   hash_t* hash = make_hash(algorithm);
+   if (settings->splitting_output && settings->verifying_output)
+   {
+      hash->current_piece = make_hash(algorithm);
+      hash->pieces = hash->current_piece; 
+      hash->piecewise_hash_length = settings->max_output_file_size;
+   }
+
+   output_t* output =  make_output(settings);
+   output->hash = hash;
+   output->open = open_hash; 
+   output->consume_bytes = hash_bytes;
+   output->close = close_hash;
+   return output;
+}
 
-      if (nread == 0)
-          eof = true;
+static output_t*
+make_hash_outputs(settings_t* settings)
+{
+   output_t* hash_outputs = NULL;
 
-      if (nread == -1 && errno == ENOSPC)
+   for (uint8_t i = 0 ; i < NUM_HASHES ; ++i)
+   {
+      if (hash_algorithms[i].active)
       {
-          if ( read_size == dc3_small_read || partread || !(conversions_mask&(C_SYNC|C_NOERROR)) )
-              eof = true;
+         add_to_output_list(&hash_outputs, make_hash_output(settings, &hash_algorithms[i]));
       }
-      
-      if (eof)
-      {
-        if ( dc3_ifjoin )
-        {
-            dc3_ifjoin_number++;
-            dc3_generate_split_filename(dc3_ifjoin_base, dc3_ifjoin_ext, dc3_ifjoin_number, &input_file);
+   }
+   
+   return hash_outputs;
+}
 
-            if (fd_reopen (STDIN_FILENO, input_file, O_RDONLY | input_flags, 0) < 0)
-            {
-                //fprintf(stderr, "join mode: no more input files\n");
-                dc3_ifjoin_done = true;
-                break;
-            }
-            else
-            {
-                //fprintf(stderr, "\njoin: opened next file %s\n", input_file);
-                // update status variables & do whatever else is needed
-                // TODO: this re-probe is not the most accurate thing
-                //       (would be better to stat all of the files in advance to get total expected size)
-                //       this method causes the completion percentage to jump around repeatedly
-                dc3_reprobe();
-                continue;
-            }
-        }
-        else
-        {
-	  break;
-        }
+static input_t*
+make_input(settings_t* settings)
+{
+   input_t* input = (input_t*)malloc(sizeof(input_t));
+   input->state =  PENDING;
+   input->sector_size = settings->sector_size;
+   input->max_sectors_to_input = settings->max_sectors_to_input; 
+   input->bytes_input = 0;   
+   input->current_file = NULL;
+   input->files = NULL;
+   input->sectors_to_skip = settings->input_sectors_to_skip;   
+   input->current_sector = 0; 
+   input->recover_errors = settings->recover_errors;
+   input->current_errno = 0;
+   input->current_errno_count = 0;
+   input->current_errno_start_sector = 0;
+   input->bad_sectors = 0;
+   input->pattern_string = NULL;
+   input->pattern = NULL;
+   input->pattern_length = 0;
+   input->current_file = NULL;
+   input->files = NULL;
+   
+   // The input buffer needs to be aligned if doing direct I/O
+   // There is no harm in aligning it in either case.
+   input->buffer_size = settings->buffer_size;
+   input->buffer.data =
+      (char*)malloc((input->buffer_size) + 2 * getpagesize() - 1);
+   input->buffer.data = (char*)ptr_align(input->buffer.data, getpagesize());
+   input->buffer.length = 0;
+  
+   if (settings->input_file)
+   {
+      input->current_file = settings->input_file;
+      if (input->current_file->part_of_set)
+      {
+         input->files = input->current_file;
       }
 
-      block_hashed = false;
-
-      if (nread < 0)
-	{
-          if (!(conversions_mask & C_DYNAMIC))
-          {
-            dc3_read_error();
-
-	    if (conversions_mask & C_NOERROR)
-	    {
-	      if (!dc3_group_errors)
-		print_stats ();
-
-	      /* Seek past the bad block if possible. */
-              if (!advance_input_after_read_error(read_size - partread))
-                  exit_status = EXIT_FAILURE;
-
-	      if ((conversions_mask & C_SYNC) && !partread)
-		/* Replace the missing input with null bytes and
-		   proceed normally.  */
-		nread = 0;
-	      else
-              {
-                if (dc3_hash && !block_hashed)
-                  fprintf(stderr, "dd_copy: loop continue()ing without hashing block!\n");
-		continue;
-              }
-	    }
-	  else
-	    {
-	      /* Write any partial block. */
-	      exit_status = EXIT_FAILURE;
-	      break;
-	    }
-          }
-          else
-          {
-            // handle error reporting when dynamic mode is applicable, but block size == sector size
-            if (input_blocksize == dc3_small_read)
-              dc3_read_error();
-
-            if (!partread) /* conversions_mask && (C_DYNAMIC|C_SYNC|C_NOERROR) can be assumed true */
-              nread = 0;
-          }
-          // else defer error handling to recovery process below
-	}
-      else if (dc3_group_errors && dc3_previous_error)
-	/* If we've made a successful read after several errors,
-	   print out the errors together now */
-	{
-	  dc3_record_previous_errors();
-	  dc3_previous_error = false;
-	  dc3_previous_error_count = 0;
-	}
-
-      n_bytes_read = nread;
-      advance_input_offset (nread);
-      if (dc3_hash && dc3_hash_before && !block_hashed)
+      if (STREQ(input->current_file->name, "stdin"))
       {
-        //fprintf(stderr, "dd_copy() 1: calling dc3_hash_update with len=%zd\n", nread);
-	dc3_hash_update(ibuf,nread);
-        block_hashed = true;
+	 input->open = connect_to_std_in;
+	 input->produce_bytes = read_bytes_from_file;
+	 input->close = disconnect_from_std_in;
       }
-
-      //fprintf(stderr, "n_bytes_read %zd vs. read_size %zd\n", n_bytes_read, read_size);
-
-      bool rec_eof = false;
-
-      if (n_bytes_read < read_size)
-	{
-          //fprintf(stderr, "n_bytes_read < read_size)\n");
-	  r_partial++;
-	  partread = n_bytes_read;
-
-	  if (conversions_mask & C_SYNC)
-	    {
-              // TODO: kind of a hack here to handle when we aren't really in dynamic mode
-              if (input_blocksize == dc3_small_read)
-              {
-                /* We have to zero out the whole block now. */
-	        memset (ibuf,
-		        (conversions_mask & (C_BLOCK | C_UNBLOCK)) ? ' ' : '\0',
-		        input_blocksize);
-
-                /* Seek past the bad block if possible. */
-                if (!advance_input_after_read_error(input_blocksize))
-                  exit_status = EXIT_FAILURE;
-
-	        n_bytes_read = read_size;
-                dc3_sectors_r_partial++;
-              }
-              else
-              {
-                // TODO: replace all instances of dc3_small_read with dc3_sectorsize ?
-  
-                // try to read individual pieces of the block
-                if ( (conversions_mask & C_DYNAMIC) && input_blocksize != dc3_small_read && (nread == -1 || nread == 0))
-                {
-                    int ret = dc3_recover_block(ibuf, read_size, &rec_eof, &nread);
-                    if (ret != EXIT_SUCCESS)
-                        exit_status = ret;
-                    n_bytes_read = nread;
-		    if (nread == 0)
-		        break;
-                }
-                else
-                {
-                  dc3_sectors_r_full += nread / dc3_sectorsize;
-                  if (nread % dc3_sectorsize != 0) dc3_sectors_r_partial++;
-                }
-              }
-	    }
-          else
-            {
-              dc3_sectors_r_full += n_bytes_read / dc3_sectorsize;
-              if (n_bytes_read % dc3_sectorsize != 0) dc3_sectors_r_partial++;
-            }
-	}
       else
-	{
-	  r_full++;
-          // TODO: make dc3_sectors_per_block variable?
-          dc3_sectors_r_full += read_size / dc3_sectorsize;
-	  partread = 0;
-	}
-
-      if (ibuf == obuf && !(conversions_mask&C_TWOBUFS))		/* If not C_TWOBUFS. */
-	{
-	  size_t nwritten = iwrite (STDOUT_FILENO, obuf, n_bytes_read);
-          dc3_write_stats(nwritten);
+      {
+         input->open = open_file_input;
 
-	  if (nwritten != n_bytes_read)
+         // This ASSUMES that probe_file() was called on settings->input_file
+         // before calling this function.
+	 if (input->current_file->is_device)
+	 {
+	    if (input->recover_errors)
 	    {
-	      dc3_error (0, errno, _("error writing %s"), quote (output_file));
-              //fprintf(stderr, "dd_copy() loop: nwritten %d, n_bytes_read %d\n", nwritten, n_bytes_read);
-	      return EXIT_FAILURE;
+	       input->current_file->flags |= O_DIRECT;
 	    }
+	    input->produce_bytes = read_bytes_from_device;
+	 }
+	 else if (input->current_file->part_of_set)
+	 {
+	    input->produce_bytes = read_bytes_from_files;
+	 }
+	 else
+	 { 
+	    input->produce_bytes = read_bytes_from_file;
+	 }
+
+         input->close = close_file_input;
+      }
+   }
+   else
+   {
+      input->pattern_string = strdup(settings->input_pattern_string);
+      input->pattern = strdup(settings->input_pattern);
+      input->pattern_length = settings->input_pattern_length;
+      input->open = open_pattern_input;
+      input->produce_bytes = read_bytes_from_pattern;
+      input->close = close_pattern_input; 
+   }
+ 
+   return input;
+}
 
-	  if (dc3_progress)
-	   dc3_do_progress(); 
-
-	  if (dc3_hash && !dc3_hash_before && !block_hashed)
-          {
-            //fprintf(stderr, "dd_copy() 2: calling dc3_hash_update with len=%zd\n", nwritten);
-	    dc3_hash_update(obuf,nwritten);
-            block_hashed = true;
-          }
-
-          // TODO: make this an assert
-          if (dc3_hash && !block_hashed)
-            fprintf(stderr, "dd_copy: loop continue()ing without hashing block!\n");
-
-	  continue;
-	}
-
-      /* Do any translations on the whole buffer at once.  */
-
-      if (translation_needed)
-	translate_buffer (ibuf, n_bytes_read);
-
-      if (conversions_mask & C_SWAB)
-	bufstart = swab_buffer (ibuf, &n_bytes_read);
-      else
-	bufstart = ibuf;
-
-      if (conversions_mask & C_BLOCK)
-        copy_with_block (bufstart, n_bytes_read);
-      else if (conversions_mask & C_UNBLOCK)
-	copy_with_unblock (bufstart, n_bytes_read);
-      else
-	copy_simple (bufstart, n_bytes_read);
-
-      if (dc3_progress)
-        dc3_do_progress();
-	
-      
-      // TODO: `n_bytes_read == blocksize' is a hack because write_output
-      // can't quite handle the case where the total_bytes % blocksize != 0
-      // write_output sets oc != 0 and then the last piece gets hashed twice.
-
-      if (dc3_hash && !dc3_hash_before /*&& (n_bytes_read == input_blocksize) */ && !block_hashed)
+static void
+add_verification_job(job_t* job, settings_t* settings)
+{  
+   // An imaging job consists of a single task.
+   task_t* imaging_task = job->tasks;
+
+   // Make a verification task for each output to be verified.
+   task_t* verification_tasks = NULL;
+   output_t* output = imaging_task->outputs;
+   while (output)
+   {
+      if (output->current_file && output->current_file->verify_requested)
       {
-        //fprintf(stderr, "dd_copy() 3: calling dc3_hash_update with len=%zd\n", n_bytes_read);
-	dc3_hash_update(bufstart,n_bytes_read);
-        block_hashed = true;
+         // Make an input file corresponding to the output file
+         // and swap it into the already initialized and validated settings.
+         // However, make sure to clear max sectors to input, since the size of the
+         // verification target is now the determinant of bytes to input.
+         settings->input_file = make_file(output->current_file->unparsed_name,
+            0, O_RDONLY, output->current_file->part_of_set, false);
+         settings->max_sectors_to_input = INFINITE_BYTES;
+	 input_t* input = make_input(settings);   
+
+         // Prepare the output hashes and cache a pointer to the list
+         // for later comparision with the list of input hashes cached
+         // in the output when the imaging job was created. 
+	 output_t* output_hashes = make_hash_outputs(settings);
+         output->actual_hashes = output_hashes;
+
+         task_t* verification_task = make_task(input, output_hashes);
+	 add_to_task_list(&verification_tasks, verification_task);
       }
+      output = output->next_output;
+   }
+ 
+   job->next_job = make_job(verification_tasks, report_verification_progress);
+}
 
-      if (rec_eof)
-          break;
-
-      // TODO: make this an assert
-      if (dc3_hash && !block_hashed)
-        fprintf(stderr, "dd_copy: loop bottom reached without hashing block!\n");
-    }
-
-
-  /* If we have a char left as a result of conv=swab, output it.  */
-  if (char_is_saved)
-    {
-      if (conversions_mask & C_BLOCK)
-        copy_with_block (&saved_char, 1);
-      else if (conversions_mask & C_UNBLOCK)
-	copy_with_unblock (&saved_char, 1);
-      else
-	output_char (saved_char);
-    }
-
-  if ((conversions_mask & C_BLOCK) && col > 0)
-    {
-      /* If the final input line didn't end with a '\n', pad
-	 the output block to `conversion_blocksize' chars.  */
-      size_t i;
-      for (i = col; i < conversion_blocksize; i++)
-	output_char (space_character);
-    }
-
-  if ((conversions_mask & C_UNBLOCK) && col == conversion_blocksize)
-    /* Add a final '\n' if there are exactly `conversion_blocksize'
-       characters in the final record. */
-    output_char (newline_character);
-
-  /* Write out the last block. */
-  if (oc != 0)
-    {
-      size_t nwritten = iwrite (STDOUT_FILENO, obuf, oc);
-      dc3_write_stats(nwritten);
-
-      if (nwritten != oc)
-	{
-	  dc3_error (0, errno, _("dd_copy() cleanup: nwritten mismatch writing %s"), quote (output_file));
-	  fprintf(stderr, "dd_copy() cleanup: nwritten %zd, n_bytes_read %zd\n", nwritten, n_bytes_read);
-	  return EXIT_FAILURE;
-	}
-    }
-  
-  if (dc3_hash)
-    {
-      if (oc != 0 && !block_hashed)
+static job_t*
+make_imaging_job(settings_t* settings)
+{
+   input_t* input = make_input(settings);   
+   output_t* input_hashes = make_hash_outputs(settings);
+
+   // Make the file outputs.
+   output_t* outputs = NULL;
+   if (settings->wipe_target)
+   {
+      add_to_output_list(&outputs, make_file_output(settings, settings->wipe_target, input_hashes));
+   } 
+   else
+   {
+      file_t* file = settings->output_files;
+      while (file)
       {
-        //fprintf(stderr, "dd_copy() cleanup: calling dc3_hash_update with len=%zd\n", oc);
-        //fprintf(stderr, "dd_copy() cleanup: block_hashed %d\n", block_hashed);
-	dc3_hash_update(obuf,oc);
-        block_hashed = true;
+	 output_t* output = make_file_output(settings, file, input_hashes);
+	 add_to_output_list(&outputs, output);
+	 file = file->next_file;
+	 
+	 // Cache a pointer to the input hashes for verification purposes.
+	 output->expected_hashes = input_hashes;
+
+	 // Unlink the file for tidiness, and so that the next_file pointer
+	 // can be used to make a list of files (if splitting the output). 
+	 output->current_file->next_file = NULL;
       }
-      dc3_hash_final();
-    }
-
-
-  if ((conversions_mask & C_FDATASYNC) && fdatasync (STDOUT_FILENO) != 0)
-    {
-      if (errno != ENOSYS && errno != EINVAL)
-	{
-	  dc3_error (0, errno, _("fdatasync failed for %s"), quote (output_file));
-	  exit_status = EXIT_FAILURE;
-	}
-      conversions_mask |= C_FSYNC;
-    }
-
-  if (conversions_mask & C_FSYNC)
-    while (fsync (STDOUT_FILENO) != 0)
-      if (errno != EINTR)
-	{
-	  dc3_error (0, errno, _("fsync failed for %s"), quote (output_file));
-	  return EXIT_FAILURE;
-	}
-
-  if (dc3_group_errors && dc3_previous_error)
-    dc3_record_previous_errors();
+   }
 
-  // slight hack to make sure progress bar gets updated before we exit
-  // because quit() doesn't update the progress bar in verify mode
-  if (dc3_progress && dc3_mode_verify)
-    dc3_display_progress(true);
+   // Append the hash outputs for the input hashes to the file outputs. 
+   add_to_output_list(&outputs, input_hashes);
 
-
-  // TODO: make this an assert
-  // TODO: fix this so it doesn't report false positives
-  if (dc3_hash && !block_hashed)
-    fprintf(stderr, "dd_copy: function returning without hashing block!\n");
-
-  return exit_status;
+   task_t* task = make_task(input, outputs);
+   return make_job(task, report_imaging_progress);
 }
 
-int dc3_recover_block(char* ibuf, ssize_t read_size, bool* eof, ssize_t* bytes_read)
+static job_t*
+make_jobs(settings_t* settings)
 {
-    int exit_status = EXIT_SUCCESS;
-
-    // TODO: is this redundant?
-    /* We have to zero out the whole block now. */
-    memset (ibuf,
-            (conversions_mask & (C_BLOCK | C_UNBLOCK)) ? ' ' : '\0',
-            input_blocksize);
-
-    // should already be rewound to beginning of block
-    size_t i = 0;
-
-    do
-    {
-        fprintf(stderr,"                                                                   \r");
-
-        char* secbuf = ibuf+i; 
+   job_t* job = make_imaging_job(settings);
+   if (settings->verifying_output)
+   {
+      add_verification_job(job, settings);
+   }
+   return job;
+}
+  
+#if USE_HDPARM
+#ifdef __linux__
 
-        uintmax_t sector = dc3_sectors_r_full + dc3_sectors_r_partial;
+static void 
+check_device_for_hpa_dco(file_t* device)
+{
+   if (device->is_device)
+   {
+      device->descriptor = open(device->name, O_RDONLY, device->perms); 
+      if (device->descriptor >= 0)
+      {   
+         report_to_log(_("checking for HPA/DCO: "));
+         
+         int err = 0;
+         __u16 *id = (void *)-1;
+         __u16 *dci = (void *)-1;
+
+         dci = get_dci_data(fd, dci);
+         __u64 maximum_lba = 0;
+         if (dci) 
+         {
+            maximum_lba = get_dci_maximum_lba(dci);
+         }
+
+         __u64 visible, native;
+         id = get_identify_data(fd, id);
+         if (id) 
+         {
+            visible = get_lba_capacity(id);
+            native  = do_get_native_max_sectors_to_input(fd, id);
+            if (!native) 
+            {
+               err = errno;
+            }
+         }
 
-        fprintf(stderr, "trying to recover sector %llu", skip_sectors+sector);
-        //fprintf(stderr, "\n");
+         if (!dci || !id || !native)
+         {
+            report_to_log(_("device doesn't support ATA commands\n"));   
+            return;
+         }
 
-        //fprintf(stderr, "dd_copy: recovery calling iread(%d, %08x, %zd), input_offset at %16jx\n", STDIN_FILENO, ibuf, dc3_small_read, input_offset);  
-        ssize_t n = 0;
-        n = iread(STDIN_FILENO, secbuf, dc3_small_read);
-        //fprintf(stderr, "dd_copy: recovery called iread, nread=%d\n", n);
+         if (id)
+         {
+            bool hpa = false;
+            bool dco = false;
 
+            if (visible != native)
+            {
+               hpa = true;
+            }
 
-        if (n == 0 || (n==-1 && errno==ENOSPC)) // EOF
-	{
-	    *eof = true;
-            //fprintf(stderr, "recovery: EOF\n");
-	    break;
-	}
+            if (maximum_lba != native)
+            {
+               dco = true;
+            }
 
-        if (n != dc3_small_read)
-        {
-            //fprintf(stderr, "dd_copy recovery: read returned wrong size\n");
-            // copied from above			  
-            if (dc3_group_errors)
+            if (hpa && dco)
             {
-                if (!dc3_previous_error)
-                {
-                    dc3_previous_error = true;
-                }
-                else if (errno != dc3_previous_error_errno)
-                {
-                    /* We have to display the old errors before
-                       starting to record this new series */
-                    fprintf(stderr,"                                                                   \r");
-                    dc3_record_previous_errors();
-                    dc3_previous_error_count = 0;
-                }
-
-                dc3_previous_error_errno = errno;
-                dc3_previous_error_count++;
+               report_to_log(_("HPA and DCO found\n"));   
             }
-            else
+            else if (hpa)
             {
-                fprintf(stderr,"                                                                   \r");
-                dc3_error (0, errno, _("reading %s at sector %jd"), quote (input_file), skip_sectors+sector);
+               report_to_log(_("HPA found\n"));   
+            }
+            else if (dco)
+            {
+               report_to_log(_("DCO found\n"));   
+            }
+            else 
+            {
+               report_to_log(_("none\n"));   
             }
 
-            /* Seek past the bad block if possible. */
-            size_t dist = dc3_small_read;
-            if (n > 0) dist -= n;
-            if (!advance_input_after_read_error(dist))
-                exit_status = EXIT_FAILURE;
-
-            memset (secbuf,
-                    (conversions_mask & (C_BLOCK | C_UNBLOCK)) ? ' ' : '\0',
-                    dc3_small_read);
-
-            // TODO: is this reasonable? really the whole sector failed
-            // since partial sector reads aren't possible
-
-            dc3_sectors_r_partial++;
-        }
-        else
-        {
-            //fprintf(stderr, "dd_copy recovery: read returned correct size %zd vs. %zd\n", n, dc3_small_read);
+            char limits[DISPLAY_MESSAGE_LENGTH];
+            
+            if (hpa)
+            {
+               sprintf(limits, _("HPA limit: %11llu sectors\n"));
+               report_to_log(limits, true);         
+            }
 
-            if (dc3_group_errors && dc3_previous_error)
-                /* If we've made a successful read after several errors,
-                   print out the errors together now */
+            if (dco)
             {
-                fprintf(stderr,"                                                                   \r");
-                dc3_record_previous_errors();
-                dc3_previous_error = false;
-                dc3_previous_error_count = 0;
+               sprintf(limits, _("DCO limit: %11llu sectors\n"));
+               report_to_log(limits);         
             }
 
-            advance_input_offset (n);
-            dc3_sectors_r_full++;
-        }
+            sprintf(limits, _("full size: %11llu sectors\n"), maximum_lba);
+            report_to_log(limits);         
+         }
+
+         if (close(device->descriptor) == 0)
+         {
+            device->descriptor = FILE_DESCRIPTOR_NOT_SET;      
+         }
+         else
+         {
+            report_error(DC3DD_EXIT_ABORTED, errno, _("closing %s after HPA/DCO check"), quote(device->name));
+         }      
+      }
+   }
+}
 
-        i+= dc3_small_read;
-        fprintf(stderr,"                                                                   \r");
-    } while ( i<read_size );
+#endif // #ifdef __linux__
+#endif // #if USE_HDPARM
 
-    *bytes_read = i;
+static void
+report_device_size(file_t* device)
+{
+   char stats[DISPLAY_MESSAGE_LENGTH];
+   sprintf(stats, _("device size: %"PRIuMAX" sectors (probed)\n"), device->probed_size_in_sectors);
+   report_to_log(stats);   
+   
+   #if USE_HDPARM
+   #ifdef __linux__
+   if (device->is_block_device)
+   {
+      device->descriptor = open(device->name, O_RDONLY, device->perms); 
+      if (device->descriptor >= 0)
+      {   
+	 check_device_for_hpa_dco(device->descriptor);
+	 if (close(device->descriptor) == 0)
+	 {
+	    device->descriptor = FILE_DESCRIPTOR_NOT_SET;      
+	 }
+	 else
+	 {
+	    report_error(DC3DD_EXIT_ABORTED, errno, _("closing %s after hpa/dco check"), quote(device->name));
+	 }      
+      }
+   }
+   #endif
+   #endif         
+}
 
-    return exit_status;
+static void
+report_input_size(settings_t* settings)
+{
+   if (settings->wipe_target)
+   {
+      report_device_size(settings->wipe_target); 
+   }
+   else if (settings->input_file && settings->input_file->is_device)
+   {
+      report_device_size(settings->input_file);
+   }
+   
+   char message[DISPLAY_MESSAGE_LENGTH];
+   sprintf(message, "sector size: %zd bytes (%s)\n", settings->sector_size, settings->sector_size_source);
+   report_to_log(message);
+   flush_logs();
 }
 
-int
-main (int argc, char **argv)
+static void 
+activate_hash(const char* algorithm_name)
 {
-  int i;
-  int exit_status;
-  off_t offset;
+   uint8_t i = 0;
+
+   // Command line settings override build time settings, so deactivate
+   // all hashing algorithms activated by build settings.
+   static bool predefined_hashes_cleared = false;
+   if (!predefined_hashes_cleared)
+   {
+      for (i = 0; i < NUM_HASHES; ++i)
+      {
+         hash_algorithms[i].active = false;
+      }
+      
+      predefined_hashes_cleared = true;   
+   }
 
-  initialize_main (&argc, &argv);
-  program_name = argv[0];
-  setlocale (LC_ALL, "");
-  bindtextdomain (PACKAGE, LOCALEDIR);
-  textdomain (PACKAGE);
+   for (i = 0; i < NUM_HASHES; ++i)
+   {
+      if (STREQ(hash_algorithms[i].name, algorithm_name))
+      {
+         if (!hash_algorithms[i].active)
+         {
+            hash_algorithms[i].active = true;
+         }
+         else
+         {
+            report_error(DC3DD_EXIT_ABORTED,0,_("hash=%s specified more than once"), quote(algorithm_name));
+         }
+         break;
+      }
+   }
+
+   // Note the early out for command line errors since evidence should not
+   // be handled any more than necessary, and glossing over a malformed
+   // command line is therefore undesirable - the user's choices need to be
+   // exactly specified before a run is undertaken.
+   if (i == NUM_HASHES)
+   {
+      report_error(DC3DD_EXIT_ABORTED,0,_("unknown hash algorithm %s"), quote(algorithm_name));
+   }
+}
 
-  /* Save command line string before scanargs mucks with argv. */
-  char* dc3_cmdline = dc3_save_cmdline(argc, argv);
+static void
+probe_file_for_validation(file_t* file)
+{
+   file->descriptor = open(file->name, O_RDONLY, 0); 
+   if (file->descriptor >= 0)
+   {   
+      if (probe_file(file))
+      {
+	 if (close(file->descriptor) == 0)
+	 {
+	    file->descriptor = FILE_DESCRIPTOR_NOT_SET;      
+	 }
+	 else
+	 {
+	    report_error(DC3DD_EXIT_ABORTED, errno, _("closing %s after validation probe"), quote(file->name));
+	 }      
+      }
+      else
+      {
+         close(file->descriptor);
+         report_error(DC3DD_EXIT_ABORTED, 0, _("validation probe of %s failed"), quote(file->name));
+      }
+   }
+   else
+   {
+      report_error(DC3DD_EXIT_ABORTED, errno, _("opening %s for validation probe"), quote(file->name));
+   }
+}
 
-  /* Arrange to close stdout if parse_long_options exits.  */
-  atexit (maybe_close_stdout);
+static void
+add_wipe_target(settings_t* settings, const char* device_name, bool verify_requested)
+{
+   // Note the early outs for command line errors since evidence should not
+   // be handled any more than necessary, and glossing over a malformed
+   // command line is therefore undesirable - the user's choices need to be
+   // exactly specified before a run is undertaken.
+   if (settings->wipe_target)
+   {
+      report_error(DC3DD_EXIT_ABORTED, 0, _("cannot specify wipe= or vwipe= more than once"));      
+   }   
+
+   if (settings->output_files)
+   {
+      report_error(DC3DD_EXIT_ABORTED, 0, _("cannot combine wipe= or vwipe= and of=, hof=, ofs= or hofs="));
+   }
+  
+   settings->wipe_target = make_file(device_name, 0, O_WRONLY, false, verify_requested);
+   DC3DD_ASSERT(settings->wipe_target != NULL);
+ 
+   // Make sure the wipe target is valid.
+   probe_file_for_validation(settings->wipe_target);
+   if (!settings->wipe_target->is_device)
+   {
+      report_error(DC3DD_EXIT_ABORTED, errno, _("%s not recognized as a device, cannot wipe"),
+	quote(settings->wipe_target->name));
+   }
+   if (settings->wipe_target->probed_size_in_bytes <= 0)
+   {
+      report_error(DC3DD_EXIT_ABORTED, errno, _("%s size probe failed, cannot wipe"),
+         quote(settings->wipe_target->name));
+   }
+
+   if (verify_requested)
+   {
+      settings->verifying_output = true;
+   }
+}
 
-  page_size = getpagesize ();
+static void 
+add_output_file(settings_t* settings, const char* file_name, bool part_of_set, bool verify_requested)
+{
+   // Note the early outs for command line errors since evidence should not
+   // be handled any more than necessary, and glossing over a malformed
+   // command line is therefore undesirable - the user's choices need to be
+   // exactly specified before a run is undertaken.
+
+   if (verify_requested)
+   {
+      if (STREQ(file_name, "/dev/null"))
+      {
+         report_error(DC3DD_EXIT_ABORTED, 0, _("cannot specify hof=/dev/null"));
+      }
+      else
+      {
+         settings->verifying_output = true;
+      }
+   }
+
+   if (part_of_set)
+   {
+      settings->splitting_output = true;
+   }
+
+   file_t* file = make_file(file_name, 0, O_WRONLY, part_of_set, verify_requested);
+   if (file)
+   {
+      add_to_file_list(&settings->output_files, file);
+   }
+   else
+   {
+      report_error(DC3DD_EXIT_ABORTED, 0, _("%s not valid BASE.FMT specifier for %s"),
+         quote(file_name), verify_requested ? "hofs=" : "ofs=");
+   }
+}
 
+static void
+add_input_text_pattern(settings_t* settings, const char* pattern)
+{
+   // Note the early out for command line errors since evidence should not
+   // be handled any more than necessary, and glossing over a malformed
+   // command line is therefore undesirable - the user's choices need to be
+   // exactly specified before a run is undertaken.
+
+   if (settings->input_file || settings->input_pattern)
+   {
+      report_error(DC3DD_EXIT_ABORTED, 0, _("use only one of pat=, tpat=, if=, ifs="));
+   }
+
+   settings->input_pattern_string = strdup(pattern); 
+   settings->input_pattern = strdup(pattern); 
+   settings->input_pattern_length = strlen(pattern);     
+}
 
+static int 
+hex_to_char(char *hstr)
+{
+   unsigned int retval;
+   
+   if (strlen(hstr) != 2)
+   {
+      return -1;
+   }
+   
+   if (EOF == sscanf(hstr, "%x", &retval))
+   {
+      return -1;
+   }
+
+   return retval;
+}
 
-  if (argc == 2 && strcmp(argv[1], "--flags") == 0)
-  {
-    printf("%s compiled with:\n", PROGRAM_NAME);
-    dc3_print_flags(stdout, true);
-    exit(0);
-  }
+static void  
+make_pattern(const char *pattern_template, char** pattern, size_t* pattern_length)
+{
+   *pattern = NULL;
+   *pattern_length = 0;
 
+   size_t pattern_template_length = strlen(pattern_template);
+   if (pattern_template_length != 0 && pattern_template_length % 2 == 0)
+   {
+      *pattern_length = pattern_template_length / 2;
+      *pattern = (char*)malloc(*pattern_length);
 
-  parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE, VERSION,
-		      usage, AUTHORS, (char const *) NULL);
-  close_stdout_required = false;
+      for (size_t i = 0; i < *pattern_length; i++) 
+      {
+         char tmpstring[3];
+         int byte_val;
+         strncpy(tmpstring, &pattern_template[i*2], 2);
+         tmpstring[2] = '\0';
+         byte_val = hex_to_char(tmpstring);
+
+         if (byte_val == -1) 
+         {
+            free(*pattern);
+            *pattern = NULL;
+            *pattern_length = 0;
+         }
+         
+         (*pattern)[i] = (char)byte_val;
+      }
+   }
+}
 
-  if (getopt_long (argc, argv, "", NULL, NULL) != -1)
-    usage (EXIT_FAILURE);
+static void
+add_input_pattern(settings_t* settings, const char* pattern)
+{
+   // Note the early outs for command line errors since evidence should not
+   // be handled any more than necessary, and glossing over a malformed
+   // command line is therefore undesirable - the user's choices need to be
+   // exactly specified before a run is undertaken.
+
+   if (settings->input_file || settings->input_pattern)
+   {
+      report_error(DC3DD_EXIT_ABORTED, 0, _("use only one of pat=, tpat=, if=, ifs="));
+   }
+
+   settings->input_pattern_string = strdup(pattern);
+   make_pattern(pattern, &settings->input_pattern, &settings->input_pattern_length);
+   if (!settings->input_pattern)
+   {
+      report_error(DC3DD_EXIT_ABORTED, 0, _("illegal pattern %s"), quote(pattern));
+   }
+}
 
-  /* Initialize translation table to identity translation. */
-  for (i = 0; i < 256; i++)
-    trans_table[i] = i;
+static void
+add_input_file(settings_t* settings, const char* file_name, bool part_of_set)
+{
+   // Note the early outs for command line errors since evidence should not
+   // be handled any more than necessary, and glossing over a malformed
+   // command line is therefore undesirable - the user's choices need to be
+   // exactly specified before a run is undertaken.
+   
+   if (settings->input_file || settings->input_pattern)
+   {
+      report_error(DC3DD_EXIT_ABORTED, 0, _("use only one of pat=, tpat=, if=, ifs="));
+   }
+
+   if (STREQ(file_name, "/dev/zero"))
+   {
+      add_input_pattern(settings, "00");
+   }
+   else
+   {
+      settings->input_file = make_file(file_name, 0, O_RDONLY, part_of_set, false);
+      if (!settings->input_file)
+      {
+	 report_error(DC3DD_EXIT_ABORTED, 0 , _("%s not valid BASE.FMT form for ifs="), file_name);
+      }
 
-  /* Decode arguments. */
-  scanargs (argc, argv);
+      if (!STREQ(file_name, "stdin"))
+      {
+	 probe_file_for_validation(settings->input_file);
+      }
+   }
+}
 
-  apply_translations ();
+static bool
+option_matches(const char* option, const char* option_name, char delim)
+{
+   while (*option_name)
+   {
+      if (*option++ != *option_name++)
+      {
+         return false;
+      }
+   }
 
-  bool input_stdin = false;
+   return !*option || *option == delim;
+}
 
-  if (input_file == NULL)
-    {
-      if (!dc3_use_pattern)
-       {
-         conversions_mask |= C_TWOBUFS;
-         input_file = _("standard input");
-         set_fd_flags (STDIN_FILENO, input_flags, input_file);
-         input_stdin = true;
-       }
-    }
-  else
-    {
-#ifdef DEFAULT_IFLAG_DIRECT
-      input_flags |= O_DIRECT;
-#endif
+static bool
+option_is(const char* option, const char* option_name)
+{
+   return option_matches(option, option_name, '=');
+}
 
-      if (fd_reopen (STDIN_FILENO, input_file, O_RDONLY | input_flags, 0) < 0)
-	dc3_error (EXIT_FAILURE, errno, _("opening %s"), quote (input_file));
-    }
+static uintmax_t
+parse_integer(const char* str, bool* invalid)
+{
+   uintmax_t n;
+   char *suffix;
+   enum strtol_error e = xstrtoumax (str, &suffix, 10, &n, "bcEGkKMPTwYZ0");
 
-  offset = lseek (STDIN_FILENO, 0, SEEK_CUR);
-  input_seekable = (0 <= offset);
-  input_offset = offset;
-  input_seek_errno = errno;
-
-  // probe input device if appropriate
-  if (dc3_sizeprobe && !dc3_use_pattern && !(dc3_mode_verify&&input_stdin))
-  {
-    if (max_sectors == (uintmax_t)-1)
-      dc3_probe_file(STDIN_FILENO);
-    else
-      dc3_probe_sectorsize(STDIN_FILENO);
-  }
-
-  if (output_file == NULL)
-    {
-      output_file = _("standard output");
-      set_fd_flags (STDOUT_FILENO, output_flags, output_file);
-    }
-  else
-    {
-      const char * file_to_open;
+   if (e == LONGINT_INVALID_SUFFIX_CHAR && *suffix == 'x')
+   {
+      uintmax_t multiplier = parse_integer(suffix + 1, invalid);
 
-      mode_t perms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
-      int opts
-	= (output_flags
-	   | (conversions_mask & C_NOCREAT ? 0 : O_CREAT)
-	   | (conversions_mask & C_EXCL ? O_EXCL : 0)
-	   | (seek_sectors || (conversions_mask & C_NOTRUNC) ? 0 : O_TRUNC));
+      if (multiplier != 0 && n * multiplier / multiplier != n)
+      {
+         *invalid = true;
+         return 0;
+      }
 
-      if (dc3_split)
-	{
-	  /* We have to extend output file to be a new string that can hold 
-	     not only the original file name but the extensions that we're
-	     adding on */
+      n *= multiplier;
+   }
+   else if (e != LONGINT_OK)
+   {
+      *invalid = true;
+      return 0;
+   }
 
-	  dc3_generate_split_filename(output_file, dc3_split_format, dc3_split_number, &dc3_split_filename);
+   return n;
+}
 
-	  file_to_open = dc3_split_filename;
-	}
-      else
-	file_to_open = output_file;
+static void
+parse_quantifier(settings_t* settings, const char* name, const char* val)
+{
+   // Note the early outs for command line errors since evidence should not
+   // be handled any more than necessary, and glossing over a malformed
+   // command line is therefore undesirable - the user's choices need to be
+   // exactly specified before a run is undertaken.
+   bool invalid = false;
+   uintmax_t n = 0;
+   if (option_is (name, "ofsz"))
+   {
+      settings->max_output_file_size = n = parse_integer(val, &invalid);
+   }
+   else if (option_is(name, "bufsz"))
+   {
+      settings->buffer_size = n = parse_integer(val, &invalid);
+   }
+   else if (option_is(name, "iskip"))
+   {
+      settings->input_sectors_to_skip = n = parse_integer(val, &invalid);
+   }
+   else if (option_is(name, "oskip"))
+   {
+      settings->output_sectors_to_skip = n = parse_integer(val, &invalid);
+   }
+   else if (option_is(name, "cnt"))
+   {	
+      settings->max_sectors_to_input = n = parse_integer(val, &invalid);
+   }
+   else if (option_is(name, "ssz"))
+   {
+      settings->sector_size = n = parse_integer(val, &invalid);
+   }
+   else
+   {
+      report_error(DC3DD_EXIT_ABORTED, 0, _("unrecognized option %s"), name);
+   }
+
+   invalid |= !(n > 0);
+   if (invalid)
+   {
+      report_error(DC3DD_EXIT_ABORTED, 0, _("invalid number %s for %s"), val, name);
+   }
+}
 
-      if (dc3_pipe_output)
-	{
-	  close(STDOUT_FILENO);
-	  FILE *tmp = popen(output_file,"w");
-	  if (NULL == tmp)
-	    dc3_error(EXIT_FAILURE,errno,_("opening %s"), quote(output_file));
-	  int fd = fileno(tmp);
-	  if (fd != STDOUT_FILENO && fd >= 0)
-	    {
-	      fcntl(fd,F_DUPFD,STDOUT_FILENO);
-	      int saved_errno = errno;
-	      close(fd);
-	      errno = saved_errno;
-	    }
-	}
+static void
+validate_hashing_settings(settings_t* settings)
+{
+   // Note the early out for command line errors since evidence should not
+   // be handled any more than necessary, and glossing over a malformed
+   // command line is therefore undesirable - the user's choices need to be
+   // exactly specified before a run is undertaken.
+
+   // Determine whether there is an active hash algorithm.
+   bool hash_specified = false;
+   for (uint8_t i = 0; i < NUM_HASHES; ++i)
+   {
+      if (hash_algorithms[i].active)
+      {
+         hash_specified = true;
+         break;
+      }         
+   }
+
+   if (settings->verifying_output && !hash_specified)
+   {
+      report_error(DC3DD_EXIT_ABORTED, 0,
+         _("hof=, hofs=, or vwipe= specified without hash algorithm(s) selection"));
+   }
+}   
 
+static void
+validate_size_settings(settings_t* settings)
+{
+   // Note the early outs for command line errors since evidence should not
+   // be handled any more than necessary, and glossing over a malformed
+   // command line is therefore undesirable - the user's choices need to be
+   // exactly specified before a run is undertaken.
+   
+   // Determine the working sector size. 
+   if (settings->wipe_target)
+   {
+      settings->sector_size = settings->wipe_target->probed_sector_size;
+      settings->sector_size_source = _("probed");
+   }
+   else if (settings->sector_size > 0)
+   {
+      settings->sector_size_source = _("set");
+   }
+   else if (settings->input_file && settings->input_file->is_device && settings->input_file->probed_sector_size > 0)
+   {
+      settings->sector_size = settings->input_file->probed_sector_size;
+      settings->sector_size_source = _("probed");
+   }
+   else
+   {
+      // This will be the case for regular files.
+      settings->sector_size = DEFAULT_SECTOR_SIZE;
+      settings->sector_size_source = _("assumed");
+   }
+
+   // Make sure the working sector size is consistent with the buffer size.
+   if (settings->buffer_size < settings->sector_size || settings->buffer_size % settings->sector_size != 0)
+   {
+      // Do not reference bufsz=, since this may be an issue with the default buffer size. 
+      report_error(DC3DD_EXIT_ABORTED, 0, _("buffer size (%d) must be a multiple of sector size (%d)"),
+         settings->buffer_size, settings->sector_size);
+   }
+
+   // Make sure the skip sizes will work.
+   if (settings->input_sectors_to_skip && 
+       settings->input_file->probed_size_in_bytes < settings->input_sectors_to_skip)
+   {
+      report_error(DC3DD_EXIT_ABORTED, 0,
+         _("if iskip= is specified, if= must specify an input file or device of at least that size"));
+   }
+
+   if (settings->output_sectors_to_skip)
+   {
+      file_t* file = settings->output_files;
+      while (file)
+      {
+         // The output file must already exist if output sectors are to be skipped.
+         probe_file_for_validation(file);
+         if (file->probed_size_in_bytes < settings->output_sectors_to_skip * settings->sector_size)
+         {
+            report_error(DC3DD_EXIT_ABORTED, 0,
+               _("if oskip= is specified, of= must specify output files of at least that size"));
+         }
+         file = file->next_file;
+      }
+   }
+}
 
-      else if (dc3_mode_verify)
-	{
-	  if (fd_reopen(STDOUT_FILENO,output_file,O_RDONLY,0) < 0)
-	    dc3_error(EXIT_FAILURE,errno,_("opening %s"), quote(output_file));
-	}
+static void
+validate_IO_options(settings_t* settings)
+{
+   // Make sure that the options specified are valid for the I\O combination. 
+   // Note the early outs for command line errors since evidence should not
+   // be handled any more than necessary, and glossing over a malformed
+   // command line is therefore undesirable - the user's choices need to be
+   // exactly specified before a run is undertaken.
+
+   if (settings->input_pattern)
+   {
+      if (settings->input_sectors_to_skip)
+      {
+         report_error(DC3DD_EXIT_ABORTED, 0, _("cannot combine pat=, tpat= or if=/dev/zero and iskip="));
+      }
 
+      if (settings->max_sectors_to_input == INFINITE_SECTORS && !settings->wipe_target)
+      {
+         // Make sure a stopping condition exists, in the form of either a count of pattern sectors
+         // to produce or the size of the device to be wiped.
+	 report_error(DC3DD_EXIT_ABORTED, 0, _("if generating a pattern and not wiping, must specify cnt="));
+      }
+   }
+ 
+   if (settings->input_file && settings->input_sectors_to_skip)
+   {
+      if (settings->input_file->part_of_set)
+      {
+	 // Not currently supporting the ability to skip input sectors if it requires opening
+	 // multiple files. 
+	 report_error(DC3DD_EXIT_ABORTED, 0, _("cannot combine cnt= and ifs="));                
+      }
 
-      /* Open the output file with *read* access only if we might
-	 need to read to satisfy a `seek=' request.  If we can't read
-	 the file, go ahead with write-only access; it might work.  */
-      else if ((! seek_sectors
-	   || fd_reopen (STDOUT_FILENO, file_to_open, O_RDWR | opts, perms) < 0)
-	  && (fd_reopen (STDOUT_FILENO, file_to_open, O_WRONLY | opts, perms)
-	      < 0))
-	dc3_error (EXIT_FAILURE, errno, _("opening %s"), quote (file_to_open));
+      if (STREQ(settings->input_file->name, "stdin"))
+      {
+	 report_error(DC3DD_EXIT_ABORTED, 0, _("cannot specify cnt= when input is stdin"));                
 
-      if (dc3_sizeprobe && (dc3_use_pattern || (dc3_mode_verify&&input_stdin)))
+      }
+   }
+
+   if (settings->output_files && STREQ(settings->output_files->name, "stdout"))
+   {
+      if (settings->output_sectors_to_skip)
+      {    
+         report_error(DC3DD_EXIT_ABORTED, 0, _("cannot specify oskip= when output is stdout"));                
+      }    
+
+      if (settings->max_output_file_size != INFINITE_BYTES)
+      {    
+         report_error(DC3DD_EXIT_ABORTED, 0, _("cannot specify ofsz= when output is stdout"));                
+      }    
+
+      if (settings->append_output)
+      {    
+         report_error(DC3DD_EXIT_ABORTED, 0, _("cannot specify app=on when output is stdout"));                
+      }    
+   }
+
+   if (settings->wipe_target)
+   {
+      if (settings->max_output_file_size != INFINITE_BYTES)
+      {  
+         report_error(DC3DD_EXIT_ABORTED, 0, _("cannot combine wipe= or vwipe= and ofsz="));                
+      }    
+
+      if (settings->max_sectors_to_input == INFINITE_SECTORS)
       {
-	if (max_sectors == (uintmax_t)-1)
-	  dc3_probe_file(STDOUT_FILENO);
-	else
-	  dc3_probe_sectorsize(STDOUT_FILENO);
+         // Throttle the pattern input to the size of the device to be wiped, 
+         // which is the sole output file.
+         settings->max_sectors_to_input = settings->wipe_target->probed_size_in_sectors; 
+      }
+      else
+      {    
+         report_error(DC3DD_EXIT_ABORTED, 0, _("cannot combine wipe= or vwipe= and cnt="));                
+      }    
+
+      if (settings->input_sectors_to_skip)
+      {    
+         report_error(DC3DD_EXIT_ABORTED, 0, _("cannot combine wipe= or vwipe= and iskip="));                
+      }    
+
+      if (settings->output_sectors_to_skip)
+      {    
+         report_error(DC3DD_EXIT_ABORTED, 0, _("cannot combine wipe= or vwipe= and oskip="));                
+      }    
+
+      if (settings->append_output)
+      {    
+         report_error(DC3DD_EXIT_ABORTED, 0, _("cannot combine wipe= or vwipe= and app=on"));                
+      }    
+    
+      if (settings->sector_size)
+      {    
+         report_error(DC3DD_EXIT_ABORTED, 0, _("cannot combine wipe= or vwipe= and ssz="));                
       }
+   }
 
-      size_t seek_sector_size = dc3_sectorsize ? dc3_sectorsize : 512;
+   if (settings->splitting_output)
+   {
+      if (settings->append_output)
+      {
+         report_error(DC3DD_EXIT_ABORTED, 0, _("cannot combine app=on and ofs= or hofs="));      
+      }
 
-#if HAVE_FTRUNCATE
-      if (seek_sectors != 0 && !(conversions_mask & C_NOTRUNC))
-	{
-          uintmax_t size = seek_sectors * seek_sector_size;
-	  //unsigned long int obs = output_blocksize;
+      if (settings->output_sectors_to_skip)
+      {    
+	 // Not currently supporting the ability to skip output sectors if it requires opening
+	 // multiple files. 
+         report_error(DC3DD_EXIT_ABORTED, 0, _("cannot combine oskip= and ofs= of hofs="));                
+      }    
 
-	  if (OFF_T_MAX / seek_sector_size < seek_sectors)
-	    dc3_error (EXIT_FAILURE, 0,
-		   _("offset too large: "
-		     "cannot truncate to a length of seek=%"PRIuMAX""
-		     " (%lu-byte) sectors"),
-		   seek_sectors, seek_sector_size);
+      if (settings->max_output_file_size == INFINITE_BYTES)
+      {
+	 #ifdef DEFAULT_OUTPUT_FILE_SIZE
+	 // This is necessary since the preprocessor symbol may have a size suffix.
+	 parse_quantifier(settings, "ofsz", AS_STRING(DEFAULT_OUTPUT_FILE_SIZE));         
+         #else
+         report_error(DC3DD_EXIT_ABORTED, 0, _("ofs= or hofs= specified, must specify ofsz="));               
+	 #endif
+      }
+   }
+   else if (settings->max_output_file_size != INFINITE_BYTES)
+   {
+      report_error(DC3DD_EXIT_ABORTED, 0, _("ofsz= specified, must specify ofs= or hofs= at least once"));
+   }   
+} 
 
-	  if (ftruncate (STDOUT_FILENO, size) != 0)
-	    {
-	      /* Complain only when ftruncate fails on a regular file, a
-		 directory, or a shared memory object, as POSIX 1003.1-2004
-		 specifies ftruncate's behavior only for these file types.
-		 For example, do not complain when Linux 2.4 ftruncate
-		 fails on /dev/fd0.  */
-	      int ftruncate_errno = errno;
-	      struct stat stdout_stat;
-	      if (fstat (STDOUT_FILENO, &stdout_stat) != 0)
-		dc3_error (EXIT_FAILURE, errno, _("cannot fstat %s"),
-			   quote (file_to_open));
-	      if (S_ISREG (stdout_stat.st_mode)
-		  || S_ISDIR (stdout_stat.st_mode)
-		  || S_TYPEISSHM (&stdout_stat))
-			   dc3_error (EXIT_FAILURE, ftruncate_errno,
-				      _("truncating at %"PRIuMAX" bytes in output file %s"),
-				      size, quote (file_to_open));
-	    }
-	}
-#endif
-    }
+static void
+validate_IO_combination(settings_t* settings)
+{
+   // Make sure that a valid combination of input and outputs is specified.
+   // Note the early outs for command line errors since evidence should not
+   // be handled any more than necessary, and glossing over a malformed
+   // command line is therefore undesirable - the user's choices need to be
+   // exactly specified before a run is undertaken.
+   
+   if (settings->wipe_target && settings->output_files)
+   {
+      report_error(DC3DD_EXIT_ABORTED, 0, _("cannot combine wipe= or vwipe= and of=, hof=, ofs= or hofs="));   
+   }
+
+   if (settings->wipe_target && settings->input_file)
+   {
+      report_error(DC3DD_EXIT_ABORTED, 0, _("cannot combine wipe= or vwipe= and if= or ifs="));      
+   }
+
+   if (settings->wipe_target && !settings->input_pattern)
+   {
+      // Wipe with zeros by default.
+      add_input_pattern(settings, "00");
+   }
+
+   if (!settings->input_pattern && !settings->input_file)
+   {
+      // No inputs specified, default to reading from stdin.
+      add_input_file(settings, "stdin", false);
+   }
+   
+   if (!settings->wipe_target && !settings->output_files)
+   {
+      // No outputs specified, default to writing to stdout.
+      add_output_file(settings, "stdout", false, false);
+   }
+
+   DC3DD_ASSERT((settings->wipe_target && settings->input_pattern) || 
+                (!settings->wipe_target && settings->output_files &&
+                (settings->input_file || settings->input_pattern)));
+}
 
-  install_signal_handlers ();
-
-  bool dc3_sizeprobe_worked = false;
-
-  // TODO: should really specify if non-probing was due to
-  // lack of size-probe mode, or probe failure
-  if (dc3_sectorsize == 0)
-  {
-    dc3_sectorsize = 512;
-    fprintf(stderr, "warning: sector size not probed, assuming 512\n");
-  }
-  else
-  {
-    dc3_sizeprobe_worked = true;
-  }
-  
-  dc3_small_read = dc3_sectorsize;
-
-  if (input_blocksize % dc3_sectorsize != 0)
-      dc3_error(EXIT_FAILURE, 0, "fatal: input block size (%zd) must be a multiple of sector size (%zd)", input_blocksize, dc3_sectorsize);
-
-  if (max_sectors != (uintmax_t)-1)
-      input_bytes = dc3_sectorsize * max_sectors;
-  // when skip=X given, adjust input_bytes so progress display is accurate
-  else if (skip_sectors != 0)
-      input_bytes -= skip_sectors * dc3_sectorsize;
-
-  if (dc3_mode_wipe && max_sectors == (uintmax_t)-1 && dc3_sizeprobe_worked)
-    max_sectors = input_bytes / dc3_sectorsize;
-
-  /* We have to check if the installer turned on a hashing algorithm
-     using a compiler define (e.g. CFLAGS="-DDEFAULT_HASH_MD5") but
-     didn't specify a hash log or hash window. In this case the
-     dc3_hash and hash_log variables don't get set. */
-  i = 0;
-  while (i < DC3_NUM_HASHES && !dc3_hash)
-    {
-      if (dc3_hashinfo[i].inuse)
-	dc3_hash = true;
+static void
+validate_settings(settings_t* settings)
+{
+   // This function is decomposed into a series of shorter functions for
+   // readability and maintainability. The order of calling of these functions
+   // should be maintained.
+   validate_IO_combination(settings);
+   validate_IO_options(settings);
+   validate_size_settings(settings);
+   validate_hashing_settings(settings);
+}
 
-      i++;
-    }
+static settings_t*
+make_settings()
+{
+   settings_t* settings = (settings_t*)malloc(sizeof(settings_t));
+   settings->input_pattern_string = NULL;
+   settings->input_pattern = NULL;
+   settings->input_pattern_length = 0;
+   settings->input_file = NULL;
+   settings->output_files = NULL;
+   settings->wipe_target = NULL;
+   settings->sector_size = 0;
+   settings->sector_size_source = NULL;
+   settings->buffer_size = DEFAULT_BUFFER_SIZE;
+   settings->input_sectors_to_skip = 0;
+   settings->output_sectors_to_skip = 0;
+   settings->max_sectors_to_input = INFINITE_SECTORS; 
+   settings->max_output_file_size = INFINITE_BYTES;
+   settings->recover_errors = true;
+   settings->splitting_output = false;
+   settings->verifying_output = false;
+   settings->append_output = false;
+   settings->corrupt_output = false;
+   return settings;
+} 
+
+static settings_t*
+parse_args(int argc, char* const* argv)
+{
+   settings_t* settings = make_settings();
+
+   for (int i = optind; i < argc; ++i)
+   {
+      // Split the argument into a name/value pair.
+      char const* name = argv[i];
+      char const* val = strchr(name, '=');
+      if (!val)
+      {
+	 // Note the early out for command line errors since evidence should not
+	 // be handled any more than necessary, and glossing over a malformed
+	 // command line is therefore undesirable - the user's choices need to be
+	 // exactly specified before a run is undertaken.
+         report_error(DC3DD_EXIT_ABORTED, 0, _("unrecognized option %s"), quote(name));
+      }
+      ++val;
 
-  if (dc3_hash)
-    dc3_hash_init();
+      if (option_is(name, "if"))
+      {
+         add_input_file(settings, val, false);
+      }
+      else if (option_is(name, "ifs"))
+      {
+         add_input_file(settings, val, true);         
+      }
+      else if (option_is(name,"pat"))
+      {
+         add_input_pattern(settings, val);
+      }
+      else if (option_is(name,"tpat"))
+      {
+         add_input_text_pattern(settings, val);
+      }
+      else if (option_is(name, "of"))
+      {
+         add_output_file(settings, val, false, false);
+      }
+      else if (option_is(name, "hof"))
+      {
+         add_output_file(settings, val, false, true);
+      }
+      else if (option_is(name, "ofs"))
+      {
+         add_output_file(settings, val, true, false);
+      }  
+      else if (option_is(name, "hofs"))
+      {
+         add_output_file(settings, val, true, true);
+      }  
+      else if (option_is(name,"hash"))
+      {
+         activate_hash(val);      
+      }
+      else if (option_is(name,"log") || option_is(name, "hlog"))
+      {
+         // Arg already parsed in initiate_logging(). 
+      }
+      else if (option_is(name,"rec"))
+      {
+         // i.e., rec=off
+         settings->recover_errors = false;
+      }
+      else if (option_is(name, "app"))
+      {
+         // i.e., app=on
+         settings->append_output = true;
+      }
+      else if (option_is(name, "wipe")) 
+      {
+         add_wipe_target(settings, val, false); 
+      }
+      else if (option_is(name, "vwipe")) 
+      {
+         add_wipe_target(settings, val, true); 
+      }
+      else if (option_is(name, "verb"))
+      {
+         // i.e., verb=on
+         verbose_reporting = true;
+      }
+      else if (option_is(name, "nwspc"))
+      {
+         // i.e., nwspc=on
+         compact_reporting = true;
+      }
+      else if (option_is(name, "b10"))
+      {
+         // i.e., dbr=on
+         progress_bytes_reporting_flag = 0;
+      }
+      else if (option_is(name, "corruptoutput"))
+      {
+         // i.e., corruptoutput=on
+         settings->corrupt_output = true;
+      }
+      else
+      {
+         parse_quantifier(settings, name, val);
+      }
+   }    
+   
+   return settings;
+}
 
-  start_time = gethrxtime ();
+static settings_t*
+parse_settings(int argc, char* const* argv)
+{
+   settings_t* settings = parse_args(argc, argv);
+   validate_settings(settings);
+   return settings;
+}
 
+static char* 
+make_cmd_line_string(int argc, char* const* argv)
+{
+   size_t len = 1; // At least 1, for terminating NUL.
 
-  char* dc3_start_time = dc3_time();
-  fprintf(stderr, "dc3dd %s started at %s\n", VERSION, dc3_start_time);
-  if (error_log != NULL)
-    fprintf(error_log, "\ndc3dd %s started at %s\n", VERSION, dc3_start_time);
+   for (int i = 0; i < argc; ++i)
+   {
+      len += strlen(argv[i]);
+      if (i < (argc - 1))
+      {
+         len += 1;
+      }
+   }
+
+   char* cmdline = NULL;
+   cmdline = (char*)malloc(len);
+   char* command_line = cmdline;
+   for (int i = 0; i < argc; ++i)
+   {
+      for (size_t j = 0; j < strlen(argv[i]); ++j)
+      {
+         *cmdline = argv[i][j];
+         ++cmdline;
+      }
 
-  fprintf(stderr, "command line: %s\n", dc3_cmdline);
-  if (error_log != NULL)
-    fprintf(error_log, "command line: %s\n", dc3_cmdline);
+      if (i < (argc - 1))
+      {
+         *cmdline = ' ';
+         ++cmdline;
+      }
+   }
+   *cmdline = '\0';
+   
+   return command_line;
+}
 
-  fprintf(stderr, "compiled options:");
-  dc3_print_flags(stderr, false);
-  if (error_log != NULL)
-  {
-    fprintf(error_log, "compiled options:");
-    dc3_print_flags(error_log, false);
-  }
+static void 
+report_compile_flags(FILE* file, bool newlines)
+{
+   #ifdef DEFAULT_HASH_MD5
+   fputs(" DEFAULT_HASH_MD5 (hash=md5)", file);
+   if (newlines) fputs("\n", file);
+   #endif
+
+   #ifdef DEFAULT_HASH_SHA1
+   fputs(" DEFAULT_HASH_SHA1 (hash=sha1)", file);
+   if (newlines) fputs("\n", file);
+   #endif
+
+   #ifdef DEFAULT_HASH_SHA256
+   fputs(" DEFAULT_HASH_SHA256 (hash=sha26)", file);
+   if (newlines) fputs("\n", file);
+   #endif
+
+   #ifdef DEFAULT_HASH_SHA512
+   fputs(" DEFAULT_HASH_SHA512 (hash=sha512)", file);
+   if (newlines) fputs("\n", file);
+   #endif
+
+   #ifdef DEFAULT_OUTPUT_FILE_SIZE
+   fprintf(file, " DEFAULT_OUTPUT_FILE_SIZE (ofsz=%s)", AS_STRING(DEFAULT_OUTPUT_FILE_SIZE));
+   if (newlines) fputs("\n", file);
+   #endif
+
+   #ifdef DEFAULT_VERBOSE_REPORTING
+   fputs(" DEFAULT_VERBOSE_REPORTING (verb=on)", file);
+   if (newlines) fputs("\n", file);
+   #endif
+
+   #ifdef DEFAULT_COMPACT_REPORTING
+   fputs(" DEFAULT_COMPACT_REPORTING (nwspc=on)", file);
+   if (newlines) fputs("\n", file);
+   #endif
+
+   #ifdef DEFAULT_BASE_TEN_BYTES_REPORTING
+   fputs(" DEFAULT_BASE_TEN_BYTES_REPORTING (dbr=on)", file);
+   if (newlines) fputs("\n", file);
+   #endif
+
+   if (!newlines) fputs("\n", file);
+}
 
-  fprintf(stderr, "sector size: %zd (%s)\n", dc3_sectorsize, dc3_sizeprobe_worked ? "probed" : "assumed");
-  if (error_log != NULL)
-    fprintf(error_log, "sector size: %zd (%s)\n", dc3_sectorsize, dc3_sizeprobe_worked ? "probed" : "assumed");
+static void
+report_settings(int argc, char* const* argv)
+{
+   // Report compiled-in options.
+   fputs(_("compiled options:"), stderr);
+   report_compile_flags(stderr, false);
+   if (log != NULL)
+   {
+      fputs(_("compiled options:"), log);
+      report_compile_flags(log, false);
+   }
+   if (hash_log != NULL)
+   {
+      fputs(_("compiled options:"), hash_log);
+      report_compile_flags(hash_log, false);
+   }
+
+   // Report the command line.
+   char* command_line = make_cmd_line_string(argc, argv);
+   char message[DISPLAY_MESSAGE_LENGTH];
+   sprintf(message, _("command line: %s\n"), command_line);
+   report_to_all(message);
+   free(command_line);
+   flush_logs();
+}
+ 
+static void
+report_start_message()
+{
+   // Save the program start time in a global for later use in 
+   // progress messages.
+   start_time = gethrxtime();
+
+   // Write the start message to all logs (i.e., console, log, hash log).
+   // The message acts as a sort of header for the run. The leading newline
+   // character acts to separate the output from multiple runs when
+   // appending to an existing log.
+   char* formatted_start_time = get_formatted_time_string();
+   char message[DISPLAY_MESSAGE_LENGTH];
+   sprintf(message, "\n%s %s started at %s\n", PROGRAM_NAME, VERSION, formatted_start_time);
+   free(formatted_start_time);
+   report_to_all(message);
+   flush_logs();
+}
 
-  if (error_log != NULL)
-    fflush(error_log);
+static void
+open_log(const char* arg, const char* arg_name, FILE** log)
+{
+   // Check for duplication of a log argument in the command line.
+   // Note the early out for command line errors since evidence should not
+   // be handled any more than necessary, and glossing over a malformed
+   // command line is therefore undesirable - the user's choices need to be
+   // exactly specified before a run is undertaken.
+   char message[DISPLAY_MESSAGE_LENGTH];
+   if (*log != NULL)
+   {
+      sprintf(message, _("cannot specify %s more than once"), arg_name);
+      report_error(DC3DD_EXIT_ABORTED, 0, message);
+   }
+
+   // Extract the log file name from the command line argument.
+   const char* val = strchr(arg, '=');
+   if (!val)
+   {
+      sprintf(message, _("%s specified with no file name"), arg_name);
+      report_error(DC3DD_EXIT_ABORTED, 0, message);
+   }
+   ++val;
+
+   // Open the log in append mode to support use cases where the
+   // imaging is performed using multiple runs (e.g., using skips
+   // etc., to work around errors) and a "cumulative" record of
+   // the runs is desired.
+   *log = fopen(val, "a");
+   if (*log == NULL)
+   {
+      report_error(DC3DD_EXIT_ABORTED, errno, _("opening log %s"), quote(val));
+   }
+}
 
-  exit_status = dd_copy ();
+static void 
+initiate_logging(int argc, char* const* argv)
+{
+   // Use PTHREAD_MUTEX_RECURSIVE to initialize the global mutex for
+   // synchronizing reporting output to the log(s) and console, so that nested
+   // calls to functions like report_to_log() that lock the mutex are safe.   
+   pthread_mutexattr_t attr;
+   pthread_mutexattr_init(&attr);
+   pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+   pthread_mutex_init(&reporting_lock, &attr);
+   pthread_mutexattr_destroy(&attr);
+
+   // Look for command line options specifying logs.
+   const char* arg = NULL;
+   for (int i = optind; i < argc; ++i)
+   {
+      arg = argv[i];
+      if (option_is(arg, "log"))
+      {
+         open_log(arg, "log=", &log);
+      }
+      else if (option_is(arg, "hlog"))
+      {
+         open_log(arg, "hlog=", &hash_log);
+      }
+   }
+}
 
-  if (dc3_mode_verify)
-    dc3_error(0,0,_("Verify PASSED"));
+void
+usage(int status)
+{
+   if (status != EXIT_SUCCESS)
+   {
+      fprintf (stderr, _("Try `%s --help' for more information.\n"), program_name);
+   }
+   else
+   {
+      fputs(_("------\n"), stderr);
+      fputs(_("usage:\n"), stderr);
+      fputs(_("------\n\n"), stderr);
+      fprintf(stderr, _("\t%s [OPTION 1] [OPTION 2] ... [OPTION N]\n"), program_name);    
+      fputs("\n", stderr);
+      fprintf(stderr, _("\t\t*or*\n"), program_name);    
+      fputs("\n", stderr);
+      fprintf(stderr, _("\t%s [HELP OPTION]\n"), program_name);    
+      fputs("\n", stderr);
+      fprintf(stderr, _("\twhere each OPTION is selected from the basic or advanced\n"), program_name);    
+      fprintf(stderr, _("\toptions listed below, or HELP OPTION is selected from the\n"), program_name);    
+      fprintf(stderr, _("\thelp options listed below.\n\n"), program_name);    
+
+      fputs(_("--------------\n"), stderr);
+      fputs(_("basic options:\n"), stderr);
+      fputs(_("--------------\n\n"), stderr);
+      fprintf(stderr, "\t%-21s%s\n", _("if=FILE"), _("Read input from the device or regular file FILE"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("(see note #1 below). This option can only be used"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("once and cannot be combined with ifs=, pat=,"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("or tpat=."));
+      if (!O_DIRECT)
+      {
+         fprintf(stderr, "\t%-21s%s\n", "", _("If FILE is a device, use rdisk for"));
+         fprintf(stderr, "\t%-21s%s\n", "", _("direct (unbuffered) input to enable read error"));
+         fprintf(stderr, "\t%-21s%s\n", "", _("recovery unless rec=off is specified."));
+      }
+      fprintf(stderr, "\t%-21s%s\n", _("ifs=BASE.FMT"), _("Read input from a set of files with base name"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("BASE and sequential file name extensions"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("conforming to the format specifier FMT (see"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("note #4 below). This option can only be used once"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("and cannot be combined with if=, pat=, or"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("tpat=."));
+      fprintf(stderr, "\t%-21s%s\n", _("of=FILE"), _("Write output to FILE (see note #2 below). This"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("option can be used more than once (see note #3")); 
+      fprintf(stderr, "\t%-21s%s\n", "", _("below).")); 
+      fprintf(stderr, "\t%-21s%s\n", _("hof=FILE"), _("Write output to FILE and verify FILE after writing"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("it by hashing it and comparing the output hash(es)"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("to the input hash(es). This option can be used more"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("than once (see note #3 below)."));
+      fprintf(stderr, "\t%-21s%s\n", _("ofs=BASE.FMT"), _("Write output to a set of files with base name BASE"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("and sequential file name extensions generated from")); 
+      fprintf(stderr, "\t%-21s%s\n", "", _("the format specifier FMT (see note #4 below). This"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("option can be used more than once (see note #3"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("below). Specify the maximum size of each file"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("in the set using ofsz=."));
+      fprintf(stderr, "\t%-21s%s\n", _("hofs=BASE.FMT"), _("Write output to a set of files with base name BASE"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("and sequential file name extensions generated from"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("the format specifier FMT (see note #4 below)."));
+      fprintf(stderr, "\t%-21s%s\n", "", _("Verify the files after writing them by hashing"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("them and comparing the output hash(es) to the input"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("hash(es). This option can be used more than once"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("(see note #3 below). Specify the maximum size of"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("each file in the set using ofsz=."));
+      fprintf(stderr, "\t%-21s%s\n", _("ofsz=BYTES"), _("Set the maximum size of each file in the sets of"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("files specified using ofs= or hofs= to"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("BYTES (see note #5 below). A default value for"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("this option may be set at compile time using"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("-DDEFAULT_OUTPUT_FILE_SIZE followed by the desired"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("value in BYTES.")); 
+      fprintf(stderr, "\t%-21s%s\n", _("hash=ALGORITHM"), _("Compute an ALGORITHM hash of the input and also"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("of any outputs specified using hof= or hofs=,"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("where ALGORITHM is one of md5, sha1, sha256, or"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("sha512. This option may be used once for each"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("supported ALGORITHM. Alternatively, hashing can"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("be activated at compile time using one or more of"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("-DDEFAULT_HASH_MD5,-DDEFAULT_HASH_SHA1,"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("-DDEFAULT_HASH_SHA256, and -DDEFAULT_HASH_SHA512.")); 
+      fprintf(stderr, "\t%-21s%s\n", _("log=FILE"), _("Log I/O statistcs, diagnostics, and total hashes"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("of input and output to FILE. If hlog= is not"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("specified, piecewise hashes of multiple file"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("input and output are also logged to FILE."));
+      fprintf(stderr, "\t%-21s%s\n\n", _("hlog=FILE"), _("Log total hashes and piecewise hashes to FILE."));
+
+      fputs(_("-----------------\n"), stderr);
+      fputs(_("advanced options:\n"), stderr);
+      fputs(_("-----------------\n\n"), stderr);
+      fprintf(stderr, "\t%-21s%s\n", _("rec=off"), _("By default, zeros are written to the output(s) in"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("place of bad sectors when the input is a device."));
+      fprintf(stderr, "\t%-21s%s\n", "", _("Use this option to cause the program to instead"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("exit when a bad sector is encountered.")); 
+      fprintf(stderr, "\t%-21s%s\n", _("wipe=DEVICE"), _("Wipe DEVICE by writing zeros (default) or a"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("pattern specified by pat= or tpat=.")); 
+      fprintf(stderr, "\t%-21s%s\n", _("vwipe=DEVICE"), _("Wipe DEVICE by writing zeros (default) or a"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("pattern specified by pat= or tpat=."));
+      fprintf(stderr, "\t%-21s%s\n", "", _("Verify DEVICE after writing it by hashing it"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("and comparing the hash(es) to the input hash(es)."));
+      fprintf(stderr, "\t%-21s%s\n", _("pat=HEX"), _("Use pattern as input, writing HEX to every byte"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("of the output. This option can only be used once"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("and cannot be combined with if=, ifs=, or"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("tpat=."));
+      fprintf(stderr, "\t%-21s%s\n", _("tpat=TEXT"), _("Use text pattern as input, writing the string TEXT"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("repeatedly to the output. This option can only be"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("used once and cannot be combined with if=, ifs=,"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("or pat=."));
+      fprintf(stderr, "\t%-21s%s\n", _("cnt=SECTORS"), _("Input only SECTORS input sectors. Must be used with"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("pat= or tpat= if not using the pattern"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("with wipe= or vwipe= to wipe a device."));
+      fprintf(stderr, "\t%-21s%s\n", _("iskip=SECTORS"), _("Skip SECTORS sectors at start of the input device"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("or file."));
+      fprintf(stderr, "\t%-21s%s\n", _("oskip=SECTORS"), _("Skip SECTORS sectors at start of the output"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("file. Specifying oskip= automatically "));
+      fprintf(stderr, "\t%-21s%s\n", "", _("sets app=on.")); 
+      fprintf(stderr, "\t%-21s%s\n", _("app=on"), _("Do not overwrite an output file specified with"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("of= if it already exists, appending output instead.")); 
+      fprintf(stderr, "\t%-21s%s\n", _("ssz=BYTES"), _("Unconditionally use BYTES (see note #5 below) bytes"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("for sector size. If ssz= is not specified,"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("sector size is determined by probing the device;"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("if the probe fails or the target is not a device,"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("a sector size of 512 bytes is assumed.")); 
+      fprintf(stderr, "\t%-21s%s\n", _("bufsz=BYTES"), _("Set the size of the internal byte buffers to BYTES"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("(see note #5 below). This effectively sets the"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("maximum number of bytes that may be read at a time"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("from the input. BYTES must be a multiple of sector"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("size. Use this option to fine-tune performance."));
+      fprintf(stderr, "\t%-21s%s\n", _("verb=on"), _("Activate verbose reporting, where sectors in/out"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("are reported for each file in sets of files"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("specified using ifs=, ofs=, or hofs=."));
+      fprintf(stderr, "\t%-21s%s\n", "", _("Alternatively, verbose reporting may be"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("activated at compile time using"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("-DDEFAULT_VERBOSE_REPORTING."));
+      fprintf(stderr, "\t%-21s%s\n", _("nwspc=on"), _("Activate compact reporting, where the use"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("of white space to divide log output into"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("logical sections is suppressed. Alternatively,"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("compact reporting may be activated at compile"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("time using -DDEFAULT_COMPACT_REPORTING."));
+      fprintf(stderr, "\t%-21s%s\n", _("b10=on"), _("Activate base 10 bytes reporting, where the"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("progress display reports 1000 bytes instead"));
+      fprintf(stderr, "\t%-21s%s\n", "",  _("of 1024 bytes as 1 KB. Alternatively, base 10"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("bytes reporting may be activated at compile"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("time using -DDEFAULT_BASE_TEN_BYTES_REPORTING."));
+      fprintf(stderr, "\t%-21s%s\n", _("corruptoutput=on"), _("For verification testing and demonstration"));
+      fprintf(stderr, "\t%-21s%s\n", "", _("purposes, corrupt the output file(s) with extra"));       
+      fprintf(stderr, "\t%-21s%s\n\n", "", _("bytes so a hash mismatch is guaranteed."));       
+
+      fputs(_("-------------\n"), stderr);
+      fputs(_("help options:\n"), stderr);
+      fputs(_("-------------\n\n"), stderr);
+      fputs (HELP_OPTION_DESCRIPTION, stderr);
+      fputs (VERSION_OPTION_DESCRIPTION, stderr);
+      fputs ("      --flags    display compile-time flags and exit\n\n", stderr);
+
+      fputs(_("------\n"), stderr);
+      fputs(_("notes:\n"), stderr);
+      fputs(_("------\n\n"), stderr);
+      fputs(_("1. To read from stdin, do not specify if=, ifs=, pat=, or tpat=.\n"), stderr);
+      fputs(_("2. To write to stdout, do not specify of=, hof=, ofs=, hofs=, wipe=,\n"), stderr); 
+      fputs(_("   or vwipe=.\n"), stderr);
+      fputs(_("3. To write to multiple outputs specify more than one of of=, hof=, ofs=,\n"), stderr);
+      fputs(_("   or hofs=, in any combination.\n"), stderr);
+      fputs(_("4. FMT is a pattern for a sequence of file extensions that can be numerical\n"), stderr);
+      fputs(_("   starting at zero, numerical starting at one, or alphabetical. Specify FMT\n"), stderr);
+      fputs(_("   by using a series of zeros, ones, or a's, respectively. The number of\n"), stderr);
+      fputs(_("   characters used indicates the desired length of the extensions.\n"), stderr);
+      fputs(_("   For example, a FMT specifier of 1111 indicates four character\n"), stderr);
+      fputs(_("   numerical extensions starting with 0001.\n"), stderr);  
+      fputs(_("5. BYTES may be followed by the following multiplicative suffixes:\n"), stderr);
+      fputs(_("   c (1), w (2), b (512), kB (1000), K (1024), MB (1000*1000),\n"), stderr);
+      fputs(_("   M (1024*1024), GB (1000*1000*1000), G (1024*1024*1024), and\n"), stderr);
+      fputs(_("   so on for T, P, E, Z, and Y.\n"), stderr);      
+      fputs(_("6. Consider using cnt=, iskip= and oskip= to work around\n"), stderr);
+      fputs(_("   unreadable sectors if error recovery fails.\n"), stderr);
+      fputs(_("7. Sending an interrupt (e.g., CTRL+C) to dc3dd will cause\n"), stderr);
+      fputs(_("   the program to report the work completed at the time\n"), stderr);
+      fputs(_("   the interrupt is received and then exit.\n"), stderr);
+      emit_bug_reporting_address();
+   }
+    
+   report_exit_message(status);
+   terminate_logging();
+   exit(status);
+}
 
-  quit (exit_status);
+int
+main (int argc, char **argv)
+{
+   // Set up for localization.
+   initialize_main(&argc, &argv);
+   program_name = argv[0];
+   setlocale(LC_ALL, "");
+   bindtextdomain(PACKAGE, LOCALEDIR);
+   textdomain(PACKAGE);
+
+   // Handle command line "help options" (i.e., --flags, --help, --version). 
+   if (argc == 2 && STREQ(argv[1], "--flags"))
+   {
+      printf("%s compiled with:\n", PROGRAM_NAME);
+      report_compile_flags(stdout, true);
+      exit(DC3DD_EXIT_COMPLETED);
+   }
+   parse_long_options(argc, argv, PROGRAM_NAME, PACKAGE, VERSION, usage, AUTHORS, (char const*)NULL);
+   if (getopt_long(argc, argv, "", NULL, NULL) != -1)
+   {
+      usage(DC3DD_EXIT_FAILED);
+   }
+   
+   // Do the requested imaging.
+   initiate_logging(argc, argv);
+   report_start_message();
+   report_settings(argc, argv);
+   settings_t* settings = parse_settings(argc, argv);
+   report_input_size(settings);
+   job_t* jobs = make_jobs(settings);
+   int exit_code = execute_jobs(jobs);
+   report_results(jobs);
+   report_exit_message(exit_code);
+   terminate_logging();
+
+   return exit_code;
 }
diff --git a/test-compile.sh b/test-compile.sh
deleted file mode 100755
index e0a1801..0000000
--- a/test-compile.sh
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/bin/bash
-
-# dynamic link, no options
-
-./configure
-if [ $? -ne 0 ]
-then
-    echo "Configure failed"
-    exit 1
-fi
-
-make
-if [ $? -ne 0 ]
-then
-    echo "Make failed"
-    exit 2
-fi
-
-MSGCOUNT=`./src/dc3dd --flags | grep -c "\<DEFAULT_BLOCKSIZE=32768\>"`
-if [ $MSGCOUNT -ne 1 ]
-then
-    echo "DEFAULT_BLOCKSIZE=32768 flag line missing"
-    exit 3
-fi
-
-LINECOUNT=`./src/dc3dd --flags | wc -l`
-if [ $LINECOUNT -ne 3 ]
-then
-    echo "Flags line count wrong - should be 3"
-    exit 3
-fi
-
-
-# dynamic link, options
-
-make distclean
-if [ $? -ne 0 ]
-then
-    echo "Make distclean failed"
-    exit 2
-fi
-
-./configure CFLAGS="-O2 -DDEFAULT_HASH_MD5 -DDEFAULT_HASH_SHA1 -DDEFAULT_SIZEPROBE -DDEFAULT_PROGRESS -DDEFAULT_PROGRESSCOUNT=1000 -DDEFAULT_HASHCONV_AFTER"
-if [ $? -ne 0 ]
-then
-    echo "Configure failed"
-    exit 1
-fi
-
-make
-if [ $? -ne 0 ]
-then
-    echo "Make failed"
-    exit 2
-fi
-
-for a in DEFAULT_HASH_MD5 DEFAULT_HASH_SHA1 DEFAULT_SIZEPROBE DEFAULT_PROGRESS "DEFAULT_PROGRESSCOUNT=1000" DEFAULT_HASHCONV_AFTER "DEFAULT_BLOCKSIZE=32768"
-do
-    MSGCOUNT=`./src/dc3dd --flags | grep -c "\<$a\>"`
-    if [ $MSGCOUNT -ne 1 ]
-    then
-        echo "$a flag line missing"
-        exit 3
-    fi
-done
-
-LINECOUNT=`./src/dc3dd --flags | wc -l`
-if [ $LINECOUNT -ne 9 ]
-then
-    echo "Flags line count wrong - should be 8"
-    exit 3
-fi
-
-# static link, options
-make distclean
-if [ $? -ne 0 ]
-then
-    echo "Make distclean failed"
-    exit 2
-fi
-
-./configure CFLAGS="-O2 -DDEFAULT_HASH_MD5 -DDEFAULT_HASH_SHA1 -DDEFAULT_SIZEPROBE -DDEFAULT_PROGRESS -DDEFAULT_PROGRESSCOUNT=1000 -DDEFAULT_HASHCONV_AFTER -static"
-if [ $? -ne 0 ]
-then
-    echo "Configure failed (static)"
-    exit 1
-fi
-
-make
-if [ $? -ne 0 ]
-then
-    echo "Make failed (static)"
-    exit 2
-fi
-
diff --git a/test-nessie.sh b/test-nessie.sh
deleted file mode 100755
index b2e843b..0000000
--- a/test-nessie.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/sh
-
-DC3DD="src/dc3dd"
-
-MD5_DIR="/home/amedico/NESSIE Test Files/MD5_Orig"
-SHA1_DIR="/home/amedico/NESSIE Test Files/SHA1"
-
-find "$MD5_DIR"/* -type f | while read f
-do
-        h=`"$DC3DD" if="$f" of=/dev/null hash=md5 hashconv=after 2>&1 | grep md5\ TOTAL | awk '{print $3}'`
-        b=`basename "$f"`
-        o=`md5sum "$f" | awk '{print $1}'`
-        if [ "$h" != "$o" ]
-        then 
-            echo "hash mismatch for $b"
-            exit 1
-        fi
-done
-
-find "$SHA1_DIR"/* -type f | while read f
-do
-        h=`"$DC3DD" if="$f" of=/dev/null hash=sha1 hashconv=after 2>&1 | grep sha1\ TOTAL | awk '{print $3}'`
-        b=`basename "$f"`
-        o=`sha1sum "$f" | awk '{print $1}'`
-        if [ "$h" != "$o" ]
-        then
-            echo "hash mismatch for $b"
-            exit 2
-        fi
-done
-
diff --git a/test.sh b/test.sh
deleted file mode 100755
index d939bde..0000000
--- a/test.sh
+++ /dev/null
@@ -1,1184 +0,0 @@
-#!/bin/sh
-
-if [ "$1" == "" -o "$2" == "" ]
-then
-    echo "Usage: $0 good_dev bad_dev"
-    exit 1
-fi
-
-GOOD="$1"
-BAD="$2"
-
-GOOD_SECTORS=1952767
-GOOD_SECTORSIZE=512
-
-BAD_SECTORS=8015505
-BAD_SECTORSIZE=512
-
-BAD_ERROR_SECTOR=4292779
-
-GOOD_REF="/mnt/scratch/ref-good.img"
-BAD_REF="/mnt/scratch/ref-bad.img"
-PAT_REF="/mnt/scratch/ref-pat.img"
-
-DC3DD="src/dc3dd"
-
-TEST_IMG="/mnt/scratch/test.img"
-TEST_LOG="/mnt/scratch/test.log"
-
-# no config below this line
-#GOOD_SECTORS=`grep sectors /var/log/messages | grep $GOOD_DEV | tail -1 | awk '{print $9}'`
-#GOOD_SECTORSIZE=`grep sectors /var/log/messages | grep $GOOD_DEV | tail -1 | awk '{print $10}' | cut -f1 -d-`
-GOOD_BYTES=`expr $GOOD_SECTORS \* $GOOD_SECTORSIZE`
-
-#BAD_SECTORS=`grep sectors /var/log/messages | grep $BAD_DEV | tail -1 | awk '{print $9}'`
-#BAD_SECTORSIZE=`grep sectors /var/log/messages | grep $BAD_DEV | tail -1 | awk '{print $10}' | cut -f1 -d-`
-BAD_BYTES=`expr $BAD_SECTORS \* $BAD_SECTORSIZE`
-
-umount "$GOOD"
-umount "$BAD"
-
-if [ -L "$GOOD" ]
-then
-    GOOD=`readlink -f "$GOOD"`
-fi
-
-if [ -L "$BAD" ]
-then
-    BAD=`readlink -f "$BAD"`
-fi
-
-GOOD_DEV=`basename "$GOOD"`
-BAD_DEV=`basename "$BAD"`
-
-# clean up temp files from any previous runs
-function cleanup()
-{
-    rm "$TEST_IMG" "$TEST_LOG" "$TEST_IMG".* "$TEST_LOG".*
-    if [ -e "$TEST_IMG" -o -e "$TEST_LOG" ]
-    then
-        echo "Failed to remove test output files"
-        exit 2
-    fi
-}
-
-function good()
-{
-cleanup
-
-# load reference image into good drive
-dd if="$GOOD_REF" of="$GOOD" bs="$GOOD_SECTORSIZE"
-if [ $? -ne 0 ]
-then
-    echo "Failed to load good reference image $GOOD_REF to good device $GOOD"
-    exit 1
-fi
-
-# get image from good drive
-"$DC3DD" if="$GOOD" of="$TEST_IMG" conv=noerror,sync iflag=direct log="$TEST_LOG" hash=md5,sha1 hashconv=after sizeprobe=on progress=on
-if [ $? -ne 0 ]
-then
-    echo "Run Failed"
-    exit 3
-fi
-
-# check the retrieved image
-
-# a. file sizes
-REF_BYTES=`stat -c %s "$GOOD_REF"`
-IMG_BYTES=`stat -c %s "$TEST_IMG"`
-
-if [ $REF_BYTES -ne $IMG_BYTES ]
-then
-    echo "Size mismatch"
-    exit 3
-fi
-
-# b. checksums
-REF_SUM=`md5sum "$GOOD_REF" | cut -f 1 -d \ `
-IMG_SUM=`md5sum "$TEST_IMG" | cut -f 1 -d \ `
-LOG_SUM=`grep "md5 TOTAL" "$TEST_LOG" | cut -f 3 -d \ `
-
-if [ "$REF_SUM" != "$IMG_SUM" ]
-then
-    echo "Ref/Img Checksum mismatch"
-    exit 3
-fi
-
-if [ "$REF_SUM" != "$LOG_SUM" ]
-then
-    echo "Ref/Log Checksum mismatch"
-    exit 3
-fi
-
-# sector probe/count
-
-LOG_SECTORMODE=`grep sector\ size\: "$TEST_LOG" | awk '{print $4}'`
-LOG_SECTORSIZE=`grep sector\ size\: "$TEST_LOG" | awk '{print $3}'`
-LOG_SECTORS_FULL=`grep sectors\ in "$TEST_LOG" | awk '{print $1}' | cut -f1 -d+`
-LOG_SECTORS_PART=`grep sectors\ in "$TEST_LOG" | awk '{print $1}' | cut -f2 -d+`
-LOG_BYTES=`grep bytes "$TEST_LOG" | awk '{print $1}'`
-
-if [ "$LOG_SECTORMODE" != "(probed)" ]
-then
-    echo "Failed to probe sector size"
-    exit 3
-fi
-
-if [ "$LOG_SECTORSIZE" != "$GOOD_SECTORSIZE" ]
-then
-    echo "Wrong sector size detected"
-    exit 3
-fi
-
-if [ "$LOG_SECTORS_PART" != "0" ]
-then
-    echo "Partial sectors must be zero"
-    exit 3
-fi
-
-if [ "$LOG_SECTORS_FULL" != "$GOOD_SECTORS" ]
-then
-    echo "Wrong sector count"
-    exit 3
-fi
-
-if [ "$LOG_BYTES" != "$GOOD_BYTES" ]
-then
-    echo "Wrong byte count - log doesn't match size calculated from kernel sectors and sectorsize"
-    exit 3
-fi
-
-if [ "$LOG_BYTES" != "$IMG_BYTES" ]
-then
-    echo "Log file bytes doesn't match output file size"
-    exit 3
-fi
-
-if [ "$LOG_BYTES" != "$REF_BYTES" ]
-then
-    echo "Log file bytes doesn't match reference file size"
-    exit 3
-fi
-
-MSGCOUNT=`egrep -c bytes.+copied "$TEST_LOG"`
-if [ $MSGCOUNT -ne 1 ]
-then
-    echo "Log is missing 'bytes copied' message"
-    exit 3
-fi
-
-# test verify mode
-
-# a. drive to reference file
-"$DC3DD" if="$GOOD" vf="$GOOD_REF" conv=noerror,sync iflag=direct log="$TEST_LOG" sizeprobe=on progress=on
-if [ $? -ne 0 ]
-then
-    echo "Verify to Reference Image Failed"
-    exit 3
-fi
-
-MSGCOUNT=`egrep -c bytes.+compared "$TEST_LOG"`
-if [ $MSGCOUNT -ne 1 ]
-then
-    echo "Log is missing 'bytes compared' message"
-    exit 3
-fi
-
-MSGCOUNT=`grep -c Verify\ PASSED "$TEST_LOG"`
-if [ $MSGCOUNT -ne 1 ]
-then
-    echo "Log is missing 'Verify PASSED' message"
-    exit 3
-fi
-
-
-# b. drive to produced image file
-"$DC3DD" if="$GOOD" vf="$TEST_IMG" conv=noerror,sync iflag=direct log="$TEST_LOG" sizeprobe=on progress=on
-if [ $? -ne 0 ]
-then
-    echo "Verify to Created Image Failed"
-    exit 3
-fi
-
-MSGCOUNT=`egrep -c bytes.+compared "$TEST_LOG"`
-if [ $MSGCOUNT -ne 2 ]
-then
-    echo "Log is missing 'bytes compared' message"
-    exit 3
-fi
-
-MSGCOUNT=`grep -c Verify\ PASSED "$TEST_LOG"`
-if [ $MSGCOUNT -ne 2 ]
-then
-    echo "Log is missing 'Verify PASSED' message"
-    exit 3
-fi
-
-
-# test splitting
-cleanup
-
-"$DC3DD" if="$GOOD" of="$TEST_IMG" conv=noerror,sync iflag=direct log="$TEST_LOG" splitformat=000 split=128M hash=md5,sha1 hashconv=after sizeprobe=on progress=on
-if [ $? -ne 0 ]
-then
-    echo "Image to split output failed"
-    exit 3
-fi
-
-IMG_SUM=`cat "$TEST_IMG".* | md5sum | cut -f 1 -d \ `
-LOG_SUM=`grep "md5 TOTAL" "$TEST_LOG" | cut -f 3 -d \ `
-
-if [ "$REF_SUM" != "$LOG_SUM" ]
-then
-    echo "Split: Ref/Log Checksum mismatch"
-    exit 3
-fi
-
-if [ "$IMG_SUM" != "$REF_SUM" ]
-then
-    echo "Split: Img/Ref Checksum mismatch"
-    exit 3
-fi
-
-LOG_SECTORMODE=`grep sector\ size\: "$TEST_LOG" | awk '{print $4}'`
-LOG_SECTORSIZE=`grep sector\ size\: "$TEST_LOG" | awk '{print $3}'`
-LOG_SECTORS_FULL=`grep sectors\ in "$TEST_LOG" | awk '{print $1}' | cut -f1 -d+`
-LOG_SECTORS_PART=`grep sectors\ in "$TEST_LOG" | awk '{print $1}' | cut -f2 -d+`
-LOG_BYTES=`grep bytes "$TEST_LOG" | awk '{print $1}'`
-
-if [ "$LOG_SECTORMODE" != "(probed)" ]
-then
-    echo "Split: Failed to probe sector size"
-    exit 3
-fi
-
-if [ "$LOG_SECTORSIZE" != "$GOOD_SECTORSIZE" ]
-then
-    echo "Split: Wrong sector size detected"
-    exit 3
-fi
-
-if [ "$LOG_SECTORS_PART" != "0" ]
-then
-    echo "Split: Partial sectors must be zero"
-    exit 3
-fi
-
-if [ "$LOG_SECTORS_FULL" != "$GOOD_SECTORS" ]
-then
-    echo "Split: Wrong sector count"
-    exit 3
-fi
-
-if [ "$LOG_BYTES" != "$GOOD_BYTES" ]
-then
-    echo "Split: Wrong byte count - log doesn't match size calculated from kernel sectors and sectorsize"
-    exit 3
-fi
-
-IMG_BYTES=0
-for a in "$TEST_IMG".*
-do
-    SPLIT_BYTES=`stat -c %s "$a"`
-    IMG_BYTES=`expr $IMG_BYTES + $SPLIT_BYTES`
-done
-
-if [ "$IMG_BYTES" != "$REF_BYTES" ]
-then
-    echo "Split: image bytes doesn't match reference file size"
-    exit 3
-fi
-
-if [ "$LOG_BYTES" != "$IMG_BYTES" ]
-then
-    echo "Split: Log file bytes doesn't match output file size"
-    exit 3
-fi
-
-# test joining
-"$DC3DD" if="$GOOD" vfjoin="$TEST_IMG.000" conv=noerror,sync iflag=direct sizeprobe=on progress=on
-if [ $? -ne 0 ]
-then
-    echo "vfjoin failed"
-    exit 3
-fi
-
-"$DC3DD" ifjoin="$TEST_IMG.000" vf="$GOOD_REF" conv=noerror,sync iflag=direct sizeprobe=on progress=on
-if [ $? -ne 0 ]
-then
-    echo "ifjoin failed"
-    exit 3
-fi
-
-# test interrupting
-
-cleanup
-
-set -m
-"$DC3DD" if="$GOOD" of="$TEST_IMG" conv=noerror,sync iflag=direct log="$TEST_LOG" hash=md5,sha1 hashconv=after sizeprobe=on progress=on& pid=$!;
-sleep 5; kill -s 2 %1
-wait %1
-set +m
-
-#if [ $? -ne 0 ]
-#then
-#    echo "Run Failed"
-#    exit 3
-#fi
-
-IMG_BYTES=`stat -c %s "$TEST_IMG"`
-LOG_BYTES=`grep bytes "$TEST_LOG" | awk '{print $1}'`
-
-if [ "$LOG_BYTES" != "$IMG_BYTES" ]
-then
-    echo "Interrupt: Log file bytes doesn't match output file size"
-    exit 3
-fi
-
-IMG_SUM=`md5sum "$TEST_IMG" | cut -f 1 -d \ `
-LOG_SUM=`grep "md5 TOTAL" "$TEST_LOG" | cut -f 3 -d \ `
-
-if [ "$IMG_SUM" != "$LOG_SUM" ]
-then
-    echo "Interrupt: Img/Log Checksum mismatch"
-    exit 3
-fi
-
-}
-
-
-#############################################################
-# test bad drive
-
-function bad()
-{
-
-ERRS=21
-
-cleanup
-
-# get image from bad drive
-"$DC3DD" if="$BAD" of="$TEST_IMG" conv=noerror,sync iflag=direct log="$TEST_LOG" hash=md5,sha1 hashconv=after sizeprobe=on progress=on
-if [ $? -ne 0 ]
-then
-    echo "Run Failed"
-    exit 4
-fi
-
-# check the retrieved image
-
-# a. file sizes
-REF_BYTES=`stat -c %s "$BAD_REF"`
-IMG_BYTES=`stat -c %s "$TEST_IMG"`
-
-if [ $REF_BYTES -ne $IMG_BYTES ]
-then
-    echo "Size mismatch"
-    exit 4
-fi
-
-# b. checksums
-REF_SUM=`md5sum "$BAD_REF" | cut -f 1 -d \ `
-IMG_SUM=`md5sum "$TEST_IMG" | cut -f 1 -d \ `
-LOG_SUM=`grep "md5 TOTAL" "$TEST_LOG" | cut -f 3 -d \ `
-
-if [ "$REF_SUM" != "$IMG_SUM" ]
-then
-    echo "Ref/Img Checksum mismatch"
-    exit 4
-fi
-
-if [ "$REF_SUM" != "$LOG_SUM" ]
-then
-    echo "Ref/Log Checksum mismatch"
-    exit 4
-fi
-
-# sector probe/count
-LOG_SECTORMODE=`grep sector\ size\: "$TEST_LOG" | awk '{print $4}'`
-LOG_SECTORSIZE=`grep sector\ size\: "$TEST_LOG" | awk '{print $3}'`
-LOG_SECTORS_FULL=`grep sectors\ in "$TEST_LOG" | awk '{print $1}' | cut -f1 -d+`
-LOG_SECTORS_PART=`grep sectors\ in "$TEST_LOG" | awk '{print $1}' | cut -f2 -d+`
-LOG_SECTORS_OUT_FULL=`grep sectors\ out "$TEST_LOG" | awk '{print $1}' | cut -f1 -d+`
-LOG_SECTORS_OUT_PART=`grep sectors\ out "$TEST_LOG" | awk '{print $1}' | cut -f2 -d+`
-LOG_BYTES=`grep bytes "$TEST_LOG" | awk '{print $1}'`
-
-if [ "$LOG_SECTORMODE" != "(probed)" ]
-then
-    echo "Failed to probe sector size"
-    exit 4
-fi
-
-if [ "$LOG_SECTORSIZE" != "$BAD_SECTORSIZE" ]
-then
-    echo "Wrong sector size detected"
-    exit 4
-fi
-
-if [ "$LOG_SECTORS_PART" != "21" ]
-then
-    echo "Partial (error) sectors in must be 21"
-    exit 4
-fi
-
-if [ `expr $LOG_SECTORS_FULL + $LOG_SECTORS_PART` != "$BAD_SECTORS" ]
-then
-    echo "Wrong sectors in total count"
-    exit 4
-fi
-
-if [ "$LOG_SECTORS_OUT_PART" != "0" ]
-then
-    echo "Partial (error) sectors out must be 0"
-    exit 4
-fi
-
-if [ "$LOG_SECTORS_OUT_FULL" != "$BAD_SECTORS" ]
-then
-    echo "Wrong sectors out total count"
-    exit 4
-fi
-
-if [ "$LOG_BYTES" != "$BAD_BYTES" ]
-then
-    echo "Wrong byte count - log doesn't match size calculated from kernel sectors and sectorsize"
-    exit 4
-fi
-
-if [ "$LOG_BYTES" != "$IMG_BYTES" ]
-then
-    echo "Log file bytes doesn't match output file size"
-    exit 4
-fi
-
-if [ "$LOG_BYTES" != "$REF_BYTES" ]
-then
-    echo "Log file bytes doesn't match reference file size"
-    exit 4
-fi
-
-MSGCOUNT=`egrep -c bytes.+copied "$TEST_LOG"`
-if [ $MSGCOUNT -ne 1 ]
-then
-    echo "Log is missing 'bytes copied' message"
-    exit 4
-fi
-
-for ((i=4292779; i<=4292799; i+=1))
-do
-    MSGCOUNT=`grep -c "at sector $i" "$TEST_LOG"`
-    if [ $MSGCOUNT -ne 1 ]
-    then
-        echo "Log is missing error message for sector $i"
-        exit 4
-    fi
-done
-
-# test verify mode
-
-# a. drive to reference file
-"$DC3DD" if="$BAD" vf="$BAD_REF" conv=noerror,sync iflag=direct log="$TEST_LOG" sizeprobe=on progress=on
-if [ $? -ne 0 ]
-then
-    echo "Verify to Reference Image Failed"
-    exit 4
-fi
-
-MSGCOUNT=`egrep -c bytes.+compared "$TEST_LOG"`
-if [ $MSGCOUNT -ne 1 ]
-then
-    echo "Log is missing 'bytes compared' message"
-    exit 4
-fi
-
-MSGCOUNT=`grep -c Verify\ PASSED "$TEST_LOG"`
-if [ $MSGCOUNT -ne 1 ]
-then
-    echo "Log is missing 'Verify PASSED' message"
-    exit 4
-fi
-
-
-# b. drive to produced image file
-"$DC3DD" if="$BAD" vf="$TEST_IMG" conv=noerror,sync iflag=direct log="$TEST_LOG" sizeprobe=on progress=on
-if [ $? -ne 0 ]
-then
-    echo "Verify to Created Image Failed"
-    exit 4
-fi
-
-MSGCOUNT=`egrep -c bytes.+compared "$TEST_LOG"`
-if [ $MSGCOUNT -ne 2 ]
-then
-    echo "Log is missing 'bytes compared' message"
-    exit 4
-fi
-
-MSGCOUNT=`grep -c Verify\ PASSED "$TEST_LOG"`
-if [ $MSGCOUNT -ne 2 ]
-then
-    echo "Log is missing 'Verify PASSED' message"
-    exit 4
-fi
-
-
-# test splitting
-cleanup
-
-"$DC3DD" if="$BAD" of="$TEST_IMG" conv=noerror,sync iflag=direct log="$TEST_LOG" splitformat=000 split=128M hash=md5,sha1 hashconv=after sizeprobe=on progress=on
-if [ $? -ne 0 ]
-then
-    echo "Image to split output failed"
-    exit 4
-fi
-
-IMG_SUM=`cat "$TEST_IMG".* | md5sum | cut -f 1 -d \ `
-LOG_SUM=`grep "md5 TOTAL" "$TEST_LOG" | cut -f 3 -d \ `
-
-if [ "$REF_SUM" != "$LOG_SUM" ]
-then
-    echo "Split: Ref/Log Checksum mismatch"
-    exit 4
-fi
-
-if [ "$IMG_SUM" != "$REF_SUM" ]
-then
-    echo "Split: Img/Ref Checksum mismatch"
-    exit 4
-fi
-
-LOG_SECTORMODE=`grep sector\ size\: "$TEST_LOG" | awk '{print $4}'`
-LOG_SECTORSIZE=`grep sector\ size\: "$TEST_LOG" | awk '{print $3}'`
-LOG_SECTORS_FULL=`grep sectors\ in "$TEST_LOG" | awk '{print $1}' | cut -f1 -d+`
-LOG_SECTORS_PART=`grep sectors\ in "$TEST_LOG" | awk '{print $1}' | cut -f2 -d+`
-LOG_SECTORS_OUT_FULL=`grep sectors\ out "$TEST_LOG" | awk '{print $1}' | cut -f1 -d+`
-LOG_SECTORS_OUT_PART=`grep sectors\ out "$TEST_LOG" | awk '{print $1}' | cut -f2 -d+`
-LOG_BYTES=`grep bytes "$TEST_LOG" | awk '{print $1}'`
-
-if [ "$LOG_SECTORMODE" != "(probed)" ]
-then
-    echo "Split: Failed to probe sector size"
-    exit 4
-fi
-
-if [ "$LOG_SECTORSIZE" != "$BAD_SECTORSIZE" ]
-then
-    echo "Split: Wrong sector size detected"
-    exit 4
-fi
-
-if [ "$LOG_SECTORS_PART" != "21" ]
-then
-    echo "Split: Partial (error) sectors in must be 21"
-    exit 4
-fi
-
-if [ `expr $LOG_SECTORS_FULL + $LOG_SECTORS_PART` != "$BAD_SECTORS" ]
-then
-    echo "Split: Wrong sectors in total count"
-    exit 4
-fi
-
-if [ "$LOG_SECTORS_OUT_PART" != "0" ]
-then
-    echo "Split: Partial (error) sectors out must be 0"
-    exit 4
-fi
-
-if [ "$LOG_BYTES" != "$BAD_BYTES" ]
-then
-    echo "Split: Wrong byte count - log doesn't match size calculated from kernel sectors and sectorsize"
-    exit 4
-fi
-
-IMG_BYTES=0
-for a in "$TEST_IMG".*
-do
-    SPLIT_BYTES=`stat -c %s "$a"`
-    IMG_BYTES=`expr $IMG_BYTES + $SPLIT_BYTES`
-done
-
-if [ "$IMG_BYTES" != "$REF_BYTES" ]
-then
-    echo "Split: image bytes doesn't match reference file size"
-    exit 4
-fi
-
-if [ "$LOG_BYTES" != "$IMG_BYTES" ]
-then
-    echo "Split: Log file bytes doesn't match output file size"
-    exit 4
-fi
-
-}
-
-function bad2()
-{
-    cleanup
-
-	# TODO: should make sure drive actually produces read errors, otherwise we aren't testing anything useful
-
-    # get image from bad drive - dd
-	"dd" if="$BAD" of="$TEST_IMG.ddslow" conv=noerror,sync iflag=direct bs=512 skip=4292778 count=40
-	if [ $? -ne 0 ]
-	then
-		echo "Run Failed"
-		exit 7
-	fi
-
-	DDSLOW_SUM=`md5sum "$TEST_IMG.ddslow" | cut -f 1 -d \ `
-
-
-    # get image from bad drive - dc3dd slow mode
-	"$DC3DD" if="$BAD" of="$TEST_IMG.slow" conv=noerror,sync iflag=direct bs=512 skip=4292778 count=40 hash=md5,sha1 hashconv=after
-	if [ $? -ne 0 ]
-	then
-		echo "Run Failed"
-		exit 7
-	fi
-
-	SLOW_SUM=`md5sum "$TEST_IMG.slow" | cut -f 1 -d \ `
-
-	# get image from bad drive - dc3dd fast (dynamic) mode
-	"$DC3DD" if="$BAD" of="$TEST_IMG.fast" conv=noerror,sync iflag=direct skip=4292778 count=40 hash=md5,sha1 hashconv=after
-	if [ $? -ne 0 ]
-	then
-		echo "Run Failed"
-		exit 7
-	fi
-
-	FAST_SUM=`md5sum "$TEST_IMG.fast" | cut -f 1 -d \ `
-
-	if [ "$DDSLOW_SUM" != "$SLOW_SUM" ]
-	then
-		echo "bad2: dc3dd slow mode checksum doesn't match dd checksum"
-		exit 7
-	fi
-
-	if [ "$DDSLOW_SUM" != "$FAST_SUM" ]
-	then
-		echo "bad2: dc3dd fast mode checksum doesn't match dd checksum"
-		exit 7
-	fi
-
-    rm "$TEST_IMG.ddslow"
-    rm "$TEST_IMG.slow"
-    rm "$TEST_IMG.fast"
-}
-
-
-
-function zero
-{
-    cleanup
-
-    ZERO_COUNT=$1
-    DEF_SECTORSIZE=512
-
-    "$DC3DD" if="/dev/zero" of="/dev/null" log="$TEST_LOG" count="$ZERO_COUNT" sizeprobe=on progress=on
-    if [ $? -ne 0 ]
-    then
-        echo "Imaging from /dev/zero"
-        exit 5
-    fi
-
-    LOG_SECTORMODE=`grep sector\ size\: "$TEST_LOG" | awk '{print $4}'`
-    LOG_SECTORSIZE=`grep sector\ size\: "$TEST_LOG" | awk '{print $3}'`
-    LOG_SECTORS_FULL=`grep sectors\ in "$TEST_LOG" | awk '{print $1}' | cut -f1 -d+`
-    LOG_SECTORS_PART=`grep sectors\ in "$TEST_LOG" | awk '{print $1}' | cut -f2 -d+`
-    LOG_SECTORS_OUT_FULL=`grep sectors\ out "$TEST_LOG" | awk '{print $1}' | cut -f1 -d+`
-    LOG_SECTORS_OUT_PART=`grep sectors\ out "$TEST_LOG" | awk '{print $1}' | cut -f2 -d+`
-    LOG_BYTES=`grep bytes "$TEST_LOG" | awk '{print $1}'`
-
-    if [ "$LOG_SECTORMODE" != "(assumed)" ]
-    then
-        echo "Split: should be assuming sector size for zero/pattern fill"
-        exit 5
-    fi
-
-    if [ "$LOG_SECTORSIZE" != "$DEF_SECTORSIZE" ]
-    then
-        echo "Split: Wrong sector size assumed"
-        exit 5
-    fi
-
-    if [ "$LOG_SECTORS_PART" != "0" ]
-    then
-        echo "Split: Partial (error) sectors in must be 0"
-        exit 5
-    fi
-
-    if [ "$LOG_SECTORS_FULL" != "$ZERO_COUNT" ]
-    then
-        echo "Split: Wrong sectors in full count"
-        exit 5
-    fi
-
-    if [ "$LOG_SECTORS_OUT_PART" != "0" ]
-    then
-        echo "Split: Partial (error) sectors out must be 0"
-        exit 5
-    fi
-
-    if [ "$LOG_SECTORS_OUT_FULL" != "$ZERO_COUNT" ]
-    then
-        echo "Split: Full sectors out count wrong"
-        exit 5
-    fi
-
-    if [ "$LOG_BYTES" != `expr $ZERO_COUNT \* $DEF_SECTORSIZE` ]
-    then
-        echo "Split: Wrong byte count - log doesn't match size calculated from kernel sectors and sectorsize"
-        exit 5
-    fi
-}
-
-function zeros
-{
-    zero       1 
-    zero      10 
-    zero     500 
-    zero     512 
-    zero    1000 
-    zero    1024 
-    zero 1000000
-    zero 1048576
-}
-
-function pattern
-{
-    cleanup
-
-    PAT="AABBCCDD"
-    PAT_COUNT=12345
-
-    # write pattern to test image file
-    "$DC3DD" textpattern="$PAT" of="$TEST_IMG" log="$TEST_LOG" count="$PAT_COUNT" hash=md5,sha1 hashconv=after sizeprobe=on progress=on
-    if [ $? -ne 0 ]
-    then
-        echo "Pattern: Run Failed"
-        exit 3
-    fi
-
-    # check the retrieved image
-
-    # a. file sizes
-    REF_BYTES=`stat -c %s "$PAT_REF"`
-    IMG_BYTES=`stat -c %s "$TEST_IMG"`
-
-    if [ $REF_BYTES -ne $IMG_BYTES ]
-    then
-        echo "Pattern: Size mismatch"
-        exit 3
-    fi
-
-    # b. checksums
-    REF_SUM=`md5sum "$PAT_REF" | cut -f 1 -d \ `
-    IMG_SUM=`md5sum "$TEST_IMG" | cut -f 1 -d \ `
-    LOG_SUM=`grep "md5 TOTAL" "$TEST_LOG" | cut -f 3 -d \ `
-
-    if [ "$REF_SUM" != "$IMG_SUM" ]
-    then
-        echo "Pattern: Ref/Img Checksum mismatch"
-        exit 3
-    fi
-
-    if [ "$REF_SUM" != "$LOG_SUM" ]
-    then
-        echo "Pattern: Ref/Log Checksum mismatch"
-        exit 3
-    fi
-
-    # sector probe/count
-    PAT_SECTORS="$PAT_COUNT"
-    PAT_SECTORSIZE=512
-    PAT_BYTES=`expr $PAT_SECTORS \* $PAT_SECTORSIZE`
-
-    LOG_SECTORMODE=`grep sector\ size\: "$TEST_LOG" | awk '{print $4}'`
-    LOG_SECTORSIZE=`grep sector\ size\: "$TEST_LOG" | awk '{print $3}'`
-    LOG_SECTORS_FULL=`grep sectors\ in "$TEST_LOG" | awk '{print $1}' | cut -f1 -d+`
-    LOG_SECTORS_PART=`grep sectors\ in "$TEST_LOG" | awk '{print $1}' | cut -f2 -d+`
-    LOG_BYTES=`grep bytes "$TEST_LOG" | awk '{print $1}'`
-
-    if [ "$LOG_SECTORMODE" != "(assumed)" ]
-    then
-        echo "Pattern: should be assuming sector size"
-        exit 3
-    fi
-
-    if [ "$LOG_SECTORSIZE" != "$PAT_SECTORSIZE" ]
-    then
-        echo "Pattern: Wrong sector size assumed"
-        exit 3
-    fi
-
-    if [ "$LOG_SECTORS_PART" != "0" ]
-    then
-        echo "Pattern: Partial sectors must be zero"
-        exit 3
-    fi
-
-    if [ "$LOG_SECTORS_FULL" != "$PAT_SECTORS" ]
-    then
-        echo "Pattern: Wrong sector count"
-        exit 3
-    fi
-
-    if [ "$LOG_BYTES" != "$PAT_BYTES" ]
-    then
-        echo "Pattern: Wrong byte count - log doesn't match size calculated from known sectors and sectorsize"
-        exit 3
-    fi
-
-    if [ "$LOG_BYTES" != "$IMG_BYTES" ]
-    then
-        echo "Pattern: Log file bytes doesn't match output file size"
-        exit 3
-    fi
-
-    if [ "$LOG_BYTES" != "$REF_BYTES" ]
-    then
-        echo "Pattern: Log file bytes doesn't match reference file size"
-        exit 3
-    fi
-
-    MSGCOUNT=`egrep -c bytes.+copied "$TEST_LOG"`
-    if [ $MSGCOUNT -ne 1 ]
-    then
-        echo "Pattern: Log is missing 'bytes copied' message"
-        exit 3
-    fi
-}
-
-function messages
-{
-    cleanup
-
-    "$DC3DD" if="/dev/zero" of="/dev/null" log="$TEST_LOG" count="1000" progress=on
-    if [ $? -ne 0 ]
-    then
-        echo "Imaging to /dev/zero test exit message failed"
-        exit 6
-    fi   
-
-    LOG_VERB=`egrep "dc3dd.+?at" "$TEST_LOG" | tail -1 | awk '{print $2}'`
-
-    if [ "$LOG_VERB" != "completed" ]
-    then
-        echo "Exit message verb on imaging /dev/zero success should be 'completed'"
-        exit 6
-    fi
-
-    cleanup
-
-    "$DC3DD" if="/dev/zero" of="$TEST_IMG" log="$TEST_LOG" count="1000" progress=on
-    if [ $? -ne 0 ]
-    then
-        echo "Imaging to /dev/zero test exit message failed"
-        exit 6
-    fi   
-
-    LOG_VERB=`egrep "dc3dd.+?at" "$TEST_LOG" | tail -1 | awk '{print $2}'`
-
-    if [ "$LOG_VERB" != "completed" ]
-    then
-        echo "Exit message verb on imaging /dev/zero success should be 'completed'"
-        exit 6
-    fi
-
-    cleanup
-
-    "$DC3DD" if="$GOOD" of="$TEST_IMG" log="$TEST_LOG" progress=on
-    if [ $? -ne 0 ]
-    then
-        echo "Imaging good drive to test exit message failed"
-        exit 6
-    fi   
-
-    LOG_VERB=`egrep "dc3dd.+?at" "$TEST_LOG" | tail -1 | awk '{print $2}'`
-
-    if [ "$LOG_VERB" != "completed" ]
-    then
-        echo "Exit message verb on imaging good drive success should be 'completed'"
-        exit 6
-    fi
-
-    cleanup
-
-    "$DC3DD" if="$BAD" of="$TEST_IMG" log="$TEST_LOG" progress=on
-    if [ $? -ne 1 ]
-    then
-        echo "Imaging bad drive to test exit message did not terminate with error condition"
-        exit 6
-    fi   
-
-    LOG_VERB=`egrep "dc3dd.+?at" "$TEST_LOG" | tail -1 | awk '{print $2}'`
-
-    if [ "$LOG_VERB" != "failed" ]
-    then
-        echo "Exit message verb on imaging bad drive failure should be 'failed'"
-        exit 6
-    fi
-
-    cleanup
-
-    "$DC3DD" if="$BAD" of="$TEST_IMG" conv=noerror,sync iflag=direct log="$TEST_LOG" progress=on
-    if [ $? -ne 0 ]
-    then
-        echo "Imaging bad drive to test exit message failed"
-        exit 6
-    fi   
-
-    LOG_VERB=`egrep "dc3dd.+?at" "$TEST_LOG" | tail -1 | awk '{print $2}'`
-
-    if [ "$LOG_VERB" != "completed" ]
-    then
-        echo "Exit message verb on imaging bad drive success should be 'completed'"
-        exit 6
-    fi
-
-    cleanup
-
-    set -m
-    "$DC3DD" if="$GOOD" of="$TEST_IMG" conv=noerror,sync iflag=direct log="$TEST_LOG" progress=on& pid=$!;
-    sleep 5; kill -s 2 %1
-    wait %1
-    set +m
-
-    LOG_VERB=`egrep "dc3dd.+?at" "$TEST_LOG" | tail -1 | awk '{print $2}'`
-
-    if [ "$LOG_VERB" != "aborted" ]
-    then
-        echo "Exit message verb on imaging good drive interrupt should be 'aborted'"
-        exit 6
-    fi
-}
-
-function rj_cat
-{
-    HASHCONV="$1"
-    BS="$2"
-
-    rm "$TEST_LOG"
-    cat "$TEST_IMG".* | "$DC3DD" of="$TEST_IMG" log="$TEST_LOG" progress=on progresscount=1000 hash=md5 "$HASHCONV" hashwindow=700M $BS
-    JOIN_SUM=`grep "md5 TOTAL" "$TEST_LOG" | cut -f 3 -d \ `
-    if [ "$ORIG_SUM" != "$JOIN_SUM" ]
-    then
-        echo "join regression: joining with cat & $HASHCONV $BS, final hash mismatch"
-        exit 9
-    fi
-
-    egrep "(^md5|TOTAL)" "$TEST_LOG" > "${TEST_LOG}.join_hashes"
-    diff -q "${TEST_LOG}.acquire_hashes" "${TEST_LOG}.join_hashes"
-    if [ $? -ne 0 ]
-    then
-        echo "join regression: joining with cat & $HASHCONV $BS, piecewise hash mismatch"
-        exit 9
-    fi
-
-    IMG_SUM=`md5sum "$TEST_IMG" | cut -f 1 -d \ `
-    if [ "$JOIN_SUM" != "$IMG_SUM" ]
-    then
-        echo "join regression: joining with cat & $HASHCONV $BS, log total hash != output file hash"
-        exit 9
-    fi
-}
-
-function rj_ifjoin
-{
-    HASHCONV="$1"
-    BS="$2"
-
-    rm "$TEST_LOG"
-    "$DC3DD" ifjoin="${TEST_IMG}.000" of="$TEST_IMG" log="$TEST_LOG" sizeprobe=on progress=on progresscount=1000 hash=md5 "$HASHCONV" hashwindow=700M $BS
-    JOIN_SUM=`grep "md5 TOTAL" "$TEST_LOG" | cut -f 3 -d \ `
-    if [ "$ORIG_SUM" != "$JOIN_SUM" ]
-    then
-        echo "join regression: joining with ifjoin & $HASHCONV $BS, final hash mismatch"
-        exit 9
-    fi
-
-    egrep "(^md5|TOTAL)" "$TEST_LOG" > "${TEST_LOG}.join_hashes"
-    diff -q "${TEST_LOG}.acquire_hashes" "${TEST_LOG}.join_hashes"
-    if [ $? -ne 0 ]
-    then
-        echo "join regression: joining with ifjoin & $HASHCONV $BS, piecewise hash mismatch"
-        exit 9
-    fi
-
-    IMG_SUM=`md5sum "$TEST_IMG" | cut -f 1 -d \ `
-    if [ "$JOIN_SUM" != "$IMG_SUM" ]
-    then
-        echo "join regression: joining with ifjoin & $HASHCONV $BS, log total hash != output file hash"
-        exit 9
-    fi
-}
-
-function regressions_join
-{
-    cleanup
-
-    # get reference image
-    "$DC3DD" if="$BAD" of="$TEST_IMG" conv=noerror,sync iflag=direct log="$TEST_LOG" splitformat=000 split=700M hash=md5 hashconv=after hashwindow=700M sizeprobe=on progress=on progresscount=1000
-    if [ $? -ne 0 ]
-    then
-        echo "join regression: split run failed"
-        exit 9
-    fi
-
-    egrep "(^md5|TOTAL)" "$TEST_LOG" > "${TEST_LOG}.acquire_hashes"
-
-    ORIG_SUM=`grep "md5 TOTAL" "$TEST_LOG" | cut -f 3 -d \ `
-
-    rj_cat    "hashconv=before" "" 
-    rj_cat    "hashconv=before" "bs=512" 
-    rj_cat    "hashconv=after"  "" 
-    rj_cat    "hashconv=after"  "bs=512" 
-
-    rj_ifjoin "hashconv=before" "" 
-    rj_ifjoin "hashconv=before" "bs=512" 
-    rj_ifjoin "hashconv=after"  "" 
-    rj_ifjoin "hashconv=after"  "bs=512" 
-}
-
-function regressions
-{
-    cleanup
-
-    # seek crash
-    "$DC3DD" if=/dev/zero of=/dev/null seek=10 count=10
-    if [ $? -ne 0 ]
-    then
-        echo "seek operator causes failure"
-	exit 7
-    fi
-
-    # ifjoin/vfjoin crash
-    "$DC3DD" ifjoin=bar
-    if [ $? -ne 1 ]
-    then
-	echo "Invalid ifjoin format not detected properly"
-	exit 7
-    fi
-
-    "$DC3DD" vfjoin=bar
-    if [ $? -ne 1 ]
-    then
-	echo "Invalid vfjoin format not detected properly"
-	exit 7
-    fi
-
-    "$DC3DD" if=foo ifjoin=bar.000
-    if [ $? -ne 1 ]
-    then
-	echo "Invalid combination of if/ifjoin not detected properly"
-	exit 7
-    fi
-
-    "$DC3DD" vf=foo vfjoin=bar.000
-    if [ $? -ne 1 ]
-    then
-	echo "Invalid combination of vf/vfjoin not detected properly"
-	exit 7
-    fi
-
-    # ensure proper skip= offset is accounted for in error messages
-    # when conv=sync,noerror not used
-
-    rem=`expr $BAD_ERROR_SECTOR % 10000`
-    skip=`expr $BAD_ERROR_SECTOR - $rem`
-
-    "$DC3DD" if="$BAD" of=/dev/null skip=$skip count=5000 iflag=direct bs=512 log="$TEST_LOG.good" conv=sync,noerror 
-    if [ $? -ne 0 ]
-    then
-        echo "checking skip: reference run failed"
-        exit 7
-    fi
-
-    "$DC3DD" if="$BAD" of=/dev/null skip=$skip count=5000 iflag=direct bs=512 log="$TEST_LOG.test"
-    if [ $? -ne 1 ]
-    then
-        echo "checking skip: test run failed"
-        exit 7
-    fi
-
-    RIGHT_SECTOR=`grep reading "$TEST_LOG.good" | head -1 | perl -ne '/sectors?\s+(\d+)/; print $1 . "\n"'`
-    CHECK_SECTOR=`grep reading "$TEST_LOG.test" | head -1 | perl -ne '/sectors?\s+(\d+)/; print $1 . "\n"'`
-
-    if [ "$RIGHT_SECTOR" != "$CHECK_SECTOR" ]
-    then
-        echo "When conv=sync,noerror not used, error message fails to account for skip= offset"
-        exit 7
-    fi
-}
-
-function driveend
-{
-    NUM=500
-    skip=`expr $BAD_SECTORS - $NUM`
-
-    for b in "bs=512" "bs=32768" ""
-    do
-        for c in "conv=sync,noerror" ""
-        do
-            for i in "iflag=direct" ""
-            do
-                rm -f "$TEST_LOG"
-
-                "$DC3DD" if="$BAD" of=/dev/null hash=md5 hashconv=after skip=$skip $c $i $b log="$TEST_LOG"
-                if [ $? -ne 0 ]
-                then
-                    echo "acquiring end of drive failed, options used: $c $i $b"
-                    exit 8
-                fi
-
-                LOG_SECTORS_IN=`grep sectors\ in "$TEST_LOG" | awk '{print $1}' | cut -f1 -d+`
-                LOG_SECTORS_OUT=`grep sectors\ out "$TEST_LOG" | awk '{print $1}' | cut -f1 -d+`
-                LOG_SUM=`grep "md5 TOTAL" "$TEST_LOG" | cut -f 3 -d \ `
-
-                if [ "$b" == "" -a "$c" == "" -a "$i" == "iflag=direct" ]
-                then
-                    # don't care what happens
-                    echo -n '' # TODO: better no-op
-                elif [ "$b" == "bs=32768" -a "$c" == "" -a "$i" == "iflag=direct" ]
-                then
-                    # don't care what happens
-                    echo -n '' # TODO: better no-op
-                else
-                    # better get $NUM sectors!
-                    if [ "$LOG_SECTORS_IN" != "$NUM" ]
-                    then
-                        echo "acquiring end of drive, got wrong number of sectors in"
-                        exit 8
-                    fi
-
-                    if [ "$LOG_SECTORS_OUT" != "$NUM" ]
-                    then
-                        echo "acquiring end of drive, got wrong number of sectors out"
-                        exit 8
-                    fi
-
-                    if [ "$LOG_SUM" != "93a6f3f06d6c7f2f5de363e9136140cd" ]
-                    then
-                        echo "acquiring end of drive, got wrong hash"
-                        exit 8
-                    fi
-                fi
-
-            done
-        done
-    done
-}
-
-good
-bad
-bad2
-zeros
-pattern
-messages
-regressions
-regressions_join
-driveend
-cleanup
-

-- 
debian-forensics/dc3dd



More information about the forensics-changes mailing list