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