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