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