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