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