(dump_file): Relativize link names before dumping.
[debian/tar] / src / create.c
1 /* Create a tar archive.
2    Copyright 1985,92,93,94,96,97,99,2000, 2001 Free Software Foundation, Inc.
3    Written by John Gilmore, on 1985-08-25.
4
5    This program is free software; you can redistribute it and/or modify it
6    under the terms of the GNU General Public License as published by the
7    Free Software Foundation; either version 2, or (at your option) any later
8    version.
9
10    This program is distributed in the hope that it will be useful, but
11    WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
13    Public License for more details.
14
15    You should have received a copy of the GNU General Public License along
16    with this program; if not, write to the Free Software Foundation, Inc.,
17    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
18
19 #include "system.h"
20
21 #if !MSDOS
22 # include <pwd.h>
23 # include <grp.h>
24 #endif
25
26 #if HAVE_UTIME_H
27 # include <utime.h>
28 #else
29 struct utimbuf
30   {
31     long actime;
32     long modtime;
33   };
34 #endif
35
36 #include <quotearg.h>
37
38 #include "common.h"
39 #include <hash.h>
40
41 #ifndef MSDOS
42 extern dev_t ar_dev;
43 extern ino_t ar_ino;
44 #endif
45
46 struct link
47   {
48     dev_t dev;
49     ino_t ino;
50     char name[1];
51   };
52 \f
53 /* The maximum uintmax_t value that can be represented with DIGITS digits,
54    assuming that each digit is BITS_PER_DIGIT wide.  */
55 #define MAX_VAL_WITH_DIGITS(digits, bits_per_digit) \
56    ((digits) * (bits_per_digit) < sizeof (uintmax_t) * CHAR_BIT \
57     ? ((uintmax_t) 1 << ((digits) * (bits_per_digit))) - 1 \
58     : (uintmax_t) -1)
59
60 /* Convert VALUE to an octal representation suitable for tar headers.
61    Output to buffer WHERE with size SIZE.
62    The result is undefined if SIZE is 0 or if VALUE is too large to fit.  */
63
64 static void
65 to_octal (uintmax_t value, char *where, size_t size)
66 {
67   uintmax_t v = value;
68   size_t i = size;
69
70   do
71     {
72       where[--i] = '0' + (v & ((1 << LG_8) - 1));
73       v >>= LG_8;
74     }
75   while (i);
76 }
77
78 /* Convert NEGATIVE VALUE to a base-256 representation suitable for
79    tar headers.  NEGATIVE is 1 if VALUE was negative before being cast
80    to uintmax_t, 0 otherwise.  Output to buffer WHERE with size SIZE.
81    The result is undefined if SIZE is 0 or if VALUE is too large to
82    fit.  */
83
84 static void
85 to_base256 (int negative, uintmax_t value, char *where, size_t size)
86 {
87   uintmax_t v = value;
88   uintmax_t propagated_sign_bits =
89     ((uintmax_t) - negative << (CHAR_BIT * sizeof v - LG_256));
90   size_t i = size;
91
92   do
93     {
94       where[--i] = v & ((1 << LG_256) - 1);
95       v = propagated_sign_bits | (v >> LG_256);
96     }
97   while (i);
98 }
99
100 /* Convert NEGATIVE VALUE (which was originally of size VALSIZE) to
101    external form, using SUBSTITUTE (...) if VALUE won't fit.  Output
102    to buffer WHERE with size SIZE.  NEGATIVE is 1 iff VALUE was
103    negative before being cast to uintmax_t; its original bitpattern
104    can be deduced from VALSIZE, its original size before casting.
105    TYPE is the kind of value being output (useful for diagnostics).
106    Prefer the POSIX format of SIZE - 1 octal digits (with leading zero
107    digits), followed by '\0'.  If this won't work, and if GNU or
108    OLDGNU format is allowed, use '\200' followed by base-256, or (if
109    NEGATIVE is nonzero) '\377' followed by two's complement base-256.
110    If neither format works, use SUBSTITUTE (...)  instead.  Pass to
111    SUBSTITUTE the address of an 0-or-1 flag recording whether the
112    substitute value is negative.  */
113
114 static void
115 to_chars (int negative, uintmax_t value, size_t valsize,
116           uintmax_t (*substitute) PARAMS ((int *)),
117           char *where, size_t size, const char *type)
118 {
119   int base256_allowed = (archive_format == GNU_FORMAT
120                          || archive_format == OLDGNU_FORMAT);
121
122   /* Generate the POSIX octal representation if the number fits.  */
123   if (! negative && value <= MAX_VAL_WITH_DIGITS (size - 1, LG_8))
124     {
125       where[size - 1] = '\0';
126       to_octal (value, where, size - 1);
127     }
128
129   /* Otherwise, generate the base-256 representation if we are
130      generating an old or new GNU format and if the number fits.  */
131   else if (((negative ? -1 - value : value)
132             <= MAX_VAL_WITH_DIGITS (size - 1, LG_256))
133            && base256_allowed)
134     {
135       where[0] = negative ? -1 : 1 << (LG_256 - 1);
136       to_base256 (negative, value, where + 1, size - 1);
137     }
138
139   /* Otherwise, if the number is negative, and if it would not cause
140      ambiguity on this host by confusing positive with negative
141      values, then generate the POSIX octal representation of the value
142      modulo 2**(field bits).  The resulting tar file is
143      machine-dependent, since it depends on the host word size.  Yuck!
144      But this is the traditional behavior.  */
145   else if (negative && valsize * CHAR_BIT <= (size - 1) * LG_8)
146     {
147       static int warned_once;
148       if (! warned_once)
149         {
150           warned_once = 1;
151           WARN ((0, 0, _("Generating negative octal headers")));
152         }
153       where[size - 1] = '\0';
154       to_octal (value & MAX_VAL_WITH_DIGITS (valsize * CHAR_BIT, 1),
155                 where, size - 1);
156     }
157
158   /* Otherwise, output a substitute value if possible (with a
159      warning), and an error message if not.  */
160   else
161     {
162       uintmax_t maxval = (base256_allowed
163                           ? MAX_VAL_WITH_DIGITS (size - 1, LG_256)
164                           : MAX_VAL_WITH_DIGITS (size - 1, LG_8));
165       char valbuf[UINTMAX_STRSIZE_BOUND + 1];
166       char maxbuf[UINTMAX_STRSIZE_BOUND];
167       char minbuf[UINTMAX_STRSIZE_BOUND + 1];
168       char const *minval_string;
169       char const *maxval_string = STRINGIFY_BIGINT (maxval, maxbuf);
170       char const *value_string;
171
172       if (base256_allowed)
173         {
174           uintmax_t m = maxval + 1 ? maxval + 1 : maxval / 2 + 1;
175           char *p = STRINGIFY_BIGINT (m, minbuf + 1);
176           *--p = '-';
177           minval_string = p;
178         }
179       else
180         minval_string = "0";
181
182       if (negative)
183         {
184           char *p = STRINGIFY_BIGINT (- value, valbuf + 1);
185           *--p = '-';
186           value_string = p;
187         }
188       else
189         value_string = STRINGIFY_BIGINT (value, valbuf);
190
191       if (substitute)
192         {
193           int negsub;
194           uintmax_t sub = substitute (&negsub) & maxval;
195           uintmax_t s = (negsub &= archive_format == GNU_FORMAT) ? - sub : sub;
196           char subbuf[UINTMAX_STRSIZE_BOUND + 1];
197           char *sub_string = STRINGIFY_BIGINT (s, subbuf + 1);
198           if (negsub)
199             *--sub_string = '-';
200           WARN ((0, 0, _("value %s out of %s range %s..%s; substituting %s"),
201                  value_string, type, minval_string, maxval_string,
202                  sub_string));
203           to_chars (negsub, s, valsize, 0, where, size, type);
204         }
205       else
206         ERROR ((0, 0, _("value %s out of %s range %s..%s"),
207                 value_string, type, minval_string, maxval_string));
208     }
209 }
210
211 static uintmax_t
212 gid_substitute (int *negative)
213 {
214   gid_t r;
215 #ifdef GID_NOBODY
216   r = GID_NOBODY;
217 #else
218   static gid_t gid_nobody;
219   if (!gid_nobody && !gname_to_gid ("nobody", &gid_nobody))
220     gid_nobody = -2;
221   r = gid_nobody;
222 #endif
223   *negative = r < 0;
224   return r;
225 }
226
227 void
228 gid_to_chars (gid_t v, char *p, size_t s)
229 {
230   to_chars (v < 0, (uintmax_t) v, sizeof v, gid_substitute, p, s, "gid_t");
231 }
232
233 void
234 major_to_chars (major_t v, char *p, size_t s)
235 {
236   to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "major_t");
237 }
238
239 void
240 minor_to_chars (minor_t v, char *p, size_t s)
241 {
242   to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "minor_t");
243 }
244
245 void
246 mode_to_chars (mode_t v, char *p, size_t s)
247 {
248   /* In the common case where the internal and external mode bits are the same,
249      and we are not using POSIX or GNU format,
250      propagate all unknown bits to the external mode.
251      This matches historical practice.
252      Otherwise, just copy the bits we know about.  */
253   int negative;
254   uintmax_t u;
255   if (S_ISUID == TSUID && S_ISGID == TSGID && S_ISVTX == TSVTX
256       && S_IRUSR == TUREAD && S_IWUSR == TUWRITE && S_IXUSR == TUEXEC
257       && S_IRGRP == TGREAD && S_IWGRP == TGWRITE && S_IXGRP == TGEXEC
258       && S_IROTH == TOREAD && S_IWOTH == TOWRITE && S_IXOTH == TOEXEC
259       && archive_format != POSIX_FORMAT
260       && archive_format != GNU_FORMAT)
261     {
262       negative = v < 0;
263       u = v;
264     }
265   else
266     {
267       negative = 0;
268       u = ((v & S_ISUID ? TSUID : 0)
269            | (v & S_ISGID ? TSGID : 0)
270            | (v & S_ISVTX ? TSVTX : 0)
271            | (v & S_IRUSR ? TUREAD : 0)
272            | (v & S_IWUSR ? TUWRITE : 0)
273            | (v & S_IXUSR ? TUEXEC : 0)
274            | (v & S_IRGRP ? TGREAD : 0)
275            | (v & S_IWGRP ? TGWRITE : 0)
276            | (v & S_IXGRP ? TGEXEC : 0)
277            | (v & S_IROTH ? TOREAD : 0)
278            | (v & S_IWOTH ? TOWRITE : 0)
279            | (v & S_IXOTH ? TOEXEC : 0));
280     }
281   to_chars (negative, u, sizeof v, 0, p, s, "mode_t");
282 }
283
284 void
285 off_to_chars (off_t v, char *p, size_t s)
286 {
287   to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "off_t");
288 }
289
290 void
291 size_to_chars (size_t v, char *p, size_t s)
292 {
293   to_chars (0, (uintmax_t) v, sizeof v, 0, p, s, "size_t");
294 }
295
296 void
297 time_to_chars (time_t v, char *p, size_t s)
298 {
299   to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "time_t");
300 }
301
302 static uintmax_t
303 uid_substitute (int *negative)
304 {
305   uid_t r;
306 #ifdef UID_NOBODY
307   r = UID_NOBODY;
308 #else
309   static uid_t uid_nobody;
310   if (!uid_nobody && !uname_to_uid ("nobody", &uid_nobody))
311     uid_nobody = -2;
312   r = uid_nobody;
313 #endif
314   *negative = r < 0;
315   return r;
316 }
317
318 void
319 uid_to_chars (uid_t v, char *p, size_t s)
320 {
321   to_chars (v < 0, (uintmax_t) v, sizeof v, uid_substitute, p, s, "uid_t");
322 }
323
324 void
325 uintmax_to_chars (uintmax_t v, char *p, size_t s)
326 {
327   to_chars (0, v, sizeof v, 0, p, s, "uintmax_t");
328 }
329 \f
330 /* Writing routines.  */
331
332 /* Zero out the buffer so we don't confuse ourselves with leftover
333    data.  */
334 static void
335 clear_buffer (char *buffer)
336 {
337   memset (buffer, 0, BLOCKSIZE);
338 }
339
340 /* Write the EOT block(s).  Zero at least two blocks, through the end
341    of the record.  Old tar, as previous versions of GNU tar, writes
342    garbage after two zeroed blocks.  */
343 void
344 write_eot (void)
345 {
346   union block *pointer = find_next_block ();
347   memset (pointer->buffer, 0, BLOCKSIZE);
348   set_next_block_after (pointer);
349   pointer = find_next_block ();
350   memset (pointer->buffer, 0, available_space_after (pointer));
351   set_next_block_after (pointer);
352 }
353
354 /* Write a GNUTYPE_LONGLINK or GNUTYPE_LONGNAME block.  */
355
356 /* FIXME: Cross recursion between start_header and write_long!  */
357
358 static union block *start_header PARAMS ((const char *, struct stat *));
359
360 static void
361 write_long (const char *p, char type)
362 {
363   size_t size = strlen (p) + 1;
364   size_t bufsize;
365   union block *header;
366   struct stat foo;
367
368   memset (&foo, 0, sizeof foo);
369   foo.st_size = size;
370
371   header = start_header ("././@LongLink", &foo);
372   header->header.typeflag = type;
373   finish_header (header);
374
375   header = find_next_block ();
376
377   bufsize = available_space_after (header);
378
379   while (bufsize < size)
380     {
381       memcpy (header->buffer, p, bufsize);
382       p += bufsize;
383       size -= bufsize;
384       set_next_block_after (header + (bufsize - 1) / BLOCKSIZE);
385       header = find_next_block ();
386       bufsize = available_space_after (header);
387     }
388   memcpy (header->buffer, p, size);
389   memset (header->buffer + size, 0, bufsize - size);
390   set_next_block_after (header + (size - 1) / BLOCKSIZE);
391 }
392 \f
393 /* Return a suffix of the file NAME that is a relative file name.
394    Warn about `..' in file names.  But return NAME if the user wants
395    absolute file names.  */
396 static char const *
397 relativize (char const *name)
398 {
399   if (! absolute_names_option)
400     {
401       {
402         static int warned_once;
403         if (! warned_once && contains_dot_dot (name))
404           {
405             warned_once = 1;
406             WARN ((0, 0, _("Member names contain `..'")));
407           }
408       }
409
410       {
411         size_t prefix_len = FILESYSTEM_PREFIX_LEN (name);
412
413         while (ISSLASH (name[prefix_len]))
414           prefix_len++;
415
416         if (prefix_len)
417           {
418             static int warned_once;
419             if (!warned_once)
420               {
421                 warned_once = 1;
422                 WARN ((0, 0, _("Removing leading `%.*s' from member names"),
423                        (int) prefix_len, name));
424               }
425             name += prefix_len;
426           }
427       }
428     }
429
430   return name;
431 }
432 \f
433 /* Header handling.  */
434
435 /* Make a header block for the file whose stat info is st,
436    and return its address.  */
437
438 static union block *
439 start_header (const char *name, struct stat *st)
440 {
441   union block *header;
442
443   name = relativize (name);
444
445   if (sizeof header->header.name <= strlen (name))
446     write_long (name, GNUTYPE_LONGNAME);
447   header = find_next_block ();
448   memset (header->buffer, 0, sizeof (union block));
449
450   assign_string (&current_file_name, name);
451
452   strncpy (header->header.name, name, NAME_FIELD_SIZE);
453   header->header.name[NAME_FIELD_SIZE - 1] = '\0';
454
455   /* Override some stat fields, if requested to do so.  */
456
457   if (owner_option != (uid_t) -1)
458     st->st_uid = owner_option;
459   if (group_option != (gid_t) -1)
460     st->st_gid = group_option;
461   if (mode_option)
462     st->st_mode = ((st->st_mode & ~MODE_ALL)
463                    | mode_adjust (st->st_mode, mode_option));
464
465   /* Paul Eggert tried the trivial test ($WRITER cf a b; $READER tvf a)
466      for a few tars and came up with the following interoperability
467      matrix:
468
469               WRITER
470         1 2 3 4 5 6 7 8 9   READER
471         . . . . . . . . .   1 = SunOS 4.2 tar
472         # . . # # . . # #   2 = NEC SVR4.0.2 tar
473         . . . # # . . # .   3 = Solaris 2.1 tar
474         . . . . . . . . .   4 = GNU tar 1.11.1
475         . . . . . . . . .   5 = HP-UX 8.07 tar
476         . . . . . . . . .   6 = Ultrix 4.1
477         . . . . . . . . .   7 = AIX 3.2
478         . . . . . . . . .   8 = Hitachi HI-UX 1.03
479         . . . . . . . . .   9 = Omron UNIOS-B 4.3BSD 1.60Beta
480
481              . = works
482              # = ``impossible file type''
483
484      The following mask for old archive removes the `#'s in column 4
485      above, thus making GNU tar both a universal donor and a universal
486      acceptor for Paul's test.  */
487
488   if (archive_format == V7_FORMAT)
489     MODE_TO_CHARS (st->st_mode & MODE_ALL, header->header.mode);
490   else
491     MODE_TO_CHARS (st->st_mode, header->header.mode);
492
493   UID_TO_CHARS (st->st_uid, header->header.uid);
494   GID_TO_CHARS (st->st_gid, header->header.gid);
495   OFF_TO_CHARS (st->st_size, header->header.size);
496   TIME_TO_CHARS (st->st_mtime, header->header.mtime);
497
498   if (incremental_option)
499     if (archive_format == OLDGNU_FORMAT)
500       {
501         TIME_TO_CHARS (st->st_atime, header->oldgnu_header.atime);
502         TIME_TO_CHARS (st->st_ctime, header->oldgnu_header.ctime);
503       }
504
505   header->header.typeflag = archive_format == V7_FORMAT ? AREGTYPE : REGTYPE;
506
507   switch (archive_format)
508     {
509     case V7_FORMAT:
510       break;
511
512     case OLDGNU_FORMAT:
513       /* Overwrite header->header.magic and header.version in one blow.  */
514       strcpy (header->header.magic, OLDGNU_MAGIC);
515       break;
516
517     case POSIX_FORMAT:
518     case GNU_FORMAT:
519       strncpy (header->header.magic, TMAGIC, TMAGLEN);
520       strncpy (header->header.version, TVERSION, TVERSLEN);
521       break;
522
523     default:
524       abort ();
525     }
526
527   if (archive_format == V7_FORMAT || numeric_owner_option)
528     {
529       /* header->header.[ug]name are left as the empty string.  */
530     }
531   else
532     {
533       uid_to_uname (st->st_uid, header->header.uname);
534       gid_to_gname (st->st_gid, header->header.gname);
535     }
536
537   return header;
538 }
539
540 /* Finish off a filled-in header block and write it out.  We also
541    print the file name and/or full info if verbose is on.  */
542 void
543 finish_header (union block *header)
544 {
545   size_t i;
546   int sum;
547   char *p;
548
549   memcpy (header->header.chksum, CHKBLANKS, sizeof header->header.chksum);
550
551   sum = 0;
552   p = header->buffer;
553   for (i = sizeof *header; i-- != 0; )
554     /* We can't use unsigned char here because of old compilers, e.g. V7.  */
555     sum += 0xFF & *p++;
556
557   /* Fill in the checksum field.  It's formatted differently from the
558      other fields: it has [6] digits, a null, then a space -- rather than
559      digits, then a null.  We use to_chars.
560      The final space is already there, from
561      checksumming, and to_chars doesn't modify it.
562
563      This is a fast way to do:
564
565      sprintf(header->header.chksum, "%6o", sum);  */
566
567   uintmax_to_chars ((uintmax_t) sum, header->header.chksum, 7);
568
569   if (verbose_option
570       && header->header.typeflag != GNUTYPE_LONGLINK
571       && header->header.typeflag != GNUTYPE_LONGNAME)
572     {
573       /* These globals are parameters to print_header, sigh.  */
574
575       current_header = header;
576       /* current_stat is already set up.  */
577       current_format = archive_format;
578       print_header ();
579     }
580
581   set_next_block_after (header);
582 }
583 \f
584 /* Sparse file processing.  */
585
586 /* Takes a blockful of data and basically cruises through it to see if
587    it's made *entirely* of zeros, returning a 0 the instant it finds
588    something that is a nonzero, i.e., useful data.  */
589 static int
590 zero_block_p (char *buffer)
591 {
592   int counter;
593
594   for (counter = 0; counter < BLOCKSIZE; counter++)
595     if (buffer[counter] != '\0')
596       return 0;
597   return 1;
598 }
599
600 static void
601 init_sparsearray (void)
602 {
603   sp_array_size = 10;
604
605   /* Make room for our scratch space -- initially is 10 elts long.  */
606
607   sparsearray = xmalloc (sp_array_size * sizeof (struct sp_array));
608 }
609
610 static off_t
611 find_new_file_size (int sparses)
612 {
613   int i;
614   off_t s = 0;
615   for (i = 0; i < sparses; i++)
616     s += sparsearray[i].numbytes;
617   return s;
618 }
619
620 /* Make one pass over the file NAME, studying where any non-zero data
621    is, that is, how far into the file each instance of data is, and
622    how many bytes are there.  Save this information in the
623    sparsearray, which will later be translated into header
624    information.  */
625
626 /* There is little point in trimming small amounts of null data at the head
627    and tail of blocks, only avoid dumping full null blocks.  */
628
629 /* FIXME: this routine might accept bits of algorithmic cleanup, it is
630    too kludgey for my taste...  */
631
632 static int
633 deal_with_sparse (char *name, union block *header)
634 {
635   size_t numbytes = 0;
636   off_t offset = 0;
637   int file;
638   int sparses = 0;
639   ssize_t count;
640   char buffer[BLOCKSIZE];
641
642   if (archive_format == OLDGNU_FORMAT)
643     header->oldgnu_header.isextended = 0;
644
645   if (file = open (name, O_RDONLY), file < 0)
646     /* This problem will be caught later on, so just return.  */
647     return 0;
648
649   init_sparsearray ();
650   clear_buffer (buffer);
651
652   for (;;)
653     {
654       /* Realloc the scratch area as necessary.  FIXME: should reallocate
655          only at beginning of a new instance of non-zero data.  */
656
657       if (sp_array_size <= sparses)
658         {
659           sparsearray =
660             xrealloc (sparsearray,
661                       2 * sp_array_size * sizeof (struct sp_array));
662           sp_array_size *= 2;
663         }
664       
665       count = safe_read (file, buffer, sizeof buffer);
666       if (count <= 0)
667         break;
668
669       /* Process one block.  */
670
671       if (count == sizeof buffer)
672
673         if (zero_block_p (buffer))
674           {
675             if (numbytes)
676               {
677                 sparsearray[sparses++].numbytes = numbytes;
678                 numbytes = 0;
679               }
680           }
681         else
682           {
683             if (!numbytes)
684               sparsearray[sparses].offset = offset;
685             numbytes += count;
686           }
687
688       else
689
690         /* Since count < sizeof buffer, we have the last bit of the file.  */
691
692         if (!zero_block_p (buffer))
693           {
694             if (!numbytes)
695               sparsearray[sparses].offset = offset;
696             numbytes += count;
697           }
698         else
699           /* The next two lines are suggested by Andreas Degert, who says
700              they are required for trailing full blocks to be written to the
701              archive, when all zeroed.  Yet, it seems to me that the case
702              does not apply.  Further, at restore time, the file is not as
703              sparse as it should.  So, some serious cleanup is *also* needed
704              in this area.  Just one more... :-(.  FIXME.  */
705           if (numbytes)
706             numbytes += count;
707
708       /* Prepare for next block.  */
709
710       offset += count;
711       /* FIXME: do not clear unless necessary.  */
712       clear_buffer (buffer);
713     }
714
715   if (numbytes)
716     sparsearray[sparses++].numbytes = numbytes;
717   else
718     {
719       sparsearray[sparses].offset = offset - 1;
720       sparsearray[sparses++].numbytes = 1;
721     }
722
723   return close (file) == 0 && 0 <= count ? sparses : 0;
724 }
725
726 static int
727 finish_sparse_file (int file, off_t *sizeleft, off_t fullsize, char *name)
728 {
729   union block *start;
730   size_t bufsize;
731   int sparses = 0;
732   ssize_t count;
733
734   while (*sizeleft > 0)
735     {
736       start = find_next_block ();
737       memset (start->buffer, 0, BLOCKSIZE);
738       bufsize = sparsearray[sparses].numbytes;
739       if (! bufsize)
740         abort ();
741
742       if (lseek (file, sparsearray[sparses++].offset, SEEK_SET) < 0)
743         {
744           (ignore_failed_read_option ? seek_warn_details : seek_error_details)
745             (name, sparsearray[sparses - 1].offset);
746           break;
747         }
748
749       /* If the number of bytes to be written here exceeds the size of
750          the temporary buffer, do it in steps.  */
751
752       while (bufsize > BLOCKSIZE)
753         {
754           count = safe_read (file, start->buffer, BLOCKSIZE);
755           if (count < 0)
756             {
757               (ignore_failed_read_option
758                ? read_warn_details
759                : read_error_details)
760                 (name, fullsize - *sizeleft, bufsize);
761               return 1;
762             }
763           bufsize -= count;
764           *sizeleft -= count;
765           set_next_block_after (start);
766           start = find_next_block ();
767           memset (start->buffer, 0, BLOCKSIZE);
768         }
769
770       {
771         char buffer[BLOCKSIZE];
772
773         clear_buffer (buffer);
774         count = safe_read (file, buffer, bufsize);
775         memcpy (start->buffer, buffer, BLOCKSIZE);
776       }
777
778       if (count < 0)
779         {
780           (ignore_failed_read_option
781            ? read_warn_details
782            : read_error_details)
783             (name, fullsize - *sizeleft, bufsize);
784           return 1;
785         }
786
787       *sizeleft -= count;
788       set_next_block_after (start);
789     }
790   free (sparsearray);
791 #if 0
792   set_next_block_after (start + (count - 1) / BLOCKSIZE);
793 #endif
794   return 0;
795 }
796 \f
797 /* Main functions of this module.  */
798
799 void
800 create_archive (void)
801 {
802   char *p;
803
804   open_archive (ACCESS_WRITE);
805
806   if (incremental_option)
807     {
808       size_t buffer_size = 1000;
809       char *buffer = xmalloc (buffer_size);
810       const char *q;
811
812       collect_and_sort_names ();
813
814       while (p = name_from_list (), p)
815         if (!excluded_name (p))
816           dump_file (p, -1, (dev_t) 0);
817
818       blank_name_list ();
819       while (p = name_from_list (), p)
820         if (!excluded_name (p))
821           {
822             size_t plen = strlen (p);
823             if (buffer_size <= plen)
824               {
825                 while ((buffer_size *= 2) <= plen)
826                   continue;
827                 buffer = xrealloc (buffer, buffer_size);
828               }
829             memcpy (buffer, p, plen);
830             if (! ISSLASH (buffer[plen - 1]))
831               buffer[plen++] = '/';
832             q = gnu_list_name->dir_contents;
833             if (q)
834               while (*q)
835                 {
836                   size_t qlen = strlen (q);
837                   if (*q == 'Y')
838                     {
839                       if (buffer_size < plen + qlen)
840                         {
841                           while ((buffer_size *=2 ) < plen + qlen)
842                             continue;
843                           buffer = xrealloc (buffer, buffer_size);
844                         }
845                       strcpy (buffer + plen, q + 1);
846                       dump_file (buffer, -1, (dev_t) 0);
847                     }
848                   q += qlen + 1;
849                 }
850           }
851       free (buffer);
852     }
853   else
854     {
855       while (p = name_next (1), p)
856         if (!excluded_name (p))
857           dump_file (p, 1, (dev_t) 0);
858     }
859
860   write_eot ();
861   close_archive ();
862
863   if (listed_incremental_option)
864     write_directory_file ();
865 }
866
867
868 /* Calculate the hash of a link.  */
869 static unsigned
870 hash_link (void const *entry, unsigned n_buckets)
871 {
872   struct link const *link = entry;
873   return (uintmax_t) (link->dev ^ link->ino) % n_buckets;
874 }
875
876 /* Compare two links for equality.  */
877 static bool
878 compare_links (void const *entry1, void const *entry2)
879 {
880   struct link const *link1 = entry1;
881   struct link const *link2 = entry2;
882   return ((link1->dev ^ link2->dev) | (link1->ino ^ link2->ino)) == 0;
883 }
884
885 /* Dump a single file, recursing on directories.  P is the file name
886    to dump.  TOP_LEVEL tells whether this is a top-level call; zero
887    means no, positive means yes, and negative means an incremental
888    dump.  PARENT_DEVICE is the device of P's
889    parent directory; it is examined only if TOP_LEVEL is zero.
890
891    Set global CURRENT_STAT to stat output for this file.  */
892
893 /* FIXME: One should make sure that for *every* path leading to setting
894    exit_status to failure, a clear diagnostic has been issued.  */
895
896 void
897 dump_file (char *p, int top_level, dev_t parent_device)
898 {
899   union block *header;
900   char type;
901   union block *exhdr;
902   char save_typeflag;
903   time_t original_ctime;
904   struct utimbuf restore_times;
905
906   /* FIXME: `header' might be used uninitialized in this
907      function.  Reported by Bruno Haible.  */
908
909   if (interactive_option && !confirm ("add", p))
910     return;
911
912   if (deref_stat (dereference_option, p, &current_stat) != 0)
913     {
914       if (ignore_failed_read_option)
915         stat_warn (p);
916       else
917         stat_error (p);
918       return;
919     }
920
921   original_ctime = current_stat.st_ctime;
922   restore_times.actime = current_stat.st_atime;
923   restore_times.modtime = current_stat.st_mtime;
924
925 #ifdef S_ISHIDDEN
926   if (S_ISHIDDEN (current_stat.st_mode))
927     {
928       char *new = (char *) alloca (strlen (p) + 2);
929       if (new)
930         {
931           strcpy (new, p);
932           strcat (new, "@");
933           p = new;
934         }
935     }
936 #endif
937
938   /* See if we want only new files, and check if this one is too old to
939      put in the archive.  */
940
941   if ((0 < top_level || !incremental_option)
942       && !S_ISDIR (current_stat.st_mode)
943       && current_stat.st_mtime < newer_mtime_option
944       && (!after_date_option || current_stat.st_ctime < newer_ctime_option))
945     {
946       if (0 < top_level)
947         WARN ((0, 0, _("%s: file is unchanged; not dumped"),
948                quotearg_colon (p)));
949       /* FIXME: recheck this return.  */
950       return;
951     }
952
953 #if !MSDOS
954   /* See if we are trying to dump the archive.  */
955
956   if (ar_dev && current_stat.st_dev == ar_dev && current_stat.st_ino == ar_ino)
957     {
958       WARN ((0, 0, _("%s: file is the archive; not dumped"),
959              quotearg_colon (p)));
960       return;
961     }
962 #endif
963
964   if (S_ISDIR (current_stat.st_mode))
965     {
966       char *directory;
967       char const *entry;
968       size_t entrylen;
969       char *namebuf;
970       size_t buflen;
971       size_t len;
972       dev_t our_device = current_stat.st_dev;
973
974       errno = 0;
975
976       directory = savedir (p);
977       if (! directory)
978         {
979           if (ignore_failed_read_option)
980             savedir_warn (p);
981           else
982             savedir_error (p);
983           return;
984         }
985
986       /* Build new prototype name.  Ensure exactly one trailing slash.  */
987
988       len = strlen (p);
989       buflen = len + NAME_FIELD_SIZE;
990       namebuf = xmalloc (buflen + 1);
991       memcpy (namebuf, p, len);
992       while (len >= 1 && ISSLASH (namebuf[len - 1]))
993         len--;
994       namebuf[len++] = '/';
995       namebuf[len] = '\0';
996
997       if (! is_avoided_name (namebuf))
998         {
999           /* The condition above used to be "archive_format != V7_FORMAT".
1000              GNU tar was not writing directory blocks at all.  Daniel Trinkle
1001              writes: ``All old versions of tar I have ever seen have
1002              correctly archived an empty directory.  The really old ones I
1003              checked included HP-UX 7 and Mt. Xinu More/BSD.  There may be
1004              some subtle reason for the exclusion that I don't know, but the
1005              current behavior is broken.''  I do not know those subtle
1006              reasons either, so until these are reported (anew?), just allow
1007              directory blocks to be written even with old archives.  */
1008
1009           current_stat.st_size = 0;     /* force 0 size on dir */
1010
1011           /* FIXME: If people could really read standard archives, this
1012              should be:
1013
1014              header
1015                = start_header (standard_option ? p : namebuf, &current_stat);
1016
1017              but since they'd interpret DIRTYPE blocks as regular
1018              files, we'd better put the / on the name.  */
1019
1020           header = start_header (namebuf, &current_stat);
1021
1022           if (incremental_option)
1023             header->header.typeflag = GNUTYPE_DUMPDIR;
1024           else /* if (standard_option) */
1025             header->header.typeflag = DIRTYPE;
1026
1027           /* If we're gnudumping, we aren't done yet so don't close it.  */
1028
1029           if (!incremental_option)
1030             finish_header (header);     /* done with directory header */
1031         }
1032
1033       if (incremental_option && gnu_list_name->dir_contents)
1034         {
1035           off_t sizeleft;
1036           off_t totsize;
1037           size_t bufsize;
1038           union block *start;
1039           ssize_t count;
1040           const char *buffer, *p_buffer;
1041
1042           buffer = gnu_list_name->dir_contents; /* FOO */
1043           totsize = 0;
1044           for (p_buffer = buffer; p_buffer && *p_buffer;)
1045             {
1046               size_t tmp;
1047
1048               tmp = strlen (p_buffer) + 1;
1049               totsize += tmp;
1050               p_buffer += tmp;
1051             }
1052           totsize++;
1053           OFF_TO_CHARS (totsize, header->header.size);
1054           finish_header (header);
1055           p_buffer = buffer;
1056           sizeleft = totsize;
1057           while (sizeleft > 0)
1058             {
1059               if (multi_volume_option)
1060                 {
1061                   assign_string (&save_name, p);
1062                   save_sizeleft = sizeleft;
1063                   save_totsize = totsize;
1064                 }
1065               start = find_next_block ();
1066               bufsize = available_space_after (start);
1067               if (sizeleft < bufsize)
1068                 {
1069                   bufsize = sizeleft;
1070                   count = bufsize % BLOCKSIZE;
1071                   if (count)
1072                     memset (start->buffer + sizeleft, 0, BLOCKSIZE - count);
1073                 }
1074               memcpy (start->buffer, p_buffer, bufsize);
1075               sizeleft -= bufsize;
1076               p_buffer += bufsize;
1077               set_next_block_after (start + (bufsize - 1) / BLOCKSIZE);
1078             }
1079           if (multi_volume_option)
1080             assign_string (&save_name, 0);
1081           goto finish_dir;
1082         }
1083
1084       /* See if we are about to recurse into a directory, and avoid doing
1085          so if the user wants that we do not descend into directories.  */
1086
1087       if (! recursion_option)
1088         goto finish_dir;
1089
1090       /* See if we are crossing from one file system to another, and
1091          avoid doing so if the user only wants to dump one file system.  */
1092
1093       if (one_file_system_option && !top_level
1094           && parent_device != current_stat.st_dev)
1095         {
1096           if (verbose_option)
1097             WARN ((0, 0,
1098                    _("%s: file is on a different filesystem; not dumped"),
1099                    quotearg_colon (p)));
1100           goto finish_dir;
1101         }
1102
1103       /* Now output all the files in the directory.  */
1104
1105       /* FIXME: Should speed this up by cd-ing into the dir.  */
1106
1107       for (entry = directory;
1108            (entrylen = strlen (entry)) != 0;
1109            entry += entrylen + 1)
1110         {
1111           if (buflen <= len + entrylen)
1112             {
1113               buflen = len + entrylen;
1114               namebuf = xrealloc (namebuf, buflen + 1);
1115             }
1116           strcpy (namebuf + len, entry);
1117           if (!excluded_name (namebuf))
1118             dump_file (namebuf, 0, our_device);
1119         }
1120
1121     finish_dir:
1122
1123       free (directory);
1124       free (namebuf);
1125       if (atime_preserve_option)
1126         utime (p, &restore_times);
1127       return;
1128     }
1129   else if (is_avoided_name (p))
1130     return;
1131   else
1132     {
1133       /* Check for multiple links.
1134
1135          We maintain a table of all such files that we've written so
1136          far.  Any time we see another, we check the table and avoid
1137          dumping the data again if we've done it once already.  */
1138
1139       if (1 < current_stat.st_nlink)
1140         {
1141           static Hash_table *link_table;
1142           struct link *lp = xmalloc (offsetof (struct link, name)
1143                                      + strlen (p) + 1);
1144           struct link *dup;
1145           lp->ino = current_stat.st_ino;
1146           lp->dev = current_stat.st_dev;
1147           strcpy (lp->name, p);
1148
1149           if (! ((link_table
1150                   || (link_table = hash_initialize (0, 0, hash_link,
1151                                                     compare_links, 0)))
1152                  && (dup = hash_insert (link_table, lp))))
1153             xalloc_die ();
1154
1155           if (dup != lp)
1156             {
1157               /* We found a link.  */
1158               char const *link_name = relativize (dup->name);
1159
1160               free (lp);
1161
1162               if (NAME_FIELD_SIZE <= strlen (link_name))
1163                 write_long (link_name, GNUTYPE_LONGLINK);
1164               assign_string (&current_link_name, link_name);
1165
1166               current_stat.st_size = 0;
1167               header = start_header (p, &current_stat);
1168               strncpy (header->header.linkname, link_name, NAME_FIELD_SIZE);
1169
1170               /* Force null termination.  */
1171               header->header.linkname[NAME_FIELD_SIZE - 1] = 0;
1172
1173               header->header.typeflag = LNKTYPE;
1174               finish_header (header);
1175
1176               /* FIXME: Maybe remove from table after all links found?  */
1177
1178               if (remove_files_option && unlink (p) != 0)
1179                 unlink_error (p);
1180
1181               /* We dumped it.  */
1182               return;
1183             }
1184         }
1185
1186       /* This is not a link to a previously dumped file, so dump it.  */
1187
1188       if (S_ISREG (current_stat.st_mode)
1189           || S_ISCTG (current_stat.st_mode))
1190         {
1191           int f;                        /* file descriptor */
1192           size_t bufsize;
1193           ssize_t count;
1194           off_t sizeleft;
1195           union block *start;
1196           int header_moved;
1197           char isextended = 0;
1198           int sparses = 0;
1199
1200           header_moved = 0;
1201
1202           if (sparse_option)
1203             {
1204               /* Check the size of the file against the number of blocks
1205                  allocated for it, counting both data and indirect blocks.
1206                  If there is a smaller number of blocks that would be
1207                  necessary to accommodate a file of this size, this is safe
1208                  to say that we have a sparse file: at least one of those
1209                  blocks in the file is just a useless hole.  For sparse
1210                  files not having more hole blocks than indirect blocks, the
1211                  sparseness will go undetected.  */
1212
1213               /* Bruno Haible sent me these statistics for Linux.  It seems
1214                  that some filesystems count indirect blocks in st_blocks,
1215                  while others do not seem to:
1216
1217                  minix-fs   tar: size=7205, st_blocks=18 and ST_NBLOCKS=18
1218                  extfs      tar: size=7205, st_blocks=18 and ST_NBLOCKS=18
1219                  ext2fs     tar: size=7205, st_blocks=16 and ST_NBLOCKS=16
1220                  msdos-fs   tar: size=7205, st_blocks=16 and ST_NBLOCKS=16
1221
1222                  Dick Streefland reports the previous numbers as misleading,
1223                  because ext2fs use 12 direct blocks, while minix-fs uses only
1224                  6 direct blocks.  Dick gets:
1225
1226                  ext2   size=20480      ls listed blocks=21
1227                  minix  size=20480      ls listed blocks=21
1228                  msdos  size=20480      ls listed blocks=20
1229
1230                  It seems that indirect blocks *are* included in st_blocks.
1231                  The minix filesystem does not account for phantom blocks in
1232                  st_blocks, so `du' and `ls -s' give wrong results.  So, the
1233                  --sparse option would not work on a minix filesystem.  */
1234
1235               if (ST_NBLOCKS (current_stat)
1236                   < (current_stat.st_size / ST_NBLOCKSIZE
1237                      + (current_stat.st_size % ST_NBLOCKSIZE != 0)))
1238                 {
1239                   int counter;
1240
1241                   header = start_header (p, &current_stat);
1242                   header->header.typeflag = GNUTYPE_SPARSE;
1243                   header_moved = 1;
1244
1245                   /* Call the routine that figures out the layout of the
1246                      sparse file in question.  SPARSES is the index of the
1247                      first unused element of the "sparsearray," i.e.,
1248                      the number of elements it needed to describe the file.  */
1249
1250                   sparses = deal_with_sparse (p, header);
1251
1252                   /* See if we'll need an extended header later.  */
1253
1254                   if (SPARSES_IN_OLDGNU_HEADER < sparses)
1255                     header->oldgnu_header.isextended = 1;
1256
1257                   /* We store the "real" file size so we can show that in
1258                      case someone wants to list the archive, i.e., tar tvf
1259                      <file>.  It might be kind of disconcerting if the
1260                      shrunken file size was the one that showed up.  */
1261
1262                   OFF_TO_CHARS (current_stat.st_size,
1263                                 header->oldgnu_header.realsize);
1264
1265                   /* This will be the new "size" of the file, i.e., the size
1266                      of the file minus the blocks of holes that we're
1267                      skipping over.  */
1268
1269                   current_stat.st_size = find_new_file_size (sparses);
1270                   OFF_TO_CHARS (current_stat.st_size, header->header.size);
1271
1272                   for (counter = 0;
1273                        counter < sparses && counter < SPARSES_IN_OLDGNU_HEADER;
1274                        counter++)
1275                     {
1276                       OFF_TO_CHARS (sparsearray[counter].offset,
1277                                     header->oldgnu_header.sp[counter].offset);
1278                       SIZE_TO_CHARS (sparsearray[counter].numbytes,
1279                                      header->oldgnu_header.sp[counter].numbytes);
1280                     }
1281                 }
1282             }
1283
1284           sizeleft = current_stat.st_size;
1285
1286           /* Don't bother opening empty, world readable files.  Also do not open
1287              files when archive is meant for /dev/null.  */
1288
1289           if (dev_null_output
1290               || (sizeleft == 0
1291                   && MODE_R == (MODE_R & current_stat.st_mode)))
1292             f = -1;
1293           else
1294             {
1295               f = open (p, O_RDONLY | O_BINARY);
1296               if (f < 0)
1297                 {
1298                   if (! top_level && errno == ENOENT)
1299                     WARN ((0, 0, _("%s: File removed before we read it"),
1300                            quotearg_colon (p)));
1301                   else
1302                     (ignore_failed_read_option ? open_warn : open_error) (p);
1303                   return;
1304                 }
1305             }
1306
1307           /* If the file is sparse, we've already taken care of this.  */
1308
1309           if (!header_moved)
1310             header = start_header (p, &current_stat);
1311
1312           /* Mark contiguous files, if we support them.  */
1313
1314           if (archive_format != V7_FORMAT && S_ISCTG (current_stat.st_mode))
1315             header->header.typeflag = CONTTYPE;
1316
1317           isextended = header->oldgnu_header.isextended;
1318           save_typeflag = header->header.typeflag;
1319           finish_header (header);
1320           if (isextended)
1321             {
1322               int sparses_emitted = SPARSES_IN_OLDGNU_HEADER;
1323
1324               for (;;)
1325                 {
1326                   int i;
1327                   exhdr = find_next_block ();
1328                   memset (exhdr->buffer, 0, BLOCKSIZE);
1329                   for (i = 0;
1330                        (i < SPARSES_IN_SPARSE_HEADER
1331                         && sparses_emitted + i < sparses);
1332                        i++)
1333                     {
1334                       SIZE_TO_CHARS (sparsearray[sparses_emitted + i].numbytes,
1335                                      exhdr->sparse_header.sp[i].numbytes);
1336                       OFF_TO_CHARS (sparsearray[sparses_emitted + i].offset,
1337                                     exhdr->sparse_header.sp[i].offset);
1338                     }
1339                   set_next_block_after (exhdr);
1340                   sparses_emitted += i;
1341                   if (sparses == sparses_emitted)
1342                     break;
1343                   exhdr->sparse_header.isextended = 1;
1344                 }
1345             }
1346           if (save_typeflag == GNUTYPE_SPARSE)
1347             {
1348               if (f < 0
1349                   || finish_sparse_file (f, &sizeleft,
1350                                          current_stat.st_size, p))
1351                 goto padit;
1352             }
1353           else
1354             while (sizeleft > 0)
1355               {
1356                 if (multi_volume_option)
1357                   {
1358                     assign_string (&save_name, p);
1359                     save_sizeleft = sizeleft;
1360                     save_totsize = current_stat.st_size;
1361                   }
1362                 start = find_next_block ();
1363
1364                 bufsize = available_space_after (start);
1365
1366                 if (sizeleft < bufsize)
1367                   {
1368                     /* Last read -- zero out area beyond.  */
1369
1370                     bufsize = sizeleft;
1371                     count = bufsize % BLOCKSIZE;
1372                     if (count)
1373                       memset (start->buffer + sizeleft, 0, BLOCKSIZE - count);
1374                   }
1375                 if (f < 0)
1376                   count = bufsize;
1377                 else
1378                   count = safe_read (f, start->buffer, bufsize);
1379                 if (count < 0)
1380                   {
1381                     (ignore_failed_read_option
1382                      ? read_warn_details
1383                      : read_error_details)
1384                       (p, current_stat.st_size - sizeleft, bufsize);
1385                     goto padit;
1386                   }
1387                 sizeleft -= bufsize;
1388
1389                 /* This is nonportable (the type of set_next_block_after's arg).  */
1390
1391                 set_next_block_after (start + (bufsize - 1) / BLOCKSIZE);
1392
1393
1394                 if (count != bufsize)
1395                   {
1396                     char buf[UINTMAX_STRSIZE_BOUND];
1397                     memset (start->buffer + count, 0, bufsize - count);
1398                     WARN ((0, 0,
1399                            _("%s: File shrank by %s bytes; padding with zeros"),
1400                            quotearg_colon (p),
1401                            STRINGIFY_BIGINT (sizeleft, buf)));
1402                     if (! ignore_failed_read_option)
1403                       exit_status = TAREXIT_FAILURE;
1404                     goto padit;         /* short read */
1405                   }
1406               }
1407
1408           if (multi_volume_option)
1409             assign_string (&save_name, 0);
1410
1411           if (f >= 0)
1412             {
1413               struct stat final_stat;
1414               if (fstat (f, &final_stat) != 0)
1415                 {
1416                   if (ignore_failed_read_option)
1417                     stat_warn (p);
1418                   else
1419                     stat_error (p);
1420                 }
1421               else if (final_stat.st_ctime != original_ctime)
1422                 {
1423                   char const *qp = quotearg_colon (p);
1424                   WARN ((0, 0, _("%s: file changed as we read it"), qp));
1425                   if (! ignore_failed_read_option)
1426                     exit_status = TAREXIT_FAILURE;
1427                 }
1428               if (close (f) != 0)
1429                 {
1430                   if (ignore_failed_read_option)
1431                     close_warn (p);
1432                   else
1433                     close_error (p);
1434                 }
1435               if (atime_preserve_option)
1436                 utime (p, &restore_times);
1437             }
1438           if (remove_files_option)
1439             {
1440               if (unlink (p) == -1)
1441                 unlink_error (p);
1442             }
1443           return;
1444
1445           /* File shrunk or gave error, pad out tape to match the size we
1446              specified in the header.  */
1447
1448         padit:
1449           while (sizeleft > 0)
1450             {
1451               save_sizeleft = sizeleft;
1452               start = find_next_block ();
1453               memset (start->buffer, 0, BLOCKSIZE);
1454               set_next_block_after (start);
1455               sizeleft -= BLOCKSIZE;
1456             }
1457           if (multi_volume_option)
1458             assign_string (&save_name, 0);
1459           if (f >= 0)
1460             {
1461               close (f);
1462               if (atime_preserve_option)
1463                 utime (p, &restore_times);
1464             }
1465           return;
1466         }
1467 #ifdef HAVE_READLINK
1468       else if (S_ISLNK (current_stat.st_mode))
1469         {
1470           char *buffer;
1471           int size;
1472           size_t linklen = current_stat.st_size;
1473           if (linklen != current_stat.st_size || linklen + 1 == 0)
1474             xalloc_die ();
1475           buffer = (char *) alloca (linklen + 1);
1476           size = readlink (p, buffer, linklen + 1);
1477           if (size < 0)
1478             {
1479               if (ignore_failed_read_option)
1480                 readlink_warn (p);
1481               else
1482                 readlink_error (p);
1483               return;
1484             }
1485           buffer[size] = '\0';
1486           if (size >= NAME_FIELD_SIZE)
1487             write_long (buffer, GNUTYPE_LONGLINK);
1488           assign_string (&current_link_name, buffer);
1489
1490           current_stat.st_size = 0;     /* force 0 size on symlink */
1491           header = start_header (p, &current_stat);
1492           strncpy (header->header.linkname, buffer, NAME_FIELD_SIZE);
1493           header->header.linkname[NAME_FIELD_SIZE - 1] = '\0';
1494           header->header.typeflag = SYMTYPE;
1495           finish_header (header);       /* nothing more to do to it */
1496           if (remove_files_option)
1497             {
1498               if (unlink (p) == -1)
1499                 unlink_error (p);
1500             }
1501           return;
1502         }
1503 #endif
1504       else if (S_ISCHR (current_stat.st_mode))
1505         type = CHRTYPE;
1506       else if (S_ISBLK (current_stat.st_mode))
1507         type = BLKTYPE;
1508       else if (S_ISFIFO (current_stat.st_mode))
1509         type = FIFOTYPE;
1510       else if (S_ISSOCK (current_stat.st_mode))
1511         {
1512           WARN ((0, 0, _("%s: socket ignored"), quotearg_colon (p)));
1513           return;
1514         }
1515       else if (S_ISDOOR (current_stat.st_mode))
1516         {
1517           WARN ((0, 0, _("%s: door ignored"), quotearg_colon (p)));
1518           return;
1519         }
1520       else
1521         goto unknown;
1522     }
1523
1524   if (archive_format == V7_FORMAT)
1525     goto unknown;
1526
1527   current_stat.st_size = 0;     /* force 0 size */
1528   header = start_header (p, &current_stat);
1529   header->header.typeflag = type;
1530
1531   if (type != FIFOTYPE)
1532     {
1533       MAJOR_TO_CHARS (major (current_stat.st_rdev), header->header.devmajor);
1534       MINOR_TO_CHARS (minor (current_stat.st_rdev), header->header.devminor);
1535     }
1536
1537   finish_header (header);
1538   if (remove_files_option)
1539     {
1540       if (unlink (p) == -1)
1541         unlink_error (p);
1542     }
1543   return;
1544
1545 unknown:
1546   WARN ((0, 0, _("%s: Unknown file type; file ignored"),
1547          quotearg_colon (p)));
1548   if (! ignore_failed_read_option)
1549     exit_status = TAREXIT_FAILURE;
1550 }