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