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