📄 xheader.c
字号:
char const *keyword, char const *arg, size_t size __attribute__((unused))){ struct timespec ts; if (decode_time (&ts, arg, keyword)) st->atime = ts;}static voidgid_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data __attribute__ ((unused))){ code_num (st->stat.st_gid, keyword, xhdr);}static voidgid_decoder (struct tar_stat_info *st, char const *keyword, char const *arg, size_t size __attribute__((unused))){ uintmax_t u; if (decode_num (&u, arg, TYPE_MAXIMUM (gid_t), keyword)) st->stat.st_gid = u;}static voidgname_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data __attribute__ ((unused))){ code_string (st->gname, keyword, xhdr);}static voidgname_decoder (struct tar_stat_info *st, char const *keyword __attribute__((unused)), char const *arg, size_t size __attribute__((unused))){ decode_string (&st->gname, arg);}static voidlinkpath_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data __attribute__ ((unused))){ code_string (st->link_name, keyword, xhdr);}static voidlinkpath_decoder (struct tar_stat_info *st, char const *keyword __attribute__((unused)), char const *arg, size_t size __attribute__((unused))){ decode_string (&st->link_name, arg);}static voidctime_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data __attribute__ ((unused))){ code_time (st->ctime, keyword, xhdr);}static voidctime_decoder (struct tar_stat_info *st, char const *keyword, char const *arg, size_t size __attribute__((unused))){ struct timespec ts; if (decode_time (&ts, arg, keyword)) st->ctime = ts;}static voidmtime_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data){ struct timespec const *mtime = data; code_time (mtime ? *mtime : st->mtime, keyword, xhdr);}static voidmtime_decoder (struct tar_stat_info *st, char const *keyword, char const *arg, size_t size __attribute__((unused))){ struct timespec ts; if (decode_time (&ts, arg, keyword)) st->mtime = ts;}static voidpath_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data __attribute__ ((unused))){ code_string (st->file_name, keyword, xhdr);}static voidpath_decoder (struct tar_stat_info *st, char const *keyword __attribute__((unused)), char const *arg, size_t size __attribute__((unused))){ decode_string (&st->orig_file_name, arg); decode_string (&st->file_name, arg); st->had_trailing_slash = strip_trailing_slashes (st->file_name);}static voidsize_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data __attribute__ ((unused))){ code_num (st->stat.st_size, keyword, xhdr);}static voidsize_decoder (struct tar_stat_info *st, char const *keyword, char const *arg, size_t size __attribute__((unused))){ uintmax_t u; if (decode_num (&u, arg, TYPE_MAXIMUM (off_t), keyword)) st->stat.st_size = u;}static voiduid_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data __attribute__ ((unused))){ code_num (st->stat.st_uid, keyword, xhdr);}static voiduid_decoder (struct tar_stat_info *st, char const *keyword, char const *arg, size_t size __attribute__((unused))){ uintmax_t u; if (decode_num (&u, arg, TYPE_MAXIMUM (uid_t), keyword)) st->stat.st_uid = u;}static voiduname_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data __attribute__ ((unused))){ code_string (st->uname, keyword, xhdr);}static voiduname_decoder (struct tar_stat_info *st, char const *keyword __attribute__((unused)), char const *arg, size_t size __attribute__((unused))){ decode_string (&st->uname, arg);}static voidsparse_size_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data){ size_coder (st, keyword, xhdr, data);}static voidsparse_size_decoder (struct tar_stat_info *st, char const *keyword, char const *arg, size_t size __attribute__((unused))){ uintmax_t u; if (decode_num (&u, arg, TYPE_MAXIMUM (off_t), keyword)) st->stat.st_size = u;}static voidsparse_numblocks_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data __attribute__ ((unused))){ code_num (st->sparse_map_avail, keyword, xhdr);}static voidsparse_numblocks_decoder (struct tar_stat_info *st, char const *keyword, char const *arg, size_t size __attribute__((unused))){ uintmax_t u; if (decode_num (&u, arg, SIZE_MAX, keyword)) { st->sparse_map_size = u; st->sparse_map = xcalloc (u, sizeof st->sparse_map[0]); st->sparse_map_avail = 0; }}static voidsparse_offset_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data){ size_t const *pi = data; code_num (st->sparse_map[*pi].offset, keyword, xhdr);}static voidsparse_offset_decoder (struct tar_stat_info *st, char const *keyword, char const *arg, size_t size __attribute__((unused))){ uintmax_t u; if (decode_num (&u, arg, TYPE_MAXIMUM (off_t), keyword)) { if (st->sparse_map_avail < st->sparse_map_size) st->sparse_map[st->sparse_map_avail].offset = u; else ERROR ((0, 0, _("Malformed extended header: excess %s=%s"), "GNU.sparse.offset", arg)); }}static voidsparse_numbytes_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data){ size_t const *pi = data; code_num (st->sparse_map[*pi].numbytes, keyword, xhdr);}static voidsparse_numbytes_decoder (struct tar_stat_info *st, char const *keyword, char const *arg, size_t size __attribute__((unused))){ uintmax_t u; if (decode_num (&u, arg, SIZE_MAX, keyword)) { if (st->sparse_map_avail < st->sparse_map_size) st->sparse_map[st->sparse_map_avail++].numbytes = u; else ERROR ((0, 0, _("Malformed extended header: excess %s=%s"), keyword, arg)); }}static voidsparse_map_decoder (struct tar_stat_info *st, char const *keyword, char const *arg, size_t size __attribute__((unused))){ int offset = 1; st->sparse_map_avail = 0; while (1) { uintmax_t u; char *delim; struct sp_array e; if (!ISDIGIT (*arg)) { ERROR ((0, 0, _("Malformed extended header: invalid %s=%s"), keyword, arg)); return; } errno = 0; u = strtoumax (arg, &delim, 10); if (offset) { e.offset = u; if (!(u == e.offset && errno != ERANGE)) { out_of_range_header (keyword, arg, 0, TYPE_MAXIMUM (off_t)); return; } } else { e.numbytes = u; if (!(u == e.numbytes && errno != ERANGE)) { out_of_range_header (keyword, arg, 0, TYPE_MAXIMUM (size_t)); return; } if (st->sparse_map_avail < st->sparse_map_size) st->sparse_map[st->sparse_map_avail++] = e; else { ERROR ((0, 0, _("Malformed extended header: excess %s=%s"), keyword, arg)); return; } } offset = !offset; if (*delim == 0) break; else if (*delim != ',') { ERROR ((0, 0, _("Malformed extended header: invalid %s: unexpected delimiter %c"), keyword, *delim)); return; } arg = delim + 1; } if (!offset) ERROR ((0, 0, _("Malformed extended header: invalid %s: odd number of values"), keyword));}static voiddumpdir_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data){ xheader_print_n (xhdr, keyword, data, dumpdir_size (data));}static voiddumpdir_decoder (struct tar_stat_info *st, char const *keyword __attribute__((unused)), char const *arg, size_t size){ st->dumpdir = xmalloc (size); memcpy (st->dumpdir, arg, size);}static voidvolume_label_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data){ code_string (data, keyword, xhdr);}static voidvolume_label_decoder (struct tar_stat_info *st, char const *keyword __attribute__((unused)), char const *arg, size_t size __attribute__((unused))){ decode_string (&volume_label, arg);}static voidvolume_size_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data){ off_t const *v = data; code_num (*v, keyword, xhdr);}static voidvolume_size_decoder (struct tar_stat_info *st, char const *keyword, char const *arg, size_t size){ uintmax_t u; if (decode_num (&u, arg, TYPE_MAXIMUM (uintmax_t), keyword)) continued_file_size = u;}/* FIXME: Merge with volume_size_coder */static voidvolume_offset_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void const *data){ off_t const *v = data; code_num (*v, keyword, xhdr);}static voidvolume_offset_decoder (struct tar_stat_info *st, char const *keyword, char const *arg, size_t size){ uintmax_t u; if (decode_num (&u, arg, TYPE_MAXIMUM (uintmax_t), keyword)) continued_file_offset = u;}static voidvolume_filename_decoder (struct tar_stat_info *st, char const *keyword __attribute__((unused)), char const *arg, size_t size __attribute__((unused))){ decode_string (&continued_file_name, arg);}static voidsparse_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 voidsparse_major_decoder (struct tar_stat_info *st, char const *keyword, char const *arg, size_t size){ uintmax_t u; if (decode_num (&u, arg, TYPE_MAXIMUM (unsigned), keyword)) st->sparse_major = u;}static voidsparse_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 voidsparse_minor_decoder (struct tar_stat_info *st, char const *keyword, char const *arg, size_t size){ uintmax_t u; if (decode_num (&u, arg, TYPE_MAXIMUM (unsigned), keyword)) st->sparse_minor = u;}struct xhdr_tab const xhdr_tab[] = { { "atime", atime_coder, atime_decoder, false }, { "comment", dummy_coder, dummy_decoder, false }, { "charset", dummy_coder, dummy_decoder, false }, { "ctime", ctime_coder, ctime_decoder, false }, { "gid", gid_coder, gid_decoder, false }, { "gname", gname_coder, gname_decoder, false }, { "linkpath", linkpath_coder, linkpath_decoder, false }, { "mtime", mtime_coder, mtime_decoder, false }, { "path", path_coder, path_decoder, false }, { "size", size_coder, size_decoder, false }, { "uid", uid_coder, uid_decoder, false }, { "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.numblocks", sparse_numblocks_coder, sparse_numblocks_decoder, true }, /* tar 1.14 - 1.15.90 keywords. */ { "GNU.sparse.size", sparse_size_coder, sparse_size_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 given in the header shall take precedence." */ { "GNU.sparse.offset", sparse_offset_coder, sparse_offset_decoder, true }, { "GNU.sparse.numbytes", sparse_numbytes_coder, sparse_numbytes_decoder, true }, /* 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 }, { "GNU.dumpdir", dumpdir_coder, dumpdir_decoder, true }, /* Keeps the tape/volume label. May be present only in the global headers. Equivalent to GNUTYPE_VOLHDR. */ { "GNU.volume.label", volume_label_coder, volume_label_decoder, true }, /* These may be present in a first global header of the archive. They provide the same functionality as GNUTYPE_MULTIVOL header. The GNU.volume.size keeps the real_s_sizeleft value, which is otherwise kept in the size field of a multivolume header. The GNU.volume.offset keeps the offset of the start of this volume, otherwise kept in oldgnu_header.offset. */ { "GNU.volume.filename", volume_label_coder, volume_filename_decoder, true }, { "GNU.volume.size", volume_size_coder, volume_size_decoder, true }, { "GNU.volume.offset", volume_offset_coder, volume_offset_decoder, true }, { NULL, NULL, NULL, false }};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -