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