1 /* dd -- convert a file while copying it.
2 Copyright (C) 85, 90, 91, 1995-2002 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>
32 #include "full-write.h"
33 #include "getpagesize.h"
35 #include "long-options.h"
37 #include "safe-read.h"
40 /* The official name of this program (e.g., no `g' prefix). */
41 #define PROGRAM_NAME "dd"
43 #define AUTHORS N_ ("Paul Rubin, David MacKenzie, and Stuart Kemp")
46 # define SIGINFO SIGUSR1
50 # define S_TYPEISSHM(Stat_ptr) 0
53 #define ROUND_UP_OFFSET(X, M) ((M) - 1 - (((X) + (M) - 1) % (M)))
54 #define PTR_ALIGN(Ptr, M) ((Ptr) \
55 + ROUND_UP_OFFSET ((char *)(Ptr) - (char *)0, (M)))
57 #define max(a, b) ((a) > (b) ? (a) : (b))
58 #define output_char(c) \
62 if (oc >= output_blocksize) \
67 /* Default input and output blocksize. */
68 #define DEFAULT_BLOCKSIZE 512
70 /* Conversions bit masks. */
79 #define C_NOERROR 0400
80 #define C_NOTRUNC 01000
82 /* Use separate input and output buffers, and combine partial input blocks. */
83 #define C_TWOBUFS 04000
85 /* The name this program was run with. */
88 /* The name of the input file, or NULL for the standard input. */
89 static char const *input_file
= NULL
;
91 /* The name of the output file, or NULL for the standard output. */
92 static char const *output_file
= NULL
;
94 /* The number of bytes in which atomic reads are done. */
95 static size_t input_blocksize
= 0;
97 /* The number of bytes in which atomic writes are done. */
98 static size_t output_blocksize
= 0;
100 /* Conversion buffer size, in bytes. 0 prevents conversions. */
101 static size_t conversion_blocksize
= 0;
103 /* Skip this many records of `input_blocksize' bytes before input. */
104 static uintmax_t skip_records
= 0;
106 /* Skip this many records of `output_blocksize' bytes before output. */
107 static uintmax_t seek_records
= 0;
109 /* Copy only this many records. The default is effectively infinity. */
110 static uintmax_t max_records
= (uintmax_t) -1;
112 /* Bit vector of conversions to apply. */
113 static int conversions_mask
= 0;
115 /* If nonzero, filter characters through the translation table. */
116 static int translation_needed
= 0;
118 /* Number of partial blocks written. */
119 static uintmax_t w_partial
= 0;
121 /* Number of full blocks written. */
122 static uintmax_t w_full
= 0;
124 /* Number of partial blocks read. */
125 static uintmax_t r_partial
= 0;
127 /* Number of full blocks read. */
128 static uintmax_t r_full
= 0;
130 /* Records truncated by conv=block. */
131 static uintmax_t r_truncate
= 0;
133 /* Output representation of newline and space characters.
134 They change if we're converting to EBCDIC. */
135 static char newline_character
= '\n';
136 static char space_character
= ' ';
141 /* Current index into `obuf'. */
142 static size_t oc
= 0;
144 /* Index into current line, for `conv=block' and `conv=unblock'. */
145 static size_t col
= 0;
153 static struct conversion conversions
[] =
155 {"ascii", C_ASCII
| C_TWOBUFS
}, /* EBCDIC to ASCII. */
156 {"ebcdic", C_EBCDIC
| C_TWOBUFS
}, /* ASCII to EBCDIC. */
157 {"ibm", C_IBM
| C_TWOBUFS
}, /* Slightly different ASCII to EBCDIC. */
158 {"block", C_BLOCK
| C_TWOBUFS
}, /* Variable to fixed length records. */
159 {"unblock", C_UNBLOCK
| C_TWOBUFS
}, /* Fixed to variable length records. */
160 {"lcase", C_LCASE
| C_TWOBUFS
}, /* Translate upper to lower case. */
161 {"ucase", C_UCASE
| C_TWOBUFS
}, /* Translate lower to upper case. */
162 {"swab", C_SWAB
| C_TWOBUFS
}, /* Swap bytes of input. */
163 {"noerror", C_NOERROR
}, /* Ignore i/o errors. */
164 {"notrunc", C_NOTRUNC
}, /* Do not truncate output file. */
165 {"sync", C_SYNC
}, /* Pad input records to ibs with NULs. */
169 /* Translation table formed by applying successive transformations. */
170 static unsigned char trans_table
[256];
172 static char const ascii_to_ebcdic
[] =
174 '\000', '\001', '\002', '\003', '\067', '\055', '\056', '\057',
175 '\026', '\005', '\045', '\013', '\014', '\015', '\016', '\017',
176 '\020', '\021', '\022', '\023', '\074', '\075', '\062', '\046',
177 '\030', '\031', '\077', '\047', '\034', '\035', '\036', '\037',
178 '\100', '\117', '\177', '\173', '\133', '\154', '\120', '\175',
179 '\115', '\135', '\134', '\116', '\153', '\140', '\113', '\141',
180 '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
181 '\370', '\371', '\172', '\136', '\114', '\176', '\156', '\157',
182 '\174', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
183 '\310', '\311', '\321', '\322', '\323', '\324', '\325', '\326',
184 '\327', '\330', '\331', '\342', '\343', '\344', '\345', '\346',
185 '\347', '\350', '\351', '\112', '\340', '\132', '\137', '\155',
186 '\171', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
187 '\210', '\211', '\221', '\222', '\223', '\224', '\225', '\226',
188 '\227', '\230', '\231', '\242', '\243', '\244', '\245', '\246',
189 '\247', '\250', '\251', '\300', '\152', '\320', '\241', '\007',
190 '\040', '\041', '\042', '\043', '\044', '\025', '\006', '\027',
191 '\050', '\051', '\052', '\053', '\054', '\011', '\012', '\033',
192 '\060', '\061', '\032', '\063', '\064', '\065', '\066', '\010',
193 '\070', '\071', '\072', '\073', '\004', '\024', '\076', '\341',
194 '\101', '\102', '\103', '\104', '\105', '\106', '\107', '\110',
195 '\111', '\121', '\122', '\123', '\124', '\125', '\126', '\127',
196 '\130', '\131', '\142', '\143', '\144', '\145', '\146', '\147',
197 '\150', '\151', '\160', '\161', '\162', '\163', '\164', '\165',
198 '\166', '\167', '\170', '\200', '\212', '\213', '\214', '\215',
199 '\216', '\217', '\220', '\232', '\233', '\234', '\235', '\236',
200 '\237', '\240', '\252', '\253', '\254', '\255', '\256', '\257',
201 '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
202 '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
203 '\312', '\313', '\314', '\315', '\316', '\317', '\332', '\333',
204 '\334', '\335', '\336', '\337', '\352', '\353', '\354', '\355',
205 '\356', '\357', '\372', '\373', '\374', '\375', '\376', '\377'
208 static char const ascii_to_ibm
[] =
210 '\000', '\001', '\002', '\003', '\067', '\055', '\056', '\057',
211 '\026', '\005', '\045', '\013', '\014', '\015', '\016', '\017',
212 '\020', '\021', '\022', '\023', '\074', '\075', '\062', '\046',
213 '\030', '\031', '\077', '\047', '\034', '\035', '\036', '\037',
214 '\100', '\132', '\177', '\173', '\133', '\154', '\120', '\175',
215 '\115', '\135', '\134', '\116', '\153', '\140', '\113', '\141',
216 '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
217 '\370', '\371', '\172', '\136', '\114', '\176', '\156', '\157',
218 '\174', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
219 '\310', '\311', '\321', '\322', '\323', '\324', '\325', '\326',
220 '\327', '\330', '\331', '\342', '\343', '\344', '\345', '\346',
221 '\347', '\350', '\351', '\255', '\340', '\275', '\137', '\155',
222 '\171', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
223 '\210', '\211', '\221', '\222', '\223', '\224', '\225', '\226',
224 '\227', '\230', '\231', '\242', '\243', '\244', '\245', '\246',
225 '\247', '\250', '\251', '\300', '\117', '\320', '\241', '\007',
226 '\040', '\041', '\042', '\043', '\044', '\025', '\006', '\027',
227 '\050', '\051', '\052', '\053', '\054', '\011', '\012', '\033',
228 '\060', '\061', '\032', '\063', '\064', '\065', '\066', '\010',
229 '\070', '\071', '\072', '\073', '\004', '\024', '\076', '\341',
230 '\101', '\102', '\103', '\104', '\105', '\106', '\107', '\110',
231 '\111', '\121', '\122', '\123', '\124', '\125', '\126', '\127',
232 '\130', '\131', '\142', '\143', '\144', '\145', '\146', '\147',
233 '\150', '\151', '\160', '\161', '\162', '\163', '\164', '\165',
234 '\166', '\167', '\170', '\200', '\212', '\213', '\214', '\215',
235 '\216', '\217', '\220', '\232', '\233', '\234', '\235', '\236',
236 '\237', '\240', '\252', '\253', '\254', '\255', '\256', '\257',
237 '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
238 '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
239 '\312', '\313', '\314', '\315', '\316', '\317', '\332', '\333',
240 '\334', '\335', '\336', '\337', '\352', '\353', '\354', '\355',
241 '\356', '\357', '\372', '\373', '\374', '\375', '\376', '\377'
244 static char const ebcdic_to_ascii
[] =
246 '\000', '\001', '\002', '\003', '\234', '\011', '\206', '\177',
247 '\227', '\215', '\216', '\013', '\014', '\015', '\016', '\017',
248 '\020', '\021', '\022', '\023', '\235', '\205', '\010', '\207',
249 '\030', '\031', '\222', '\217', '\034', '\035', '\036', '\037',
250 '\200', '\201', '\202', '\203', '\204', '\012', '\027', '\033',
251 '\210', '\211', '\212', '\213', '\214', '\005', '\006', '\007',
252 '\220', '\221', '\026', '\223', '\224', '\225', '\226', '\004',
253 '\230', '\231', '\232', '\233', '\024', '\025', '\236', '\032',
254 '\040', '\240', '\241', '\242', '\243', '\244', '\245', '\246',
255 '\247', '\250', '\133', '\056', '\074', '\050', '\053', '\041',
256 '\046', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
257 '\260', '\261', '\135', '\044', '\052', '\051', '\073', '\136',
258 '\055', '\057', '\262', '\263', '\264', '\265', '\266', '\267',
259 '\270', '\271', '\174', '\054', '\045', '\137', '\076', '\077',
260 '\272', '\273', '\274', '\275', '\276', '\277', '\300', '\301',
261 '\302', '\140', '\072', '\043', '\100', '\047', '\075', '\042',
262 '\303', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
263 '\150', '\151', '\304', '\305', '\306', '\307', '\310', '\311',
264 '\312', '\152', '\153', '\154', '\155', '\156', '\157', '\160',
265 '\161', '\162', '\313', '\314', '\315', '\316', '\317', '\320',
266 '\321', '\176', '\163', '\164', '\165', '\166', '\167', '\170',
267 '\171', '\172', '\322', '\323', '\324', '\325', '\326', '\327',
268 '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
269 '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
270 '\173', '\101', '\102', '\103', '\104', '\105', '\106', '\107',
271 '\110', '\111', '\350', '\351', '\352', '\353', '\354', '\355',
272 '\175', '\112', '\113', '\114', '\115', '\116', '\117', '\120',
273 '\121', '\122', '\356', '\357', '\360', '\361', '\362', '\363',
274 '\134', '\237', '\123', '\124', '\125', '\126', '\127', '\130',
275 '\131', '\132', '\364', '\365', '\366', '\367', '\370', '\371',
276 '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
277 '\070', '\071', '\372', '\373', '\374', '\375', '\376', '\377'
284 fprintf (stderr
, _("Try `%s --help' for more information.\n"),
288 printf (_("Usage: %s [OPTION]...\n"), program_name
);
290 Copy a file, converting and formatting according to the options.\n\
292 bs=BYTES force ibs=BYTES and obs=BYTES\n\
293 cbs=BYTES convert BYTES bytes at a time\n\
294 conv=KEYWORDS convert the file as per the comma separated keyword list\n\
295 count=BLOCKS copy only BLOCKS input blocks\n\
296 ibs=BYTES read BYTES bytes at a time\n\
299 if=FILE read from FILE instead of stdin\n\
300 obs=BYTES write BYTES bytes at a time\n\
301 of=FILE write to FILE instead of stdout\n\
302 seek=BLOCKS skip BLOCKS obs-sized blocks at start of output\n\
303 skip=BLOCKS skip BLOCKS ibs-sized blocks at start of input\n\
305 fputs (HELP_OPTION_DESCRIPTION
, stdout
);
306 fputs (VERSION_OPTION_DESCRIPTION
, stdout
);
309 BLOCKS and BYTES may be followed by the following multiplicative suffixes:\n\
310 xM M, c 1, w 2, b 512, kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n\
311 GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y.\n\
312 Each KEYWORD may be:\n\
316 ascii from EBCDIC to ASCII\n\
317 ebcdic from ASCII to EBCDIC\n\
318 ibm from ASCII to alternated EBCDIC\n\
319 block pad newline-terminated records with spaces to cbs-size\n\
320 unblock replace trailing spaces in cbs-size records with newline\n\
321 lcase change upper case to lower case\n\
324 notrunc do not truncate the output file\n\
325 ucase change lower case to upper case\n\
326 swab swap every pair of input bytes\n\
327 noerror continue after read errors\n\
328 sync pad every input block with NULs to ibs-size; when used\n\
329 with block or unblock, pad with spaces rather than NULs\n\
331 printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT
);
337 translate_charset (char const *new_trans
)
341 for (i
= 0; i
< 256; i
++)
342 trans_table
[i
] = new_trans
[trans_table
[i
]];
343 translation_needed
= 1;
346 /* Return the number of 1 bits in `i'. */
349 bit_count (register int i
)
351 register int set_bits
;
353 for (set_bits
= 0; i
!= 0; set_bits
++)
361 char buf
[2][INT_BUFSIZE_BOUND (uintmax_t)];
362 fprintf (stderr
, _("%s+%s records in\n"),
363 umaxtostr (r_full
, buf
[0]), umaxtostr (r_partial
, buf
[1]));
364 fprintf (stderr
, _("%s+%s records out\n"),
365 umaxtostr (w_full
, buf
[0]), umaxtostr (w_partial
, buf
[1]));
368 fprintf (stderr
, "%s %s\n",
369 umaxtostr (r_truncate
, buf
[0]),
371 ? _("truncated record")
372 : _("truncated records")));
380 if (close (STDIN_FILENO
) < 0)
381 error (EXIT_FAILURE
, errno
,
382 _("closing input file %s"), quote (input_file
));
383 if (close (STDOUT_FILENO
) < 0)
384 error (EXIT_FAILURE
, errno
,
385 _("closing output file %s"), quote (output_file
));
396 interrupt_handler (int sig
)
399 struct sigaction sigact
;
401 sigact
.sa_handler
= SIG_DFL
;
402 sigemptyset (&sigact
.sa_mask
);
404 sigaction (sig
, &sigact
, NULL
);
406 signal (sig
, SIG_DFL
);
413 siginfo_handler (int sig ATTRIBUTE_UNUSED
)
418 /* Encapsulate portability mess of establishing signal handlers. */
421 install_handler (int sig_num
, RETSIGTYPE (*sig_handler
) (int sig
))
424 struct sigaction sigact
;
425 sigaction (sig_num
, NULL
, &sigact
);
426 if (sigact
.sa_handler
!= SIG_IGN
)
428 sigact
.sa_handler
= sig_handler
;
429 sigemptyset (&sigact
.sa_mask
);
431 sigaction (sig_num
, &sigact
, NULL
);
434 if (signal (sig_num
, SIG_IGN
) != SIG_IGN
)
435 signal (sig_num
, sig_handler
);
439 /* Open a file to a particular file descriptor. This is like standard
440 `open', except it always returns DESIRED_FD if successful. */
442 open_fd (int desired_fd
, char const *filename
, int options
, mode_t mode
)
446 fd
= open (filename
, options
, mode
);
450 if (fd
!= desired_fd
)
452 if (dup2 (fd
, desired_fd
) != desired_fd
)
461 /* Write, then empty, the output buffer `obuf'. */
466 size_t nwritten
= full_write (STDOUT_FILENO
, obuf
, output_blocksize
);
467 if (nwritten
!= output_blocksize
)
469 error (0, errno
, _("writing to %s"), quote (output_file
));
479 /* Interpret one "conv=..." option.
480 As a by product, this function replaces each `,' in STR with a NUL byte. */
483 parse_conversion (char *str
)
490 new = strchr (str
, ',');
493 for (i
= 0; conversions
[i
].convname
!= NULL
; i
++)
494 if (STREQ (conversions
[i
].convname
, str
))
496 conversions_mask
|= conversions
[i
].conversion
;
499 if (conversions
[i
].convname
== NULL
)
501 error (0, 0, _("invalid conversion: %s"), quote (str
));
502 usage (EXIT_FAILURE
);
505 } while (new != NULL
);
508 /* Return the value of STR, interpreted as a non-negative decimal integer,
509 optionally multiplied by various values.
510 Assign nonzero to *INVALID if STR does not represent a number in
514 parse_integer (const char *str
, int *invalid
)
518 enum strtol_error e
= xstrtoumax (str
, &suffix
, 10, &n
, "bcEGkKMPTwYZ0");
520 if (e
== LONGINT_INVALID_SUFFIX_CHAR
&& *suffix
== 'x')
522 uintmax_t multiplier
= parse_integer (suffix
+ 1, invalid
);
524 if (multiplier
!= 0 && n
* multiplier
/ multiplier
!= n
)
532 else if (e
!= LONGINT_OK
)
542 scanargs (int argc
, char **argv
)
549 for (i
= optind
; i
< argc
; i
++)
554 val
= strchr (name
, '=');
557 error (0, 0, _("unrecognized option %s"), quote (name
));
558 usage (EXIT_FAILURE
);
562 if (STREQ (name
, "if"))
564 else if (STREQ (name
, "of"))
566 else if (STREQ (name
, "conv"))
567 parse_conversion (val
);
571 uintmax_t n
= parse_integer (val
, &invalid
);
573 if (STREQ (name
, "ibs"))
575 /* Ensure that each blocksize is <= SSIZE_MAX. */
576 invalid
|= SSIZE_MAX
< n
;
578 invalid
|= input_blocksize
!= n
|| input_blocksize
== 0;
579 conversions_mask
|= C_TWOBUFS
;
581 else if (STREQ (name
, "obs"))
583 /* Ensure that each blocksize is <= SSIZE_MAX. */
584 invalid
|= SSIZE_MAX
< n
;
585 output_blocksize
= n
;
586 invalid
|= output_blocksize
!= n
|| output_blocksize
== 0;
587 conversions_mask
|= C_TWOBUFS
;
589 else if (STREQ (name
, "bs"))
591 /* Ensure that each blocksize is <= SSIZE_MAX. */
592 invalid
|= SSIZE_MAX
< n
;
593 output_blocksize
= input_blocksize
= n
;
594 invalid
|= output_blocksize
!= n
|| output_blocksize
== 0;
596 else if (STREQ (name
, "cbs"))
598 conversion_blocksize
= n
;
599 invalid
|= (conversion_blocksize
!= n
600 || conversion_blocksize
== 0);
602 else if (STREQ (name
, "skip"))
604 else if (STREQ (name
, "seek"))
606 else if (STREQ (name
, "count"))
610 error (0, 0, _("unrecognized option %s=%s"),
611 quote_n (0, name
), quote_n (1, val
));
612 usage (EXIT_FAILURE
);
616 error (EXIT_FAILURE
, 0, _("invalid number %s"), quote (val
));
620 /* If bs= was given, both `input_blocksize' and `output_blocksize' will
621 have been set to positive values. If either has not been set,
622 bs= was not given, so make sure two buffers are used. */
623 if (input_blocksize
== 0 || output_blocksize
== 0)
624 conversions_mask
|= C_TWOBUFS
;
625 if (input_blocksize
== 0)
626 input_blocksize
= DEFAULT_BLOCKSIZE
;
627 if (output_blocksize
== 0)
628 output_blocksize
= DEFAULT_BLOCKSIZE
;
629 if (conversion_blocksize
== 0)
630 conversions_mask
&= ~(C_BLOCK
| C_UNBLOCK
);
633 /* Fix up translation table. */
636 apply_translations (void)
640 #define MX(a) (bit_count (conversions_mask & (a)))
641 if ((MX (C_ASCII
| C_EBCDIC
| C_IBM
) > 1)
642 || (MX (C_BLOCK
| C_UNBLOCK
) > 1)
643 || (MX (C_LCASE
| C_UCASE
) > 1)
644 || (MX (C_UNBLOCK
| C_SYNC
) > 1))
646 error (EXIT_FAILURE
, 0, _("\
647 only one conv in {ascii,ebcdic,ibm}, {lcase,ucase}, {block,unblock}, {unblock,sync}"));
651 if (conversions_mask
& C_ASCII
)
652 translate_charset (ebcdic_to_ascii
);
654 if (conversions_mask
& C_UCASE
)
656 for (i
= 0; i
< 256; i
++)
657 if (ISLOWER (trans_table
[i
]))
658 trans_table
[i
] = TOUPPER (trans_table
[i
]);
659 translation_needed
= 1;
661 else if (conversions_mask
& C_LCASE
)
663 for (i
= 0; i
< 256; i
++)
664 if (ISUPPER (trans_table
[i
]))
665 trans_table
[i
] = TOLOWER (trans_table
[i
]);
666 translation_needed
= 1;
669 if (conversions_mask
& C_EBCDIC
)
671 translate_charset (ascii_to_ebcdic
);
672 newline_character
= ascii_to_ebcdic
['\n'];
673 space_character
= ascii_to_ebcdic
[' '];
675 else if (conversions_mask
& C_IBM
)
677 translate_charset (ascii_to_ibm
);
678 newline_character
= ascii_to_ibm
['\n'];
679 space_character
= ascii_to_ibm
[' '];
683 /* Apply the character-set translations specified by the user
684 to the NREAD bytes in BUF. */
687 translate_buffer (char *buf
, size_t nread
)
692 for (i
= nread
, cp
= buf
; i
; i
--, cp
++)
693 *cp
= trans_table
[(unsigned char) *cp
];
696 /* If nonnzero, the last char from the previous call to `swab_buffer'
697 is saved in `saved_char'. */
698 static int char_is_saved
= 0;
700 /* Odd char from previous call. */
701 static char saved_char
;
703 /* Swap NREAD bytes in BUF, plus possibly an initial char from the
704 previous call. If NREAD is odd, save the last char for the
705 next call. Return the new start of the BUF buffer. */
708 swab_buffer (char *buf
, size_t *nread
)
710 char *bufstart
= buf
;
714 /* Is a char left from last time? */
717 *--bufstart
= saved_char
;
724 /* An odd number of chars are in the buffer. */
725 saved_char
= bufstart
[--*nread
];
729 /* Do the byte-swapping by moving every second character two
730 positions toward the end, working from the end of the buffer
731 toward the beginning. This way we only move half of the data. */
733 cp
= bufstart
+ *nread
; /* Start one char past the last. */
734 for (i
= *nread
/ 2; i
; i
--, cp
-= 2)
740 /* This is a wrapper for lseek. It detects and warns about a kernel
741 bug that makes lseek a no-op for tape devices, even though the kernel
742 lseek return value suggests that the function succeeded.
744 The parameters are the same as those of the lseek function, but
745 with the addition of FILENAME, the name of the file associated with
746 descriptor FDESC. The file name is used solely in the warning that's
747 printed when the bug is detected. Return the same value that lseek
748 would have returned, but when the lseek bug is detected, return -1
749 to indicate that lseek failed.
751 The offending behavior has been confirmed with an Exabyte SCSI tape
752 drive accessed via /dev/nst0 on both Linux-2.2.17 and Linux-2.4.16. */
756 # include <sys/mtio.h>
758 # define MT_SAME_POSITION(P, Q) \
759 ((P).mt_resid == (Q).mt_resid \
760 && (P).mt_fileno == (Q).mt_fileno \
761 && (P).mt_blkno == (Q).mt_blkno)
764 skip_via_lseek (char const *filename
, int fdesc
, off_t offset
, int whence
)
769 int got_original_tape_position
;
771 got_original_tape_position
= (ioctl (fdesc
, MTIOCGET
, &s1
) == 0);
772 /* known bad device type */
773 /* && s.mt_type == MT_ISSCSI2 */
775 new_position
= lseek (fdesc
, offset
, whence
);
776 if (0 <= new_position
777 && got_original_tape_position
778 && ioctl (fdesc
, MTIOCGET
, &s2
) == 0
779 && MT_SAME_POSITION (s1
, s2
))
781 error (0, 0, _("warning: working around lseek kernel bug for file (%s)\n\
782 of mt_type=0x%0lx -- see <sys/mtio.h> for the list of types"),
783 filename
, s2
.mt_type
);
790 # define skip_via_lseek(Filename, Fd, Offset, Whence) lseek (Fd, Offset, Whence)
793 /* Throw away RECORDS blocks of BLOCKSIZE bytes on file descriptor FDESC,
794 which is open with read permission for FILE. Store up to BLOCKSIZE
795 bytes of the data at a time in BUF, if necessary. RECORDS must be
799 skip (int fdesc
, char const *file
, uintmax_t records
, size_t blocksize
,
802 off_t offset
= records
* blocksize
;
804 /* Try lseek and if an error indicates it was an inappropriate operation --
805 or if the the file offset is not representable as an off_t --
806 fall back on using read. */
808 if ((uintmax_t) offset
/ blocksize
!= records
809 || skip_via_lseek (file
, fdesc
, offset
, SEEK_CUR
) < 0)
813 size_t nread
= safe_read (fdesc
, buf
, blocksize
);
814 if (nread
== SAFE_READ_ERROR
)
816 error (0, errno
, _("reading %s"), quote (file
));
819 /* POSIX doesn't say what to do when dd detects it has been
820 asked to skip past EOF, so I assume it's non-fatal.
821 FIXME: maybe give a warning. */
828 /* Copy NREAD bytes of BUF, with no conversions. */
831 copy_simple (char const *buf
, int nread
)
833 int nfree
; /* Number of unused bytes in `obuf'. */
834 const char *start
= buf
; /* First uncopied char in BUF. */
838 nfree
= output_blocksize
- oc
;
842 memcpy (obuf
+ oc
, start
, nfree
);
844 nread
-= nfree
; /* Update the number of bytes left to copy. */
847 if (oc
>= output_blocksize
)
853 /* Copy NREAD bytes of BUF, doing conv=block
854 (pad newline-terminated records to `conversion_blocksize',
855 replacing the newline with trailing spaces). */
858 copy_with_block (char const *buf
, size_t nread
)
862 for (i
= nread
; i
; i
--, buf
++)
864 if (*buf
== newline_character
)
866 if (col
< conversion_blocksize
)
869 for (j
= col
; j
< conversion_blocksize
; j
++)
870 output_char (space_character
);
876 if (col
== conversion_blocksize
)
878 else if (col
< conversion_blocksize
)
885 /* Copy NREAD bytes of BUF, doing conv=unblock
886 (replace trailing spaces in `conversion_blocksize'-sized records
890 copy_with_unblock (char const *buf
, size_t nread
)
894 static int pending_spaces
= 0;
896 for (i
= 0; i
< nread
; i
++)
900 if (col
++ >= conversion_blocksize
)
902 col
= pending_spaces
= 0; /* Wipe out any pending spaces. */
903 i
--; /* Push the char back; get it later. */
904 output_char (newline_character
);
906 else if (c
== space_character
)
910 /* `c' is the character after a run of spaces that were not
911 at the end of the conversion buffer. Output them. */
912 while (pending_spaces
)
914 output_char (space_character
);
927 char *ibuf
, *bufstart
; /* Input buffer. */
928 char *real_buf
; /* real buffer address before alignment */
930 size_t nread
; /* Bytes read in the current block. */
932 size_t page_size
= getpagesize ();
935 /* Leave at least one extra byte at the beginning and end of `ibuf'
936 for conv=swab, but keep the buffer address even. But some peculiar
937 device drivers work only with word-aligned buffers, so leave an
940 /* Some devices require alignment on a sector or page boundary
941 (e.g. character disk devices). Align the input buffer to a
942 page boundary to cover all bases. Note that due to the swab
943 algorithm, we must have at least one byte in the page before
944 the input buffer; thus we allocate 2 pages of slop in the
945 real buffer. 8k above the blocksize shouldn't bother anyone.
947 The page alignment is necessary on any linux system that supports
948 either the SGI raw I/O patch or Steven Tweedies raw I/O patch.
949 It is necessary when accessing raw (i.e. character special) disk
950 devices on Unixware or other SVR4-derived system. */
952 real_buf
= xmalloc (input_blocksize
953 + 2 * SWAB_ALIGN_OFFSET
954 + 2 * page_size
- 1);
956 ibuf
+= SWAB_ALIGN_OFFSET
; /* allow space for swab */
958 ibuf
= PTR_ALIGN (ibuf
, page_size
);
960 if (conversions_mask
& C_TWOBUFS
)
962 /* Page-align the output buffer, too. */
963 real_obuf
= xmalloc (output_blocksize
+ page_size
- 1);
964 obuf
= PTR_ALIGN (real_obuf
, page_size
);
972 if (skip_records
!= 0)
973 skip (STDIN_FILENO
, input_file
, skip_records
, input_blocksize
, ibuf
);
975 if (seek_records
!= 0)
977 /* FIXME: this loses for
978 % ./dd if=dd seek=1 |:
979 ./dd: standard output: Bad file descriptor
984 skip (STDOUT_FILENO
, output_file
, seek_records
, output_blocksize
, obuf
);
987 if (max_records
== 0)
992 if (r_partial
+ r_full
>= max_records
)
995 /* Zero the buffer before reading, so that if we get a read error,
996 whatever data we are able to read is followed by zeros.
997 This minimizes data loss. */
998 if ((conversions_mask
& C_SYNC
) && (conversions_mask
& C_NOERROR
))
1000 (conversions_mask
& (C_BLOCK
| C_UNBLOCK
)) ? ' ' : '\0',
1003 nread
= safe_read (STDIN_FILENO
, ibuf
, input_blocksize
);
1008 if (nread
== SAFE_READ_ERROR
)
1010 error (0, errno
, _("reading %s"), quote (input_file
));
1011 if (conversions_mask
& C_NOERROR
)
1014 /* Seek past the bad block if possible. */
1015 lseek (STDIN_FILENO
, (off_t
) input_blocksize
, SEEK_CUR
);
1016 if (conversions_mask
& C_SYNC
)
1017 /* Replace the missing input with null bytes and
1018 proceed normally. */
1025 /* Write any partial block. */
1031 n_bytes_read
= nread
;
1033 if (n_bytes_read
< input_blocksize
)
1036 if (conversions_mask
& C_SYNC
)
1038 if (!(conversions_mask
& C_NOERROR
))
1039 /* If C_NOERROR, we zeroed the block before reading. */
1040 memset (ibuf
+ n_bytes_read
,
1041 (conversions_mask
& (C_BLOCK
| C_UNBLOCK
)) ? ' ' : '\0',
1042 input_blocksize
- n_bytes_read
);
1043 n_bytes_read
= input_blocksize
;
1049 if (ibuf
== obuf
) /* If not C_TWOBUFS. */
1051 size_t nwritten
= full_write (STDOUT_FILENO
, obuf
, n_bytes_read
);
1052 if (nwritten
!= n_bytes_read
)
1054 error (0, errno
, _("writing %s"), quote (output_file
));
1057 else if (n_bytes_read
== input_blocksize
)
1064 /* Do any translations on the whole buffer at once. */
1066 if (translation_needed
)
1067 translate_buffer (ibuf
, n_bytes_read
);
1069 if (conversions_mask
& C_SWAB
)
1070 bufstart
= swab_buffer (ibuf
, &n_bytes_read
);
1074 if (conversions_mask
& C_BLOCK
)
1075 copy_with_block (bufstart
, n_bytes_read
);
1076 else if (conversions_mask
& C_UNBLOCK
)
1077 copy_with_unblock (bufstart
, n_bytes_read
);
1079 copy_simple (bufstart
, n_bytes_read
);
1082 /* If we have a char left as a result of conv=swab, output it. */
1085 if (conversions_mask
& C_BLOCK
)
1086 copy_with_block (&saved_char
, 1);
1087 else if (conversions_mask
& C_UNBLOCK
)
1088 copy_with_unblock (&saved_char
, 1);
1090 output_char (saved_char
);
1093 if ((conversions_mask
& C_BLOCK
) && col
> 0)
1095 /* If the final input line didn't end with a '\n', pad
1096 the output block to `conversion_blocksize' chars. */
1098 for (i
= col
; i
< conversion_blocksize
; i
++)
1099 output_char (space_character
);
1102 if ((conversions_mask
& C_UNBLOCK
) && col
== conversion_blocksize
)
1103 /* Add a final '\n' if there are exactly `conversion_blocksize'
1104 characters in the final record. */
1105 output_char (newline_character
);
1107 /* Write out the last block. */
1110 size_t nwritten
= full_write (STDOUT_FILENO
, obuf
, oc
);
1115 error (0, errno
, _("writing %s"), quote (output_file
));
1127 /* This is gross, but necessary, because of the way close_stdout
1128 works and because this program closes STDOUT_FILENO directly. */
1129 static void (*closeout_func
) (void) = close_stdout
;
1132 close_stdout_wrapper (void)
1135 (*closeout_func
) ();
1139 main (int argc
, char **argv
)
1144 program_name
= argv
[0];
1145 setlocale (LC_ALL
, "");
1146 bindtextdomain (PACKAGE
, LOCALEDIR
);
1147 textdomain (PACKAGE
);
1149 /* Arrange to close stdout if parse_long_options exits. */
1150 atexit (close_stdout_wrapper
);
1152 parse_long_options (argc
, argv
, PROGRAM_NAME
, PACKAGE
, VERSION
,
1155 /* Don't close stdout on exit from here on. */
1156 closeout_func
= NULL
;
1158 /* Initialize translation table to identity translation. */
1159 for (i
= 0; i
< 256; i
++)
1162 /* Decode arguments. */
1163 scanargs (argc
, argv
);
1165 apply_translations ();
1167 if (input_file
!= NULL
)
1169 if (open_fd (STDIN_FILENO
, input_file
, O_RDONLY
, 0) < 0)
1170 error (EXIT_FAILURE
, errno
, _("opening %s"), quote (input_file
));
1173 input_file
= _("standard input");
1175 if (output_file
!= NULL
)
1177 mode_t perms
= S_IRUSR
| S_IWUSR
| S_IRGRP
| S_IWGRP
| S_IROTH
| S_IWOTH
;
1180 | (seek_records
|| (conversions_mask
& C_NOTRUNC
) ? 0 : O_TRUNC
));
1182 /* Open the output file with *read* access only if we might
1183 need to read to satisfy a `seek=' request. If we can't read
1184 the file, go ahead with write-only access; it might work. */
1186 || open_fd (STDOUT_FILENO
, output_file
, O_RDWR
| opts
, perms
) < 0)
1187 && open_fd (STDOUT_FILENO
, output_file
, O_WRONLY
| opts
, perms
) < 0)
1188 error (EXIT_FAILURE
, errno
, _("opening %s"), quote (output_file
));
1191 if (seek_records
!= 0 && !(conversions_mask
& C_NOTRUNC
))
1193 struct stat stdout_stat
;
1194 off_t o
= seek_records
* output_blocksize
;
1195 if ((uintmax_t) o
/ output_blocksize
!= seek_records
)
1196 error (EXIT_FAILURE
, 0, _("file offset out of range"));
1198 if (fstat (STDOUT_FILENO
, &stdout_stat
) != 0)
1199 error (EXIT_FAILURE
, errno
, _("cannot fstat %s"),
1200 quote (output_file
));
1202 /* Complain only when ftruncate fails on a regular file, a
1203 directory, or a shared memory object, as the 2000-08
1204 POSIX draft specifies ftruncate's behavior only for these
1205 file types. For example, do not complain when Linux 2.4
1206 ftruncate fails on /dev/fd0. */
1207 if (ftruncate (STDOUT_FILENO
, o
) != 0
1208 && (S_ISREG (stdout_stat
.st_mode
)
1209 || S_ISDIR (stdout_stat
.st_mode
)
1210 || S_TYPEISSHM (&stdout_stat
)))
1212 char buf
[INT_BUFSIZE_BOUND (off_t
)];
1213 error (EXIT_FAILURE
, errno
,
1214 _("advancing past %s bytes in output file %s"),
1215 offtostr (o
, buf
), quote (output_file
));
1222 output_file
= _("standard output");
1225 install_handler (SIGINT
, interrupt_handler
);
1226 install_handler (SIGQUIT
, interrupt_handler
);
1227 install_handler (SIGPIPE
, interrupt_handler
);
1228 install_handler (SIGINFO
, siginfo_handler
);
1230 exit_status
= dd_copy ();