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