]> Dogcows Code - chaz/tar/blob - src/create.c
(write_extended): Remove unused local 'bufsize'.
[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 !MSDOS
25 # include <pwd.h>
26 # include <grp.h>
27 #endif
28
29 #if HAVE_UTIME_H
30 # include <utime.h>
31 #else
32 struct utimbuf
33 {
34 long actime;
35 long modtime;
36 };
37 #endif
38
39 #include <quotearg.h>
40
41 #include "common.h"
42 #include <hash.h>
43
44 #ifndef MSDOS
45 extern dev_t ar_dev;
46 extern ino_t ar_ino;
47 #endif
48
49 struct link
50 {
51 dev_t dev;
52 ino_t ino;
53 size_t nlink;
54 char name[1];
55 };
56 \f
57 /* The maximum uintmax_t value that can be represented with DIGITS digits,
58 assuming that each digit is BITS_PER_DIGIT wide. */
59 #define MAX_VAL_WITH_DIGITS(digits, bits_per_digit) \
60 ((digits) * (bits_per_digit) < sizeof (uintmax_t) * CHAR_BIT \
61 ? ((uintmax_t) 1 << ((digits) * (bits_per_digit))) - 1 \
62 : (uintmax_t) -1)
63
64 /* Convert VALUE to an octal representation suitable for tar headers.
65 Output to buffer WHERE with size SIZE.
66 The result is undefined if SIZE is 0 or if VALUE is too large to fit. */
67
68 static void
69 to_octal (uintmax_t value, char *where, size_t size)
70 {
71 uintmax_t v = value;
72 size_t i = size;
73
74 do
75 {
76 where[--i] = '0' + (v & ((1 << LG_8) - 1));
77 v >>= LG_8;
78 }
79 while (i);
80 }
81
82 /* Convert NEGATIVE VALUE to a base-256 representation suitable for
83 tar headers. NEGATIVE is 1 if VALUE was negative before being cast
84 to uintmax_t, 0 otherwise. Output to buffer WHERE with size SIZE.
85 The result is undefined if SIZE is 0 or if VALUE is too large to
86 fit. */
87
88 static void
89 to_base256 (int negative, uintmax_t value, char *where, size_t size)
90 {
91 uintmax_t v = value;
92 uintmax_t propagated_sign_bits =
93 ((uintmax_t) - negative << (CHAR_BIT * sizeof v - LG_256));
94 size_t i = size;
95
96 do
97 {
98 where[--i] = v & ((1 << LG_256) - 1);
99 v = propagated_sign_bits | (v >> LG_256);
100 }
101 while (i);
102 }
103
104 /* Convert NEGATIVE VALUE (which was originally of size VALSIZE) to
105 external form, using SUBSTITUTE (...) if VALUE won't fit. Output
106 to buffer WHERE with size SIZE. NEGATIVE is 1 iff VALUE was
107 negative before being cast to uintmax_t; its original bitpattern
108 can be deduced from VALSIZE, its original size before casting.
109 TYPE is the kind of value being output (useful for diagnostics).
110 Prefer the POSIX format of SIZE - 1 octal digits (with leading zero
111 digits), followed by '\0'. If this won't work, and if GNU or
112 OLDGNU format is allowed, use '\200' followed by base-256, or (if
113 NEGATIVE is nonzero) '\377' followed by two's complement base-256.
114 If neither format works, use SUBSTITUTE (...) instead. Pass to
115 SUBSTITUTE the address of an 0-or-1 flag recording whether the
116 substitute value is negative. */
117
118 static void
119 to_chars (int negative, uintmax_t value, size_t valsize,
120 uintmax_t (*substitute) (int *),
121 char *where, size_t size, const char *type)
122 {
123 int base256_allowed = (archive_format == GNU_FORMAT
124 || archive_format == OLDGNU_FORMAT);
125
126 /* Generate the POSIX octal representation if the number fits. */
127 if (! negative && value <= MAX_VAL_WITH_DIGITS (size - 1, LG_8))
128 {
129 where[size - 1] = '\0';
130 to_octal (value, where, size - 1);
131 }
132
133 /* Otherwise, generate the base-256 representation if we are
134 generating an old or new GNU format and if the number fits. */
135 else if (((negative ? -1 - value : value)
136 <= MAX_VAL_WITH_DIGITS (size - 1, LG_256))
137 && base256_allowed)
138 {
139 where[0] = negative ? -1 : 1 << (LG_256 - 1);
140 to_base256 (negative, value, where + 1, size - 1);
141 }
142
143 /* Otherwise, if the number is negative, and if it would not cause
144 ambiguity on this host by confusing positive with negative
145 values, then generate the POSIX octal representation of the value
146 modulo 2**(field bits). The resulting tar file is
147 machine-dependent, since it depends on the host word size. Yuck!
148 But this is the traditional behavior. */
149 else if (negative && valsize * CHAR_BIT <= (size - 1) * LG_8)
150 {
151 static int warned_once;
152 if (! warned_once)
153 {
154 warned_once = 1;
155 WARN ((0, 0, _("Generating negative octal headers")));
156 }
157 where[size - 1] = '\0';
158 to_octal (value & MAX_VAL_WITH_DIGITS (valsize * CHAR_BIT, 1),
159 where, size - 1);
160 }
161
162 /* Otherwise, output a substitute value if possible (with a
163 warning), and an error message if not. */
164 else
165 {
166 uintmax_t maxval = (base256_allowed
167 ? MAX_VAL_WITH_DIGITS (size - 1, LG_256)
168 : MAX_VAL_WITH_DIGITS (size - 1, LG_8));
169 char valbuf[UINTMAX_STRSIZE_BOUND + 1];
170 char maxbuf[UINTMAX_STRSIZE_BOUND];
171 char minbuf[UINTMAX_STRSIZE_BOUND + 1];
172 char const *minval_string;
173 char const *maxval_string = STRINGIFY_BIGINT (maxval, maxbuf);
174 char const *value_string;
175
176 if (base256_allowed)
177 {
178 uintmax_t m = maxval + 1 ? maxval + 1 : maxval / 2 + 1;
179 char *p = STRINGIFY_BIGINT (m, minbuf + 1);
180 *--p = '-';
181 minval_string = p;
182 }
183 else
184 minval_string = "0";
185
186 if (negative)
187 {
188 char *p = STRINGIFY_BIGINT (- value, valbuf + 1);
189 *--p = '-';
190 value_string = p;
191 }
192 else
193 value_string = STRINGIFY_BIGINT (value, valbuf);
194
195 if (substitute)
196 {
197 int negsub;
198 uintmax_t sub = substitute (&negsub) & maxval;
199 uintmax_t s = (negsub &= archive_format == GNU_FORMAT) ? - sub : sub;
200 char subbuf[UINTMAX_STRSIZE_BOUND + 1];
201 char *sub_string = STRINGIFY_BIGINT (s, subbuf + 1);
202 if (negsub)
203 *--sub_string = '-';
204 WARN ((0, 0, _("value %s out of %s range %s..%s; substituting %s"),
205 value_string, type, minval_string, maxval_string,
206 sub_string));
207 to_chars (negsub, s, valsize, 0, where, size, type);
208 }
209 else
210 ERROR ((0, 0, _("value %s out of %s range %s..%s"),
211 value_string, type, minval_string, maxval_string));
212 }
213 }
214
215 static uintmax_t
216 gid_substitute (int *negative)
217 {
218 gid_t r;
219 #ifdef GID_NOBODY
220 r = GID_NOBODY;
221 #else
222 static gid_t gid_nobody;
223 if (!gid_nobody && !gname_to_gid ("nobody", &gid_nobody))
224 gid_nobody = -2;
225 r = gid_nobody;
226 #endif
227 *negative = r < 0;
228 return r;
229 }
230
231 void
232 gid_to_chars (gid_t v, char *p, size_t s)
233 {
234 to_chars (v < 0, (uintmax_t) v, sizeof v, gid_substitute, p, s, "gid_t");
235 }
236
237 void
238 major_to_chars (major_t v, char *p, size_t s)
239 {
240 to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "major_t");
241 }
242
243 void
244 minor_to_chars (minor_t v, char *p, size_t s)
245 {
246 to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "minor_t");
247 }
248
249 void
250 mode_to_chars (mode_t v, char *p, size_t s)
251 {
252 /* In the common case where the internal and external mode bits are the same,
253 and we are not using POSIX or GNU format,
254 propagate all unknown bits to the external mode.
255 This matches historical practice.
256 Otherwise, just copy the bits we know about. */
257 int negative;
258 uintmax_t u;
259 if (S_ISUID == TSUID && S_ISGID == TSGID && S_ISVTX == TSVTX
260 && S_IRUSR == TUREAD && S_IWUSR == TUWRITE && S_IXUSR == TUEXEC
261 && S_IRGRP == TGREAD && S_IWGRP == TGWRITE && S_IXGRP == TGEXEC
262 && S_IROTH == TOREAD && S_IWOTH == TOWRITE && S_IXOTH == TOEXEC
263 && archive_format != POSIX_FORMAT
264 && archive_format != GNU_FORMAT)
265 {
266 negative = v < 0;
267 u = v;
268 }
269 else
270 {
271 negative = 0;
272 u = ((v & S_ISUID ? TSUID : 0)
273 | (v & S_ISGID ? TSGID : 0)
274 | (v & S_ISVTX ? TSVTX : 0)
275 | (v & S_IRUSR ? TUREAD : 0)
276 | (v & S_IWUSR ? TUWRITE : 0)
277 | (v & S_IXUSR ? TUEXEC : 0)
278 | (v & S_IRGRP ? TGREAD : 0)
279 | (v & S_IWGRP ? TGWRITE : 0)
280 | (v & S_IXGRP ? TGEXEC : 0)
281 | (v & S_IROTH ? TOREAD : 0)
282 | (v & S_IWOTH ? TOWRITE : 0)
283 | (v & S_IXOTH ? TOEXEC : 0));
284 }
285 to_chars (negative, u, sizeof v, 0, p, s, "mode_t");
286 }
287
288 void
289 off_to_chars (off_t v, char *p, size_t s)
290 {
291 to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "off_t");
292 }
293
294 void
295 size_to_chars (size_t v, char *p, size_t s)
296 {
297 to_chars (0, (uintmax_t) v, sizeof v, 0, p, s, "size_t");
298 }
299
300 void
301 time_to_chars (time_t v, char *p, size_t s)
302 {
303 to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "time_t");
304 }
305
306 static uintmax_t
307 uid_substitute (int *negative)
308 {
309 uid_t r;
310 #ifdef UID_NOBODY
311 r = UID_NOBODY;
312 #else
313 static uid_t uid_nobody;
314 if (!uid_nobody && !uname_to_uid ("nobody", &uid_nobody))
315 uid_nobody = -2;
316 r = uid_nobody;
317 #endif
318 *negative = r < 0;
319 return r;
320 }
321
322 void
323 uid_to_chars (uid_t v, char *p, size_t s)
324 {
325 to_chars (v < 0, (uintmax_t) v, sizeof v, uid_substitute, p, s, "uid_t");
326 }
327
328 void
329 uintmax_to_chars (uintmax_t v, char *p, size_t s)
330 {
331 to_chars (0, v, sizeof v, 0, p, s, "uintmax_t");
332 }
333
334 void
335 string_to_chars (char *str, char *p, size_t s)
336 {
337 strncpy (p, str, s);
338 p[s-1] = 0;
339 }
340
341 \f
342 /* Writing routines. */
343
344 /* Zero out the buffer so we don't confuse ourselves with leftover
345 data. */
346 static void
347 clear_buffer (char *buffer)
348 {
349 memset (buffer, 0, BLOCKSIZE);
350 }
351
352 /* Write the EOT block(s). Zero at least two blocks, through the end
353 of the record. Old tar, as previous versions of GNU tar, writes
354 garbage after two zeroed blocks. */
355 void
356 write_eot (void)
357 {
358 union block *pointer = find_next_block ();
359 memset (pointer->buffer, 0, BLOCKSIZE);
360 set_next_block_after (pointer);
361 pointer = find_next_block ();
362 memset (pointer->buffer, 0, available_space_after (pointer));
363 set_next_block_after (pointer);
364 }
365
366 /* Write a GNUTYPE_LONGLINK or GNUTYPE_LONGNAME block. */
367
368 /* FIXME: Cross recursion between start_header and write_long! */
369
370 static union block *start_header (const char *, struct tar_stat_info *);
371
372 static void
373 write_long (const char *p, char type)
374 {
375 size_t size = strlen (p) + 1;
376 size_t bufsize;
377 union block *header;
378 struct tar_stat_info foo;
379
380 memset (&foo, 0, sizeof foo);
381 foo.stat.st_size = size;
382
383 header = start_header ("././@LongLink", &foo);
384 header->header.typeflag = type;
385 finish_header (header, -1);
386
387 header = find_next_block ();
388
389 bufsize = available_space_after (header);
390
391 while (bufsize < size)
392 {
393 memcpy (header->buffer, p, bufsize);
394 p += bufsize;
395 size -= bufsize;
396 set_next_block_after (header + (bufsize - 1) / BLOCKSIZE);
397 header = find_next_block ();
398 bufsize = available_space_after (header);
399 }
400 memcpy (header->buffer, p, size);
401 memset (header->buffer + size, 0, bufsize - size);
402 set_next_block_after (header + (size - 1) / BLOCKSIZE);
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 #if !MSDOS
1052 /* See if we are trying to dump the archive. */
1053
1054 if (ar_dev && current_stat_info.stat.st_dev == ar_dev && current_stat_info.stat.st_ino == ar_ino)
1055 {
1056 WARN ((0, 0, _("%s: file is the archive; not dumped"),
1057 quotearg_colon (p)));
1058 return;
1059 }
1060 #endif
1061
1062 if (S_ISDIR (current_stat_info.stat.st_mode))
1063 {
1064 char *directory;
1065 char const *entry;
1066 size_t entrylen;
1067 char *namebuf;
1068 size_t buflen;
1069 size_t len;
1070 dev_t our_device = current_stat_info.stat.st_dev;
1071
1072 errno = 0;
1073
1074 directory = savedir (p);
1075 if (! directory)
1076 {
1077 if (ignore_failed_read_option)
1078 savedir_warn (p);
1079 else
1080 savedir_error (p);
1081 return;
1082 }
1083
1084 /* Build new prototype name. Ensure exactly one trailing slash. */
1085
1086 len = strlen (p);
1087 buflen = len + NAME_FIELD_SIZE;
1088 namebuf = xmalloc (buflen + 1);
1089 memcpy (namebuf, p, len);
1090 while (len >= 1 && ISSLASH (namebuf[len - 1]))
1091 len--;
1092 namebuf[len++] = '/';
1093 namebuf[len] = '\0';
1094
1095 if (! is_avoided_name (namebuf))
1096 {
1097 /* The condition above used to be "archive_format != V7_FORMAT".
1098 GNU tar was not writing directory blocks at all. Daniel Trinkle
1099 writes: ``All old versions of tar I have ever seen have
1100 correctly archived an empty directory. The really old ones I
1101 checked included HP-UX 7 and Mt. Xinu More/BSD. There may be
1102 some subtle reason for the exclusion that I don't know, but the
1103 current behavior is broken.'' I do not know those subtle
1104 reasons either, so until these are reported (anew?), just allow
1105 directory blocks to be written even with old archives. */
1106
1107 block_ordinal = current_block_ordinal ();
1108 current_stat_info.stat.st_size = 0; /* force 0 size on dir */
1109
1110 /* FIXME: If people could really read standard archives, this
1111 should be:
1112
1113 header
1114 = start_header (standard_option ? p : namebuf, &current_stat_info);
1115
1116 but since they'd interpret DIRTYPE blocks as regular
1117 files, we'd better put the / on the name. */
1118
1119 header = start_header (namebuf, &current_stat_info);
1120
1121 if (incremental_option)
1122 header->header.typeflag = GNUTYPE_DUMPDIR;
1123 else /* if (standard_option) */
1124 header->header.typeflag = DIRTYPE;
1125
1126 /* If we're gnudumping, we aren't done yet so don't close it. */
1127
1128 if (!incremental_option)
1129 finish_header (header, block_ordinal);
1130 }
1131
1132 if (incremental_option && gnu_list_name->dir_contents)
1133 {
1134 off_t sizeleft;
1135 off_t totsize;
1136 size_t bufsize;
1137 union block *start;
1138 ssize_t count;
1139 const char *buffer, *p_buffer;
1140
1141 buffer = gnu_list_name->dir_contents; /* FOO */
1142 totsize = 0;
1143 if (buffer)
1144 for (p_buffer = buffer; *p_buffer; )
1145 {
1146 size_t size = strlen (p_buffer) + 1;
1147 totsize += size;
1148 p_buffer += size;
1149 }
1150 totsize++;
1151 OFF_TO_CHARS (totsize, header->header.size);
1152 finish_header (header, block_ordinal);
1153 p_buffer = buffer;
1154 sizeleft = totsize;
1155 while (sizeleft > 0)
1156 {
1157 if (multi_volume_option)
1158 {
1159 assign_string (&save_name, p);
1160 save_sizeleft = sizeleft;
1161 save_totsize = totsize;
1162 }
1163 start = find_next_block ();
1164 bufsize = available_space_after (start);
1165 if (sizeleft < bufsize)
1166 {
1167 bufsize = sizeleft;
1168 count = bufsize % BLOCKSIZE;
1169 if (count)
1170 memset (start->buffer + sizeleft, 0, BLOCKSIZE - count);
1171 }
1172 memcpy (start->buffer, p_buffer, bufsize);
1173 sizeleft -= bufsize;
1174 p_buffer += bufsize;
1175 set_next_block_after (start + (bufsize - 1) / BLOCKSIZE);
1176 }
1177 if (multi_volume_option)
1178 assign_string (&save_name, 0);
1179 goto finish_dir;
1180 }
1181
1182 /* See if we are about to recurse into a directory, and avoid doing
1183 so if the user wants that we do not descend into directories. */
1184
1185 if (! recursion_option)
1186 goto finish_dir;
1187
1188 /* See if we are crossing from one file system to another, and
1189 avoid doing so if the user only wants to dump one file system. */
1190
1191 if (one_file_system_option && !top_level
1192 && parent_device != current_stat_info.stat.st_dev)
1193 {
1194 if (verbose_option)
1195 WARN ((0, 0,
1196 _("%s: file is on a different filesystem; not dumped"),
1197 quotearg_colon (p)));
1198 goto finish_dir;
1199 }
1200
1201 /* Now output all the files in the directory. */
1202
1203 /* FIXME: Should speed this up by cd-ing into the dir. */
1204
1205 for (entry = directory;
1206 (entrylen = strlen (entry)) != 0;
1207 entry += entrylen + 1)
1208 {
1209 if (buflen < len + entrylen)
1210 {
1211 buflen = len + entrylen;
1212 namebuf = xrealloc (namebuf, buflen + 1);
1213 }
1214 strcpy (namebuf + len, entry);
1215 if (!excluded_name (namebuf))
1216 dump_file (namebuf, 0, our_device);
1217 }
1218
1219 finish_dir:
1220
1221 free (directory);
1222 free (namebuf);
1223 if (atime_preserve_option)
1224 utime (p, &restore_times);
1225 return;
1226 }
1227 else if (is_avoided_name (p))
1228 return;
1229 else
1230 {
1231 /* Check for multiple links. */
1232
1233 if (1 < current_stat_info.stat.st_nlink && link_table)
1234 {
1235 struct link lp;
1236 struct link *dup;
1237 lp.ino = current_stat_info.stat.st_ino;
1238 lp.dev = current_stat_info.stat.st_dev;
1239
1240 if ((dup = hash_lookup (link_table, &lp)))
1241 {
1242 /* We found a link. */
1243 char const *link_name = safer_name_suffix (dup->name, 1);
1244
1245 dup->nlink--;
1246
1247 block_ordinal = current_block_ordinal ();
1248 if (NAME_FIELD_SIZE <= strlen (link_name))
1249 write_long (link_name, GNUTYPE_LONGLINK);
1250 assign_string (&current_stat_info.link_name, link_name);
1251
1252 current_stat_info.stat.st_size = 0;
1253 header = start_header (p, &current_stat_info);
1254 strncpy (header->header.linkname, link_name, NAME_FIELD_SIZE);
1255
1256 /* Force null termination. */
1257 header->header.linkname[NAME_FIELD_SIZE - 1] = 0;
1258
1259 header->header.typeflag = LNKTYPE;
1260 finish_header (header, block_ordinal);
1261
1262 /* FIXME: Maybe remove from table after all links found? */
1263
1264 if (remove_files_option && unlink (p) != 0)
1265 unlink_error (p);
1266
1267 /* We dumped it, and we don't need to put it in the
1268 table again. */
1269 return;
1270 }
1271 }
1272
1273 /* This is not a link to a previously dumped file, so dump it. */
1274
1275 if (S_ISREG (current_stat_info.stat.st_mode)
1276 || S_ISCTG (current_stat_info.stat.st_mode))
1277 {
1278 int f; /* file descriptor */
1279 size_t bufsize;
1280 ssize_t count;
1281 off_t sizeleft;
1282 union block *start;
1283 int header_moved;
1284 char isextended = 0;
1285 int sparses = 0;
1286
1287 header_moved = 0;
1288
1289 if (sparse_option)
1290 {
1291 /* Check the size of the file against the number of blocks
1292 allocated for it, counting both data and indirect blocks.
1293 If there is a smaller number of blocks than would be
1294 necessary to accommodate a file of this size, this is safe
1295 to say that we have a sparse file: at least one of those
1296 blocks in the file is just a useless hole. For sparse
1297 files not having more hole blocks than indirect blocks, the
1298 sparseness will go undetected. */
1299
1300 /* Bruno Haible sent me these statistics for Linux. It seems
1301 that some filesystems count indirect blocks in st_blocks,
1302 while others do not seem to:
1303
1304 minix-fs tar: size=7205, st_blocks=18 and ST_NBLOCKS=18
1305 extfs tar: size=7205, st_blocks=18 and ST_NBLOCKS=18
1306 ext2fs tar: size=7205, st_blocks=16 and ST_NBLOCKS=16
1307 msdos-fs tar: size=7205, st_blocks=16 and ST_NBLOCKS=16
1308
1309 Dick Streefland reports the previous numbers as misleading,
1310 because ext2fs use 12 direct blocks, while minix-fs uses only
1311 6 direct blocks. Dick gets:
1312
1313 ext2 size=20480 ls listed blocks=21
1314 minix size=20480 ls listed blocks=21
1315 msdos size=20480 ls listed blocks=20
1316
1317 It seems that indirect blocks *are* included in st_blocks.
1318 The minix filesystem does not account for phantom blocks in
1319 st_blocks, so `du' and `ls -s' give wrong results. So, the
1320 --sparse option would not work on a minix filesystem. */
1321
1322 if (ST_NBLOCKS (current_stat_info.stat)
1323 < (current_stat_info.stat.st_size / ST_NBLOCKSIZE
1324 + (current_stat_info.stat.st_size % ST_NBLOCKSIZE != 0)))
1325 {
1326 int counter;
1327
1328 block_ordinal = current_block_ordinal ();
1329 header = start_header (p, &current_stat_info);
1330 header->header.typeflag = GNUTYPE_SPARSE;
1331 header_moved = 1;
1332
1333 /* Call the routine that figures out the layout of the
1334 sparse file in question. SPARSES is the index of the
1335 first unused element of the "sparsearray," i.e.,
1336 the number of elements it needed to describe the file. */
1337
1338 sparses = deal_with_sparse (p, header);
1339
1340 /* See if we'll need an extended header later. */
1341
1342 if (SPARSES_IN_OLDGNU_HEADER < sparses)
1343 header->oldgnu_header.isextended = 1;
1344
1345 /* We store the "real" file size so we can show that in
1346 case someone wants to list the archive, i.e., tar tvf
1347 <file>. It might be kind of disconcerting if the
1348 shrunken file size was the one that showed up. */
1349
1350 OFF_TO_CHARS (current_stat_info.stat.st_size,
1351 header->oldgnu_header.realsize);
1352
1353 /* This will be the new "size" of the file, i.e., the size
1354 of the file minus the blocks of holes that we're
1355 skipping over. */
1356
1357 current_stat_info.stat.st_size = find_new_file_size (sparses);
1358 OFF_TO_CHARS (current_stat_info.stat.st_size, header->header.size);
1359
1360 for (counter = 0;
1361 counter < sparses && counter < SPARSES_IN_OLDGNU_HEADER;
1362 counter++)
1363 {
1364 OFF_TO_CHARS (sparsearray[counter].offset,
1365 header->oldgnu_header.sp[counter].offset);
1366 SIZE_TO_CHARS (sparsearray[counter].numbytes,
1367 header->oldgnu_header.sp[counter].numbytes);
1368 }
1369 }
1370 }
1371
1372 sizeleft = current_stat_info.stat.st_size;
1373
1374 /* Don't bother opening empty, world readable files. Also do not open
1375 files when archive is meant for /dev/null. */
1376
1377 if (dev_null_output
1378 || (sizeleft == 0
1379 && MODE_R == (MODE_R & current_stat_info.stat.st_mode)))
1380 f = -1;
1381 else
1382 {
1383 f = open (p, O_RDONLY | O_BINARY);
1384 if (f < 0)
1385 {
1386 if (! top_level && errno == ENOENT)
1387 WARN ((0, 0, _("%s: File removed before we read it"),
1388 quotearg_colon (p)));
1389 else
1390 (ignore_failed_read_option ? open_warn : open_error) (p);
1391 return;
1392 }
1393 }
1394
1395 /* If the file is sparse, we've already taken care of this. */
1396
1397 if (!header_moved)
1398 {
1399 block_ordinal = current_block_ordinal ();
1400 header = start_header (p, &current_stat_info);
1401 }
1402
1403 /* Mark contiguous files, if we support them. */
1404
1405 if (archive_format != V7_FORMAT && S_ISCTG (current_stat_info.stat.st_mode))
1406 header->header.typeflag = CONTTYPE;
1407
1408 isextended = header->oldgnu_header.isextended;
1409 save_typeflag = header->header.typeflag;
1410 finish_header (header, block_ordinal);
1411 if (isextended)
1412 {
1413 int sparses_emitted = SPARSES_IN_OLDGNU_HEADER;
1414
1415 for (;;)
1416 {
1417 int i;
1418 exhdr = find_next_block ();
1419 memset (exhdr->buffer, 0, BLOCKSIZE);
1420 for (i = 0;
1421 (i < SPARSES_IN_SPARSE_HEADER
1422 && sparses_emitted + i < sparses);
1423 i++)
1424 {
1425 SIZE_TO_CHARS (sparsearray[sparses_emitted + i].numbytes,
1426 exhdr->sparse_header.sp[i].numbytes);
1427 OFF_TO_CHARS (sparsearray[sparses_emitted + i].offset,
1428 exhdr->sparse_header.sp[i].offset);
1429 }
1430 set_next_block_after (exhdr);
1431 sparses_emitted += i;
1432 if (sparses == sparses_emitted)
1433 break;
1434 exhdr->sparse_header.isextended = 1;
1435 }
1436 }
1437 if (save_typeflag == GNUTYPE_SPARSE)
1438 {
1439 if (f < 0
1440 || finish_sparse_file (f, &sizeleft,
1441 current_stat_info.stat.st_size, p))
1442 goto padit;
1443 }
1444 else
1445 while (sizeleft > 0)
1446 {
1447 if (multi_volume_option)
1448 {
1449 assign_string (&save_name, p);
1450 save_sizeleft = sizeleft;
1451 save_totsize = current_stat_info.stat.st_size;
1452 }
1453 start = find_next_block ();
1454
1455 bufsize = available_space_after (start);
1456
1457 if (sizeleft < bufsize)
1458 {
1459 /* Last read -- zero out area beyond. */
1460
1461 bufsize = sizeleft;
1462 count = bufsize % BLOCKSIZE;
1463 if (count)
1464 memset (start->buffer + sizeleft, 0, BLOCKSIZE - count);
1465 }
1466 if (f < 0)
1467 count = bufsize;
1468 else
1469 count = safe_read (f, start->buffer, bufsize);
1470 if (count < 0)
1471 {
1472 (ignore_failed_read_option
1473 ? read_warn_details
1474 : read_error_details)
1475 (p, current_stat_info.stat.st_size - sizeleft, bufsize);
1476 goto padit;
1477 }
1478 sizeleft -= count;
1479
1480 /* This is nonportable (the type of set_next_block_after's arg). */
1481
1482 set_next_block_after (start + (bufsize - 1) / BLOCKSIZE);
1483
1484
1485 if (count != bufsize)
1486 {
1487 char buf[UINTMAX_STRSIZE_BOUND];
1488 memset (start->buffer + count, 0, bufsize - count);
1489 WARN ((0, 0,
1490 _("%s: File shrank by %s bytes; padding with zeros"),
1491 quotearg_colon (p),
1492 STRINGIFY_BIGINT (sizeleft, buf)));
1493 if (! ignore_failed_read_option)
1494 exit_status = TAREXIT_FAILURE;
1495 goto padit; /* short read */
1496 }
1497 }
1498
1499 if (multi_volume_option)
1500 assign_string (&save_name, 0);
1501
1502 if (f >= 0)
1503 {
1504 struct stat final_stat;
1505 if (fstat (f, &final_stat) != 0)
1506 {
1507 if (ignore_failed_read_option)
1508 stat_warn (p);
1509 else
1510 stat_error (p);
1511 }
1512 else if (final_stat.st_ctime != original_ctime)
1513 {
1514 char const *qp = quotearg_colon (p);
1515 WARN ((0, 0, _("%s: file changed as we read it"), qp));
1516 }
1517 if (close (f) != 0)
1518 {
1519 if (ignore_failed_read_option)
1520 close_warn (p);
1521 else
1522 close_error (p);
1523 }
1524 if (atime_preserve_option)
1525 utime (p, &restore_times);
1526 }
1527 if (remove_files_option)
1528 {
1529 if (unlink (p) == -1)
1530 unlink_error (p);
1531 }
1532 goto file_was_dumped;
1533
1534 /* File shrunk or gave error, pad out tape to match the size we
1535 specified in the header. */
1536
1537 padit:
1538 while (sizeleft > 0)
1539 {
1540 save_sizeleft = sizeleft;
1541 start = find_next_block ();
1542 memset (start->buffer, 0, BLOCKSIZE);
1543 set_next_block_after (start);
1544 sizeleft -= BLOCKSIZE;
1545 }
1546 if (multi_volume_option)
1547 assign_string (&save_name, 0);
1548 if (f >= 0)
1549 {
1550 close (f);
1551 if (atime_preserve_option)
1552 utime (p, &restore_times);
1553 }
1554 goto file_was_dumped;
1555 }
1556 #ifdef HAVE_READLINK
1557 else if (S_ISLNK (current_stat_info.stat.st_mode))
1558 {
1559 char *buffer;
1560 int size;
1561 size_t linklen = current_stat_info.stat.st_size;
1562 if (linklen != current_stat_info.stat.st_size || linklen + 1 == 0)
1563 xalloc_die ();
1564 buffer = (char *) alloca (linklen + 1);
1565 size = readlink (p, buffer, linklen + 1);
1566 if (size < 0)
1567 {
1568 if (ignore_failed_read_option)
1569 readlink_warn (p);
1570 else
1571 readlink_error (p);
1572 return;
1573 }
1574 buffer[size] = '\0';
1575 if (size >= NAME_FIELD_SIZE)
1576 write_long (buffer, GNUTYPE_LONGLINK);
1577 assign_string (&current_stat_info.link_name, buffer);
1578
1579 block_ordinal = current_block_ordinal ();
1580 current_stat_info.stat.st_size = 0; /* force 0 size on symlink */
1581 header = start_header (p, &current_stat_info);
1582 strncpy (header->header.linkname, buffer, NAME_FIELD_SIZE);
1583 header->header.linkname[NAME_FIELD_SIZE - 1] = '\0';
1584 header->header.typeflag = SYMTYPE;
1585 finish_header (header, block_ordinal);
1586 /* nothing more to do to it */
1587
1588 if (remove_files_option)
1589 {
1590 if (unlink (p) == -1)
1591 unlink_error (p);
1592 }
1593 goto file_was_dumped;
1594 }
1595 #endif
1596 else if (S_ISCHR (current_stat_info.stat.st_mode))
1597 type = CHRTYPE;
1598 else if (S_ISBLK (current_stat_info.stat.st_mode))
1599 type = BLKTYPE;
1600 else if (S_ISFIFO (current_stat_info.stat.st_mode))
1601 type = FIFOTYPE;
1602 else if (S_ISSOCK (current_stat_info.stat.st_mode))
1603 {
1604 WARN ((0, 0, _("%s: socket ignored"), quotearg_colon (p)));
1605 return;
1606 }
1607 else if (S_ISDOOR (current_stat_info.stat.st_mode))
1608 {
1609 WARN ((0, 0, _("%s: door ignored"), quotearg_colon (p)));
1610 return;
1611 }
1612 else
1613 goto unknown;
1614 }
1615
1616 if (archive_format == V7_FORMAT)
1617 goto unknown;
1618
1619 block_ordinal = current_block_ordinal ();
1620 current_stat_info.stat.st_size = 0; /* force 0 size */
1621 header = start_header (p, &current_stat_info);
1622 header->header.typeflag = type;
1623
1624 if (type != FIFOTYPE)
1625 {
1626 MAJOR_TO_CHARS (major (current_stat_info.stat.st_rdev), header->header.devmajor);
1627 MINOR_TO_CHARS (minor (current_stat_info.stat.st_rdev), header->header.devminor);
1628 }
1629
1630 finish_header (header, block_ordinal);
1631 if (remove_files_option)
1632 {
1633 if (unlink (p) == -1)
1634 unlink_error (p);
1635 }
1636 goto file_was_dumped;
1637
1638 unknown:
1639 WARN ((0, 0, _("%s: Unknown file type; file ignored"),
1640 quotearg_colon (p)));
1641 if (! ignore_failed_read_option)
1642 exit_status = TAREXIT_FAILURE;
1643 return;
1644
1645 file_was_dumped:
1646 if (1 < current_stat_info.stat.st_nlink)
1647 {
1648 struct link *dup;
1649 struct link *lp = xmalloc (offsetof (struct link, name)
1650 + strlen (p) + 1);
1651 lp->ino = current_stat_info.stat.st_ino;
1652 lp->dev = current_stat_info.stat.st_dev;
1653 lp->nlink = current_stat_info.stat.st_nlink;
1654 strcpy (lp->name, p);
1655
1656 if (! ((link_table
1657 || (link_table = hash_initialize (0, 0, hash_link,
1658 compare_links, 0)))
1659 && (dup = hash_insert (link_table, lp))))
1660 xalloc_die ();
1661
1662 if (dup != lp)
1663 abort ();
1664 lp->nlink--;
1665 }
1666
1667 }
1668
1669 /* For each dumped file, check if all its links were dumped. Emit
1670 warnings if it is not so. */
1671 void
1672 check_links ()
1673 {
1674 struct link *lp;
1675
1676 if (!link_table)
1677 return;
1678
1679 for (lp = hash_get_first (link_table); lp;
1680 lp = hash_get_next (link_table, lp))
1681 {
1682 if (lp->nlink)
1683 {
1684 WARN ((0, 0, _("Missing links to '%s'.\n"), lp->name));
1685 }
1686 }
1687 }
This page took 0.10588 seconds and 5 git commands to generate.