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