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