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 WRITTEN_BY _("Written by Paul Rubin, David MacKenzie, and 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)
654 || (MX (C_UNBLOCK | C_SYNC) > 1))
656 error (EXIT_FAILURE, 0, _("\
657 only one conv in {ascii,ebcdic,ibm}, {lcase,ucase}, {block,unblock}, {unblock,sync}"));
661 if (conversions_mask & C_ASCII)
662 translate_charset (ebcdic_to_ascii);
664 if (conversions_mask & C_UCASE)
666 for (i = 0; i < 256; i++)
667 if (ISLOWER (trans_table[i]))
668 trans_table[i] = TOUPPER (trans_table[i]);
669 translation_needed = 1;
671 else if (conversions_mask & C_LCASE)
673 for (i = 0; i < 256; i++)
674 if (ISUPPER (trans_table[i]))
675 trans_table[i] = TOLOWER (trans_table[i]);
676 translation_needed = 1;
679 if (conversions_mask & C_EBCDIC)
681 translate_charset (ascii_to_ebcdic);
682 newline_character = ascii_to_ebcdic['\n'];
683 space_character = ascii_to_ebcdic[' '];
685 else if (conversions_mask & C_IBM)
687 translate_charset (ascii_to_ibm);
688 newline_character = ascii_to_ibm['\n'];
689 space_character = ascii_to_ibm[' '];
693 /* Apply the character-set translations specified by the user
694 to the NREAD bytes in BUF. */
697 translate_buffer (char *buf, size_t nread)
702 for (i = nread, cp = buf; i; i--, cp++)
703 *cp = trans_table[(unsigned char) *cp];
706 /* If nonnzero, the last char from the previous call to `swab_buffer'
707 is saved in `saved_char'. */
708 static int char_is_saved = 0;
710 /* Odd char from previous call. */
711 static char saved_char;
713 /* Swap NREAD bytes in BUF, plus possibly an initial char from the
714 previous call. If NREAD is odd, save the last char for the
715 next call. Return the new start of the BUF buffer. */
718 swab_buffer (char *buf, size_t *nread)
720 char *bufstart = buf;
724 /* Is a char left from last time? */
727 *--bufstart = saved_char;
734 /* An odd number of chars are in the buffer. */
735 saved_char = bufstart[--*nread];
739 /* Do the byte-swapping by moving every second character two
740 positions toward the end, working from the end of the buffer
741 toward the beginning. This way we only move half of the data. */
743 cp = bufstart + *nread; /* Start one char past the last. */
744 for (i = *nread / 2; i; i--, cp -= 2)
750 /* This is a wrapper for lseek. It detects and warns about a kernel
751 bug that makes lseek a no-op for tape devices, even though the kernel
752 lseek return value suggests that the function succeeded.
754 The parameters are the same as those of the lseek function, but
755 with the addition of FILENAME, the name of the file associated with
756 descriptor FDESC. The file name is used solely in the warning that's
757 printed when the bug is detected. Return the same value that lseek
758 would have returned, but when the lseek bug is detected, return -1
759 to indicate that lseek failed.
761 The offending behavior has been confirmed with an Exabyte SCSI tape
762 drive accessed via /dev/nst0 on both Linux-2.2.17 and Linux-2.4.16. */
766 # include <sys/mtio.h>
768 # define MT_SAME_POSITION(P, Q) \
769 ((P).mt_resid == (Q).mt_resid \
770 && (P).mt_fileno == (Q).mt_fileno \
771 && (P).mt_blkno == (Q).mt_blkno)
774 skip_via_lseek (char const *filename, int fdesc, off_t offset, int whence)
779 int got_original_tape_position;
781 got_original_tape_position = (ioctl (fdesc, MTIOCGET, &s1) == 0);
782 /* known bad device type */
783 /* && s.mt_type == MT_ISSCSI2 */
785 new_position = lseek (fdesc, offset, whence);
786 if (0 <= new_position
787 && got_original_tape_position
788 && ioctl (fdesc, MTIOCGET, &s2) == 0
789 && MT_SAME_POSITION (s1, s2))
791 error (0, 0, _("warning: working around lseek kernel bug for file (%s)\n\
792 of mt_type=0x%0lx -- see <sys/mtio.h> for the list of types"),
793 filename, s2.mt_type);
800 # define skip_via_lseek(Filename, Fd, Offset, Whence) lseek (Fd, Offset, Whence)
803 /* Throw away RECORDS blocks of BLOCKSIZE bytes on file descriptor FDESC,
804 which is open with read permission for FILE. Store up to BLOCKSIZE
805 bytes of the data at a time in BUF, if necessary. RECORDS must be
809 skip (int fdesc, char const *file, uintmax_t records, size_t blocksize,
812 off_t offset = records * blocksize;
814 /* Try lseek and if an error indicates it was an inappropriate operation --
815 or if the the file offset is not representable as an off_t --
816 fall back on using read. */
818 if ((uintmax_t) offset / blocksize != records
819 || skip_via_lseek (file, fdesc, offset, SEEK_CUR) < 0)
823 size_t nread = safe_read (fdesc, buf, blocksize);
824 if (nread == SAFE_READ_ERROR)
826 error (0, errno, _("reading %s"), quote (file));
829 /* POSIX doesn't say what to do when dd detects it has been
830 asked to skip past EOF, so I assume it's non-fatal.
831 FIXME: maybe give a warning. */
838 /* Copy NREAD bytes of BUF, with no conversions. */
841 copy_simple (char const *buf, int nread)
843 int nfree; /* Number of unused bytes in `obuf'. */
844 const char *start = buf; /* First uncopied char in BUF. */
848 nfree = output_blocksize - oc;
852 memcpy (obuf + oc, start, nfree);
854 nread -= nfree; /* Update the number of bytes left to copy. */
857 if (oc >= output_blocksize)
863 /* Copy NREAD bytes of BUF, doing conv=block
864 (pad newline-terminated records to `conversion_blocksize',
865 replacing the newline with trailing spaces). */
868 copy_with_block (char const *buf, size_t nread)
872 for (i = nread; i; i--, buf++)
874 if (*buf == newline_character)
876 if (col < conversion_blocksize)
879 for (j = col; j < conversion_blocksize; j++)
880 output_char (space_character);
886 if (col == conversion_blocksize)
888 else if (col < conversion_blocksize)
895 /* Copy NREAD bytes of BUF, doing conv=unblock
896 (replace trailing spaces in `conversion_blocksize'-sized records
900 copy_with_unblock (char const *buf, size_t nread)
904 static int pending_spaces = 0;
906 for (i = 0; i < nread; i++)
910 if (col++ >= conversion_blocksize)
912 col = pending_spaces = 0; /* Wipe out any pending spaces. */
913 i--; /* Push the char back; get it later. */
914 output_char (newline_character);
916 else if (c == space_character)
920 /* `c' is the character after a run of spaces that were not
921 at the end of the conversion buffer. Output them. */
922 while (pending_spaces)
924 output_char (space_character);
937 char *ibuf, *bufstart; /* Input buffer. */
938 char *real_buf; /* real buffer address before alignment */
940 size_t nread; /* Bytes read in the current block. */
942 size_t page_size = getpagesize ();
945 /* Leave at least one extra byte at the beginning and end of `ibuf'
946 for conv=swab, but keep the buffer address even. But some peculiar
947 device drivers work only with word-aligned buffers, so leave an
950 /* Some devices require alignment on a sector or page boundary
951 (e.g. character disk devices). Align the input buffer to a
952 page boundary to cover all bases. Note that due to the swab
953 algorithm, we must have at least one byte in the page before
954 the input buffer; thus we allocate 2 pages of slop in the
955 real buffer. 8k above the blocksize shouldn't bother anyone.
957 The page alignment is necessary on any linux system that supports
958 either the SGI raw I/O patch or Steven Tweedies raw I/O patch.
959 It is necessary when accessing raw (i.e. character special) disk
960 devices on Unixware or other SVR4-derived system. */
962 real_buf = xmalloc (input_blocksize
963 + 2 * SWAB_ALIGN_OFFSET
964 + 2 * page_size - 1);
966 ibuf += SWAB_ALIGN_OFFSET; /* allow space for swab */
968 ibuf = PTR_ALIGN (ibuf, page_size);
970 if (conversions_mask & C_TWOBUFS)
972 /* Page-align the output buffer, too. */
973 real_obuf = xmalloc (output_blocksize + page_size - 1);
974 obuf = PTR_ALIGN (real_obuf, page_size);
982 if (skip_records != 0)
983 skip (STDIN_FILENO, input_file, skip_records, input_blocksize, ibuf);
985 if (seek_records != 0)
987 /* FIXME: this loses for
988 % ./dd if=dd seek=1 |:
989 ./dd: standard output: Bad file descriptor
994 skip (STDOUT_FILENO, output_file, seek_records, output_blocksize, obuf);
997 if (max_records == 0)
1002 if (r_partial + r_full >= max_records)
1005 /* Zero the buffer before reading, so that if we get a read error,
1006 whatever data we are able to read is followed by zeros.
1007 This minimizes data loss. */
1008 if ((conversions_mask & C_SYNC) && (conversions_mask & C_NOERROR))
1010 (conversions_mask & (C_BLOCK | C_UNBLOCK)) ? ' ' : '\0',
1013 nread = safe_read (STDIN_FILENO, ibuf, input_blocksize);
1018 if (nread == SAFE_READ_ERROR)
1020 error (0, errno, _("reading %s"), quote (input_file));
1021 if (conversions_mask & C_NOERROR)
1024 /* Seek past the bad block if possible. */
1025 lseek (STDIN_FILENO, (off_t) input_blocksize, SEEK_CUR);
1026 if (conversions_mask & C_SYNC)
1027 /* Replace the missing input with null bytes and
1028 proceed normally. */
1035 /* Write any partial block. */
1041 n_bytes_read = nread;
1043 if (n_bytes_read < input_blocksize)
1046 if (conversions_mask & C_SYNC)
1048 if (!(conversions_mask & C_NOERROR))
1049 /* If C_NOERROR, we zeroed the block before reading. */
1050 memset (ibuf + n_bytes_read,
1051 (conversions_mask & (C_BLOCK | C_UNBLOCK)) ? ' ' : '\0',
1052 input_blocksize - n_bytes_read);
1053 n_bytes_read = input_blocksize;
1059 if (ibuf == obuf) /* If not C_TWOBUFS. */
1061 size_t nwritten = full_write (STDOUT_FILENO, obuf, n_bytes_read);
1062 if (nwritten != n_bytes_read)
1064 error (0, errno, _("writing %s"), quote (output_file));
1067 else if (n_bytes_read == input_blocksize)
1074 /* Do any translations on the whole buffer at once. */
1076 if (translation_needed)
1077 translate_buffer (ibuf, n_bytes_read);
1079 if (conversions_mask & C_SWAB)
1080 bufstart = swab_buffer (ibuf, &n_bytes_read);
1084 if (conversions_mask & C_BLOCK)
1085 copy_with_block (bufstart, n_bytes_read);
1086 else if (conversions_mask & C_UNBLOCK)
1087 copy_with_unblock (bufstart, n_bytes_read);
1089 copy_simple (bufstart, n_bytes_read);
1092 /* If we have a char left as a result of conv=swab, output it. */
1095 if (conversions_mask & C_BLOCK)
1096 copy_with_block (&saved_char, 1);
1097 else if (conversions_mask & C_UNBLOCK)
1098 copy_with_unblock (&saved_char, 1);
1100 output_char (saved_char);
1103 if ((conversions_mask & C_BLOCK) && col > 0)
1105 /* If the final input line didn't end with a '\n', pad
1106 the output block to `conversion_blocksize' chars. */
1108 for (i = col; i < conversion_blocksize; i++)
1109 output_char (space_character);
1112 if ((conversions_mask & C_UNBLOCK) && col == conversion_blocksize)
1113 /* Add a final '\n' if there are exactly `conversion_blocksize'
1114 characters in the final record. */
1115 output_char (newline_character);
1117 /* Write out the last block. */
1120 size_t nwritten = full_write (STDOUT_FILENO, obuf, oc);
1125 error (0, errno, _("writing %s"), quote (output_file));
1137 /* This is gross, but necessary, because of the way close_stdout
1138 works and because this program closes STDOUT_FILENO directly. */
1139 static void (*closeout_func) (void) = close_stdout;
1142 close_stdout_wrapper (void)
1145 (*closeout_func) ();
1149 main (int argc, char **argv)
1154 initialize_main (&argc, &argv);
1155 program_name = argv[0];
1156 setlocale (LC_ALL, "");
1157 bindtextdomain (PACKAGE, LOCALEDIR);
1158 textdomain (PACKAGE);
1160 /* Arrange to close stdout if parse_long_options exits. */
1161 atexit (close_stdout_wrapper);
1163 parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE, VERSION,
1166 /* Don't close stdout on exit from here on. */
1167 closeout_func = NULL;
1169 /* Initialize translation table to identity translation. */
1170 for (i = 0; i < 256; i++)
1173 /* Decode arguments. */
1174 scanargs (argc, argv);
1176 apply_translations ();
1178 if (input_file != NULL)
1180 if (open_fd (STDIN_FILENO, input_file, O_RDONLY, 0) < 0)
1181 error (EXIT_FAILURE, errno, _("opening %s"), quote (input_file));
1184 input_file = _("standard input");
1186 if (output_file != NULL)
1188 mode_t perms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
1191 | (seek_records || (conversions_mask & C_NOTRUNC) ? 0 : O_TRUNC));
1193 /* Open the output file with *read* access only if we might
1194 need to read to satisfy a `seek=' request. If we can't read
1195 the file, go ahead with write-only access; it might work. */
1197 || open_fd (STDOUT_FILENO, output_file, O_RDWR | opts, perms) < 0)
1198 && open_fd (STDOUT_FILENO, output_file, O_WRONLY | opts, perms) < 0)
1199 error (EXIT_FAILURE, errno, _("opening %s"), quote (output_file));
1202 if (seek_records != 0 && !(conversions_mask & C_NOTRUNC))
1204 struct stat stdout_stat;
1205 off_t o = seek_records * output_blocksize;
1206 if ((uintmax_t) o / output_blocksize != seek_records)
1207 error (EXIT_FAILURE, 0, _("file offset out of range"));
1209 if (fstat (STDOUT_FILENO, &stdout_stat) != 0)
1210 error (EXIT_FAILURE, errno, _("cannot fstat %s"),
1211 quote (output_file));
1213 /* Complain only when ftruncate fails on a regular file, a
1214 directory, or a shared memory object, as the 2000-08
1215 POSIX draft specifies ftruncate's behavior only for these
1216 file types. For example, do not complain when Linux 2.4
1217 ftruncate fails on /dev/fd0. */
1218 if (ftruncate (STDOUT_FILENO, o) != 0
1219 && (S_ISREG (stdout_stat.st_mode)
1220 || S_ISDIR (stdout_stat.st_mode)
1221 || S_TYPEISSHM (&stdout_stat)))
1223 char buf[INT_BUFSIZE_BOUND (off_t)];
1224 error (EXIT_FAILURE, errno,
1225 _("advancing past %s bytes in output file %s"),
1226 offtostr (o, buf), quote (output_file));
1233 output_file = _("standard output");
1236 install_handler (SIGINT, interrupt_handler);
1237 install_handler (SIGQUIT, interrupt_handler);
1238 install_handler (SIGPIPE, interrupt_handler);
1239 install_handler (SIGINFO, siginfo_handler);
1241 exit_status = dd_copy ();