]> Dogcows Code - chaz/tar/blob - src/create.c
Moved system dependencies to system.c
[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 GNUTYPE_LONGLINK or GNUTYPE_LONGNAME block. */
357
358 /* FIXME: Cross recursion between start_header and write_long! */
359
360 static union block *start_header (const char *, struct tar_stat_info *);
361
362 static void
363 write_long (const char *p, char type)
364 {
365 size_t size = strlen (p) + 1;
366 size_t bufsize;
367 union block *header;
368 struct tar_stat_info foo;
369
370 memset (&foo, 0, sizeof foo);
371 foo.stat.st_size = size;
372
373 header = start_header ("././@LongLink", &foo);
374 header->header.typeflag = type;
375 finish_header (header, -1);
376
377 header = find_next_block ();
378
379 bufsize = available_space_after (header);
380
381 while (bufsize < size)
382 {
383 memcpy (header->buffer, p, bufsize);
384 p += bufsize;
385 size -= bufsize;
386 set_next_block_after (header + (bufsize - 1) / BLOCKSIZE);
387 header = find_next_block ();
388 bufsize = available_space_after (header);
389 }
390 memcpy (header->buffer, p, size);
391 memset (header->buffer + size, 0, bufsize - size);
392 set_next_block_after (header + (size - 1) / BLOCKSIZE);
393 }
394
395 /* Write a long link name, depending on the current archive format */
396 static void
397 write_long_link (struct tar_stat_info *st)
398 {
399 if (archive_format == POSIX_FORMAT)
400 xheader_store ("linkpath", st);
401 else
402 write_long (st->link_name, GNUTYPE_LONGNAME);
403 }
404
405 /* NOTE: Cross recursion between start_header and write_extended */
406
407 static union block *
408 write_extended (union block *old_header, char type)
409 {
410 union block *header, hp;
411 struct tar_stat_info foo;
412 size_t size;
413 char *p;
414
415 if (extended_header.buffer || extended_header.stk == NULL)
416 return old_header; /* Prevent recursion */
417
418 xheader_finish (&extended_header);
419 size = extended_header.size;
420 memset (&foo, 0, sizeof foo);
421 foo.stat.st_mode = S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH;
422 time (&foo.stat.st_ctime);
423 foo.stat.st_atime = foo.stat.st_ctime;
424 foo.stat.st_mtime = foo.stat.st_ctime;
425 foo.stat.st_size = size;
426
427 memcpy (hp.buffer, old_header, sizeof (hp));
428
429 header = start_header ("././@PaxHeader", &foo);
430 header->header.typeflag = type;
431
432 finish_header (header, -1);
433
434 p = extended_header.buffer;
435
436 do
437 {
438 size_t len;
439
440 header = find_next_block ();
441 len = BLOCKSIZE;
442 if (len > size)
443 len = size;
444 memcpy (header->buffer, p, len);
445 if (len < BLOCKSIZE)
446 memset (header->buffer + len, 0, BLOCKSIZE - len);
447 p += len;
448 size -= len;
449 set_next_block_after (header);
450 }
451 while (size > 0);
452
453 xheader_destroy (&extended_header);
454 header = find_next_block ();
455 memcpy (header, &hp.buffer, sizeof (hp.buffer));
456 return header;
457 }
458
459 \f
460 /* Header handling. */
461
462 /* Make a header block for the file whose stat info is st,
463 and return its address. */
464
465 static union block *
466 start_header (const char *name, struct tar_stat_info *st)
467 {
468 union block *header;
469
470 name = safer_name_suffix (name, 0);
471 assign_string (&st->file_name, name);
472
473 if (sizeof header->header.name <= strlen (name))
474 {
475 if (archive_format == POSIX_FORMAT)
476 xheader_store ("path", st);
477 else
478 write_long (name, GNUTYPE_LONGNAME);
479 }
480
481 header = find_next_block ();
482 memset (header->buffer, 0, sizeof (union block));
483
484 assign_string (&current_stat_info.file_name, name);
485
486 strncpy (header->header.name, name, NAME_FIELD_SIZE);
487 header->header.name[NAME_FIELD_SIZE - 1] = '\0';
488
489 /* Override some stat fields, if requested to do so. */
490
491 if (owner_option != (uid_t) -1)
492 st->stat.st_uid = owner_option;
493 if (group_option != (gid_t) -1)
494 st->stat.st_gid = group_option;
495 if (mode_option)
496 st->stat.st_mode = ((st->stat.st_mode & ~MODE_ALL)
497 | mode_adjust (st->stat.st_mode, mode_option));
498
499 /* Paul Eggert tried the trivial test ($WRITER cf a b; $READER tvf a)
500 for a few tars and came up with the following interoperability
501 matrix:
502
503 WRITER
504 1 2 3 4 5 6 7 8 9 READER
505 . . . . . . . . . 1 = SunOS 4.2 tar
506 # . . # # . . # # 2 = NEC SVR4.0.2 tar
507 . . . # # . . # . 3 = Solaris 2.1 tar
508 . . . . . . . . . 4 = GNU tar 1.11.1
509 . . . . . . . . . 5 = HP-UX 8.07 tar
510 . . . . . . . . . 6 = Ultrix 4.1
511 . . . . . . . . . 7 = AIX 3.2
512 . . . . . . . . . 8 = Hitachi HI-UX 1.03
513 . . . . . . . . . 9 = Omron UNIOS-B 4.3BSD 1.60Beta
514
515 . = works
516 # = ``impossible file type''
517
518 The following mask for old archive removes the `#'s in column 4
519 above, thus making GNU tar both a universal donor and a universal
520 acceptor for Paul's test. */
521
522 if (archive_format == V7_FORMAT)
523 MODE_TO_CHARS (st->stat.st_mode & MODE_ALL, header->header.mode);
524 else
525 MODE_TO_CHARS (st->stat.st_mode, header->header.mode);
526
527 if (st->stat.st_uid > MAXOCTAL7 && archive_format == POSIX_FORMAT)
528 xheader_store ("uid", st);
529 else
530 UID_TO_CHARS (st->stat.st_uid, header->header.uid);
531
532 if (st->stat.st_gid > MAXOCTAL7 && archive_format == POSIX_FORMAT)
533 xheader_store ("gid", st);
534 else
535 GID_TO_CHARS (st->stat.st_gid, header->header.gid);
536
537 if (st->stat.st_size > MAXOCTAL11 && archive_format == POSIX_FORMAT)
538 xheader_store ("size", st);
539 else
540 OFF_TO_CHARS (st->stat.st_size, header->header.size);
541
542 TIME_TO_CHARS (st->stat.st_mtime, header->header.mtime);
543
544 /* FIXME */
545 if (S_ISCHR (st->stat.st_mode)
546 || S_ISBLK (st->stat.st_mode))
547 {
548 st->devmajor = major (st->stat.st_rdev);
549 st->devminor = minor (st->stat.st_rdev);
550
551 if (st->devmajor > MAXOCTAL7 && archive_format == POSIX_FORMAT)
552 xheader_store ("devmajor", st);
553 else
554 MAJOR_TO_CHARS (st->devmajor, header->header.devmajor);
555
556 if (st->devminor > MAXOCTAL7 && archive_format == POSIX_FORMAT)
557 xheader_store ("devminor", st);
558 else
559 MAJOR_TO_CHARS (st->devminor, header->header.devminor);
560 }
561 else
562 {
563 MAJOR_TO_CHARS (0, header->header.devmajor);
564 MINOR_TO_CHARS (0, header->header.devminor);
565 }
566
567 if (archive_format == POSIX_FORMAT)
568 {
569 xheader_store ("atime", st);
570 xheader_store ("ctime", st);
571 }
572 else if (incremental_option)
573 if (archive_format == OLDGNU_FORMAT)
574 {
575 TIME_TO_CHARS (st->stat.st_atime, header->oldgnu_header.atime);
576 TIME_TO_CHARS (st->stat.st_ctime, header->oldgnu_header.ctime);
577 }
578
579 header->header.typeflag = archive_format == V7_FORMAT ? AREGTYPE : REGTYPE;
580
581 switch (archive_format)
582 {
583 case V7_FORMAT:
584 break;
585
586 case OLDGNU_FORMAT:
587 /* Overwrite header->header.magic and header.version in one blow. */
588 strcpy (header->header.magic, OLDGNU_MAGIC);
589 break;
590
591 case POSIX_FORMAT:
592 case GNU_FORMAT:
593 strncpy (header->header.magic, TMAGIC, TMAGLEN);
594 strncpy (header->header.version, TVERSION, TVERSLEN);
595 break;
596
597 default:
598 abort ();
599 }
600
601 if (archive_format == V7_FORMAT || numeric_owner_option)
602 {
603 /* header->header.[ug]name are left as the empty string. */
604 }
605 else
606 {
607 uid_to_uname (st->stat.st_uid, &st->uname);
608 gid_to_gname (st->stat.st_gid, &st->gname);
609
610 if (archive_format == POSIX_FORMAT
611 && strlen (st->uname) > UNAME_FIELD_SIZE)
612 xheader_store ("uname", st);
613 else
614 UNAME_TO_CHARS (st->uname, header->header.uname);
615
616 if (archive_format == POSIX_FORMAT
617 && strlen (st->gname) > GNAME_FIELD_SIZE)
618 xheader_store ("gname", st);
619 else
620 GNAME_TO_CHARS (st->gname, header->header.gname);
621 }
622
623 return header;
624 }
625
626 /* Finish off a filled-in header block and write it out. We also
627 print the file name and/or full info if verbose is on. If BLOCK_ORDINAL
628 is not negative, is the block ordinal of the first record for this
629 file, which may be a preceding long name or long link record. */
630 void
631 finish_header (union block *header, off_t block_ordinal)
632 {
633 size_t i;
634 int sum;
635 char *p;
636
637 /* Note: It is important to do this before the call to write_extended(),
638 so that the actual ustar header is printed */
639 if (verbose_option
640 && header->header.typeflag != GNUTYPE_LONGLINK
641 && header->header.typeflag != GNUTYPE_LONGNAME
642 && header->header.typeflag != XHDTYPE
643 && header->header.typeflag != XGLTYPE)
644 {
645 /* These globals are parameters to print_header, sigh. */
646
647 current_header = header;
648 /* current_stat_info is already set up. */
649 current_format = archive_format;
650 print_header (block_ordinal);
651 }
652
653 header = write_extended (header, XHDTYPE);
654
655 memcpy (header->header.chksum, CHKBLANKS, sizeof header->header.chksum);
656
657 sum = 0;
658 p = header->buffer;
659 for (i = sizeof *header; i-- != 0; )
660 /* We can't use unsigned char here because of old compilers, e.g. V7. */
661 sum += 0xFF & *p++;
662
663 /* Fill in the checksum field. It's formatted differently from the
664 other fields: it has [6] digits, a null, then a space -- rather than
665 digits, then a null. We use to_chars.
666 The final space is already there, from
667 checksumming, and to_chars doesn't modify it.
668
669 This is a fast way to do:
670
671 sprintf(header->header.chksum, "%6o", sum); */
672
673 uintmax_to_chars ((uintmax_t) sum, header->header.chksum, 7);
674
675 set_next_block_after (header);
676 }
677 \f
678 /* Sparse file processing. */
679
680 /* Takes a blockful of data and basically cruises through it to see if
681 it's made *entirely* of zeros, returning a 0 the instant it finds
682 something that is a nonzero, i.e., useful data. */
683 static int
684 zero_block_p (char *buffer)
685 {
686 int counter;
687
688 for (counter = 0; counter < BLOCKSIZE; counter++)
689 if (buffer[counter] != '\0')
690 return 0;
691 return 1;
692 }
693
694 void
695 init_sparsearray (void)
696 {
697 if (! sp_array_size)
698 sp_array_size = SPARSES_IN_OLDGNU_HEADER;
699 sparsearray = xmalloc (sp_array_size * sizeof *sparsearray);
700 }
701
702 static off_t
703 find_new_file_size (int sparses)
704 {
705 int i;
706 off_t s = 0;
707 for (i = 0; i < sparses; i++)
708 s += sparsearray[i].numbytes;
709 return s;
710 }
711
712 /* Make one pass over the file NAME, studying where any non-zero data
713 is, that is, how far into the file each instance of data is, and
714 how many bytes are there. Save this information in the
715 sparsearray, which will later be translated into header
716 information. */
717
718 /* There is little point in trimming small amounts of null data at the head
719 and tail of blocks, only avoid dumping full null blocks. */
720
721 /* FIXME: this routine might accept bits of algorithmic cleanup, it is
722 too kludgey for my taste... */
723
724 static int
725 deal_with_sparse (char *name, union block *header)
726 {
727 size_t numbytes = 0;
728 off_t offset = 0;
729 int file;
730 int sparses = 0;
731 ssize_t count;
732 char buffer[BLOCKSIZE];
733
734 if (archive_format == OLDGNU_FORMAT)
735 header->oldgnu_header.isextended = 0;
736
737 if (file = open (name, O_RDONLY), file < 0)
738 /* This problem will be caught later on, so just return. */
739 return 0;
740
741 init_sparsearray ();
742 clear_buffer (buffer);
743
744 for (;;)
745 {
746 /* Realloc the scratch area as necessary. FIXME: should reallocate
747 only at beginning of a new instance of non-zero data. */
748
749 if (sp_array_size <= sparses)
750 {
751 sparsearray =
752 xrealloc (sparsearray,
753 2 * sp_array_size * sizeof (struct sp_array));
754 sp_array_size *= 2;
755 }
756
757 count = safe_read (file, buffer, sizeof buffer);
758 if (count <= 0)
759 break;
760
761 /* Process one block. */
762
763 if (count == sizeof buffer)
764
765 if (zero_block_p (buffer))
766 {
767 if (numbytes)
768 {
769 sparsearray[sparses++].numbytes = numbytes;
770 numbytes = 0;
771 }
772 }
773 else
774 {
775 if (!numbytes)
776 sparsearray[sparses].offset = offset;
777 numbytes += count;
778 }
779
780 else
781
782 /* Since count < sizeof buffer, we have the last bit of the file. */
783
784 if (!zero_block_p (buffer))
785 {
786 if (!numbytes)
787 sparsearray[sparses].offset = offset;
788 numbytes += count;
789 }
790 else
791 /* The next two lines are suggested by Andreas Degert, who says
792 they are required for trailing full blocks to be written to the
793 archive, when all zeroed. Yet, it seems to me that the case
794 does not apply. Further, at restore time, the file is not as
795 sparse as it should. So, some serious cleanup is *also* needed
796 in this area. Just one more... :-(. FIXME. */
797 if (numbytes)
798 numbytes += count;
799
800 /* Prepare for next block. */
801
802 offset += count;
803 /* FIXME: do not clear unless necessary. */
804 clear_buffer (buffer);
805 }
806
807 if (numbytes)
808 sparsearray[sparses++].numbytes = numbytes;
809 else
810 {
811 sparsearray[sparses].offset = offset - 1;
812 sparsearray[sparses++].numbytes = 1;
813 }
814
815 return close (file) == 0 && 0 <= count ? sparses : 0;
816 }
817
818 static int
819 finish_sparse_file (int file, off_t *sizeleft, off_t fullsize, char *name)
820 {
821 union block *start;
822 size_t bufsize;
823 int sparses = 0;
824 ssize_t count;
825
826 while (*sizeleft > 0)
827 {
828 start = find_next_block ();
829 memset (start->buffer, 0, BLOCKSIZE);
830 bufsize = sparsearray[sparses].numbytes;
831 if (! bufsize)
832 abort ();
833
834 if (lseek (file, sparsearray[sparses++].offset, SEEK_SET) < 0)
835 {
836 (ignore_failed_read_option ? seek_warn_details : seek_error_details)
837 (name, sparsearray[sparses - 1].offset);
838 break;
839 }
840
841 /* If the number of bytes to be written here exceeds the size of
842 the temporary buffer, do it in steps. */
843
844 while (bufsize > BLOCKSIZE)
845 {
846 count = safe_read (file, start->buffer, BLOCKSIZE);
847 if (count < 0)
848 {
849 (ignore_failed_read_option
850 ? read_warn_details
851 : read_error_details)
852 (name, fullsize - *sizeleft, bufsize);
853 return 1;
854 }
855 bufsize -= count;
856 *sizeleft -= count;
857 set_next_block_after (start);
858 start = find_next_block ();
859 memset (start->buffer, 0, BLOCKSIZE);
860 }
861
862 {
863 char buffer[BLOCKSIZE];
864
865 clear_buffer (buffer);
866 count = safe_read (file, buffer, bufsize);
867 memcpy (start->buffer, buffer, BLOCKSIZE);
868 }
869
870 if (count < 0)
871 {
872 (ignore_failed_read_option
873 ? read_warn_details
874 : read_error_details)
875 (name, fullsize - *sizeleft, bufsize);
876 return 1;
877 }
878
879 *sizeleft -= count;
880 set_next_block_after (start);
881 }
882 free (sparsearray);
883 #if 0
884 set_next_block_after (start + (count - 1) / BLOCKSIZE);
885 #endif
886 return 0;
887 }
888 \f
889 /* Main functions of this module. */
890
891 void
892 create_archive (void)
893 {
894 char *p;
895
896 open_archive (ACCESS_WRITE);
897
898 if (incremental_option)
899 {
900 size_t buffer_size = 1000;
901 char *buffer = xmalloc (buffer_size);
902 const char *q;
903
904 collect_and_sort_names ();
905
906 while (p = name_from_list (), p)
907 if (!excluded_name (p))
908 dump_file (p, -1, (dev_t) 0);
909
910 blank_name_list ();
911 while (p = name_from_list (), p)
912 if (!excluded_name (p))
913 {
914 size_t plen = strlen (p);
915 if (buffer_size <= plen)
916 {
917 while ((buffer_size *= 2) <= plen)
918 continue;
919 buffer = xrealloc (buffer, buffer_size);
920 }
921 memcpy (buffer, p, plen);
922 if (! ISSLASH (buffer[plen - 1]))
923 buffer[plen++] = '/';
924 q = gnu_list_name->dir_contents;
925 if (q)
926 while (*q)
927 {
928 size_t qlen = strlen (q);
929 if (*q == 'Y')
930 {
931 if (buffer_size < plen + qlen)
932 {
933 while ((buffer_size *=2 ) < plen + qlen)
934 continue;
935 buffer = xrealloc (buffer, buffer_size);
936 }
937 strcpy (buffer + plen, q + 1);
938 dump_file (buffer, -1, (dev_t) 0);
939 }
940 q += qlen + 1;
941 }
942 }
943 free (buffer);
944 }
945 else
946 {
947 while (p = name_next (1), p)
948 if (!excluded_name (p))
949 dump_file (p, 1, (dev_t) 0);
950 }
951
952 write_eot ();
953 close_archive ();
954
955 if (listed_incremental_option)
956 write_directory_file ();
957 }
958
959
960 /* Calculate the hash of a link. */
961 static unsigned
962 hash_link (void const *entry, unsigned n_buckets)
963 {
964 struct link const *link = entry;
965 return (uintmax_t) (link->dev ^ link->ino) % n_buckets;
966 }
967
968 /* Compare two links for equality. */
969 static bool
970 compare_links (void const *entry1, void const *entry2)
971 {
972 struct link const *link1 = entry1;
973 struct link const *link2 = entry2;
974 return ((link1->dev ^ link2->dev) | (link1->ino ^ link2->ino)) == 0;
975 }
976
977 /* Table of all non-directories that we've written so far. Any time
978 we see another, we check the table and avoid dumping the data
979 again if we've done it once already. */
980 static Hash_table *link_table;
981
982 /* Dump a single file, recursing on directories. P is the file name
983 to dump. TOP_LEVEL tells whether this is a top-level call; zero
984 means no, positive means yes, and negative means the top level
985 of an incremental dump. PARENT_DEVICE is the device of P's
986 parent directory; it is examined only if TOP_LEVEL is zero.
987
988 Set global CURRENT_STAT_INFO to stat output for this file. */
989
990 /* FIXME: One should make sure that for *every* path leading to setting
991 exit_status to failure, a clear diagnostic has been issued. */
992
993 void
994 dump_file (char *p, int top_level, dev_t parent_device)
995 {
996 union block *header;
997 char type;
998 union block *exhdr;
999 char save_typeflag;
1000 time_t original_ctime;
1001 struct utimbuf restore_times;
1002 off_t block_ordinal = -1;
1003
1004 /* FIXME: `header' might be used uninitialized in this
1005 function. Reported by Bruno Haible. */
1006
1007 if (interactive_option && !confirm ("add", p))
1008 return;
1009
1010 if (deref_stat (dereference_option, p, &current_stat_info.stat) != 0)
1011 {
1012 if (ignore_failed_read_option)
1013 stat_warn (p);
1014 else
1015 stat_error (p);
1016 return;
1017 }
1018
1019 original_ctime = current_stat_info.stat.st_ctime;
1020 restore_times.actime = current_stat_info.stat.st_atime;
1021 restore_times.modtime = current_stat_info.stat.st_mtime;
1022
1023 #ifdef S_ISHIDDEN
1024 if (S_ISHIDDEN (current_stat_info.stat.st_mode))
1025 {
1026 char *new = (char *) alloca (strlen (p) + 2);
1027 if (new)
1028 {
1029 strcpy (new, p);
1030 strcat (new, "@");
1031 p = new;
1032 }
1033 }
1034 #endif
1035
1036 /* See if we want only new files, and check if this one is too old to
1037 put in the archive. */
1038
1039 if ((0 < top_level || !incremental_option)
1040 && !S_ISDIR (current_stat_info.stat.st_mode)
1041 && current_stat_info.stat.st_mtime < newer_mtime_option
1042 && (!after_date_option || current_stat_info.stat.st_ctime < newer_ctime_option))
1043 {
1044 if (0 < top_level)
1045 WARN ((0, 0, _("%s: file is unchanged; not dumped"),
1046 quotearg_colon (p)));
1047 /* FIXME: recheck this return. */
1048 return;
1049 }
1050
1051 /* See if we are trying to dump the archive. */
1052 if (sys_file_is_archive (&current_stat_info))
1053 {
1054 WARN ((0, 0, _("%s: file is the archive; not dumped"),
1055 quotearg_colon (p)));
1056 return;
1057 }
1058
1059 if (S_ISDIR (current_stat_info.stat.st_mode))
1060 {
1061 char *directory;
1062 char const *entry;
1063 size_t entrylen;
1064 char *namebuf;
1065 size_t buflen;
1066 size_t len;
1067 dev_t our_device = current_stat_info.stat.st_dev;
1068
1069 errno = 0;
1070
1071 directory = savedir (p);
1072 if (! directory)
1073 {
1074 if (ignore_failed_read_option)
1075 savedir_warn (p);
1076 else
1077 savedir_error (p);
1078 return;
1079 }
1080
1081 /* Build new prototype name. Ensure exactly one trailing slash. */
1082
1083 len = strlen (p);
1084 buflen = len + NAME_FIELD_SIZE;
1085 namebuf = xmalloc (buflen + 1);
1086 memcpy (namebuf, p, len);
1087 while (len >= 1 && ISSLASH (namebuf[len - 1]))
1088 len--;
1089 namebuf[len++] = '/';
1090 namebuf[len] = '\0';
1091
1092 if (! is_avoided_name (namebuf))
1093 {
1094 /* The condition above used to be "archive_format != V7_FORMAT".
1095 GNU tar was not writing directory blocks at all. Daniel Trinkle
1096 writes: ``All old versions of tar I have ever seen have
1097 correctly archived an empty directory. The really old ones I
1098 checked included HP-UX 7 and Mt. Xinu More/BSD. There may be
1099 some subtle reason for the exclusion that I don't know, but the
1100 current behavior is broken.'' I do not know those subtle
1101 reasons either, so until these are reported (anew?), just allow
1102 directory blocks to be written even with old archives. */
1103
1104 block_ordinal = current_block_ordinal ();
1105 current_stat_info.stat.st_size = 0; /* force 0 size on dir */
1106
1107 /* FIXME: If people could really read standard archives, this
1108 should be:
1109
1110 header
1111 = start_header (standard_option ? p : namebuf, &current_stat_info);
1112
1113 but since they'd interpret DIRTYPE blocks as regular
1114 files, we'd better put the / on the name. */
1115
1116 header = start_header (namebuf, &current_stat_info);
1117
1118 if (incremental_option)
1119 header->header.typeflag = GNUTYPE_DUMPDIR;
1120 else /* if (standard_option) */
1121 header->header.typeflag = DIRTYPE;
1122
1123 /* If we're gnudumping, we aren't done yet so don't close it. */
1124
1125 if (!incremental_option)
1126 finish_header (header, block_ordinal);
1127 }
1128
1129 if (incremental_option && gnu_list_name->dir_contents)
1130 {
1131 off_t sizeleft;
1132 off_t totsize;
1133 size_t bufsize;
1134 union block *start;
1135 ssize_t count;
1136 const char *buffer, *p_buffer;
1137
1138 buffer = gnu_list_name->dir_contents; /* FOO */
1139 totsize = 0;
1140 if (buffer)
1141 for (p_buffer = buffer; *p_buffer; )
1142 {
1143 size_t size = strlen (p_buffer) + 1;
1144 totsize += size;
1145 p_buffer += size;
1146 }
1147 totsize++;
1148 OFF_TO_CHARS (totsize, header->header.size);
1149 finish_header (header, block_ordinal);
1150 p_buffer = buffer;
1151 sizeleft = totsize;
1152 while (sizeleft > 0)
1153 {
1154 if (multi_volume_option)
1155 {
1156 assign_string (&save_name, p);
1157 save_sizeleft = sizeleft;
1158 save_totsize = totsize;
1159 }
1160 start = find_next_block ();
1161 bufsize = available_space_after (start);
1162 if (sizeleft < bufsize)
1163 {
1164 bufsize = sizeleft;
1165 count = bufsize % BLOCKSIZE;
1166 if (count)
1167 memset (start->buffer + sizeleft, 0, BLOCKSIZE - count);
1168 }
1169 memcpy (start->buffer, p_buffer, bufsize);
1170 sizeleft -= bufsize;
1171 p_buffer += bufsize;
1172 set_next_block_after (start + (bufsize - 1) / BLOCKSIZE);
1173 }
1174 if (multi_volume_option)
1175 assign_string (&save_name, 0);
1176 goto finish_dir;
1177 }
1178
1179 /* See if we are about to recurse into a directory, and avoid doing
1180 so if the user wants that we do not descend into directories. */
1181
1182 if (! recursion_option)
1183 goto finish_dir;
1184
1185 /* See if we are crossing from one file system to another, and
1186 avoid doing so if the user only wants to dump one file system. */
1187
1188 if (one_file_system_option && !top_level
1189 && parent_device != current_stat_info.stat.st_dev)
1190 {
1191 if (verbose_option)
1192 WARN ((0, 0,
1193 _("%s: file is on a different filesystem; not dumped"),
1194 quotearg_colon (p)));
1195 goto finish_dir;
1196 }
1197
1198 /* Now output all the files in the directory. */
1199
1200 /* FIXME: Should speed this up by cd-ing into the dir. */
1201
1202 for (entry = directory;
1203 (entrylen = strlen (entry)) != 0;
1204 entry += entrylen + 1)
1205 {
1206 if (buflen < len + entrylen)
1207 {
1208 buflen = len + entrylen;
1209 namebuf = xrealloc (namebuf, buflen + 1);
1210 }
1211 strcpy (namebuf + len, entry);
1212 if (!excluded_name (namebuf))
1213 dump_file (namebuf, 0, our_device);
1214 }
1215
1216 finish_dir:
1217
1218 free (directory);
1219 free (namebuf);
1220 if (atime_preserve_option)
1221 utime (p, &restore_times);
1222 return;
1223 }
1224 else if (is_avoided_name (p))
1225 return;
1226 else
1227 {
1228 /* Check for multiple links. */
1229
1230 if (1 < current_stat_info.stat.st_nlink && link_table)
1231 {
1232 struct link lp;
1233 struct link *dup;
1234 lp.ino = current_stat_info.stat.st_ino;
1235 lp.dev = current_stat_info.stat.st_dev;
1236
1237 if ((dup = hash_lookup (link_table, &lp)))
1238 {
1239 /* We found a link. */
1240 char const *link_name = safer_name_suffix (dup->name, 1);
1241
1242 dup->nlink--;
1243
1244 block_ordinal = current_block_ordinal ();
1245 assign_string (&current_stat_info.link_name, link_name);
1246 if (NAME_FIELD_SIZE <= strlen (link_name))
1247 write_long_link (&current_stat_info);
1248
1249 current_stat_info.stat.st_size = 0;
1250 header = start_header (p, &current_stat_info);
1251 strncpy (header->header.linkname, link_name, NAME_FIELD_SIZE);
1252
1253 /* Force null termination. */
1254 header->header.linkname[NAME_FIELD_SIZE - 1] = 0;
1255
1256 header->header.typeflag = LNKTYPE;
1257 finish_header (header, block_ordinal);
1258
1259 /* FIXME: Maybe remove from table after all links found? */
1260
1261 if (remove_files_option && unlink (p) != 0)
1262 unlink_error (p);
1263
1264 /* We dumped it, and we don't need to put it in the
1265 table again. */
1266 return;
1267 }
1268 }
1269
1270 /* This is not a link to a previously dumped file, so dump it. */
1271
1272 if (S_ISREG (current_stat_info.stat.st_mode)
1273 || S_ISCTG (current_stat_info.stat.st_mode))
1274 {
1275 int f; /* file descriptor */
1276 size_t bufsize;
1277 ssize_t count;
1278 off_t sizeleft;
1279 union block *start;
1280 int header_moved;
1281 char isextended = 0;
1282 int sparses = 0;
1283
1284 header_moved = 0;
1285
1286 if (sparse_option)
1287 {
1288 /* Check the size of the file against the number of blocks
1289 allocated for it, counting both data and indirect blocks.
1290 If there is a smaller number of blocks than would be
1291 necessary to accommodate a file of this size, this is safe
1292 to say that we have a sparse file: at least one of those
1293 blocks in the file is just a useless hole. For sparse
1294 files not having more hole blocks than indirect blocks, the
1295 sparseness will go undetected. */
1296
1297 /* Bruno Haible sent me these statistics for Linux. It seems
1298 that some filesystems count indirect blocks in st_blocks,
1299 while others do not seem to:
1300
1301 minix-fs tar: size=7205, st_blocks=18 and ST_NBLOCKS=18
1302 extfs tar: size=7205, st_blocks=18 and ST_NBLOCKS=18
1303 ext2fs tar: size=7205, st_blocks=16 and ST_NBLOCKS=16
1304 msdos-fs tar: size=7205, st_blocks=16 and ST_NBLOCKS=16
1305
1306 Dick Streefland reports the previous numbers as misleading,
1307 because ext2fs use 12 direct blocks, while minix-fs uses only
1308 6 direct blocks. Dick gets:
1309
1310 ext2 size=20480 ls listed blocks=21
1311 minix size=20480 ls listed blocks=21
1312 msdos size=20480 ls listed blocks=20
1313
1314 It seems that indirect blocks *are* included in st_blocks.
1315 The minix filesystem does not account for phantom blocks in
1316 st_blocks, so `du' and `ls -s' give wrong results. So, the
1317 --sparse option would not work on a minix filesystem. */
1318
1319 if (ST_NBLOCKS (current_stat_info.stat)
1320 < (current_stat_info.stat.st_size / ST_NBLOCKSIZE
1321 + (current_stat_info.stat.st_size % ST_NBLOCKSIZE != 0)))
1322 {
1323 int counter;
1324
1325 block_ordinal = current_block_ordinal ();
1326 header = start_header (p, &current_stat_info);
1327 header->header.typeflag = GNUTYPE_SPARSE;
1328 header_moved = 1;
1329
1330 /* Call the routine that figures out the layout of the
1331 sparse file in question. SPARSES is the index of the
1332 first unused element of the "sparsearray," i.e.,
1333 the number of elements it needed to describe the file. */
1334
1335 sparses = deal_with_sparse (p, header);
1336
1337 /* See if we'll need an extended header later. */
1338
1339 if (SPARSES_IN_OLDGNU_HEADER < sparses)
1340 header->oldgnu_header.isextended = 1;
1341
1342 /* We store the "real" file size so we can show that in
1343 case someone wants to list the archive, i.e., tar tvf
1344 <file>. It might be kind of disconcerting if the
1345 shrunken file size was the one that showed up. */
1346
1347 OFF_TO_CHARS (current_stat_info.stat.st_size,
1348 header->oldgnu_header.realsize);
1349
1350 /* This will be the new "size" of the file, i.e., the size
1351 of the file minus the blocks of holes that we're
1352 skipping over. */
1353
1354 current_stat_info.stat.st_size = find_new_file_size (sparses);
1355 OFF_TO_CHARS (current_stat_info.stat.st_size, header->header.size);
1356
1357 for (counter = 0;
1358 counter < sparses && counter < SPARSES_IN_OLDGNU_HEADER;
1359 counter++)
1360 {
1361 OFF_TO_CHARS (sparsearray[counter].offset,
1362 header->oldgnu_header.sp[counter].offset);
1363 SIZE_TO_CHARS (sparsearray[counter].numbytes,
1364 header->oldgnu_header.sp[counter].numbytes);
1365 }
1366 }
1367 }
1368
1369 sizeleft = current_stat_info.stat.st_size;
1370
1371 /* Don't bother opening empty, world readable files. Also do not open
1372 files when archive is meant for /dev/null. */
1373
1374 if (dev_null_output
1375 || (sizeleft == 0
1376 && MODE_R == (MODE_R & current_stat_info.stat.st_mode)))
1377 f = -1;
1378 else
1379 {
1380 f = open (p, O_RDONLY | O_BINARY);
1381 if (f < 0)
1382 {
1383 if (! top_level && errno == ENOENT)
1384 WARN ((0, 0, _("%s: File removed before we read it"),
1385 quotearg_colon (p)));
1386 else
1387 (ignore_failed_read_option ? open_warn : open_error) (p);
1388 return;
1389 }
1390 }
1391
1392 /* If the file is sparse, we've already taken care of this. */
1393
1394 if (!header_moved)
1395 {
1396 block_ordinal = current_block_ordinal ();
1397 header = start_header (p, &current_stat_info);
1398 }
1399
1400 /* Mark contiguous files, if we support them. */
1401
1402 if (archive_format != V7_FORMAT && S_ISCTG (current_stat_info.stat.st_mode))
1403 header->header.typeflag = CONTTYPE;
1404
1405 isextended = header->oldgnu_header.isextended;
1406 save_typeflag = header->header.typeflag;
1407 finish_header (header, block_ordinal);
1408 if (isextended)
1409 {
1410 int sparses_emitted = SPARSES_IN_OLDGNU_HEADER;
1411
1412 for (;;)
1413 {
1414 int i;
1415 exhdr = find_next_block ();
1416 memset (exhdr->buffer, 0, BLOCKSIZE);
1417 for (i = 0;
1418 (i < SPARSES_IN_SPARSE_HEADER
1419 && sparses_emitted + i < sparses);
1420 i++)
1421 {
1422 SIZE_TO_CHARS (sparsearray[sparses_emitted + i].numbytes,
1423 exhdr->sparse_header.sp[i].numbytes);
1424 OFF_TO_CHARS (sparsearray[sparses_emitted + i].offset,
1425 exhdr->sparse_header.sp[i].offset);
1426 }
1427 set_next_block_after (exhdr);
1428 sparses_emitted += i;
1429 if (sparses == sparses_emitted)
1430 break;
1431 exhdr->sparse_header.isextended = 1;
1432 }
1433 }
1434 if (save_typeflag == GNUTYPE_SPARSE)
1435 {
1436 if (f < 0
1437 || finish_sparse_file (f, &sizeleft,
1438 current_stat_info.stat.st_size, p))
1439 goto padit;
1440 }
1441 else
1442 while (sizeleft > 0)
1443 {
1444 if (multi_volume_option)
1445 {
1446 assign_string (&save_name, p);
1447 save_sizeleft = sizeleft;
1448 save_totsize = current_stat_info.stat.st_size;
1449 }
1450 start = find_next_block ();
1451
1452 bufsize = available_space_after (start);
1453
1454 if (sizeleft < bufsize)
1455 {
1456 /* Last read -- zero out area beyond. */
1457
1458 bufsize = sizeleft;
1459 count = bufsize % BLOCKSIZE;
1460 if (count)
1461 memset (start->buffer + sizeleft, 0, BLOCKSIZE - count);
1462 }
1463 if (f < 0)
1464 count = bufsize;
1465 else
1466 count = safe_read (f, start->buffer, bufsize);
1467 if (count < 0)
1468 {
1469 (ignore_failed_read_option
1470 ? read_warn_details
1471 : read_error_details)
1472 (p, current_stat_info.stat.st_size - sizeleft, bufsize);
1473 goto padit;
1474 }
1475 sizeleft -= count;
1476
1477 /* This is nonportable (the type of set_next_block_after's arg). */
1478
1479 set_next_block_after (start + (bufsize - 1) / BLOCKSIZE);
1480
1481
1482 if (count != bufsize)
1483 {
1484 char buf[UINTMAX_STRSIZE_BOUND];
1485 memset (start->buffer + count, 0, bufsize - count);
1486 WARN ((0, 0,
1487 ngettext ("%s: File shrank by %s byte; padding with zeros",
1488 "%s: File shrank by %s bytes; padding with zeros",
1489 sizeleft),
1490 quotearg_colon (p),
1491 STRINGIFY_BIGINT (sizeleft, buf)));
1492 if (! ignore_failed_read_option)
1493 exit_status = TAREXIT_FAILURE;
1494 goto padit; /* short read */
1495 }
1496 }
1497
1498 if (multi_volume_option)
1499 assign_string (&save_name, 0);
1500
1501 if (f >= 0)
1502 {
1503 struct stat final_stat;
1504 if (fstat (f, &final_stat) != 0)
1505 {
1506 if (ignore_failed_read_option)
1507 stat_warn (p);
1508 else
1509 stat_error (p);
1510 }
1511 else if (final_stat.st_ctime != original_ctime)
1512 {
1513 char const *qp = quotearg_colon (p);
1514 WARN ((0, 0, _("%s: file changed as we read it"), qp));
1515 }
1516 if (close (f) != 0)
1517 {
1518 if (ignore_failed_read_option)
1519 close_warn (p);
1520 else
1521 close_error (p);
1522 }
1523 if (atime_preserve_option)
1524 utime (p, &restore_times);
1525 }
1526 if (remove_files_option)
1527 {
1528 if (unlink (p) == -1)
1529 unlink_error (p);
1530 }
1531 goto file_was_dumped;
1532
1533 /* File shrunk or gave error, pad out tape to match the size we
1534 specified in the header. */
1535
1536 padit:
1537 while (sizeleft > 0)
1538 {
1539 save_sizeleft = sizeleft;
1540 start = find_next_block ();
1541 memset (start->buffer, 0, BLOCKSIZE);
1542 set_next_block_after (start);
1543 sizeleft -= BLOCKSIZE;
1544 }
1545 if (multi_volume_option)
1546 assign_string (&save_name, 0);
1547 if (f >= 0)
1548 {
1549 close (f);
1550 if (atime_preserve_option)
1551 utime (p, &restore_times);
1552 }
1553 goto file_was_dumped;
1554 }
1555 #ifdef HAVE_READLINK
1556 else if (S_ISLNK (current_stat_info.stat.st_mode))
1557 {
1558 char *buffer;
1559 int size;
1560 size_t linklen = current_stat_info.stat.st_size;
1561 if (linklen != current_stat_info.stat.st_size || linklen + 1 == 0)
1562 xalloc_die ();
1563 buffer = (char *) alloca (linklen + 1);
1564 size = readlink (p, buffer, linklen + 1);
1565 if (size < 0)
1566 {
1567 if (ignore_failed_read_option)
1568 readlink_warn (p);
1569 else
1570 readlink_error (p);
1571 return;
1572 }
1573 buffer[size] = '\0';
1574 assign_string (&current_stat_info.link_name, buffer);
1575 if (size >= NAME_FIELD_SIZE)
1576 write_long_link (&current_stat_info);
1577
1578 block_ordinal = current_block_ordinal ();
1579 current_stat_info.stat.st_size = 0; /* force 0 size on symlink */
1580 header = start_header (p, &current_stat_info);
1581 strncpy (header->header.linkname, buffer, NAME_FIELD_SIZE);
1582 header->header.linkname[NAME_FIELD_SIZE - 1] = '\0';
1583 header->header.typeflag = SYMTYPE;
1584 finish_header (header, block_ordinal);
1585 /* nothing more to do to it */
1586
1587 if (remove_files_option)
1588 {
1589 if (unlink (p) == -1)
1590 unlink_error (p);
1591 }
1592 goto file_was_dumped;
1593 }
1594 #endif
1595 else if (S_ISCHR (current_stat_info.stat.st_mode))
1596 type = CHRTYPE;
1597 else if (S_ISBLK (current_stat_info.stat.st_mode))
1598 type = BLKTYPE;
1599 else if (S_ISFIFO (current_stat_info.stat.st_mode))
1600 type = FIFOTYPE;
1601 else if (S_ISSOCK (current_stat_info.stat.st_mode))
1602 {
1603 WARN ((0, 0, _("%s: socket ignored"), quotearg_colon (p)));
1604 return;
1605 }
1606 else if (S_ISDOOR (current_stat_info.stat.st_mode))
1607 {
1608 WARN ((0, 0, _("%s: door ignored"), quotearg_colon (p)));
1609 return;
1610 }
1611 else
1612 goto unknown;
1613 }
1614
1615 if (archive_format == V7_FORMAT)
1616 goto unknown;
1617
1618 block_ordinal = current_block_ordinal ();
1619 current_stat_info.stat.st_size = 0; /* force 0 size */
1620 header = start_header (p, &current_stat_info);
1621 header->header.typeflag = type;
1622
1623 if (type != FIFOTYPE)
1624 {
1625 MAJOR_TO_CHARS (major (current_stat_info.stat.st_rdev), header->header.devmajor);
1626 MINOR_TO_CHARS (minor (current_stat_info.stat.st_rdev), header->header.devminor);
1627 }
1628
1629 finish_header (header, block_ordinal);
1630 if (remove_files_option)
1631 {
1632 if (unlink (p) == -1)
1633 unlink_error (p);
1634 }
1635 goto file_was_dumped;
1636
1637 unknown:
1638 WARN ((0, 0, _("%s: Unknown file type; file ignored"),
1639 quotearg_colon (p)));
1640 if (! ignore_failed_read_option)
1641 exit_status = TAREXIT_FAILURE;
1642 return;
1643
1644 file_was_dumped:
1645 if (1 < current_stat_info.stat.st_nlink)
1646 {
1647 struct link *dup;
1648 struct link *lp = xmalloc (offsetof (struct link, name)
1649 + strlen (p) + 1);
1650 lp->ino = current_stat_info.stat.st_ino;
1651 lp->dev = current_stat_info.stat.st_dev;
1652 lp->nlink = current_stat_info.stat.st_nlink;
1653 strcpy (lp->name, p);
1654
1655 if (! ((link_table
1656 || (link_table = hash_initialize (0, 0, hash_link,
1657 compare_links, 0)))
1658 && (dup = hash_insert (link_table, lp))))
1659 xalloc_die ();
1660
1661 if (dup != lp)
1662 abort ();
1663 lp->nlink--;
1664 }
1665
1666 }
1667
1668 /* For each dumped file, check if all its links were dumped. Emit
1669 warnings if it is not so. */
1670 void
1671 check_links ()
1672 {
1673 struct link *lp;
1674
1675 if (!link_table)
1676 return;
1677
1678 for (lp = hash_get_first (link_table); lp;
1679 lp = hash_get_next (link_table, lp))
1680 {
1681 if (lp->nlink)
1682 {
1683 WARN ((0, 0, _("Missing links to '%s'.\n"), lp->name));
1684 }
1685 }
1686 }
This page took 0.115056 seconds and 4 git commands to generate.