]> Dogcows Code - chaz/tar/blob - src/create.c
Removed debugging hook
[chaz/tar] / src / create.c
1 /* Create a tar archive.
2
3 Copyright (C) 1985, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
4 2003 Free Software Foundation, Inc.
5
6 Written by John Gilmore, on 1985-08-25.
7
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
16 Public License for more details.
17
18 You should have received a copy of the GNU General Public License along
19 with this program; if not, write to the Free Software Foundation, Inc.,
20 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21
22 #include "system.h"
23
24 #if HAVE_UTIME_H
25 # include <utime.h>
26 #else
27 struct utimbuf
28 {
29 long actime;
30 long modtime;
31 };
32 #endif
33
34 #include <quotearg.h>
35
36 #include "common.h"
37 #include <hash.h>
38
39 struct link
40 {
41 dev_t dev;
42 ino_t ino;
43 size_t nlink;
44 char name[1];
45 };
46 \f
47 /* The maximum uintmax_t value that can be represented with DIGITS digits,
48 assuming that each digit is BITS_PER_DIGIT wide. */
49 #define MAX_VAL_WITH_DIGITS(digits, bits_per_digit) \
50 ((digits) * (bits_per_digit) < sizeof (uintmax_t) * CHAR_BIT \
51 ? ((uintmax_t) 1 << ((digits) * (bits_per_digit))) - 1 \
52 : (uintmax_t) -1)
53
54 /* Convert VALUE to an octal representation suitable for tar headers.
55 Output to buffer WHERE with size SIZE.
56 The result is undefined if SIZE is 0 or if VALUE is too large to fit. */
57
58 static void
59 to_octal (uintmax_t value, char *where, size_t size)
60 {
61 uintmax_t v = value;
62 size_t i = size;
63
64 do
65 {
66 where[--i] = '0' + (v & ((1 << LG_8) - 1));
67 v >>= LG_8;
68 }
69 while (i);
70 }
71
72 /* Convert NEGATIVE VALUE to a base-256 representation suitable for
73 tar headers. NEGATIVE is 1 if VALUE was negative before being cast
74 to uintmax_t, 0 otherwise. Output to buffer WHERE with size SIZE.
75 The result is undefined if SIZE is 0 or if VALUE is too large to
76 fit. */
77
78 static void
79 to_base256 (int negative, uintmax_t value, char *where, size_t size)
80 {
81 uintmax_t v = value;
82 uintmax_t propagated_sign_bits =
83 ((uintmax_t) - negative << (CHAR_BIT * sizeof v - LG_256));
84 size_t i = size;
85
86 do
87 {
88 where[--i] = v & ((1 << LG_256) - 1);
89 v = propagated_sign_bits | (v >> LG_256);
90 }
91 while (i);
92 }
93
94 /* Convert NEGATIVE VALUE (which was originally of size VALSIZE) to
95 external form, using SUBSTITUTE (...) if VALUE won't fit. Output
96 to buffer WHERE with size SIZE. NEGATIVE is 1 iff VALUE was
97 negative before being cast to uintmax_t; its original bitpattern
98 can be deduced from VALSIZE, its original size before casting.
99 TYPE is the kind of value being output (useful for diagnostics).
100 Prefer the POSIX format of SIZE - 1 octal digits (with leading zero
101 digits), followed by '\0'. If this won't work, and if GNU or
102 OLDGNU format is allowed, use '\200' followed by base-256, or (if
103 NEGATIVE is nonzero) '\377' followed by two's complement base-256.
104 If neither format works, use SUBSTITUTE (...) instead. Pass to
105 SUBSTITUTE the address of an 0-or-1 flag recording whether the
106 substitute value is negative. */
107
108 static void
109 to_chars (int negative, uintmax_t value, size_t valsize,
110 uintmax_t (*substitute) (int *),
111 char *where, size_t size, const char *type)
112 {
113 int base256_allowed = (archive_format == GNU_FORMAT
114 || archive_format == OLDGNU_FORMAT);
115
116 /* Generate the POSIX octal representation if the number fits. */
117 if (! negative && value <= MAX_VAL_WITH_DIGITS (size - 1, LG_8))
118 {
119 where[size - 1] = '\0';
120 to_octal (value, where, size - 1);
121 }
122
123 /* Otherwise, generate the base-256 representation if we are
124 generating an old or new GNU format and if the number fits. */
125 else if (((negative ? -1 - value : value)
126 <= MAX_VAL_WITH_DIGITS (size - 1, LG_256))
127 && base256_allowed)
128 {
129 where[0] = negative ? -1 : 1 << (LG_256 - 1);
130 to_base256 (negative, value, where + 1, size - 1);
131 }
132
133 /* Otherwise, if the number is negative, and if it would not cause
134 ambiguity on this host by confusing positive with negative
135 values, then generate the POSIX octal representation of the value
136 modulo 2**(field bits). The resulting tar file is
137 machine-dependent, since it depends on the host word size. Yuck!
138 But this is the traditional behavior. */
139 else if (negative && valsize * CHAR_BIT <= (size - 1) * LG_8)
140 {
141 static int warned_once;
142 if (! warned_once)
143 {
144 warned_once = 1;
145 WARN ((0, 0, _("Generating negative octal headers")));
146 }
147 where[size - 1] = '\0';
148 to_octal (value & MAX_VAL_WITH_DIGITS (valsize * CHAR_BIT, 1),
149 where, size - 1);
150 }
151
152 /* Otherwise, output a substitute value if possible (with a
153 warning), and an error message if not. */
154 else
155 {
156 uintmax_t maxval = (base256_allowed
157 ? MAX_VAL_WITH_DIGITS (size - 1, LG_256)
158 : MAX_VAL_WITH_DIGITS (size - 1, LG_8));
159 char valbuf[UINTMAX_STRSIZE_BOUND + 1];
160 char maxbuf[UINTMAX_STRSIZE_BOUND];
161 char minbuf[UINTMAX_STRSIZE_BOUND + 1];
162 char const *minval_string;
163 char const *maxval_string = STRINGIFY_BIGINT (maxval, maxbuf);
164 char const *value_string;
165
166 if (base256_allowed)
167 {
168 uintmax_t m = maxval + 1 ? maxval + 1 : maxval / 2 + 1;
169 char *p = STRINGIFY_BIGINT (m, minbuf + 1);
170 *--p = '-';
171 minval_string = p;
172 }
173 else
174 minval_string = "0";
175
176 if (negative)
177 {
178 char *p = STRINGIFY_BIGINT (- value, valbuf + 1);
179 *--p = '-';
180 value_string = p;
181 }
182 else
183 value_string = STRINGIFY_BIGINT (value, valbuf);
184
185 if (substitute)
186 {
187 int negsub;
188 uintmax_t sub = substitute (&negsub) & maxval;
189 uintmax_t s = (negsub &= archive_format == GNU_FORMAT) ? - sub : sub;
190 char subbuf[UINTMAX_STRSIZE_BOUND + 1];
191 char *sub_string = STRINGIFY_BIGINT (s, subbuf + 1);
192 if (negsub)
193 *--sub_string = '-';
194 WARN ((0, 0, _("value %s out of %s range %s..%s; substituting %s"),
195 value_string, type, minval_string, maxval_string,
196 sub_string));
197 to_chars (negsub, s, valsize, 0, where, size, type);
198 }
199 else
200 ERROR ((0, 0, _("value %s out of %s range %s..%s"),
201 value_string, type, minval_string, maxval_string));
202 }
203 }
204
205 static uintmax_t
206 gid_substitute (int *negative)
207 {
208 gid_t r;
209 #ifdef GID_NOBODY
210 r = GID_NOBODY;
211 #else
212 static gid_t gid_nobody;
213 if (!gid_nobody && !gname_to_gid ("nobody", &gid_nobody))
214 gid_nobody = -2;
215 r = gid_nobody;
216 #endif
217 *negative = r < 0;
218 return r;
219 }
220
221 void
222 gid_to_chars (gid_t v, char *p, size_t s)
223 {
224 to_chars (v < 0, (uintmax_t) v, sizeof v, gid_substitute, p, s, "gid_t");
225 }
226
227 void
228 major_to_chars (major_t v, char *p, size_t s)
229 {
230 to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "major_t");
231 }
232
233 void
234 minor_to_chars (minor_t v, char *p, size_t s)
235 {
236 to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "minor_t");
237 }
238
239 void
240 mode_to_chars (mode_t v, char *p, size_t s)
241 {
242 /* In the common case where the internal and external mode bits are the same,
243 and we are not using POSIX or GNU format,
244 propagate all unknown bits to the external mode.
245 This matches historical practice.
246 Otherwise, just copy the bits we know about. */
247 int negative;
248 uintmax_t u;
249 if (S_ISUID == TSUID && S_ISGID == TSGID && S_ISVTX == TSVTX
250 && S_IRUSR == TUREAD && S_IWUSR == TUWRITE && S_IXUSR == TUEXEC
251 && S_IRGRP == TGREAD && S_IWGRP == TGWRITE && S_IXGRP == TGEXEC
252 && S_IROTH == TOREAD && S_IWOTH == TOWRITE && S_IXOTH == TOEXEC
253 && archive_format != POSIX_FORMAT
254 && archive_format != GNU_FORMAT)
255 {
256 negative = v < 0;
257 u = v;
258 }
259 else
260 {
261 negative = 0;
262 u = ((v & S_ISUID ? TSUID : 0)
263 | (v & S_ISGID ? TSGID : 0)
264 | (v & S_ISVTX ? TSVTX : 0)
265 | (v & S_IRUSR ? TUREAD : 0)
266 | (v & S_IWUSR ? TUWRITE : 0)
267 | (v & S_IXUSR ? TUEXEC : 0)
268 | (v & S_IRGRP ? TGREAD : 0)
269 | (v & S_IWGRP ? TGWRITE : 0)
270 | (v & S_IXGRP ? TGEXEC : 0)
271 | (v & S_IROTH ? TOREAD : 0)
272 | (v & S_IWOTH ? TOWRITE : 0)
273 | (v & S_IXOTH ? TOEXEC : 0));
274 }
275 to_chars (negative, u, sizeof v, 0, p, s, "mode_t");
276 }
277
278 void
279 off_to_chars (off_t v, char *p, size_t s)
280 {
281 to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "off_t");
282 }
283
284 void
285 size_to_chars (size_t v, char *p, size_t s)
286 {
287 to_chars (0, (uintmax_t) v, sizeof v, 0, p, s, "size_t");
288 }
289
290 void
291 time_to_chars (time_t v, char *p, size_t s)
292 {
293 to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "time_t");
294 }
295
296 static uintmax_t
297 uid_substitute (int *negative)
298 {
299 uid_t r;
300 #ifdef UID_NOBODY
301 r = UID_NOBODY;
302 #else
303 static uid_t uid_nobody;
304 if (!uid_nobody && !uname_to_uid ("nobody", &uid_nobody))
305 uid_nobody = -2;
306 r = uid_nobody;
307 #endif
308 *negative = r < 0;
309 return r;
310 }
311
312 void
313 uid_to_chars (uid_t v, char *p, size_t s)
314 {
315 to_chars (v < 0, (uintmax_t) v, sizeof v, uid_substitute, p, s, "uid_t");
316 }
317
318 void
319 uintmax_to_chars (uintmax_t v, char *p, size_t s)
320 {
321 to_chars (0, v, sizeof v, 0, p, s, "uintmax_t");
322 }
323
324 void
325 string_to_chars (char *str, char *p, size_t s)
326 {
327 strncpy (p, str, s);
328 p[s-1] = 0;
329 }
330
331 \f
332 /* Writing routines. */
333
334 /* Zero out the buffer so we don't confuse ourselves with leftover
335 data. */
336 static void
337 clear_buffer (char *buffer)
338 {
339 memset (buffer, 0, BLOCKSIZE);
340 }
341
342 /* Write the EOT block(s). Zero at least two blocks, through the end
343 of the record. Old tar, as previous versions of GNU tar, writes
344 garbage after two zeroed blocks. */
345 void
346 write_eot (void)
347 {
348 union block *pointer = find_next_block ();
349 memset (pointer->buffer, 0, BLOCKSIZE);
350 set_next_block_after (pointer);
351 pointer = find_next_block ();
352 memset (pointer->buffer, 0, available_space_after (pointer));
353 set_next_block_after (pointer);
354 }
355
356 /* Write a "private" header */
357 static union block *
358 start_private_header (const char *name, size_t size)
359 {
360 time_t t;
361 union block *header = find_next_block ();
362
363 memset (header->buffer, 0, sizeof (union block));
364
365 strncpy (header->header.name, name, NAME_FIELD_SIZE);
366 header->header.name[NAME_FIELD_SIZE - 1] = '\0';
367 OFF_TO_CHARS (size, header->header.size);
368
369 time (&t);
370 TIME_TO_CHARS (t, header->header.mtime);
371 MODE_TO_CHARS (S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, header->header.mode);
372 UID_TO_CHARS (getuid (), header->header.uid);
373 GID_TO_CHARS (getgid (), header->header.gid);
374 MAJOR_TO_CHARS (0, header->header.devmajor);
375 MAJOR_TO_CHARS (0, header->header.devminor);
376 strncpy (header->header.magic, TMAGIC, TMAGLEN);
377 strncpy (header->header.version, TVERSION, TVERSLEN);
378 return header;
379 }
380
381 /* Create a new header and store there at most NAME_FIELD_SIZE bytes of
382 the file name */
383
384 static union block *
385 write_short_name (struct tar_stat_info *st)
386 {
387 union block *header = find_next_block ();
388 memset (header->buffer, 0, sizeof (union block));
389
390 strncpy (header->header.name, st->file_name, NAME_FIELD_SIZE);
391 header->header.name[NAME_FIELD_SIZE - 1] = '\0';
392 return header;
393 }
394
395 /* Write a GNUTYPE_LONGLINK or GNUTYPE_LONGNAME block. */
396 static void
397 write_gnu_long_link (const char *p, char type)
398 {
399 size_t size = strlen (p) + 1;
400 size_t bufsize;
401 union block *header;
402
403 header = start_private_header ("././@LongLink", size);
404 header->header.typeflag = type;
405 finish_header (header, -1);
406
407 header = find_next_block ();
408
409 bufsize = available_space_after (header);
410
411 while (bufsize < size)
412 {
413 memcpy (header->buffer, p, bufsize);
414 p += bufsize;
415 size -= bufsize;
416 set_next_block_after (header + (bufsize - 1) / BLOCKSIZE);
417 header = find_next_block ();
418 bufsize = available_space_after (header);
419 }
420 memcpy (header->buffer, p, size);
421 memset (header->buffer + size, 0, bufsize - size);
422 set_next_block_after (header + (size - 1) / BLOCKSIZE);
423 }
424
425 static size_t
426 split_long_name (const char *name, size_t length)
427 {
428 size_t i;
429
430 if (length > PREFIX_FIELD_SIZE)
431 length = PREFIX_FIELD_SIZE+2;
432 for (i = length - 1; i > 0; i--)
433 if (ISSLASH (name[i]))
434 break;
435 return i;
436 }
437
438 static union block *
439 write_ustar_long_name (const char *name)
440 {
441 size_t length = strlen (name);
442 size_t i;
443 union block *header;
444
445 if (length > PREFIX_FIELD_SIZE + NAME_FIELD_SIZE + 1)
446 {
447 WARN ((0, 0, _("%s: file name is too long (max %d); not dumped"),
448 quotearg_colon (name),
449 PREFIX_FIELD_SIZE + NAME_FIELD_SIZE + 1));
450 return NULL;
451 }
452
453 i = split_long_name (name, length);
454 if (i == 0)
455 {
456 WARN ((0, 0,
457 _("%s: file name is too long (cannot be split); not dumped"),
458 quotearg_colon (name),
459 PREFIX_FIELD_SIZE + NAME_FIELD_SIZE + 1));
460 return NULL;
461 }
462
463 header = find_next_block ();
464 memset (header->buffer, 0, sizeof (header->buffer));
465 memcpy (header->header.prefix, name, i);
466 memcpy (header->header.name, name + i + 1, length - i);
467
468 return header;
469 }
470
471 /* Write a long link name, depending on the current archive format */
472 static void
473 write_long_link (struct tar_stat_info *st)
474 {
475 switch (archive_format)
476 {
477 case POSIX_FORMAT:
478 xheader_store ("linkpath", st);
479 break;
480
481 case V7_FORMAT: /* old V7 tar format */
482 case USTAR_FORMAT:
483 case STAR_FORMAT:
484 WARN ((0, 0,
485 _("%s: link name is too long; not dumped"),
486 quotearg_colon (st->link_name)));
487 break;
488
489 case OLDGNU_FORMAT:
490 case GNU_FORMAT:
491 write_gnu_long_link (st->link_name, GNUTYPE_LONGLINK);
492 break;
493
494 default:
495 abort(); /*FIXME*/
496 }
497 }
498
499 static union block *
500 write_long_name (struct tar_stat_info *st)
501 {
502 switch (archive_format)
503 {
504 case POSIX_FORMAT:
505 xheader_store ("path", st);
506 break;
507
508 case V7_FORMAT:
509 case USTAR_FORMAT:
510 case STAR_FORMAT:
511 return write_ustar_long_name (st->file_name);
512
513 case OLDGNU_FORMAT:
514 case GNU_FORMAT:
515 write_gnu_long_link (st->file_name, GNUTYPE_LONGNAME);
516 break;
517
518 default:
519 abort(); /*FIXME*/
520 }
521 return write_short_name (st);
522 }
523
524 static union block *
525 write_extended (union block *old_header, char type)
526 {
527 union block *header, hp;
528 struct tar_stat_info foo;
529 size_t size;
530 char *p;
531
532 if (extended_header.buffer || extended_header.stk == NULL)
533 return old_header;
534
535 xheader_finish (&extended_header);
536 size = extended_header.size;
537
538 memcpy (hp.buffer, old_header, sizeof (hp));
539
540 header = start_private_header ("././@PaxHeader", size);
541 header->header.typeflag = type;
542
543 finish_header (header, -1);
544
545 p = extended_header.buffer;
546
547 do
548 {
549 size_t len;
550
551 header = find_next_block ();
552 len = BLOCKSIZE;
553 if (len > size)
554 len = size;
555 memcpy (header->buffer, p, len);
556 if (len < BLOCKSIZE)
557 memset (header->buffer + len, 0, BLOCKSIZE - len);
558 p += len;
559 size -= len;
560 set_next_block_after (header);
561 }
562 while (size > 0);
563
564 xheader_destroy (&extended_header);
565 header = find_next_block ();
566 memcpy (header, &hp.buffer, sizeof (hp.buffer));
567 return header;
568 }
569
570 static union block *
571 write_header_name (struct tar_stat_info *st)
572 {
573 if (NAME_FIELD_SIZE <= strlen (st->file_name))
574 return write_long_name (st);
575 else
576 return write_short_name (st);
577 }
578
579 \f
580 /* Header handling. */
581
582 /* Make a header block for the file whose stat info is st,
583 and return its address. */
584
585 static union block *
586 start_header (const char *name, struct tar_stat_info *st)
587 {
588 union block *header;
589
590 name = safer_name_suffix (name, 0);
591 assign_string (&st->file_name, name);
592
593 header = write_header_name (st);
594 if (!header)
595 return NULL;
596
597 assign_string (&current_stat_info.file_name, name);
598
599 /* Override some stat fields, if requested to do so. */
600
601 if (owner_option != (uid_t) -1)
602 st->stat.st_uid = owner_option;
603 if (group_option != (gid_t) -1)
604 st->stat.st_gid = group_option;
605 if (mode_option)
606 st->stat.st_mode = ((st->stat.st_mode & ~MODE_ALL)
607 | mode_adjust (st->stat.st_mode, mode_option));
608
609 /* Paul Eggert tried the trivial test ($WRITER cf a b; $READER tvf a)
610 for a few tars and came up with the following interoperability
611 matrix:
612
613 WRITER
614 1 2 3 4 5 6 7 8 9 READER
615 . . . . . . . . . 1 = SunOS 4.2 tar
616 # . . # # . . # # 2 = NEC SVR4.0.2 tar
617 . . . # # . . # . 3 = Solaris 2.1 tar
618 . . . . . . . . . 4 = GNU tar 1.11.1
619 . . . . . . . . . 5 = HP-UX 8.07 tar
620 . . . . . . . . . 6 = Ultrix 4.1
621 . . . . . . . . . 7 = AIX 3.2
622 . . . . . . . . . 8 = Hitachi HI-UX 1.03
623 . . . . . . . . . 9 = Omron UNIOS-B 4.3BSD 1.60Beta
624
625 . = works
626 # = ``impossible file type''
627
628 The following mask for old archive removes the `#'s in column 4
629 above, thus making GNU tar both a universal donor and a universal
630 acceptor for Paul's test. */
631
632 if (archive_format == V7_FORMAT || archive_format == USTAR_FORMAT)
633 MODE_TO_CHARS (st->stat.st_mode & MODE_ALL, header->header.mode);
634 else
635 MODE_TO_CHARS (st->stat.st_mode, header->header.mode);
636
637 if (st->stat.st_uid > MAXOCTAL7 && archive_format == POSIX_FORMAT)
638 xheader_store ("uid", st);
639 else
640 UID_TO_CHARS (st->stat.st_uid, header->header.uid);
641
642 if (st->stat.st_gid > MAXOCTAL7 && archive_format == POSIX_FORMAT)
643 xheader_store ("gid", st);
644 else
645 GID_TO_CHARS (st->stat.st_gid, header->header.gid);
646
647 if (st->stat.st_size > MAXOCTAL11 && archive_format == POSIX_FORMAT)
648 xheader_store ("size", st);
649 else
650 OFF_TO_CHARS (st->stat.st_size, header->header.size);
651
652 TIME_TO_CHARS (st->stat.st_mtime, header->header.mtime);
653
654 /* FIXME */
655 if (S_ISCHR (st->stat.st_mode)
656 || S_ISBLK (st->stat.st_mode))
657 {
658 st->devmajor = major (st->stat.st_rdev);
659 st->devminor = minor (st->stat.st_rdev);
660
661 if (st->devmajor > MAXOCTAL7 && archive_format == POSIX_FORMAT)
662 xheader_store ("devmajor", st);
663 else
664 MAJOR_TO_CHARS (st->devmajor, header->header.devmajor);
665
666 if (st->devminor > MAXOCTAL7 && archive_format == POSIX_FORMAT)
667 xheader_store ("devminor", st);
668 else
669 MAJOR_TO_CHARS (st->devminor, header->header.devminor);
670 }
671 else
672 {
673 MAJOR_TO_CHARS (0, header->header.devmajor);
674 MINOR_TO_CHARS (0, header->header.devminor);
675 }
676
677 if (archive_format == POSIX_FORMAT)
678 {
679 xheader_store ("atime", st);
680 xheader_store ("ctime", st);
681 }
682 else if (incremental_option)
683 if (archive_format == OLDGNU_FORMAT)
684 {
685 TIME_TO_CHARS (st->stat.st_atime, header->oldgnu_header.atime);
686 TIME_TO_CHARS (st->stat.st_ctime, header->oldgnu_header.ctime);
687 }
688
689 header->header.typeflag = archive_format == V7_FORMAT ? AREGTYPE : REGTYPE;
690
691 switch (archive_format)
692 {
693 case V7_FORMAT:
694 break;
695
696 case OLDGNU_FORMAT:
697 /* Overwrite header->header.magic and header.version in one blow. */
698 strcpy (header->header.magic, OLDGNU_MAGIC);
699 break;
700
701 case POSIX_FORMAT:
702 case USTAR_FORMAT:
703 case GNU_FORMAT: /*FIXME?*/
704 strncpy (header->header.magic, TMAGIC, TMAGLEN);
705 strncpy (header->header.version, TVERSION, TVERSLEN);
706 break;
707
708 default:
709 abort ();
710 }
711
712 if (archive_format == V7_FORMAT || numeric_owner_option)
713 {
714 /* header->header.[ug]name are left as the empty string. */
715 }
716 else
717 {
718 uid_to_uname (st->stat.st_uid, &st->uname);
719 gid_to_gname (st->stat.st_gid, &st->gname);
720
721 if (archive_format == POSIX_FORMAT
722 && strlen (st->uname) > UNAME_FIELD_SIZE)
723 xheader_store ("uname", st);
724 else
725 UNAME_TO_CHARS (st->uname, header->header.uname);
726
727 if (archive_format == POSIX_FORMAT
728 && strlen (st->gname) > GNAME_FIELD_SIZE)
729 xheader_store ("gname", st);
730 else
731 GNAME_TO_CHARS (st->gname, header->header.gname);
732 }
733
734 return header;
735 }
736
737 /* Finish off a filled-in header block and write it out. We also
738 print the file name and/or full info if verbose is on. If BLOCK_ORDINAL
739 is not negative, is the block ordinal of the first record for this
740 file, which may be a preceding long name or long link record. */
741 void
742 finish_header (union block *header, off_t block_ordinal)
743 {
744 size_t i;
745 int sum;
746 char *p;
747
748 /* Note: It is important to do this before the call to write_extended(),
749 so that the actual ustar header is printed */
750 if (verbose_option
751 && header->header.typeflag != GNUTYPE_LONGLINK
752 && header->header.typeflag != GNUTYPE_LONGNAME
753 && header->header.typeflag != XHDTYPE
754 && header->header.typeflag != XGLTYPE)
755 {
756 /* These globals are parameters to print_header, sigh. */
757
758 current_header = header;
759 /* current_stat_info is already set up. */
760 current_format = archive_format;
761 print_header (block_ordinal);
762 }
763
764 header = write_extended (header, XHDTYPE);
765
766 memcpy (header->header.chksum, CHKBLANKS, sizeof header->header.chksum);
767
768 sum = 0;
769 p = header->buffer;
770 for (i = sizeof *header; i-- != 0; )
771 /* We can't use unsigned char here because of old compilers, e.g. V7. */
772 sum += 0xFF & *p++;
773
774 /* Fill in the checksum field. It's formatted differently from the
775 other fields: it has [6] digits, a null, then a space -- rather than
776 digits, then a null. We use to_chars.
777 The final space is already there, from
778 checksumming, and to_chars doesn't modify it.
779
780 This is a fast way to do:
781
782 sprintf(header->header.chksum, "%6o", sum); */
783
784 uintmax_to_chars ((uintmax_t) sum, header->header.chksum, 7);
785
786 set_next_block_after (header);
787 }
788 \f
789 /* Sparse file processing. */
790
791 /* Takes a blockful of data and basically cruises through it to see if
792 it's made *entirely* of zeros, returning a 0 the instant it finds
793 something that is a nonzero, i.e., useful data. */
794 static int
795 zero_block_p (char *buffer)
796 {
797 int counter;
798
799 for (counter = 0; counter < BLOCKSIZE; counter++)
800 if (buffer[counter] != '\0')
801 return 0;
802 return 1;
803 }
804
805 void
806 init_sparsearray (void)
807 {
808 if (! sp_array_size)
809 sp_array_size = SPARSES_IN_OLDGNU_HEADER;
810 sparsearray = xmalloc (sp_array_size * sizeof *sparsearray);
811 }
812
813 static off_t
814 find_new_file_size (int sparses)
815 {
816 int i;
817 off_t s = 0;
818 for (i = 0; i < sparses; i++)
819 s += sparsearray[i].numbytes;
820 return s;
821 }
822
823 /* Make one pass over the file NAME, studying where any non-zero data
824 is, that is, how far into the file each instance of data is, and
825 how many bytes are there. Save this information in the
826 sparsearray, which will later be translated into header
827 information. */
828
829 /* There is little point in trimming small amounts of null data at the head
830 and tail of blocks, only avoid dumping full null blocks. */
831
832 /* FIXME: this routine might accept bits of algorithmic cleanup, it is
833 too kludgey for my taste... */
834
835 static int
836 deal_with_sparse (char *name, union block *header)
837 {
838 size_t numbytes = 0;
839 off_t offset = 0;
840 int file;
841 int sparses = 0;
842 ssize_t count;
843 char buffer[BLOCKSIZE];
844
845 if (archive_format == OLDGNU_FORMAT)
846 header->oldgnu_header.isextended = 0;
847
848 if (file = open (name, O_RDONLY), file < 0)
849 /* This problem will be caught later on, so just return. */
850 return 0;
851
852 init_sparsearray ();
853 clear_buffer (buffer);
854
855 for (;;)
856 {
857 /* Realloc the scratch area as necessary. FIXME: should reallocate
858 only at beginning of a new instance of non-zero data. */
859
860 if (sp_array_size <= sparses)
861 {
862 sparsearray =
863 xrealloc (sparsearray,
864 2 * sp_array_size * sizeof (struct sp_array));
865 sp_array_size *= 2;
866 }
867
868 count = safe_read (file, buffer, sizeof buffer);
869 if (count <= 0)
870 break;
871
872 /* Process one block. */
873
874 if (count == sizeof buffer)
875
876 if (zero_block_p (buffer))
877 {
878 if (numbytes)
879 {
880 sparsearray[sparses++].numbytes = numbytes;
881 numbytes = 0;
882 }
883 }
884 else
885 {
886 if (!numbytes)
887 sparsearray[sparses].offset = offset;
888 numbytes += count;
889 }
890
891 else
892
893 /* Since count < sizeof buffer, we have the last bit of the file. */
894
895 if (!zero_block_p (buffer))
896 {
897 if (!numbytes)
898 sparsearray[sparses].offset = offset;
899 numbytes += count;
900 }
901 else
902 /* The next two lines are suggested by Andreas Degert, who says
903 they are required for trailing full blocks to be written to the
904 archive, when all zeroed. Yet, it seems to me that the case
905 does not apply. Further, at restore time, the file is not as
906 sparse as it should. So, some serious cleanup is *also* needed
907 in this area. Just one more... :-(. FIXME. */
908 if (numbytes)
909 numbytes += count;
910
911 /* Prepare for next block. */
912
913 offset += count;
914 /* FIXME: do not clear unless necessary. */
915 clear_buffer (buffer);
916 }
917
918 if (numbytes)
919 sparsearray[sparses++].numbytes = numbytes;
920 else
921 {
922 sparsearray[sparses].offset = offset - 1;
923 sparsearray[sparses++].numbytes = 1;
924 }
925
926 return close (file) == 0 && 0 <= count ? sparses : 0;
927 }
928
929 static int
930 finish_sparse_file (int file, off_t *sizeleft, off_t fullsize, char *name)
931 {
932 union block *start;
933 size_t bufsize;
934 int sparses = 0;
935 ssize_t count;
936
937 while (*sizeleft > 0)
938 {
939 start = find_next_block ();
940 memset (start->buffer, 0, BLOCKSIZE);
941 bufsize = sparsearray[sparses].numbytes;
942 if (! bufsize)
943 abort ();
944
945 if (lseek (file, sparsearray[sparses++].offset, SEEK_SET) < 0)
946 {
947 (ignore_failed_read_option ? seek_warn_details : seek_error_details)
948 (name, sparsearray[sparses - 1].offset);
949 break;
950 }
951
952 /* If the number of bytes to be written here exceeds the size of
953 the temporary buffer, do it in steps. */
954
955 while (bufsize > BLOCKSIZE)
956 {
957 count = safe_read (file, start->buffer, BLOCKSIZE);
958 if (count < 0)
959 {
960 (ignore_failed_read_option
961 ? read_warn_details
962 : read_error_details)
963 (name, fullsize - *sizeleft, bufsize);
964 return 1;
965 }
966 bufsize -= count;
967 *sizeleft -= count;
968 set_next_block_after (start);
969 start = find_next_block ();
970 memset (start->buffer, 0, BLOCKSIZE);
971 }
972
973 {
974 char buffer[BLOCKSIZE];
975
976 clear_buffer (buffer);
977 count = safe_read (file, buffer, bufsize);
978 memcpy (start->buffer, buffer, BLOCKSIZE);
979 }
980
981 if (count < 0)
982 {
983 (ignore_failed_read_option
984 ? read_warn_details
985 : read_error_details)
986 (name, fullsize - *sizeleft, bufsize);
987 return 1;
988 }
989
990 *sizeleft -= count;
991 set_next_block_after (start);
992 }
993 free (sparsearray);
994 #if 0
995 set_next_block_after (start + (count - 1) / BLOCKSIZE);
996 #endif
997 return 0;
998 }
999 \f
1000 /* Main functions of this module. */
1001
1002 void
1003 create_archive (void)
1004 {
1005 char *p;
1006
1007 open_archive (ACCESS_WRITE);
1008
1009 if (incremental_option)
1010 {
1011 size_t buffer_size = 1000;
1012 char *buffer = xmalloc (buffer_size);
1013 const char *q;
1014
1015 collect_and_sort_names ();
1016
1017 while (p = name_from_list (), p)
1018 if (!excluded_name (p))
1019 dump_file (p, -1, (dev_t) 0);
1020
1021 blank_name_list ();
1022 while (p = name_from_list (), p)
1023 if (!excluded_name (p))
1024 {
1025 size_t plen = strlen (p);
1026 if (buffer_size <= plen)
1027 {
1028 while ((buffer_size *= 2) <= plen)
1029 continue;
1030 buffer = xrealloc (buffer, buffer_size);
1031 }
1032 memcpy (buffer, p, plen);
1033 if (! ISSLASH (buffer[plen - 1]))
1034 buffer[plen++] = '/';
1035 q = gnu_list_name->dir_contents;
1036 if (q)
1037 while (*q)
1038 {
1039 size_t qlen = strlen (q);
1040 if (*q == 'Y')
1041 {
1042 if (buffer_size < plen + qlen)
1043 {
1044 while ((buffer_size *=2 ) < plen + qlen)
1045 continue;
1046 buffer = xrealloc (buffer, buffer_size);
1047 }
1048 strcpy (buffer + plen, q + 1);
1049 dump_file (buffer, -1, (dev_t) 0);
1050 }
1051 q += qlen + 1;
1052 }
1053 }
1054 free (buffer);
1055 }
1056 else
1057 {
1058 while (p = name_next (1), p)
1059 if (!excluded_name (p))
1060 dump_file (p, 1, (dev_t) 0);
1061 }
1062
1063 write_eot ();
1064 close_archive ();
1065
1066 if (listed_incremental_option)
1067 write_directory_file ();
1068 }
1069
1070
1071 /* Calculate the hash of a link. */
1072 static unsigned
1073 hash_link (void const *entry, unsigned n_buckets)
1074 {
1075 struct link const *link = entry;
1076 return (uintmax_t) (link->dev ^ link->ino) % n_buckets;
1077 }
1078
1079 /* Compare two links for equality. */
1080 static bool
1081 compare_links (void const *entry1, void const *entry2)
1082 {
1083 struct link const *link1 = entry1;
1084 struct link const *link2 = entry2;
1085 return ((link1->dev ^ link2->dev) | (link1->ino ^ link2->ino)) == 0;
1086 }
1087
1088 /* Copy at most LEN bytes from SRC to DST. Terminate with NUL unless
1089 SRC is LEN characters long */
1090 static void
1091 tar_copy_str (char *dst, const char *src, size_t len)
1092 {
1093 dst[len-1] = 0;
1094 strncpy (dst, src, len);
1095 }
1096
1097 /* Table of all non-directories that we've written so far. Any time
1098 we see another, we check the table and avoid dumping the data
1099 again if we've done it once already. */
1100 static Hash_table *link_table;
1101
1102 /* Dump a single file, recursing on directories. P is the file name
1103 to dump. TOP_LEVEL tells whether this is a top-level call; zero
1104 means no, positive means yes, and negative means the top level
1105 of an incremental dump. PARENT_DEVICE is the device of P's
1106 parent directory; it is examined only if TOP_LEVEL is zero.
1107
1108 Set global CURRENT_STAT_INFO to stat output for this file. */
1109
1110 /* FIXME: One should make sure that for *every* path leading to setting
1111 exit_status to failure, a clear diagnostic has been issued. */
1112
1113 void
1114 dump_file (char *p, int top_level, dev_t parent_device)
1115 {
1116 union block *header;
1117 char type;
1118 union block *exhdr;
1119 char save_typeflag;
1120 time_t original_ctime;
1121 struct utimbuf restore_times;
1122 off_t block_ordinal = -1;
1123
1124 /* FIXME: `header' might be used uninitialized in this
1125 function. Reported by Bruno Haible. */
1126
1127 if (interactive_option && !confirm ("add", p))
1128 return;
1129
1130 if (deref_stat (dereference_option, p, &current_stat_info.stat) != 0)
1131 {
1132 if (ignore_failed_read_option)
1133 stat_warn (p);
1134 else
1135 stat_error (p);
1136 return;
1137 }
1138
1139 original_ctime = current_stat_info.stat.st_ctime;
1140 restore_times.actime = current_stat_info.stat.st_atime;
1141 restore_times.modtime = current_stat_info.stat.st_mtime;
1142
1143 #ifdef S_ISHIDDEN
1144 if (S_ISHIDDEN (current_stat_info.stat.st_mode))
1145 {
1146 char *new = (char *) alloca (strlen (p) + 2);
1147 if (new)
1148 {
1149 strcpy (new, p);
1150 strcat (new, "@");
1151 p = new;
1152 }
1153 }
1154 #endif
1155
1156 /* See if we want only new files, and check if this one is too old to
1157 put in the archive. */
1158
1159 if ((0 < top_level || !incremental_option)
1160 && !S_ISDIR (current_stat_info.stat.st_mode)
1161 && current_stat_info.stat.st_mtime < newer_mtime_option
1162 && (!after_date_option || current_stat_info.stat.st_ctime < newer_ctime_option))
1163 {
1164 if (0 < top_level)
1165 WARN ((0, 0, _("%s: file is unchanged; not dumped"),
1166 quotearg_colon (p)));
1167 /* FIXME: recheck this return. */
1168 return;
1169 }
1170
1171 /* See if we are trying to dump the archive. */
1172 if (sys_file_is_archive (&current_stat_info))
1173 {
1174 WARN ((0, 0, _("%s: file is the archive; not dumped"),
1175 quotearg_colon (p)));
1176 return;
1177 }
1178
1179 if (S_ISDIR (current_stat_info.stat.st_mode))
1180 {
1181 char *directory;
1182 char const *entry;
1183 size_t entrylen;
1184 char *namebuf;
1185 size_t buflen;
1186 size_t len;
1187 dev_t our_device = current_stat_info.stat.st_dev;
1188
1189 errno = 0;
1190
1191 directory = savedir (p);
1192 if (! directory)
1193 {
1194 if (ignore_failed_read_option)
1195 savedir_warn (p);
1196 else
1197 savedir_error (p);
1198 return;
1199 }
1200
1201 /* Build new prototype name. Ensure exactly one trailing slash. */
1202
1203 len = strlen (p);
1204 buflen = len + NAME_FIELD_SIZE;
1205 namebuf = xmalloc (buflen + 1);
1206 memcpy (namebuf, p, len);
1207 while (len >= 1 && ISSLASH (namebuf[len - 1]))
1208 len--;
1209 namebuf[len++] = '/';
1210 namebuf[len] = '\0';
1211
1212 if (! is_avoided_name (namebuf))
1213 {
1214 /* The condition above used to be "archive_format != V7_FORMAT".
1215 GNU tar was not writing directory blocks at all. Daniel Trinkle
1216 writes: ``All old versions of tar I have ever seen have
1217 correctly archived an empty directory. The really old ones I
1218 checked included HP-UX 7 and Mt. Xinu More/BSD. There may be
1219 some subtle reason for the exclusion that I don't know, but the
1220 current behavior is broken.'' I do not know those subtle
1221 reasons either, so until these are reported (anew?), just allow
1222 directory blocks to be written even with old archives. */
1223
1224 block_ordinal = current_block_ordinal ();
1225 current_stat_info.stat.st_size = 0; /* force 0 size on dir */
1226
1227 header = start_header (namebuf, &current_stat_info);
1228 if (!header)
1229 return;
1230
1231 if (incremental_option)
1232 header->header.typeflag = GNUTYPE_DUMPDIR;
1233 else /* if (standard_option) */
1234 header->header.typeflag = DIRTYPE;
1235
1236 /* If we're gnudumping, we aren't done yet so don't close it. */
1237
1238 if (!incremental_option)
1239 finish_header (header, block_ordinal);
1240 }
1241
1242 if (incremental_option && gnu_list_name->dir_contents)
1243 {
1244 off_t sizeleft;
1245 off_t totsize;
1246 size_t bufsize;
1247 union block *start;
1248 ssize_t count;
1249 const char *buffer, *p_buffer;
1250
1251 buffer = gnu_list_name->dir_contents; /* FOO */
1252 totsize = 0;
1253 if (buffer)
1254 for (p_buffer = buffer; *p_buffer; )
1255 {
1256 size_t size = strlen (p_buffer) + 1;
1257 totsize += size;
1258 p_buffer += size;
1259 }
1260 totsize++;
1261 OFF_TO_CHARS (totsize, header->header.size);
1262 finish_header (header, block_ordinal);
1263 p_buffer = buffer;
1264 sizeleft = totsize;
1265 while (sizeleft > 0)
1266 {
1267 if (multi_volume_option)
1268 {
1269 assign_string (&save_name, p);
1270 save_sizeleft = sizeleft;
1271 save_totsize = totsize;
1272 }
1273 start = find_next_block ();
1274 bufsize = available_space_after (start);
1275 if (sizeleft < bufsize)
1276 {
1277 bufsize = sizeleft;
1278 count = bufsize % BLOCKSIZE;
1279 if (count)
1280 memset (start->buffer + sizeleft, 0, BLOCKSIZE - count);
1281 }
1282 memcpy (start->buffer, p_buffer, bufsize);
1283 sizeleft -= bufsize;
1284 p_buffer += bufsize;
1285 set_next_block_after (start + (bufsize - 1) / BLOCKSIZE);
1286 }
1287 if (multi_volume_option)
1288 assign_string (&save_name, 0);
1289 goto finish_dir;
1290 }
1291
1292 /* See if we are about to recurse into a directory, and avoid doing
1293 so if the user wants that we do not descend into directories. */
1294
1295 if (! recursion_option)
1296 goto finish_dir;
1297
1298 /* See if we are crossing from one file system to another, and
1299 avoid doing so if the user only wants to dump one file system. */
1300
1301 if (one_file_system_option && !top_level
1302 && parent_device != current_stat_info.stat.st_dev)
1303 {
1304 if (verbose_option)
1305 WARN ((0, 0,
1306 _("%s: file is on a different filesystem; not dumped"),
1307 quotearg_colon (p)));
1308 goto finish_dir;
1309 }
1310
1311 /* Now output all the files in the directory. */
1312
1313 /* FIXME: Should speed this up by cd-ing into the dir. */
1314
1315 for (entry = directory;
1316 (entrylen = strlen (entry)) != 0;
1317 entry += entrylen + 1)
1318 {
1319 if (buflen < len + entrylen)
1320 {
1321 buflen = len + entrylen;
1322 namebuf = xrealloc (namebuf, buflen + 1);
1323 }
1324 strcpy (namebuf + len, entry);
1325 if (!excluded_name (namebuf))
1326 dump_file (namebuf, 0, our_device);
1327 }
1328
1329 finish_dir:
1330
1331 free (directory);
1332 free (namebuf);
1333 if (atime_preserve_option)
1334 utime (p, &restore_times);
1335 return;
1336 }
1337 else if (is_avoided_name (p))
1338 return;
1339 else
1340 {
1341 /* Check for multiple links. */
1342
1343 if (1 < current_stat_info.stat.st_nlink && link_table)
1344 {
1345 struct link lp;
1346 struct link *dup;
1347 lp.ino = current_stat_info.stat.st_ino;
1348 lp.dev = current_stat_info.stat.st_dev;
1349
1350 if ((dup = hash_lookup (link_table, &lp)))
1351 {
1352 /* We found a link. */
1353 char const *link_name = safer_name_suffix (dup->name, 1);
1354
1355 dup->nlink--;
1356
1357 block_ordinal = current_block_ordinal ();
1358 assign_string (&current_stat_info.link_name, link_name);
1359 if (NAME_FIELD_SIZE < strlen (link_name))
1360 write_long_link (&current_stat_info);
1361
1362 current_stat_info.stat.st_size = 0;
1363 header = start_header (p, &current_stat_info);
1364 if (!header)
1365 return;
1366 tar_copy_str (header->header.linkname, link_name,
1367 NAME_FIELD_SIZE);
1368
1369 header->header.typeflag = LNKTYPE;
1370 finish_header (header, block_ordinal);
1371
1372 /* FIXME: Maybe remove from table after all links found? */
1373
1374 if (remove_files_option && unlink (p) != 0)
1375 unlink_error (p);
1376
1377 /* We dumped it, and we don't need to put it in the
1378 table again. */
1379 return;
1380 }
1381 }
1382
1383 /* This is not a link to a previously dumped file, so dump it. */
1384
1385 if (S_ISREG (current_stat_info.stat.st_mode)
1386 || S_ISCTG (current_stat_info.stat.st_mode))
1387 {
1388 int f; /* file descriptor */
1389 size_t bufsize;
1390 ssize_t count;
1391 off_t sizeleft;
1392 union block *start;
1393 int header_moved;
1394 char isextended = 0;
1395 int sparses = 0;
1396
1397 header_moved = 0;
1398
1399 if (sparse_option)
1400 {
1401 /* Check the size of the file against the number of blocks
1402 allocated for it, counting both data and indirect blocks.
1403 If there is a smaller number of blocks than would be
1404 necessary to accommodate a file of this size, this is safe
1405 to say that we have a sparse file: at least one of those
1406 blocks in the file is just a useless hole. For sparse
1407 files not having more hole blocks than indirect blocks, the
1408 sparseness will go undetected. */
1409
1410 /* Bruno Haible sent me these statistics for Linux. It seems
1411 that some filesystems count indirect blocks in st_blocks,
1412 while others do not seem to:
1413
1414 minix-fs tar: size=7205, st_blocks=18 and ST_NBLOCKS=18
1415 extfs tar: size=7205, st_blocks=18 and ST_NBLOCKS=18
1416 ext2fs tar: size=7205, st_blocks=16 and ST_NBLOCKS=16
1417 msdos-fs tar: size=7205, st_blocks=16 and ST_NBLOCKS=16
1418
1419 Dick Streefland reports the previous numbers as misleading,
1420 because ext2fs use 12 direct blocks, while minix-fs uses only
1421 6 direct blocks. Dick gets:
1422
1423 ext2 size=20480 ls listed blocks=21
1424 minix size=20480 ls listed blocks=21
1425 msdos size=20480 ls listed blocks=20
1426
1427 It seems that indirect blocks *are* included in st_blocks.
1428 The minix filesystem does not account for phantom blocks in
1429 st_blocks, so `du' and `ls -s' give wrong results. So, the
1430 --sparse option would not work on a minix filesystem. */
1431
1432 if (ST_NBLOCKS (current_stat_info.stat)
1433 < (current_stat_info.stat.st_size / ST_NBLOCKSIZE
1434 + (current_stat_info.stat.st_size % ST_NBLOCKSIZE != 0)))
1435 {
1436 int counter;
1437
1438 block_ordinal = current_block_ordinal ();
1439 header = start_header (p, &current_stat_info);
1440 if (!header)
1441 return;
1442 header->header.typeflag = GNUTYPE_SPARSE;
1443 header_moved = 1;
1444
1445 /* Call the routine that figures out the layout of the
1446 sparse file in question. SPARSES is the index of the
1447 first unused element of the "sparsearray," i.e.,
1448 the number of elements it needed to describe the file. */
1449
1450 sparses = deal_with_sparse (p, header);
1451
1452 /* See if we'll need an extended header later. */
1453
1454 if (SPARSES_IN_OLDGNU_HEADER < sparses)
1455 header->oldgnu_header.isextended = 1;
1456
1457 /* We store the "real" file size so we can show that in
1458 case someone wants to list the archive, i.e., tar tvf
1459 <file>. It might be kind of disconcerting if the
1460 shrunken file size was the one that showed up. */
1461
1462 OFF_TO_CHARS (current_stat_info.stat.st_size,
1463 header->oldgnu_header.realsize);
1464
1465 /* This will be the new "size" of the file, i.e., the size
1466 of the file minus the blocks of holes that we're
1467 skipping over. */
1468
1469 current_stat_info.stat.st_size = find_new_file_size (sparses);
1470 OFF_TO_CHARS (current_stat_info.stat.st_size, header->header.size);
1471
1472 for (counter = 0;
1473 counter < sparses && counter < SPARSES_IN_OLDGNU_HEADER;
1474 counter++)
1475 {
1476 OFF_TO_CHARS (sparsearray[counter].offset,
1477 header->oldgnu_header.sp[counter].offset);
1478 SIZE_TO_CHARS (sparsearray[counter].numbytes,
1479 header->oldgnu_header.sp[counter].numbytes);
1480 }
1481 }
1482 }
1483
1484 sizeleft = current_stat_info.stat.st_size;
1485
1486 /* Don't bother opening empty, world readable files. Also do not
1487 open files when archive is meant for /dev/null. */
1488
1489 if (dev_null_output
1490 || (sizeleft == 0
1491 && MODE_R == (MODE_R & current_stat_info.stat.st_mode)))
1492 f = -1;
1493 else
1494 {
1495 f = open (p, O_RDONLY | O_BINARY);
1496 if (f < 0)
1497 {
1498 if (! top_level && errno == ENOENT)
1499 WARN ((0, 0, _("%s: File removed before we read it"),
1500 quotearg_colon (p)));
1501 else
1502 (ignore_failed_read_option ? open_warn : open_error) (p);
1503 return;
1504 }
1505 }
1506
1507 /* If the file is sparse, we've already taken care of this. */
1508
1509 if (!header_moved)
1510 {
1511 block_ordinal = current_block_ordinal ();
1512 header = start_header (p, &current_stat_info);
1513 if (!header)
1514 return;
1515 }
1516
1517 /* Mark contiguous files, if we support them. */
1518
1519 if (archive_format != V7_FORMAT
1520 && S_ISCTG (current_stat_info.stat.st_mode))
1521 header->header.typeflag = CONTTYPE;
1522
1523 if (archive_format == GNU_FORMAT || archive_format == OLDGNU_FORMAT)
1524 isextended = header->oldgnu_header.isextended;
1525 else
1526 isextended = 0;
1527
1528 save_typeflag = header->header.typeflag;
1529 finish_header (header, block_ordinal);
1530 if (isextended)
1531 {
1532 int sparses_emitted = SPARSES_IN_OLDGNU_HEADER;
1533
1534 for (;;)
1535 {
1536 int i;
1537 exhdr = find_next_block ();
1538 memset (exhdr->buffer, 0, BLOCKSIZE);
1539 for (i = 0;
1540 (i < SPARSES_IN_SPARSE_HEADER
1541 && sparses_emitted + i < sparses);
1542 i++)
1543 {
1544 SIZE_TO_CHARS (sparsearray[sparses_emitted + i].numbytes,
1545 exhdr->sparse_header.sp[i].numbytes);
1546 OFF_TO_CHARS (sparsearray[sparses_emitted + i].offset,
1547 exhdr->sparse_header.sp[i].offset);
1548 }
1549 set_next_block_after (exhdr);
1550 sparses_emitted += i;
1551 if (sparses == sparses_emitted)
1552 break;
1553 exhdr->sparse_header.isextended = 1;
1554 }
1555 }
1556 if (save_typeflag == GNUTYPE_SPARSE)
1557 {
1558 if (f < 0
1559 || finish_sparse_file (f, &sizeleft,
1560 current_stat_info.stat.st_size, p))
1561 goto padit;
1562 }
1563 else
1564 while (sizeleft > 0)
1565 {
1566 if (multi_volume_option)
1567 {
1568 assign_string (&save_name, p);
1569 save_sizeleft = sizeleft;
1570 save_totsize = current_stat_info.stat.st_size;
1571 }
1572 start = find_next_block ();
1573
1574 bufsize = available_space_after (start);
1575
1576 if (sizeleft < bufsize)
1577 {
1578 /* Last read -- zero out area beyond. */
1579
1580 bufsize = sizeleft;
1581 count = bufsize % BLOCKSIZE;
1582 if (count)
1583 memset (start->buffer + sizeleft, 0, BLOCKSIZE - count);
1584 }
1585 if (f < 0)
1586 count = bufsize;
1587 else
1588 count = safe_read (f, start->buffer, bufsize);
1589 if (count < 0)
1590 {
1591 (ignore_failed_read_option
1592 ? read_warn_details
1593 : read_error_details)
1594 (p, current_stat_info.stat.st_size - sizeleft, bufsize);
1595 goto padit;
1596 }
1597 sizeleft -= count;
1598
1599 /* This is nonportable (the type of set_next_block_after's arg). */
1600
1601 set_next_block_after (start + (bufsize - 1) / BLOCKSIZE);
1602
1603
1604 if (count != bufsize)
1605 {
1606 char buf[UINTMAX_STRSIZE_BOUND];
1607 memset (start->buffer + count, 0, bufsize - count);
1608 WARN ((0, 0,
1609 ngettext ("%s: File shrank by %s byte; padding with zeros",
1610 "%s: File shrank by %s bytes; padding with zeros",
1611 sizeleft),
1612 quotearg_colon (p),
1613 STRINGIFY_BIGINT (sizeleft, buf)));
1614 if (! ignore_failed_read_option)
1615 exit_status = TAREXIT_FAILURE;
1616 goto padit; /* short read */
1617 }
1618 }
1619
1620 if (multi_volume_option)
1621 assign_string (&save_name, 0);
1622
1623 if (f >= 0)
1624 {
1625 struct stat final_stat;
1626 if (fstat (f, &final_stat) != 0)
1627 {
1628 if (ignore_failed_read_option)
1629 stat_warn (p);
1630 else
1631 stat_error (p);
1632 }
1633 else if (final_stat.st_ctime != original_ctime)
1634 {
1635 char const *qp = quotearg_colon (p);
1636 WARN ((0, 0, _("%s: file changed as we read it"), qp));
1637 }
1638 if (close (f) != 0)
1639 {
1640 if (ignore_failed_read_option)
1641 close_warn (p);
1642 else
1643 close_error (p);
1644 }
1645 if (atime_preserve_option)
1646 utime (p, &restore_times);
1647 }
1648 if (remove_files_option)
1649 {
1650 if (unlink (p) == -1)
1651 unlink_error (p);
1652 }
1653 goto file_was_dumped;
1654
1655 /* File shrunk or gave error, pad out tape to match the size we
1656 specified in the header. */
1657
1658 padit:
1659 while (sizeleft > 0)
1660 {
1661 save_sizeleft = sizeleft;
1662 start = find_next_block ();
1663 memset (start->buffer, 0, BLOCKSIZE);
1664 set_next_block_after (start);
1665 sizeleft -= BLOCKSIZE;
1666 }
1667 if (multi_volume_option)
1668 assign_string (&save_name, 0);
1669 if (f >= 0)
1670 {
1671 close (f);
1672 if (atime_preserve_option)
1673 utime (p, &restore_times);
1674 }
1675 goto file_was_dumped;
1676 }
1677 #ifdef HAVE_READLINK
1678 else if (S_ISLNK (current_stat_info.stat.st_mode))
1679 {
1680 char *buffer;
1681 int size;
1682 size_t linklen = current_stat_info.stat.st_size;
1683 if (linklen != current_stat_info.stat.st_size || linklen + 1 == 0)
1684 xalloc_die ();
1685 buffer = (char *) alloca (linklen + 1);
1686 size = readlink (p, buffer, linklen + 1);
1687 if (size < 0)
1688 {
1689 if (ignore_failed_read_option)
1690 readlink_warn (p);
1691 else
1692 readlink_error (p);
1693 return;
1694 }
1695 buffer[size] = '\0';
1696 assign_string (&current_stat_info.link_name, buffer);
1697 if (size > NAME_FIELD_SIZE)
1698 write_long_link (&current_stat_info);
1699
1700 block_ordinal = current_block_ordinal ();
1701 current_stat_info.stat.st_size = 0; /* force 0 size on symlink */
1702 header = start_header (p, &current_stat_info);
1703 if (!header)
1704 return;
1705 tar_copy_str (header->header.linkname, buffer, NAME_FIELD_SIZE);
1706 header->header.typeflag = SYMTYPE;
1707 finish_header (header, block_ordinal);
1708 /* nothing more to do to it */
1709
1710 if (remove_files_option)
1711 {
1712 if (unlink (p) == -1)
1713 unlink_error (p);
1714 }
1715 goto file_was_dumped;
1716 }
1717 #endif
1718 else if (S_ISCHR (current_stat_info.stat.st_mode))
1719 type = CHRTYPE;
1720 else if (S_ISBLK (current_stat_info.stat.st_mode))
1721 type = BLKTYPE;
1722 else if (S_ISFIFO (current_stat_info.stat.st_mode))
1723 type = FIFOTYPE;
1724 else if (S_ISSOCK (current_stat_info.stat.st_mode))
1725 {
1726 WARN ((0, 0, _("%s: socket ignored"), quotearg_colon (p)));
1727 return;
1728 }
1729 else if (S_ISDOOR (current_stat_info.stat.st_mode))
1730 {
1731 WARN ((0, 0, _("%s: door ignored"), quotearg_colon (p)));
1732 return;
1733 }
1734 else
1735 goto unknown;
1736 }
1737
1738 if (archive_format == V7_FORMAT)
1739 goto unknown;
1740
1741 block_ordinal = current_block_ordinal ();
1742 current_stat_info.stat.st_size = 0; /* force 0 size */
1743 header = start_header (p, &current_stat_info);
1744 if (!header)
1745 return;
1746 header->header.typeflag = type;
1747
1748 if (type != FIFOTYPE)
1749 {
1750 MAJOR_TO_CHARS (major (current_stat_info.stat.st_rdev), header->header.devmajor);
1751 MINOR_TO_CHARS (minor (current_stat_info.stat.st_rdev), header->header.devminor);
1752 }
1753
1754 finish_header (header, block_ordinal);
1755 if (remove_files_option)
1756 {
1757 if (unlink (p) == -1)
1758 unlink_error (p);
1759 }
1760 goto file_was_dumped;
1761
1762 unknown:
1763 WARN ((0, 0, _("%s: Unknown file type; file ignored"),
1764 quotearg_colon (p)));
1765 if (! ignore_failed_read_option)
1766 exit_status = TAREXIT_FAILURE;
1767 return;
1768
1769 file_was_dumped:
1770 if (1 < current_stat_info.stat.st_nlink)
1771 {
1772 struct link *dup;
1773 struct link *lp = xmalloc (offsetof (struct link, name)
1774 + strlen (p) + 1);
1775 lp->ino = current_stat_info.stat.st_ino;
1776 lp->dev = current_stat_info.stat.st_dev;
1777 lp->nlink = current_stat_info.stat.st_nlink;
1778 strcpy (lp->name, p);
1779
1780 if (! ((link_table
1781 || (link_table = hash_initialize (0, 0, hash_link,
1782 compare_links, 0)))
1783 && (dup = hash_insert (link_table, lp))))
1784 xalloc_die ();
1785
1786 if (dup != lp)
1787 abort ();
1788 lp->nlink--;
1789 }
1790
1791 }
1792
1793 /* For each dumped file, check if all its links were dumped. Emit
1794 warnings if it is not so. */
1795 void
1796 check_links ()
1797 {
1798 struct link *lp;
1799
1800 if (!link_table)
1801 return;
1802
1803 for (lp = hash_get_first (link_table); lp;
1804 lp = hash_get_next (link_table, lp))
1805 {
1806 if (lp->nlink)
1807 {
1808 WARN ((0, 0, _("Missing links to '%s'.\n"), lp->name));
1809 }
1810 }
1811 }
This page took 0.108337 seconds and 5 git commands to generate.