1 /* dd -- convert a file while copying it.
2 Copyright (C) 85, 90, 91, 1995-2003 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2, or (at your option)
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software Foundation,
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
18 /* Written by Paul Rubin, David MacKenzie, and Stuart Kemp. */
23 #define SWAB_ALIGN_OFFSET 2
25 #include <sys/types.h>
31 #include "full-write.h"
32 #include "getpagesize.h"
34 #include "long-options.h"
36 #include "safe-read.h"
39 /* The official name of this program (e.g., no `g' prefix). */
40 #define PROGRAM_NAME "dd"
42 #define AUTHORS "Paul Rubin", "David MacKenzie", "Stuart Kemp"
45 # define SIGINFO SIGUSR1
49 # define S_TYPEISSHM(Stat_ptr) 0
52 #define ROUND_UP_OFFSET(X, M) ((M) - 1 - (((X) + (M) - 1) % (M)))
53 #define PTR_ALIGN(Ptr, M) ((Ptr) \
54 + ROUND_UP_OFFSET ((char *)(Ptr) - (char *)0, (M)))
56 #define max(a, b) ((a) > (b) ? (a) : (b))
57 #define output_char(c) \
61 if (oc >= output_blocksize) \
66 /* Default input and output blocksize. */
67 #define DEFAULT_BLOCKSIZE 512
69 /* Conversions bit masks. */
78 #define C_NOERROR 0400
79 #define C_NOTRUNC 01000
81 /* Use separate input and output buffers, and combine partial input blocks. */
82 #define C_TWOBUFS 04000
84 /* The name this program was run with. */
87 /* The name of the input file, or NULL for the standard input. */
88 static char const *input_file
= NULL
;
90 /* The name of the output file, or NULL for the standard output. */
91 static char const *output_file
= NULL
;
93 /* The number of bytes in which atomic reads are done. */
94 static size_t input_blocksize
= 0;
96 /* The number of bytes in which atomic writes are done. */
97 static size_t output_blocksize
= 0;
99 /* Conversion buffer size, in bytes. 0 prevents conversions. */
100 static size_t conversion_blocksize
= 0;
102 /* Skip this many records of `input_blocksize' bytes before input. */
103 static uintmax_t skip_records
= 0;
105 /* Skip this many records of `output_blocksize' bytes before output. */
106 static uintmax_t seek_records
= 0;
108 /* Copy only this many records. The default is effectively infinity. */
109 static uintmax_t max_records
= (uintmax_t) -1;
111 /* Bit vector of conversions to apply. */
112 static int conversions_mask
= 0;
114 /* If nonzero, filter characters through the translation table. */
115 static int translation_needed
= 0;
117 /* Number of partial blocks written. */
118 static uintmax_t w_partial
= 0;
120 /* Number of full blocks written. */
121 static uintmax_t w_full
= 0;
123 /* Number of partial blocks read. */
124 static uintmax_t r_partial
= 0;
126 /* Number of full blocks read. */
127 static uintmax_t r_full
= 0;
129 /* Records truncated by conv=block. */
130 static uintmax_t r_truncate
= 0;
132 /* Output representation of newline and space characters.
133 They change if we're converting to EBCDIC. */
134 static char newline_character
= '\n';
135 static char space_character
= ' ';
140 /* Current index into `obuf'. */
141 static size_t oc
= 0;
143 /* Index into current line, for `conv=block' and `conv=unblock'. */
144 static size_t col
= 0;
152 static struct conversion conversions
[] =
154 {"ascii", C_ASCII
| C_TWOBUFS
}, /* EBCDIC to ASCII. */
155 {"ebcdic", C_EBCDIC
| C_TWOBUFS
}, /* ASCII to EBCDIC. */
156 {"ibm", C_IBM
| C_TWOBUFS
}, /* Slightly different ASCII to EBCDIC. */
157 {"block", C_BLOCK
| C_TWOBUFS
}, /* Variable to fixed length records. */
158 {"unblock", C_UNBLOCK
| C_TWOBUFS
}, /* Fixed to variable length records. */
159 {"lcase", C_LCASE
| C_TWOBUFS
}, /* Translate upper to lower case. */
160 {"ucase", C_UCASE
| C_TWOBUFS
}, /* Translate lower to upper case. */
161 {"swab", C_SWAB
| C_TWOBUFS
}, /* Swap bytes of input. */
162 {"noerror", C_NOERROR
}, /* Ignore i/o errors. */
163 {"notrunc", C_NOTRUNC
}, /* Do not truncate output file. */
164 {"sync", C_SYNC
}, /* Pad input records to ibs with NULs. */
168 /* Translation table formed by applying successive transformations. */
169 static unsigned char trans_table
[256];
171 static char const ascii_to_ebcdic
[] =
173 '\000', '\001', '\002', '\003', '\067', '\055', '\056', '\057',
174 '\026', '\005', '\045', '\013', '\014', '\015', '\016', '\017',
175 '\020', '\021', '\022', '\023', '\074', '\075', '\062', '\046',
176 '\030', '\031', '\077', '\047', '\034', '\035', '\036', '\037',
177 '\100', '\117', '\177', '\173', '\133', '\154', '\120', '\175',
178 '\115', '\135', '\134', '\116', '\153', '\140', '\113', '\141',
179 '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
180 '\370', '\371', '\172', '\136', '\114', '\176', '\156', '\157',
181 '\174', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
182 '\310', '\311', '\321', '\322', '\323', '\324', '\325', '\326',
183 '\327', '\330', '\331', '\342', '\343', '\344', '\345', '\346',
184 '\347', '\350', '\351', '\112', '\340', '\132', '\137', '\155',
185 '\171', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
186 '\210', '\211', '\221', '\222', '\223', '\224', '\225', '\226',
187 '\227', '\230', '\231', '\242', '\243', '\244', '\245', '\246',
188 '\247', '\250', '\251', '\300', '\152', '\320', '\241', '\007',
189 '\040', '\041', '\042', '\043', '\044', '\025', '\006', '\027',
190 '\050', '\051', '\052', '\053', '\054', '\011', '\012', '\033',
191 '\060', '\061', '\032', '\063', '\064', '\065', '\066', '\010',
192 '\070', '\071', '\072', '\073', '\004', '\024', '\076', '\341',
193 '\101', '\102', '\103', '\104', '\105', '\106', '\107', '\110',
194 '\111', '\121', '\122', '\123', '\124', '\125', '\126', '\127',
195 '\130', '\131', '\142', '\143', '\144', '\145', '\146', '\147',
196 '\150', '\151', '\160', '\161', '\162', '\163', '\164', '\165',
197 '\166', '\167', '\170', '\200', '\212', '\213', '\214', '\215',
198 '\216', '\217', '\220', '\232', '\233', '\234', '\235', '\236',
199 '\237', '\240', '\252', '\253', '\254', '\255', '\256', '\257',
200 '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
201 '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
202 '\312', '\313', '\314', '\315', '\316', '\317', '\332', '\333',
203 '\334', '\335', '\336', '\337', '\352', '\353', '\354', '\355',
204 '\356', '\357', '\372', '\373', '\374', '\375', '\376', '\377'
207 static char const ascii_to_ibm
[] =
209 '\000', '\001', '\002', '\003', '\067', '\055', '\056', '\057',
210 '\026', '\005', '\045', '\013', '\014', '\015', '\016', '\017',
211 '\020', '\021', '\022', '\023', '\074', '\075', '\062', '\046',
212 '\030', '\031', '\077', '\047', '\034', '\035', '\036', '\037',
213 '\100', '\132', '\177', '\173', '\133', '\154', '\120', '\175',
214 '\115', '\135', '\134', '\116', '\153', '\140', '\113', '\141',
215 '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
216 '\370', '\371', '\172', '\136', '\114', '\176', '\156', '\157',
217 '\174', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
218 '\310', '\311', '\321', '\322', '\323', '\324', '\325', '\326',
219 '\327', '\330', '\331', '\342', '\343', '\344', '\345', '\346',
220 '\347', '\350', '\351', '\255', '\340', '\275', '\137', '\155',
221 '\171', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
222 '\210', '\211', '\221', '\222', '\223', '\224', '\225', '\226',
223 '\227', '\230', '\231', '\242', '\243', '\244', '\245', '\246',
224 '\247', '\250', '\251', '\300', '\117', '\320', '\241', '\007',
225 '\040', '\041', '\042', '\043', '\044', '\025', '\006', '\027',
226 '\050', '\051', '\052', '\053', '\054', '\011', '\012', '\033',
227 '\060', '\061', '\032', '\063', '\064', '\065', '\066', '\010',
228 '\070', '\071', '\072', '\073', '\004', '\024', '\076', '\341',
229 '\101', '\102', '\103', '\104', '\105', '\106', '\107', '\110',
230 '\111', '\121', '\122', '\123', '\124', '\125', '\126', '\127',
231 '\130', '\131', '\142', '\143', '\144', '\145', '\146', '\147',
232 '\150', '\151', '\160', '\161', '\162', '\163', '\164', '\165',
233 '\166', '\167', '\170', '\200', '\212', '\213', '\214', '\215',
234 '\216', '\217', '\220', '\232', '\233', '\234', '\235', '\236',
235 '\237', '\240', '\252', '\253', '\254', '\255', '\256', '\257',
236 '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
237 '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
238 '\312', '\313', '\314', '\315', '\316', '\317', '\332', '\333',
239 '\334', '\335', '\336', '\337', '\352', '\353', '\354', '\355',
240 '\356', '\357', '\372', '\373', '\374', '\375', '\376', '\377'
243 static char const ebcdic_to_ascii
[] =
245 '\000', '\001', '\002', '\003', '\234', '\011', '\206', '\177',
246 '\227', '\215', '\216', '\013', '\014', '\015', '\016', '\017',
247 '\020', '\021', '\022', '\023', '\235', '\205', '\010', '\207',
248 '\030', '\031', '\222', '\217', '\034', '\035', '\036', '\037',
249 '\200', '\201', '\202', '\203', '\204', '\012', '\027', '\033',
250 '\210', '\211', '\212', '\213', '\214', '\005', '\006', '\007',
251 '\220', '\221', '\026', '\223', '\224', '\225', '\226', '\004',
252 '\230', '\231', '\232', '\233', '\024', '\025', '\236', '\032',
253 '\040', '\240', '\241', '\242', '\243', '\244', '\245', '\246',
254 '\247', '\250', '\133', '\056', '\074', '\050', '\053', '\041',
255 '\046', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
256 '\260', '\261', '\135', '\044', '\052', '\051', '\073', '\136',
257 '\055', '\057', '\262', '\263', '\264', '\265', '\266', '\267',
258 '\270', '\271', '\174', '\054', '\045', '\137', '\076', '\077',
259 '\272', '\273', '\274', '\275', '\276', '\277', '\300', '\301',
260 '\302', '\140', '\072', '\043', '\100', '\047', '\075', '\042',
261 '\303', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
262 '\150', '\151', '\304', '\305', '\306', '\307', '\310', '\311',
263 '\312', '\152', '\153', '\154', '\155', '\156', '\157', '\160',
264 '\161', '\162', '\313', '\314', '\315', '\316', '\317', '\320',
265 '\321', '\176', '\163', '\164', '\165', '\166', '\167', '\170',
266 '\171', '\172', '\322', '\323', '\324', '\325', '\326', '\327',
267 '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
268 '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
269 '\173', '\101', '\102', '\103', '\104', '\105', '\106', '\107',
270 '\110', '\111', '\350', '\351', '\352', '\353', '\354', '\355',
271 '\175', '\112', '\113', '\114', '\115', '\116', '\117', '\120',
272 '\121', '\122', '\356', '\357', '\360', '\361', '\362', '\363',
273 '\134', '\237', '\123', '\124', '\125', '\126', '\127', '\130',
274 '\131', '\132', '\364', '\365', '\366', '\367', '\370', '\371',
275 '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
276 '\070', '\071', '\372', '\373', '\374', '\375', '\376', '\377'
283 fprintf (stderr
, _("Try `%s --help' for more information.\n"),
287 printf (_("Usage: %s [OPTION]...\n"), program_name
);
289 Copy a file, converting and formatting according to the options.\n\
291 bs=BYTES force ibs=BYTES and obs=BYTES\n\
292 cbs=BYTES convert BYTES bytes at a time\n\
293 conv=KEYWORDS convert the file as per the comma separated keyword list\n\
294 count=BLOCKS copy only BLOCKS input blocks\n\
295 ibs=BYTES read BYTES bytes at a time\n\
298 if=FILE read from FILE instead of stdin\n\
299 obs=BYTES write BYTES bytes at a time\n\
300 of=FILE write to FILE instead of stdout\n\
301 seek=BLOCKS skip BLOCKS obs-sized blocks at start of output\n\
302 skip=BLOCKS skip BLOCKS ibs-sized blocks at start of input\n\
304 fputs (HELP_OPTION_DESCRIPTION
, stdout
);
305 fputs (VERSION_OPTION_DESCRIPTION
, stdout
);
308 BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n\
309 xM M, c 1, w 2, b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,\n\
310 GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.\n\
311 Each KEYWORD may be:\n\
315 ascii from EBCDIC to ASCII\n\
316 ebcdic from ASCII to EBCDIC\n\
317 ibm from ASCII to alternated EBCDIC\n\
318 block pad newline-terminated records with spaces to cbs-size\n\
319 unblock replace trailing spaces in cbs-size records with newline\n\
320 lcase change upper case to lower case\n\
323 notrunc do not truncate the output file\n\
324 ucase change lower case to upper case\n\
325 swab swap every pair of input bytes\n\
326 noerror continue after read errors\n\
327 sync pad every input block with NULs to ibs-size; when used\n\
328 with block or unblock, pad with spaces rather than NULs\n\
332 Note that sending a SIGUSR1 signal to a running `dd' process makes it\n\
333 print to standard error the number of records read and written so far,\n\
334 then to resume copying.\n\
336 $ dd if=/dev/zero of=/dev/null& pid=$!\n\
337 $ kill -USR1 $pid; sleep 1; kill $pid\n\
338 10899206+0 records in\n\
339 10899206+0 records out\n\
341 printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT
);
347 translate_charset (char const *new_trans
)
351 for (i
= 0; i
< 256; i
++)
352 trans_table
[i
] = new_trans
[trans_table
[i
]];
353 translation_needed
= 1;
356 /* Return the number of 1 bits in `i'. */
359 bit_count (register int i
)
361 register int set_bits
;
363 for (set_bits
= 0; i
!= 0; set_bits
++)
371 char buf
[2][INT_BUFSIZE_BOUND (uintmax_t)];
372 fprintf (stderr
, _("%s+%s records in\n"),
373 umaxtostr (r_full
, buf
[0]), umaxtostr (r_partial
, buf
[1]));
374 fprintf (stderr
, _("%s+%s records out\n"),
375 umaxtostr (w_full
, buf
[0]), umaxtostr (w_partial
, buf
[1]));
378 fprintf (stderr
, "%s %s\n",
379 umaxtostr (r_truncate
, buf
[0]),
381 ? _("truncated record")
382 : _("truncated records")));
390 if (close (STDIN_FILENO
) < 0)
391 error (EXIT_FAILURE
, errno
,
392 _("closing input file %s"), quote (input_file
));
393 if (close (STDOUT_FILENO
) < 0)
394 error (EXIT_FAILURE
, errno
,
395 _("closing output file %s"), quote (output_file
));
406 interrupt_handler (int sig
)
409 struct sigaction sigact
;
411 sigact
.sa_handler
= SIG_DFL
;
412 sigemptyset (&sigact
.sa_mask
);
414 sigaction (sig
, &sigact
, NULL
);
416 signal (sig
, SIG_DFL
);
423 siginfo_handler (int sig ATTRIBUTE_UNUSED
)
428 /* Encapsulate portability mess of establishing signal handlers. */
431 install_handler (int sig_num
, RETSIGTYPE (*sig_handler
) (int sig
))
434 struct sigaction sigact
;
435 sigaction (sig_num
, NULL
, &sigact
);
436 if (sigact
.sa_handler
!= SIG_IGN
)
438 sigact
.sa_handler
= sig_handler
;
439 sigemptyset (&sigact
.sa_mask
);
441 sigaction (sig_num
, &sigact
, NULL
);
444 if (signal (sig_num
, SIG_IGN
) != SIG_IGN
)
445 signal (sig_num
, sig_handler
);
449 /* Open a file to a particular file descriptor. This is like standard
450 `open', except it always returns DESIRED_FD if successful. */
452 open_fd (int desired_fd
, char const *filename
, int options
, mode_t mode
)
456 fd
= open (filename
, options
, mode
);
460 if (fd
!= desired_fd
)
462 if (dup2 (fd
, desired_fd
) != desired_fd
)
471 /* Write, then empty, the output buffer `obuf'. */
476 size_t nwritten
= full_write (STDOUT_FILENO
, obuf
, output_blocksize
);
477 if (nwritten
!= output_blocksize
)
479 error (0, errno
, _("writing to %s"), quote (output_file
));
489 /* Interpret one "conv=..." option.
490 As a by product, this function replaces each `,' in STR with a NUL byte. */
493 parse_conversion (char *str
)
500 new = strchr (str
, ',');
503 for (i
= 0; conversions
[i
].convname
!= NULL
; i
++)
504 if (STREQ (conversions
[i
].convname
, str
))
506 conversions_mask
|= conversions
[i
].conversion
;
509 if (conversions
[i
].convname
== NULL
)
511 error (0, 0, _("invalid conversion: %s"), quote (str
));
512 usage (EXIT_FAILURE
);
515 } while (new != NULL
);
518 /* Return the value of STR, interpreted as a non-negative decimal integer,
519 optionally multiplied by various values.
520 Assign nonzero to *INVALID if STR does not represent a number in
524 parse_integer (const char *str
, int *invalid
)
528 enum strtol_error e
= xstrtoumax (str
, &suffix
, 10, &n
, "bcEGkKMPTwYZ0");
530 if (e
== LONGINT_INVALID_SUFFIX_CHAR
&& *suffix
== 'x')
532 uintmax_t multiplier
= parse_integer (suffix
+ 1, invalid
);
534 if (multiplier
!= 0 && n
* multiplier
/ multiplier
!= n
)
542 else if (e
!= LONGINT_OK
)
552 scanargs (int argc
, char **argv
)
559 for (i
= optind
; i
< argc
; i
++)
564 val
= strchr (name
, '=');
567 error (0, 0, _("unrecognized option %s"), quote (name
));
568 usage (EXIT_FAILURE
);
572 if (STREQ (name
, "if"))
574 else if (STREQ (name
, "of"))
576 else if (STREQ (name
, "conv"))
577 parse_conversion (val
);
581 uintmax_t n
= parse_integer (val
, &invalid
);
583 if (STREQ (name
, "ibs"))
585 /* Ensure that each blocksize is <= SSIZE_MAX. */
586 invalid
|= SSIZE_MAX
< n
;
588 invalid
|= input_blocksize
!= n
|| input_blocksize
== 0;
589 conversions_mask
|= C_TWOBUFS
;
591 else if (STREQ (name
, "obs"))
593 /* Ensure that each blocksize is <= SSIZE_MAX. */
594 invalid
|= SSIZE_MAX
< n
;
595 output_blocksize
= n
;
596 invalid
|= output_blocksize
!= n
|| output_blocksize
== 0;
597 conversions_mask
|= C_TWOBUFS
;
599 else if (STREQ (name
, "bs"))
601 /* Ensure that each blocksize is <= SSIZE_MAX. */
602 invalid
|= SSIZE_MAX
< n
;
603 output_blocksize
= input_blocksize
= n
;
604 invalid
|= output_blocksize
!= n
|| output_blocksize
== 0;
606 else if (STREQ (name
, "cbs"))
608 conversion_blocksize
= n
;
609 invalid
|= (conversion_blocksize
!= n
610 || conversion_blocksize
== 0);
612 else if (STREQ (name
, "skip"))
614 else if (STREQ (name
, "seek"))
616 else if (STREQ (name
, "count"))
620 error (0, 0, _("unrecognized option %s=%s"),
621 quote_n (0, name
), quote_n (1, val
));
622 usage (EXIT_FAILURE
);
626 error (EXIT_FAILURE
, 0, _("invalid number %s"), quote (val
));
630 /* If bs= was given, both `input_blocksize' and `output_blocksize' will
631 have been set to positive values. If either has not been set,
632 bs= was not given, so make sure two buffers are used. */
633 if (input_blocksize
== 0 || output_blocksize
== 0)
634 conversions_mask
|= C_TWOBUFS
;
635 if (input_blocksize
== 0)
636 input_blocksize
= DEFAULT_BLOCKSIZE
;
637 if (output_blocksize
== 0)
638 output_blocksize
= DEFAULT_BLOCKSIZE
;
639 if (conversion_blocksize
== 0)
640 conversions_mask
&= ~(C_BLOCK
| C_UNBLOCK
);
643 /* Fix up translation table. */
646 apply_translations (void)
650 #define MX(a) (bit_count (conversions_mask & (a)))
651 if ((MX (C_ASCII
| C_EBCDIC
| C_IBM
) > 1)
652 || (MX (C_BLOCK
| C_UNBLOCK
) > 1)
653 || (MX (C_LCASE
| C_UCASE
) > 1))
655 error (EXIT_FAILURE
, 0, _("\
656 only one conv in {ascii,ebcdic,ibm}, {lcase,ucase}, {block,unblock}"));
660 if (conversions_mask
& C_ASCII
)
661 translate_charset (ebcdic_to_ascii
);
663 if (conversions_mask
& C_UCASE
)
665 for (i
= 0; i
< 256; i
++)
666 if (ISLOWER (trans_table
[i
]))
667 trans_table
[i
] = TOUPPER (trans_table
[i
]);
668 translation_needed
= 1;
670 else if (conversions_mask
& C_LCASE
)
672 for (i
= 0; i
< 256; i
++)
673 if (ISUPPER (trans_table
[i
]))
674 trans_table
[i
] = TOLOWER (trans_table
[i
]);
675 translation_needed
= 1;
678 if (conversions_mask
& C_EBCDIC
)
680 translate_charset (ascii_to_ebcdic
);
681 newline_character
= ascii_to_ebcdic
['\n'];
682 space_character
= ascii_to_ebcdic
[' '];
684 else if (conversions_mask
& C_IBM
)
686 translate_charset (ascii_to_ibm
);
687 newline_character
= ascii_to_ibm
['\n'];
688 space_character
= ascii_to_ibm
[' '];
692 /* Apply the character-set translations specified by the user
693 to the NREAD bytes in BUF. */
696 translate_buffer (char *buf
, size_t nread
)
701 for (i
= nread
, cp
= buf
; i
; i
--, cp
++)
702 *cp
= trans_table
[(unsigned char) *cp
];
705 /* If nonnzero, the last char from the previous call to `swab_buffer'
706 is saved in `saved_char'. */
707 static int char_is_saved
= 0;
709 /* Odd char from previous call. */
710 static char saved_char
;
712 /* Swap NREAD bytes in BUF, plus possibly an initial char from the
713 previous call. If NREAD is odd, save the last char for the
714 next call. Return the new start of the BUF buffer. */
717 swab_buffer (char *buf
, size_t *nread
)
719 char *bufstart
= buf
;
723 /* Is a char left from last time? */
726 *--bufstart
= saved_char
;
733 /* An odd number of chars are in the buffer. */
734 saved_char
= bufstart
[--*nread
];
738 /* Do the byte-swapping by moving every second character two
739 positions toward the end, working from the end of the buffer
740 toward the beginning. This way we only move half of the data. */
742 cp
= bufstart
+ *nread
; /* Start one char past the last. */
743 for (i
= *nread
/ 2; i
; i
--, cp
-= 2)
749 /* This is a wrapper for lseek. It detects and warns about a kernel
750 bug that makes lseek a no-op for tape devices, even though the kernel
751 lseek return value suggests that the function succeeded.
753 The parameters are the same as those of the lseek function, but
754 with the addition of FILENAME, the name of the file associated with
755 descriptor FDESC. The file name is used solely in the warning that's
756 printed when the bug is detected. Return the same value that lseek
757 would have returned, but when the lseek bug is detected, return -1
758 to indicate that lseek failed.
760 The offending behavior has been confirmed with an Exabyte SCSI tape
761 drive accessed via /dev/nst0 on both Linux-2.2.17 and Linux-2.4.16. */
765 # include <sys/mtio.h>
767 # define MT_SAME_POSITION(P, Q) \
768 ((P).mt_resid == (Q).mt_resid \
769 && (P).mt_fileno == (Q).mt_fileno \
770 && (P).mt_blkno == (Q).mt_blkno)
773 skip_via_lseek (char const *filename
, int fdesc
, off_t offset
, int whence
)
778 int got_original_tape_position
;
780 got_original_tape_position
= (ioctl (fdesc
, MTIOCGET
, &s1
) == 0);
781 /* known bad device type */
782 /* && s.mt_type == MT_ISSCSI2 */
784 new_position
= lseek (fdesc
, offset
, whence
);
785 if (0 <= new_position
786 && got_original_tape_position
787 && ioctl (fdesc
, MTIOCGET
, &s2
) == 0
788 && MT_SAME_POSITION (s1
, s2
))
790 error (0, 0, _("warning: working around lseek kernel bug for file (%s)\n\
791 of mt_type=0x%0lx -- see <sys/mtio.h> for the list of types"),
792 filename
, s2
.mt_type
);
799 # define skip_via_lseek(Filename, Fd, Offset, Whence) lseek (Fd, Offset, Whence)
802 /* Throw away RECORDS blocks of BLOCKSIZE bytes on file descriptor FDESC,
803 which is open with read permission for FILE. Store up to BLOCKSIZE
804 bytes of the data at a time in BUF, if necessary. RECORDS must be
808 skip (int fdesc
, char const *file
, uintmax_t records
, size_t blocksize
,
811 off_t offset
= records
* blocksize
;
813 /* Try lseek and if an error indicates it was an inappropriate operation --
814 or if the the file offset is not representable as an off_t --
815 fall back on using read. */
817 if ((uintmax_t) offset
/ blocksize
!= records
818 || skip_via_lseek (file
, fdesc
, offset
, SEEK_CUR
) < 0)
822 size_t nread
= safe_read (fdesc
, buf
, blocksize
);
823 if (nread
== SAFE_READ_ERROR
)
825 error (0, errno
, _("reading %s"), quote (file
));
828 /* POSIX doesn't say what to do when dd detects it has been
829 asked to skip past EOF, so I assume it's non-fatal.
830 FIXME: maybe give a warning. */
837 /* Copy NREAD bytes of BUF, with no conversions. */
840 copy_simple (char const *buf
, int nread
)
842 int nfree
; /* Number of unused bytes in `obuf'. */
843 const char *start
= buf
; /* First uncopied char in BUF. */
847 nfree
= output_blocksize
- oc
;
851 memcpy (obuf
+ oc
, start
, nfree
);
853 nread
-= nfree
; /* Update the number of bytes left to copy. */
856 if (oc
>= output_blocksize
)
862 /* Copy NREAD bytes of BUF, doing conv=block
863 (pad newline-terminated records to `conversion_blocksize',
864 replacing the newline with trailing spaces). */
867 copy_with_block (char const *buf
, size_t nread
)
871 for (i
= nread
; i
; i
--, buf
++)
873 if (*buf
== newline_character
)
875 if (col
< conversion_blocksize
)
878 for (j
= col
; j
< conversion_blocksize
; j
++)
879 output_char (space_character
);
885 if (col
== conversion_blocksize
)
887 else if (col
< conversion_blocksize
)
894 /* Copy NREAD bytes of BUF, doing conv=unblock
895 (replace trailing spaces in `conversion_blocksize'-sized records
899 copy_with_unblock (char const *buf
, size_t nread
)
903 static int pending_spaces
= 0;
905 for (i
= 0; i
< nread
; i
++)
909 if (col
++ >= conversion_blocksize
)
911 col
= pending_spaces
= 0; /* Wipe out any pending spaces. */
912 i
--; /* Push the char back; get it later. */
913 output_char (newline_character
);
915 else if (c
== space_character
)
919 /* `c' is the character after a run of spaces that were not
920 at the end of the conversion buffer. Output them. */
921 while (pending_spaces
)
923 output_char (space_character
);
936 char *ibuf
, *bufstart
; /* Input buffer. */
937 char *real_buf
; /* real buffer address before alignment */
939 size_t nread
; /* Bytes read in the current block. */
941 size_t page_size
= getpagesize ();
944 /* Leave at least one extra byte at the beginning and end of `ibuf'
945 for conv=swab, but keep the buffer address even. But some peculiar
946 device drivers work only with word-aligned buffers, so leave an
949 /* Some devices require alignment on a sector or page boundary
950 (e.g. character disk devices). Align the input buffer to a
951 page boundary to cover all bases. Note that due to the swab
952 algorithm, we must have at least one byte in the page before
953 the input buffer; thus we allocate 2 pages of slop in the
954 real buffer. 8k above the blocksize shouldn't bother anyone.
956 The page alignment is necessary on any linux system that supports
957 either the SGI raw I/O patch or Steven Tweedies raw I/O patch.
958 It is necessary when accessing raw (i.e. character special) disk
959 devices on Unixware or other SVR4-derived system. */
961 real_buf
= xmalloc (input_blocksize
962 + 2 * SWAB_ALIGN_OFFSET
963 + 2 * page_size
- 1);
965 ibuf
+= SWAB_ALIGN_OFFSET
; /* allow space for swab */
967 ibuf
= PTR_ALIGN (ibuf
, page_size
);
969 if (conversions_mask
& C_TWOBUFS
)
971 /* Page-align the output buffer, too. */
972 real_obuf
= xmalloc (output_blocksize
+ page_size
- 1);
973 obuf
= PTR_ALIGN (real_obuf
, page_size
);
981 if (skip_records
!= 0)
982 skip (STDIN_FILENO
, input_file
, skip_records
, input_blocksize
, ibuf
);
984 if (seek_records
!= 0)
986 /* FIXME: this loses for
987 % ./dd if=dd seek=1 |:
988 ./dd: standard output: Bad file descriptor
993 skip (STDOUT_FILENO
, output_file
, seek_records
, output_blocksize
, obuf
);
996 if (max_records
== 0)
1001 if (r_partial
+ r_full
>= max_records
)
1004 /* Zero the buffer before reading, so that if we get a read error,
1005 whatever data we are able to read is followed by zeros.
1006 This minimizes data loss. */
1007 if ((conversions_mask
& C_SYNC
) && (conversions_mask
& C_NOERROR
))
1009 (conversions_mask
& (C_BLOCK
| C_UNBLOCK
)) ? ' ' : '\0',
1012 nread
= safe_read (STDIN_FILENO
, ibuf
, input_blocksize
);
1017 if (nread
== SAFE_READ_ERROR
)
1019 error (0, errno
, _("reading %s"), quote (input_file
));
1020 if (conversions_mask
& C_NOERROR
)
1023 /* Seek past the bad block if possible. */
1024 lseek (STDIN_FILENO
, (off_t
) input_blocksize
, SEEK_CUR
);
1025 if (conversions_mask
& C_SYNC
)
1026 /* Replace the missing input with null bytes and
1027 proceed normally. */
1034 /* Write any partial block. */
1040 n_bytes_read
= nread
;
1042 if (n_bytes_read
< input_blocksize
)
1045 if (conversions_mask
& C_SYNC
)
1047 if (!(conversions_mask
& C_NOERROR
))
1048 /* If C_NOERROR, we zeroed the block before reading. */
1049 memset (ibuf
+ n_bytes_read
,
1050 (conversions_mask
& (C_BLOCK
| C_UNBLOCK
)) ? ' ' : '\0',
1051 input_blocksize
- n_bytes_read
);
1052 n_bytes_read
= input_blocksize
;
1058 if (ibuf
== obuf
) /* If not C_TWOBUFS. */
1060 size_t nwritten
= full_write (STDOUT_FILENO
, obuf
, n_bytes_read
);
1061 if (nwritten
!= n_bytes_read
)
1063 error (0, errno
, _("writing %s"), quote (output_file
));
1066 else if (n_bytes_read
== input_blocksize
)
1073 /* Do any translations on the whole buffer at once. */
1075 if (translation_needed
)
1076 translate_buffer (ibuf
, n_bytes_read
);
1078 if (conversions_mask
& C_SWAB
)
1079 bufstart
= swab_buffer (ibuf
, &n_bytes_read
);
1083 if (conversions_mask
& C_BLOCK
)
1084 copy_with_block (bufstart
, n_bytes_read
);
1085 else if (conversions_mask
& C_UNBLOCK
)
1086 copy_with_unblock (bufstart
, n_bytes_read
);
1088 copy_simple (bufstart
, n_bytes_read
);
1091 /* If we have a char left as a result of conv=swab, output it. */
1094 if (conversions_mask
& C_BLOCK
)
1095 copy_with_block (&saved_char
, 1);
1096 else if (conversions_mask
& C_UNBLOCK
)
1097 copy_with_unblock (&saved_char
, 1);
1099 output_char (saved_char
);
1102 if ((conversions_mask
& C_BLOCK
) && col
> 0)
1104 /* If the final input line didn't end with a '\n', pad
1105 the output block to `conversion_blocksize' chars. */
1107 for (i
= col
; i
< conversion_blocksize
; i
++)
1108 output_char (space_character
);
1111 if ((conversions_mask
& C_UNBLOCK
) && col
== conversion_blocksize
)
1112 /* Add a final '\n' if there are exactly `conversion_blocksize'
1113 characters in the final record. */
1114 output_char (newline_character
);
1116 /* Write out the last block. */
1119 size_t nwritten
= full_write (STDOUT_FILENO
, obuf
, oc
);
1124 error (0, errno
, _("writing %s"), quote (output_file
));
1136 /* This is gross, but necessary, because of the way close_stdout
1137 works and because this program closes STDOUT_FILENO directly. */
1138 static void (*closeout_func
) (void) = close_stdout
;
1141 close_stdout_wrapper (void)
1144 (*closeout_func
) ();
1148 main (int argc
, char **argv
)
1153 initialize_main (&argc
, &argv
);
1154 program_name
= argv
[0];
1155 setlocale (LC_ALL
, "");
1156 bindtextdomain (PACKAGE
, LOCALEDIR
);
1157 textdomain (PACKAGE
);
1159 /* Arrange to close stdout if parse_long_options exits. */
1160 atexit (close_stdout_wrapper
);
1162 parse_long_options (argc
, argv
, PROGRAM_NAME
, PACKAGE
, VERSION
,
1163 usage
, AUTHORS
, (char const *) NULL
);
1165 /* Don't close stdout on exit from here on. */
1166 closeout_func
= NULL
;
1168 /* Initialize translation table to identity translation. */
1169 for (i
= 0; i
< 256; i
++)
1172 /* Decode arguments. */
1173 scanargs (argc
, argv
);
1175 apply_translations ();
1177 if (input_file
!= NULL
)
1179 if (open_fd (STDIN_FILENO
, input_file
, O_RDONLY
, 0) < 0)
1180 error (EXIT_FAILURE
, errno
, _("opening %s"), quote (input_file
));
1183 input_file
= _("standard input");
1185 if (output_file
!= NULL
)
1187 mode_t perms
= S_IRUSR
| S_IWUSR
| S_IRGRP
| S_IWGRP
| S_IROTH
| S_IWOTH
;
1190 | (seek_records
|| (conversions_mask
& C_NOTRUNC
) ? 0 : O_TRUNC
));
1192 /* Open the output file with *read* access only if we might
1193 need to read to satisfy a `seek=' request. If we can't read
1194 the file, go ahead with write-only access; it might work. */
1196 || open_fd (STDOUT_FILENO
, output_file
, O_RDWR
| opts
, perms
) < 0)
1197 && open_fd (STDOUT_FILENO
, output_file
, O_WRONLY
| opts
, perms
) < 0)
1198 error (EXIT_FAILURE
, errno
, _("opening %s"), quote (output_file
));
1201 if (seek_records
!= 0 && !(conversions_mask
& C_NOTRUNC
))
1203 struct stat stdout_stat
;
1204 off_t o
= seek_records
* output_blocksize
;
1205 if ((uintmax_t) o
/ output_blocksize
!= seek_records
)
1206 error (EXIT_FAILURE
, 0, _("file offset out of range"));
1208 if (fstat (STDOUT_FILENO
, &stdout_stat
) != 0)
1209 error (EXIT_FAILURE
, errno
, _("cannot fstat %s"),
1210 quote (output_file
));
1212 /* Complain only when ftruncate fails on a regular file, a
1213 directory, or a shared memory object, as the 2000-08
1214 POSIX draft specifies ftruncate's behavior only for these
1215 file types. For example, do not complain when Linux 2.4
1216 ftruncate fails on /dev/fd0. */
1217 if (ftruncate (STDOUT_FILENO
, o
) != 0
1218 && (S_ISREG (stdout_stat
.st_mode
)
1219 || S_ISDIR (stdout_stat
.st_mode
)
1220 || S_TYPEISSHM (&stdout_stat
)))
1222 char buf
[INT_BUFSIZE_BOUND (off_t
)];
1223 error (EXIT_FAILURE
, errno
,
1224 _("advancing past %s bytes in output file %s"),
1225 offtostr (o
, buf
), quote (output_file
));
1232 output_file
= _("standard output");
1235 install_handler (SIGINT
, interrupt_handler
);
1236 install_handler (SIGQUIT
, interrupt_handler
);
1237 install_handler (SIGPIPE
, interrupt_handler
);
1238 install_handler (SIGINFO
, siginfo_handler
);
1240 exit_status
= dd_copy ();