1 /* POSIX extended headers for tar.
3 Copyright (C) 2003-2007, 2009-2010, 2012-2013 Free Software Foundation, Inc.
5 This file is part of GNU tar.
7 GNU tar is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 GNU tar is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
29 static void xheader_init (struct xheader
*xhdr
);
30 static bool xheader_protected_pattern_p (char const *pattern
);
31 static bool xheader_protected_keyword_p (char const *keyword
);
32 static void xheader_set_single_keyword (char *) __attribute__ ((noreturn
));
34 /* Used by xheader_finish() */
35 static void code_string (char const *string
, char const *keyword
,
36 struct xheader
*xhdr
);
38 /* Number of global headers written so far. */
39 static size_t global_header_count
;
40 /* FIXME: Possibly it should be reset after changing the volume.
41 POSIX %n specification says that it is expanded to the sequence
42 number of current global header in *the* archive. However, for
43 multi-volume archives this will yield duplicate header names
44 in different volumes, which I'd like to avoid. The best way
45 to solve this would be to use per-archive header count as required
46 by POSIX *and* set globexthdr.name to, say,
47 $TMPDIR/GlobalHead.%p.$NUMVOLUME.%n.
49 However it should wait until buffer.c is finally rewritten */
52 /* Interface functions to obstacks */
55 x_obstack_grow (struct xheader
*xhdr
, const char *ptr
, size_t length
)
57 obstack_grow (xhdr
->stk
, ptr
, length
);
62 x_obstack_1grow (struct xheader
*xhdr
, char c
)
64 obstack_1grow (xhdr
->stk
, c
);
69 x_obstack_blank (struct xheader
*xhdr
, size_t length
)
71 obstack_blank (xhdr
->stk
, length
);
80 struct keyword_list
*next
;
86 /* List of keyword patterns set by delete= option */
87 static struct keyword_list
*keyword_pattern_list
;
89 /* List of keyword/value pairs set by 'keyword=value' option */
90 static struct keyword_list
*keyword_global_override_list
;
92 /* List of keyword/value pairs set by 'keyword:=value' option */
93 static struct keyword_list
*keyword_override_list
;
95 /* List of keyword/value pairs decoded from the last 'g' type header */
96 static struct keyword_list
*global_header_override_list
;
98 /* Template for the name field of an 'x' type header */
99 static char *exthdr_name
;
101 static char *exthdr_mtime_option
;
102 static time_t exthdr_mtime
;
104 /* Template for the name field of a 'g' type header */
105 static char *globexthdr_name
;
107 static char *globexthdr_mtime_option
;
108 static time_t globexthdr_mtime
;
111 xheader_keyword_deleted_p (const char *kw
)
113 struct keyword_list
*kp
;
115 for (kp
= keyword_pattern_list
; kp
; kp
= kp
->next
)
116 if (fnmatch (kp
->pattern
, kw
, 0) == 0)
122 xheader_keyword_override_p (const char *keyword
)
124 struct keyword_list
*kp
;
126 for (kp
= keyword_override_list
; kp
; kp
= kp
->next
)
127 if (strcmp (kp
->pattern
, keyword
) == 0)
133 xheader_list_append (struct keyword_list
**root
, char const *kw
,
136 struct keyword_list
*kp
= xmalloc (sizeof *kp
);
137 kp
->pattern
= xstrdup (kw
);
138 kp
->value
= value
? xstrdup (value
) : NULL
;
144 xheader_list_destroy (struct keyword_list
**root
)
148 struct keyword_list
*kw
= *root
;
151 struct keyword_list
*next
= kw
->next
;
162 xheader_set_single_keyword (char *kw
)
164 USAGE_ERROR ((0, 0, _("Keyword %s is unknown or not yet implemented"), kw
));
168 assign_time_option (char **sval
, time_t *tval
, const char *input
)
171 struct timespec t
= decode_timespec (input
, &p
, false);
172 if (! valid_timespec (t
) || *p
)
173 ERROR ((0, 0, _("Time stamp is out of allowed range")));
177 assign_string (sval
, input
);
182 xheader_set_keyword_equal (char *kw
, char *eq
)
193 while (p
> kw
&& isspace ((unsigned char) *p
))
198 for (p
= eq
+ 1; *p
&& isspace ((unsigned char) *p
); p
++)
201 if (strcmp (kw
, "delete") == 0)
203 if (xheader_protected_pattern_p (p
))
204 USAGE_ERROR ((0, 0, _("Pattern %s cannot be used"), quote (p
)));
205 xheader_list_append (&keyword_pattern_list
, p
, NULL
);
207 else if (strcmp (kw
, "exthdr.name") == 0)
208 assign_string (&exthdr_name
, p
);
209 else if (strcmp (kw
, "globexthdr.name") == 0)
210 assign_string (&globexthdr_name
, p
);
211 else if (strcmp (kw
, "exthdr.mtime") == 0)
212 assign_time_option (&exthdr_mtime_option
, &exthdr_mtime
, p
);
213 else if (strcmp (kw
, "globexthdr.mtime") == 0)
214 assign_time_option (&globexthdr_mtime_option
, &globexthdr_mtime
, p
);
217 if (xheader_protected_keyword_p (kw
))
218 USAGE_ERROR ((0, 0, _("Keyword %s cannot be overridden"), kw
));
220 xheader_list_append (&keyword_global_override_list
, kw
, p
);
222 xheader_list_append (&keyword_override_list
, kw
, p
);
227 xheader_set_option (char *string
)
230 for (token
= strtok (string
, ","); token
; token
= strtok (NULL
, ","))
232 char *p
= strchr (token
, '=');
234 xheader_set_single_keyword (token
);
236 xheader_set_keyword_equal (token
, p
);
241 string Includes: Replaced By:
242 %d The directory name of the file,
243 equivalent to the result of the
244 dirname utility on the translated
246 %f The filename of the file, equivalent
247 to the result of the basename
248 utility on the translated file name.
249 %p The process ID of the pax process.
250 %n The value of the 3rd argument.
251 %% A '%' character. */
254 xheader_format_name (struct tar_stat_info
*st
, const char *fmt
, size_t n
)
257 size_t len
= strlen (fmt
);
263 char pidbuf
[UINTMAX_STRSIZE_BOUND
];
264 char const *pptr
= NULL
;
265 char nbuf
[UINTMAX_STRSIZE_BOUND
];
266 char const *nptr
= NULL
;
268 for (p
= fmt
; *p
&& (p
= strchr (p
, '%')); )
280 dirp
= dir_name (st
->orig_file_name
);
281 dir
= safer_name_suffix (dirp
, false, absolute_names_option
);
282 len
+= strlen (dir
) - 2;
289 base
= last_component (st
->orig_file_name
);
290 len
+= strlen (base
) - 2;
295 pptr
= umaxtostr (getpid (), pidbuf
);
296 len
+= pidbuf
+ sizeof pidbuf
- 1 - pptr
- 2;
300 nptr
= umaxtostr (n
, nbuf
);
301 len
+= nbuf
+ sizeof nbuf
- 1 - nptr
- 2;
307 buf
= xmalloc (len
+ 1);
308 for (q
= buf
, p
= fmt
; *p
; )
327 q
= stpcpy (q
, base
);
332 q
= stpcpy (q
, pptr
);
337 q
= stpcpy (q
, nptr
);
354 /* Do not allow it to end in a slash */
355 while (q
> buf
&& ISSLASH (q
[-1]))
362 xheader_xhdr_name (struct tar_stat_info
*st
)
365 assign_string (&exthdr_name
, "%d/PaxHeaders.%p/%f");
366 return xheader_format_name (st
, exthdr_name
, 0);
369 #define GLOBAL_HEADER_TEMPLATE "/GlobalHead.%p.%n"
372 xheader_ghdr_name (void)
374 if (!globexthdr_name
)
377 const char *tmp
= getenv ("TMPDIR");
380 len
= strlen (tmp
) + sizeof (GLOBAL_HEADER_TEMPLATE
); /* Includes nul */
381 globexthdr_name
= xmalloc (len
);
382 strcpy(globexthdr_name
, tmp
);
383 strcat(globexthdr_name
, GLOBAL_HEADER_TEMPLATE
);
386 return xheader_format_name (NULL
, globexthdr_name
, global_header_count
+ 1);
390 xheader_write (char type
, char *name
, time_t t
, struct xheader
*xhdr
)
400 if (globexthdr_mtime_option
)
401 t
= globexthdr_mtime
;
405 if (exthdr_mtime_option
)
409 header
= start_private_header (name
, size
, t
);
410 header
->header
.typeflag
= type
;
412 simple_finish_header (header
);
420 header
= find_next_block ();
424 memcpy (header
->buffer
, p
, len
);
426 memset (header
->buffer
+ len
, 0, BLOCKSIZE
- len
);
429 set_next_block_after (header
);
432 xheader_destroy (xhdr
);
435 global_header_count
++;
439 xheader_write_global (struct xheader
*xhdr
)
441 if (keyword_global_override_list
)
443 struct keyword_list
*kp
;
446 for (kp
= keyword_global_override_list
; kp
; kp
= kp
->next
)
447 code_string (kp
->value
, kp
->pattern
, xhdr
);
453 xheader_finish (xhdr
);
454 name
= xheader_ghdr_name ();
455 xheader_write (XGLTYPE
, name
, start_time
.tv_sec
, xhdr
);
461 xheader_xattr_init (struct tar_stat_info
*st
)
463 st
->xattr_map
= NULL
;
464 st
->xattr_map_size
= 0;
466 st
->acls_a_ptr
= NULL
;
468 st
->acls_d_ptr
= NULL
;
470 st
->cntx_name
= NULL
;
474 xheader_xattr_free (struct xattr_array
*xattr_map
, size_t xattr_map_size
)
478 while (scan
< xattr_map_size
)
480 free (xattr_map
[scan
].xkey
);
481 free (xattr_map
[scan
].xval_ptr
);
489 xheader_xattr__add (struct xattr_array
**xattr_map
,
490 size_t *xattr_map_size
,
491 const char *key
, const char *val
, size_t len
)
493 size_t pos
= (*xattr_map_size
)++;
495 *xattr_map
= xrealloc (*xattr_map
,
496 *xattr_map_size
* sizeof(struct xattr_array
));
497 (*xattr_map
)[pos
].xkey
= xstrdup (key
);
498 (*xattr_map
)[pos
].xval_ptr
= xmemdup (val
, len
+ 1);
499 (*xattr_map
)[pos
].xval_len
= len
;
502 /* This is reversal function for xattr_encode_keyword. See comment for
503 xattr_encode_keyword() for more info. */
505 xattr_decode_keyword (char *keyword
)
507 char *kpr
, *kpl
; /* keyword pointer left/right */
514 if (kpr
[1] == '3' && kpr
[2] == 'D')
521 else if (kpr
[1] == '2' && kpr
[2] == '5')
541 xheader_xattr_add (struct tar_stat_info
*st
,
542 const char *key
, const char *val
, size_t len
)
544 size_t klen
= strlen (key
);
545 char *xkey
= xmalloc (strlen("SCHILY.xattr.") + klen
+ 1);
548 tmp
= stpcpy (tmp
, "SCHILY.xattr.");
551 xheader_xattr__add (&st
->xattr_map
, &st
->xattr_map_size
, xkey
, val
, len
);
557 xheader_xattr_copy (const struct tar_stat_info
*st
,
558 struct xattr_array
**xattr_map
, size_t *xattr_map_size
)
565 while (scan
< st
->xattr_map_size
)
567 char *key
= st
->xattr_map
[scan
].xkey
;
568 char *val
= st
->xattr_map
[scan
].xval_ptr
;
569 size_t len
= st
->xattr_map
[scan
].xval_len
;
571 xheader_xattr__add(xattr_map
, xattr_map_size
, key
, val
, len
);
578 /* General Interface */
580 #define XHDR_PROTECTED 0x01
581 #define XHDR_GLOBAL 0x02
586 void (*coder
) (struct tar_stat_info
const *, char const *,
587 struct xheader
*, void const *data
);
588 void (*decoder
) (struct tar_stat_info
*, char const *, char const *, size_t);
590 bool prefix
; /* select handler comparing prefix only */
593 /* This declaration must be extern, because ISO C99 section 6.9.2
594 prohibits a tentative definition that has both internal linkage and
595 incomplete type. If we made it static, we'd have to declare its
596 size which would be a maintenance pain; if we put its initializer
597 here, we'd need a boatload of forward declarations, which would be
598 even more of a pain. */
599 extern struct xhdr_tab
const xhdr_tab
[];
601 static struct xhdr_tab
const *
602 locate_handler (char const *keyword
)
604 struct xhdr_tab
const *p
;
606 for (p
= xhdr_tab
; p
->keyword
; p
++)
609 if (strncmp (p
->keyword
, keyword
, strlen(p
->keyword
)) == 0)
614 if (strcmp (p
->keyword
, keyword
) == 0)
622 xheader_protected_pattern_p (const char *pattern
)
624 struct xhdr_tab
const *p
;
626 for (p
= xhdr_tab
; p
->keyword
; p
++)
627 if (!p
->prefix
&& (p
->flags
& XHDR_PROTECTED
)
628 && fnmatch (pattern
, p
->keyword
, 0) == 0)
634 xheader_protected_keyword_p (const char *keyword
)
636 struct xhdr_tab
const *p
;
638 for (p
= xhdr_tab
; p
->keyword
; p
++)
639 if (!p
->prefix
&& (p
->flags
& XHDR_PROTECTED
)
640 && strcmp (p
->keyword
, keyword
) == 0)
645 /* Decode a single extended header record, advancing *PTR to the next record.
646 Return true on success, false otherwise. */
648 decode_record (struct xheader
*xhdr
,
650 void (*handler
) (void *, char const *, char const *, size_t),
659 size_t len_max
= xhdr
->buffer
+ xhdr
->size
- start
;
661 while (*p
== ' ' || *p
== '\t')
667 ERROR ((0, 0, _("Malformed extended header: missing length")));
671 len
= strtoumax (p
, &len_lim
, 10);
675 int len_len
= len_lim
- p
;
676 ERROR ((0, 0, _("Extended header length %*s is out of range"),
683 for (p
= len_lim
; *p
== ' ' || *p
== '\t'; p
++)
688 _("Malformed extended header: missing blank after length")));
694 if (! (p
&& p
< nextp
))
696 ERROR ((0, 0, _("Malformed extended header: missing equal sign")));
700 if (nextp
[-1] != '\n')
702 ERROR ((0, 0, _("Malformed extended header: missing newline")));
706 *p
= nextp
[-1] = '\0';
707 handler (data
, keyword
, p
+ 1, nextp
- p
- 2); /* '=' + trailing '\n' */
715 run_override_list (struct keyword_list
*kp
, struct tar_stat_info
*st
)
717 for (; kp
; kp
= kp
->next
)
719 struct xhdr_tab
const *t
= locate_handler (kp
->pattern
);
721 t
->decoder (st
, t
->keyword
, kp
->value
, strlen (kp
->value
));
726 decx (void *data
, char const *keyword
, char const *value
, size_t size
)
728 struct xhdr_tab
const *t
;
729 struct tar_stat_info
*st
= data
;
731 if (xheader_keyword_deleted_p (keyword
)
732 || xheader_keyword_override_p (keyword
))
735 t
= locate_handler (keyword
);
737 t
->decoder (st
, keyword
, value
, size
);
739 WARNOPT (WARN_UNKNOWN_KEYWORD
,
740 (0, 0, _("Ignoring unknown extended header keyword '%s'"),
745 xheader_decode (struct tar_stat_info
*st
)
747 run_override_list (keyword_global_override_list
, st
);
748 run_override_list (global_header_override_list
, st
);
752 char *p
= st
->xhdr
.buffer
+ BLOCKSIZE
;
753 while (decode_record (&st
->xhdr
, &p
, decx
, st
))
756 run_override_list (keyword_override_list
, st
);
760 decg (void *data
, char const *keyword
, char const *value
,
761 size_t size
__attribute__((unused
)))
763 struct keyword_list
**kwl
= data
;
764 struct xhdr_tab
const *tab
= locate_handler (keyword
);
765 if (tab
&& (tab
->flags
& XHDR_GLOBAL
))
766 tab
->decoder (data
, keyword
, value
, size
);
768 xheader_list_append (kwl
, keyword
, value
);
772 xheader_decode_global (struct xheader
*xhdr
)
776 char *p
= xhdr
->buffer
+ BLOCKSIZE
;
778 xheader_list_destroy (&global_header_override_list
);
779 while (decode_record (xhdr
, &p
, decg
, &global_header_override_list
))
785 xheader_init (struct xheader
*xhdr
)
789 xhdr
->stk
= xmalloc (sizeof *xhdr
->stk
);
790 obstack_init (xhdr
->stk
);
795 xheader_store (char const *keyword
, struct tar_stat_info
*st
,
798 struct xhdr_tab
const *t
;
802 t
= locate_handler (keyword
);
805 if (xheader_keyword_deleted_p (keyword
)
806 || xheader_keyword_override_p (keyword
))
808 xheader_init (&st
->xhdr
);
809 t
->coder (st
, keyword
, &st
->xhdr
, data
);
813 xheader_read (struct xheader
*xhdr
, union block
*p
, off_t size
)
818 size
= 0; /* Already diagnosed. */
820 if (SIZE_MAX
- BLOCKSIZE
<= size
)
825 xhdr
->buffer
= xmalloc (size
+ 1);
826 xhdr
->buffer
[size
] = '\0';
836 FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
838 memcpy (&xhdr
->buffer
[j
], p
->buffer
, len
);
839 set_next_block_after (p
);
841 p
= find_next_block ();
849 /* xattr_encode_keyword() substitutes '=' ~~> '%3D' and '%' ~~> '%25'
850 in extended attribute keywords. This is needed because the '=' character
851 has special purpose in extended attribute header - it splits keyword and
852 value part of header. If there was the '=' occurrence allowed inside
853 keyword, there would be no unambiguous way how to decode this extended
856 (http://lists.gnu.org/archive/html/bug-tar/2012-10/msg00017.html)
859 xattr_encode_keyword(const char *keyword
)
861 static char *encode_buffer
= NULL
;
862 static size_t encode_buffer_size
= 0;
863 size_t bp
; /* keyword/buffer pointers */
867 encode_buffer_size
= 256;
868 encode_buffer
= xmalloc (encode_buffer_size
);
873 for (bp
= 0; *keyword
!= 0; ++bp
, ++keyword
)
877 if (bp
+ 2 /* enough for URL encoding also.. */ >= encode_buffer_size
)
879 encode_buffer
= x2realloc (encode_buffer
, &encode_buffer_size
);
884 strcpy (encode_buffer
+ bp
, "%25");
889 strcpy (encode_buffer
+ bp
, "%3D");
893 encode_buffer
[bp
] = c
;
896 encode_buffer
[bp
] = 0;
898 return encode_buffer
;
902 xheader_print_n (struct xheader
*xhdr
, char const *keyword
,
903 char const *value
, size_t vsize
)
907 char nbuf
[UINTMAX_STRSIZE_BOUND
];
911 keyword
= xattr_encode_keyword (keyword
);
912 klen
= strlen (keyword
);
913 len
= klen
+ vsize
+ 3; /* ' ' + '=' + '\n' */
918 np
= umaxtostr (len
+ p
, nbuf
);
919 n
= nbuf
+ sizeof nbuf
- 1 - np
;
923 x_obstack_grow (xhdr
, np
, n
);
924 x_obstack_1grow (xhdr
, ' ');
925 x_obstack_grow (xhdr
, keyword
, klen
);
926 x_obstack_1grow (xhdr
, '=');
927 x_obstack_grow (xhdr
, value
, vsize
);
928 x_obstack_1grow (xhdr
, '\n');
932 xheader_print (struct xheader
*xhdr
, char const *keyword
, char const *value
)
934 xheader_print_n (xhdr
, keyword
, value
, strlen (value
));
938 xheader_finish (struct xheader
*xhdr
)
940 struct keyword_list
*kp
;
942 for (kp
= keyword_override_list
; kp
; kp
= kp
->next
)
943 code_string (kp
->value
, kp
->pattern
, xhdr
);
945 xhdr
->buffer
= obstack_finish (xhdr
->stk
);
949 xheader_destroy (struct xheader
*xhdr
)
953 obstack_free (xhdr
->stk
, NULL
);
964 /* Buildable strings */
967 xheader_string_begin (struct xheader
*xhdr
)
969 xhdr
->string_length
= 0;
973 xheader_string_add (struct xheader
*xhdr
, char const *s
)
978 xhdr
->string_length
+= strlen (s
);
979 x_obstack_grow (xhdr
, s
, strlen (s
));
983 xheader_string_end (struct xheader
*xhdr
, char const *keyword
)
989 char nbuf
[UINTMAX_STRSIZE_BOUND
];
997 len
= strlen (keyword
) + xhdr
->string_length
+ 3; /* ' ' + '=' + '\n' */
1002 np
= umaxtostr (len
+ p
, nbuf
);
1003 n
= nbuf
+ sizeof nbuf
- 1 - np
;
1007 p
= strlen (keyword
) + n
+ 2;
1012 _("Generated keyword/value pair is too long (keyword=%s, length=%s)"),
1014 obstack_free (xhdr
->stk
, obstack_finish (xhdr
->stk
));
1017 x_obstack_blank (xhdr
, p
);
1018 x_obstack_1grow (xhdr
, '\n');
1019 cp
= obstack_next_free (xhdr
->stk
) - xhdr
->string_length
- p
- 1;
1020 memmove (cp
+ p
, cp
, xhdr
->string_length
);
1021 cp
= stpcpy (cp
, np
);
1023 cp
= stpcpy (cp
, keyword
);
1029 /* Implementations */
1032 out_of_range_header (char const *keyword
, char const *value
,
1033 intmax_t minval
, uintmax_t maxval
)
1035 char minval_buf
[INT_BUFSIZE_BOUND (intmax_t)];
1036 char maxval_buf
[UINTMAX_STRSIZE_BOUND
];
1037 char *minval_string
= imaxtostr (minval
, minval_buf
);
1038 char *maxval_string
= umaxtostr (maxval
, maxval_buf
);
1040 /* TRANSLATORS: The first %s is the pax extended header keyword
1041 (atime, gid, etc.). */
1042 ERROR ((0, 0, _("Extended header %s=%s is out of range %s..%s"),
1043 keyword
, value
, minval_string
, maxval_string
));
1047 code_string (char const *string
, char const *keyword
, struct xheader
*xhdr
)
1050 if (!utf8_convert (true, string
, &outstr
))
1052 /* FIXME: report error */
1053 outstr
= xstrdup (string
);
1055 xheader_print (xhdr
, keyword
, outstr
);
1060 decode_string (char **string
, char const *arg
)
1067 if (!utf8_convert (false, arg
, string
))
1069 /* FIXME: report error and act accordingly to --pax invalid=UTF-8 */
1070 assign_string (string
, arg
);
1075 code_time (struct timespec t
, char const *keyword
, struct xheader
*xhdr
)
1077 char buf
[TIMESPEC_STRSIZE_BOUND
];
1078 xheader_print (xhdr
, keyword
, code_timespec (t
, buf
));
1082 decode_time (struct timespec
*ts
, char const *arg
, char const *keyword
)
1085 struct timespec t
= decode_timespec (arg
, &arg_lim
, true);
1087 if (! valid_timespec (t
))
1089 if (arg
< arg_lim
&& !*arg_lim
)
1090 out_of_range_header (keyword
, arg
, TYPE_MINIMUM (time_t),
1091 TYPE_MAXIMUM (time_t));
1093 ERROR ((0, 0, _("Malformed extended header: invalid %s=%s"),
1103 code_signed_num (uintmax_t value
, char const *keyword
,
1104 intmax_t minval
, uintmax_t maxval
, struct xheader
*xhdr
)
1106 char sbuf
[SYSINT_BUFSIZE
];
1107 xheader_print (xhdr
, keyword
, sysinttostr (value
, minval
, maxval
, sbuf
));
1111 code_num (uintmax_t value
, char const *keyword
, struct xheader
*xhdr
)
1113 code_signed_num (value
, keyword
, 0, UINTMAX_MAX
, xhdr
);
1117 decode_signed_num (intmax_t *num
, char const *arg
,
1118 intmax_t minval
, uintmax_t maxval
,
1119 char const *keyword
)
1122 intmax_t u
= strtosysint (arg
, &arg_lim
, minval
, maxval
);
1124 if (errno
== EINVAL
|| *arg_lim
)
1126 ERROR ((0, 0, _("Malformed extended header: invalid %s=%s"),
1131 if (errno
== ERANGE
)
1133 out_of_range_header (keyword
, arg
, minval
, maxval
);
1142 decode_num (uintmax_t *num
, char const *arg
, uintmax_t maxval
,
1143 char const *keyword
)
1146 if (! decode_signed_num (&i
, arg
, 0, maxval
, keyword
))
1153 dummy_coder (struct tar_stat_info
const *st
__attribute__ ((unused
)),
1154 char const *keyword
__attribute__ ((unused
)),
1155 struct xheader
*xhdr
__attribute__ ((unused
)),
1156 void const *data
__attribute__ ((unused
)))
1161 dummy_decoder (struct tar_stat_info
*st
__attribute__ ((unused
)),
1162 char const *keyword
__attribute__ ((unused
)),
1163 char const *arg
__attribute__ ((unused
)),
1164 size_t size
__attribute__((unused
)))
1169 atime_coder (struct tar_stat_info
const *st
, char const *keyword
,
1170 struct xheader
*xhdr
, void const *data
__attribute__ ((unused
)))
1172 code_time (st
->atime
, keyword
, xhdr
);
1176 atime_decoder (struct tar_stat_info
*st
,
1177 char const *keyword
,
1179 size_t size
__attribute__((unused
)))
1182 if (decode_time (&ts
, arg
, keyword
))
1187 gid_coder (struct tar_stat_info
const *st
, char const *keyword
,
1188 struct xheader
*xhdr
, void const *data
__attribute__ ((unused
)))
1190 code_signed_num (st
->stat
.st_gid
, keyword
,
1191 TYPE_MINIMUM (gid_t
), TYPE_MAXIMUM (gid_t
), xhdr
);
1195 gid_decoder (struct tar_stat_info
*st
,
1196 char const *keyword
,
1198 size_t size
__attribute__((unused
)))
1201 if (decode_signed_num (&u
, arg
, TYPE_MINIMUM (gid_t
),
1202 TYPE_MAXIMUM (gid_t
), keyword
))
1203 st
->stat
.st_gid
= u
;
1207 gname_coder (struct tar_stat_info
const *st
, char const *keyword
,
1208 struct xheader
*xhdr
, void const *data
__attribute__ ((unused
)))
1210 code_string (st
->gname
, keyword
, xhdr
);
1214 gname_decoder (struct tar_stat_info
*st
,
1215 char const *keyword
__attribute__((unused
)),
1217 size_t size
__attribute__((unused
)))
1219 decode_string (&st
->gname
, arg
);
1223 linkpath_coder (struct tar_stat_info
const *st
, char const *keyword
,
1224 struct xheader
*xhdr
, void const *data
__attribute__ ((unused
)))
1226 code_string (st
->link_name
, keyword
, xhdr
);
1230 linkpath_decoder (struct tar_stat_info
*st
,
1231 char const *keyword
__attribute__((unused
)),
1233 size_t size
__attribute__((unused
)))
1235 decode_string (&st
->link_name
, arg
);
1239 ctime_coder (struct tar_stat_info
const *st
, char const *keyword
,
1240 struct xheader
*xhdr
, void const *data
__attribute__ ((unused
)))
1242 code_time (st
->ctime
, keyword
, xhdr
);
1246 ctime_decoder (struct tar_stat_info
*st
,
1247 char const *keyword
,
1249 size_t size
__attribute__((unused
)))
1252 if (decode_time (&ts
, arg
, keyword
))
1257 mtime_coder (struct tar_stat_info
const *st
, char const *keyword
,
1258 struct xheader
*xhdr
, void const *data
)
1260 struct timespec
const *mtime
= data
;
1261 code_time (mtime
? *mtime
: st
->mtime
, keyword
, xhdr
);
1265 mtime_decoder (struct tar_stat_info
*st
,
1266 char const *keyword
,
1268 size_t size
__attribute__((unused
)))
1271 if (decode_time (&ts
, arg
, keyword
))
1276 path_coder (struct tar_stat_info
const *st
, char const *keyword
,
1277 struct xheader
*xhdr
, void const *data
__attribute__ ((unused
)))
1279 code_string (st
->file_name
, keyword
, xhdr
);
1283 path_decoder (struct tar_stat_info
*st
,
1284 char const *keyword
__attribute__((unused
)),
1286 size_t size
__attribute__((unused
)))
1288 decode_string (&st
->orig_file_name
, arg
);
1289 decode_string (&st
->file_name
, arg
);
1290 st
->had_trailing_slash
= strip_trailing_slashes (st
->file_name
);
1294 size_coder (struct tar_stat_info
const *st
, char const *keyword
,
1295 struct xheader
*xhdr
, void const *data
__attribute__ ((unused
)))
1297 code_num (st
->stat
.st_size
, keyword
, xhdr
);
1301 size_decoder (struct tar_stat_info
*st
,
1302 char const *keyword
,
1304 size_t size
__attribute__((unused
)))
1307 if (decode_num (&u
, arg
, TYPE_MAXIMUM (off_t
), keyword
))
1308 st
->stat
.st_size
= u
;
1312 uid_coder (struct tar_stat_info
const *st
, char const *keyword
,
1313 struct xheader
*xhdr
, void const *data
__attribute__ ((unused
)))
1315 code_signed_num (st
->stat
.st_uid
, keyword
,
1316 TYPE_MINIMUM (uid_t
), TYPE_MAXIMUM (uid_t
), xhdr
);
1320 uid_decoder (struct tar_stat_info
*st
,
1321 char const *keyword
,
1323 size_t size
__attribute__((unused
)))
1326 if (decode_signed_num (&u
, arg
, TYPE_MINIMUM (uid_t
),
1327 TYPE_MAXIMUM (uid_t
), keyword
))
1328 st
->stat
.st_uid
= u
;
1332 uname_coder (struct tar_stat_info
const *st
, char const *keyword
,
1333 struct xheader
*xhdr
, void const *data
__attribute__ ((unused
)))
1335 code_string (st
->uname
, keyword
, xhdr
);
1339 uname_decoder (struct tar_stat_info
*st
,
1340 char const *keyword
__attribute__((unused
)),
1342 size_t size
__attribute__((unused
)))
1344 decode_string (&st
->uname
, arg
);
1348 sparse_size_coder (struct tar_stat_info
const *st
, char const *keyword
,
1349 struct xheader
*xhdr
, void const *data
)
1351 size_coder (st
, keyword
, xhdr
, data
);
1355 sparse_size_decoder (struct tar_stat_info
*st
,
1356 char const *keyword
,
1358 size_t size
__attribute__((unused
)))
1361 if (decode_num (&u
, arg
, TYPE_MAXIMUM (off_t
), keyword
))
1362 st
->stat
.st_size
= u
;
1366 sparse_numblocks_coder (struct tar_stat_info
const *st
, char const *keyword
,
1367 struct xheader
*xhdr
,
1368 void const *data
__attribute__ ((unused
)))
1370 code_num (st
->sparse_map_avail
, keyword
, xhdr
);
1374 sparse_numblocks_decoder (struct tar_stat_info
*st
,
1375 char const *keyword
,
1377 size_t size
__attribute__((unused
)))
1380 if (decode_num (&u
, arg
, SIZE_MAX
, keyword
))
1382 st
->sparse_map_size
= u
;
1383 st
->sparse_map
= xcalloc (u
, sizeof st
->sparse_map
[0]);
1384 st
->sparse_map_avail
= 0;
1389 sparse_offset_coder (struct tar_stat_info
const *st
, char const *keyword
,
1390 struct xheader
*xhdr
, void const *data
)
1392 size_t const *pi
= data
;
1393 code_num (st
->sparse_map
[*pi
].offset
, keyword
, xhdr
);
1397 sparse_offset_decoder (struct tar_stat_info
*st
,
1398 char const *keyword
,
1400 size_t size
__attribute__((unused
)))
1403 if (decode_num (&u
, arg
, TYPE_MAXIMUM (off_t
), keyword
))
1405 if (st
->sparse_map_avail
< st
->sparse_map_size
)
1406 st
->sparse_map
[st
->sparse_map_avail
].offset
= u
;
1408 ERROR ((0, 0, _("Malformed extended header: excess %s=%s"),
1409 "GNU.sparse.offset", arg
));
1414 sparse_numbytes_coder (struct tar_stat_info
const *st
, char const *keyword
,
1415 struct xheader
*xhdr
, void const *data
)
1417 size_t const *pi
= data
;
1418 code_num (st
->sparse_map
[*pi
].numbytes
, keyword
, xhdr
);
1422 sparse_numbytes_decoder (struct tar_stat_info
*st
,
1423 char const *keyword
,
1425 size_t size
__attribute__((unused
)))
1428 if (decode_num (&u
, arg
, TYPE_MAXIMUM (off_t
), keyword
))
1430 if (st
->sparse_map_avail
< st
->sparse_map_size
)
1431 st
->sparse_map
[st
->sparse_map_avail
++].numbytes
= u
;
1433 ERROR ((0, 0, _("Malformed extended header: excess %s=%s"),
1439 sparse_map_decoder (struct tar_stat_info
*st
,
1440 char const *keyword
,
1442 size_t size
__attribute__((unused
)))
1446 st
->sparse_map_avail
= 0;
1453 if (!ISDIGIT (*arg
))
1455 ERROR ((0, 0, _("Malformed extended header: invalid %s=%s"),
1461 u
= strtoimax (arg
, &delim
, 10);
1462 if (TYPE_MAXIMUM (off_t
) < u
)
1464 u
= TYPE_MAXIMUM (off_t
);
1470 if (errno
== ERANGE
)
1472 out_of_range_header (keyword
, arg
, 0, TYPE_MAXIMUM (off_t
));
1479 if (errno
== ERANGE
)
1481 out_of_range_header (keyword
, arg
, 0, TYPE_MAXIMUM (off_t
));
1484 if (st
->sparse_map_avail
< st
->sparse_map_size
)
1485 st
->sparse_map
[st
->sparse_map_avail
++] = e
;
1488 ERROR ((0, 0, _("Malformed extended header: excess %s=%s"),
1498 else if (*delim
!= ',')
1501 _("Malformed extended header: invalid %s: unexpected delimiter %c"),
1511 _("Malformed extended header: invalid %s: odd number of values"),
1516 dumpdir_coder (struct tar_stat_info
const *st
, char const *keyword
,
1517 struct xheader
*xhdr
, void const *data
)
1519 xheader_print_n (xhdr
, keyword
, data
, dumpdir_size (data
));
1523 dumpdir_decoder (struct tar_stat_info
*st
,
1524 char const *keyword
__attribute__((unused
)),
1528 st
->dumpdir
= xmalloc (size
);
1529 memcpy (st
->dumpdir
, arg
, size
);
1533 volume_label_coder (struct tar_stat_info
const *st
, char const *keyword
,
1534 struct xheader
*xhdr
, void const *data
)
1536 code_string (data
, keyword
, xhdr
);
1540 volume_label_decoder (struct tar_stat_info
*st
,
1541 char const *keyword
__attribute__((unused
)),
1543 size_t size
__attribute__((unused
)))
1545 decode_string (&volume_label
, arg
);
1549 volume_size_coder (struct tar_stat_info
const *st
, char const *keyword
,
1550 struct xheader
*xhdr
, void const *data
)
1552 off_t
const *v
= data
;
1553 code_num (*v
, keyword
, xhdr
);
1557 volume_size_decoder (struct tar_stat_info
*st
,
1558 char const *keyword
,
1559 char const *arg
, size_t size
)
1562 if (decode_num (&u
, arg
, TYPE_MAXIMUM (uintmax_t), keyword
))
1563 continued_file_size
= u
;
1566 /* FIXME: Merge with volume_size_coder */
1568 volume_offset_coder (struct tar_stat_info
const *st
, char const *keyword
,
1569 struct xheader
*xhdr
, void const *data
)
1571 off_t
const *v
= data
;
1572 code_num (*v
, keyword
, xhdr
);
1576 volume_offset_decoder (struct tar_stat_info
*st
,
1577 char const *keyword
,
1578 char const *arg
, size_t size
)
1581 if (decode_num (&u
, arg
, TYPE_MAXIMUM (uintmax_t), keyword
))
1582 continued_file_offset
= u
;
1586 volume_filename_decoder (struct tar_stat_info
*st
,
1587 char const *keyword
__attribute__((unused
)),
1589 size_t size
__attribute__((unused
)))
1591 decode_string (&continued_file_name
, arg
);
1595 xattr_selinux_coder (struct tar_stat_info
const *st
, char const *keyword
,
1596 struct xheader
*xhdr
, void const *data
)
1598 code_string (st
->cntx_name
, keyword
, xhdr
);
1602 xattr_selinux_decoder (struct tar_stat_info
*st
,
1603 char const *keyword
, char const *arg
, size_t size
)
1605 decode_string (&st
->cntx_name
, arg
);
1609 xattr_acls_a_coder (struct tar_stat_info
const *st
, char const *keyword
,
1610 struct xheader
*xhdr
, void const *data
)
1612 xheader_print_n (xhdr
, keyword
, st
->acls_a_ptr
, st
->acls_a_len
);
1616 xattr_acls_a_decoder (struct tar_stat_info
*st
,
1617 char const *keyword
, char const *arg
, size_t size
)
1619 st
->acls_a_ptr
= xmemdup (arg
, size
+ 1);
1620 st
->acls_a_len
= size
;
1624 xattr_acls_d_coder (struct tar_stat_info
const *st
, char const *keyword
,
1625 struct xheader
*xhdr
, void const *data
)
1627 xheader_print_n (xhdr
, keyword
, st
->acls_d_ptr
, st
->acls_d_len
);
1631 xattr_acls_d_decoder (struct tar_stat_info
*st
,
1632 char const *keyword
, char const *arg
, size_t size
)
1634 st
->acls_d_ptr
= xmemdup (arg
, size
+ 1);
1635 st
->acls_d_len
= size
;
1639 xattr_coder (struct tar_stat_info
const *st
, char const *keyword
,
1640 struct xheader
*xhdr
, void const *data
)
1642 struct xattr_array
*xattr_map
= st
->xattr_map
;
1643 const size_t *off
= data
;
1644 xheader_print_n (xhdr
, keyword
,
1645 xattr_map
[*off
].xval_ptr
, xattr_map
[*off
].xval_len
);
1649 xattr_decoder (struct tar_stat_info
*st
,
1650 char const *keyword
, char const *arg
, size_t size
)
1655 size_t klen_raw
= strlen (keyword
);
1656 xkey
= alloca (klen_raw
+ 1);
1657 memcpy (xkey
, keyword
, klen_raw
+ 1) /* including null-terminating */;
1660 xstr
= alloca (size
+ 1);
1661 memcpy (xstr
, arg
, size
+ 1); /* separator included, for GNU tar '\n' */;
1663 xattr_decode_keyword (xkey
);
1665 xheader_xattr_add (st
, xkey
+ strlen("SCHILY.xattr."), xstr
, size
);
1669 sparse_major_coder (struct tar_stat_info
const *st
, char const *keyword
,
1670 struct xheader
*xhdr
, void const *data
)
1672 code_num (st
->sparse_major
, keyword
, xhdr
);
1676 sparse_major_decoder (struct tar_stat_info
*st
,
1677 char const *keyword
,
1682 if (decode_num (&u
, arg
, TYPE_MAXIMUM (unsigned), keyword
))
1683 st
->sparse_major
= u
;
1687 sparse_minor_coder (struct tar_stat_info
const *st
, char const *keyword
,
1688 struct xheader
*xhdr
, void const *data
)
1690 code_num (st
->sparse_minor
, keyword
, xhdr
);
1694 sparse_minor_decoder (struct tar_stat_info
*st
,
1695 char const *keyword
,
1700 if (decode_num (&u
, arg
, TYPE_MAXIMUM (unsigned), keyword
))
1701 st
->sparse_minor
= u
;
1704 struct xhdr_tab
const xhdr_tab
[] = {
1705 { "atime", atime_coder
, atime_decoder
, 0, false },
1706 { "comment", dummy_coder
, dummy_decoder
, 0, false },
1707 { "charset", dummy_coder
, dummy_decoder
, 0, false },
1708 { "ctime", ctime_coder
, ctime_decoder
, 0, false },
1709 { "gid", gid_coder
, gid_decoder
, 0, false },
1710 { "gname", gname_coder
, gname_decoder
, 0, false },
1711 { "linkpath", linkpath_coder
, linkpath_decoder
, 0, false },
1712 { "mtime", mtime_coder
, mtime_decoder
, 0, false },
1713 { "path", path_coder
, path_decoder
, 0, false },
1714 { "size", size_coder
, size_decoder
, 0, false },
1715 { "uid", uid_coder
, uid_decoder
, 0, false },
1716 { "uname", uname_coder
, uname_decoder
, 0, false },
1718 /* Sparse file handling */
1719 { "GNU.sparse.name", path_coder
, path_decoder
,
1720 XHDR_PROTECTED
, false },
1721 { "GNU.sparse.major", sparse_major_coder
, sparse_major_decoder
,
1722 XHDR_PROTECTED
, false },
1723 { "GNU.sparse.minor", sparse_minor_coder
, sparse_minor_decoder
,
1724 XHDR_PROTECTED
, false },
1725 { "GNU.sparse.realsize", sparse_size_coder
, sparse_size_decoder
,
1726 XHDR_PROTECTED
, false },
1727 { "GNU.sparse.numblocks", sparse_numblocks_coder
, sparse_numblocks_decoder
,
1728 XHDR_PROTECTED
, false },
1730 /* tar 1.14 - 1.15.90 keywords. */
1731 { "GNU.sparse.size", sparse_size_coder
, sparse_size_decoder
,
1732 XHDR_PROTECTED
, false },
1733 /* tar 1.14 - 1.15.1 keywords. Multiple instances of these appeared in 'x'
1734 headers, and each of them was meaningful. It confilcted with POSIX specs,
1735 which requires that "when extended header records conflict, the last one
1736 given in the header shall take precedence." */
1737 { "GNU.sparse.offset", sparse_offset_coder
, sparse_offset_decoder
,
1738 XHDR_PROTECTED
, false },
1739 { "GNU.sparse.numbytes", sparse_numbytes_coder
, sparse_numbytes_decoder
,
1740 XHDR_PROTECTED
, false },
1741 /* tar 1.15.90 keyword, introduced to remove the above-mentioned conflict. */
1742 { "GNU.sparse.map", NULL
/* Unused, see pax_dump_header() */,
1743 sparse_map_decoder
, 0, false },
1745 { "GNU.dumpdir", dumpdir_coder
, dumpdir_decoder
,
1746 XHDR_PROTECTED
, false },
1748 /* Keeps the tape/volume label. May be present only in the global headers.
1749 Equivalent to GNUTYPE_VOLHDR. */
1750 { "GNU.volume.label", volume_label_coder
, volume_label_decoder
,
1751 XHDR_PROTECTED
| XHDR_GLOBAL
, false },
1753 /* These may be present in a first global header of the archive.
1754 They provide the same functionality as GNUTYPE_MULTIVOL header.
1755 The GNU.volume.size keeps the real_s_sizeleft value, which is
1756 otherwise kept in the size field of a multivolume header. The
1757 GNU.volume.offset keeps the offset of the start of this volume,
1758 otherwise kept in oldgnu_header.offset. */
1759 { "GNU.volume.filename", volume_label_coder
, volume_filename_decoder
,
1760 XHDR_PROTECTED
| XHDR_GLOBAL
, false },
1761 { "GNU.volume.size", volume_size_coder
, volume_size_decoder
,
1762 XHDR_PROTECTED
| XHDR_GLOBAL
, false },
1763 { "GNU.volume.offset", volume_offset_coder
, volume_offset_decoder
,
1764 XHDR_PROTECTED
| XHDR_GLOBAL
, false },
1766 /* We get the SELinux value from filecon, so add a namespace for SELinux
1767 instead of storing it in SCHILY.xattr.* (which would be RAW). */
1768 { "RHT.security.selinux",
1769 xattr_selinux_coder
, xattr_selinux_decoder
, 0, false },
1771 /* ACLs, use the star format... */
1772 { "SCHILY.acl.access",
1773 xattr_acls_a_coder
, xattr_acls_a_decoder
, 0, false },
1775 { "SCHILY.acl.default",
1776 xattr_acls_d_coder
, xattr_acls_d_decoder
, 0, false },
1778 /* We are storing all extended attributes using this rule even if some of them
1779 were stored by some previous rule (duplicates) -- we just have to make sure
1780 they are restored *only once* during extraction later on. */
1781 { "SCHILY.xattr", xattr_coder
, xattr_decoder
, 0, true },
1783 { NULL
, NULL
, NULL
, 0, false }