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