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