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