From 19a63e523dddd8e9fb0f4f510594172103404a74 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Fri, 23 Jun 2006 15:22:50 +0000 Subject: [PATCH] Implement new keywords: GNU.sparse.name, GNU.sparse.major, GNU.sparse.minor, GNU.sparse.realsize --- src/xheader.c | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/src/xheader.c b/src/xheader.c index 3eb1505..0896043 100644 --- a/src/xheader.c +++ b/src/xheader.c @@ -1363,8 +1363,39 @@ volume_filename_decoder (struct tar_stat_info *st, char const *arg, { decode_string (&continued_file_name, arg); } + +static void +sparse_major_coder (struct tar_stat_info const *st, char const *keyword, + struct xheader *xhdr, void const *data) +{ + code_num (st->sparse_major, keyword, xhdr); +} + +static void +sparse_major_decoder (struct tar_stat_info *st, char const *arg, + size_t size) +{ + uintmax_t u; + if (decode_num (&u, arg, TYPE_MAXIMUM (unsigned), "GNU.sparse.major")) + st->sparse_major = u; +} +static void +sparse_minor_coder (struct tar_stat_info const *st, char const *keyword, + struct xheader *xhdr, void const *data) +{ + code_num (st->sparse_minor, keyword, xhdr); +} +static void +sparse_minor_decoder (struct tar_stat_info *st, char const *arg, + size_t size) +{ + uintmax_t u; + if (decode_num (&u, arg, TYPE_MAXIMUM (unsigned), "GNU.sparse.minor")) + st->sparse_minor = u; +} + struct xhdr_tab const xhdr_tab[] = { { "atime", atime_coder, atime_decoder, false }, { "comment", dummy_coder, dummy_decoder, false }, @@ -1380,11 +1411,17 @@ struct xhdr_tab const xhdr_tab[] = { { "uname", uname_coder, uname_decoder, false }, /* Sparse file handling */ + { "GNU.sparse.name", path_coder, path_decoder, + true }, + { "GNU.sparse.major", sparse_major_coder, sparse_major_decoder, + true }, + { "GNU.sparse.minor", sparse_minor_coder, sparse_minor_decoder, + true }, + { "GNU.sparse.realsize", sparse_size_coder, sparse_size_decoder, true }, + { "GNU.sparse.size", sparse_size_coder, sparse_size_decoder, true }, { "GNU.sparse.numblocks", sparse_numblocks_coder, sparse_numblocks_decoder, true }, - { "GNU.sparse.name", path_coder, path_decoder, - true }, /* tar 1.14 - 1.15.1 keywords. Multiple instances of these appeared in 'x' headers, and each of them was meaningful. It confilcted with POSIX specs, which requires that "when extended header records conflict, the last one @@ -1393,7 +1430,7 @@ struct xhdr_tab const xhdr_tab[] = { true }, { "GNU.sparse.numbytes", sparse_numbytes_coder, sparse_numbytes_decoder, true }, - /* tar >=1.16 keyword, introduced to remove the above-mentioned conflict. */ + /* tar 1.15.90 keyword, introduced to remove the above-mentioned conflict. */ { "GNU.sparse.map", NULL /* Unused, see pax_dump_header() */, sparse_map_decoder, false }, -- 2.44.0