104 return &streamer->
base;
175 nbytes =
Min(nbytes,
len);
254 pg_fatal(
"unexpected state while parsing tar archive");
272 char *buffer =
mystreamer->base.bbs_buffer.data;
282 if (buffer[
i] !=
'\0')
300 pg_fatal(
"input file does not appear to be a valid tar archive");
307 pg_fatal(
"tar member has empty name");
328 pg_fatal(
"pax extensions to tar format are not supported");
357 pg_fatal(
"COPY stream ended before last file was finished");
397 return &streamer->
base;
static void astreamer_free(astreamer *streamer)
static void astreamer_content(astreamer *streamer, astreamer_member *member, const char *data, int len, astreamer_archive_context context)
static bool astreamer_buffer_until(astreamer *streamer, const char **data, int *len, int target_bytes)
static void astreamer_finalize(astreamer *streamer)
astreamer_archive_context
@ ASTREAMER_MEMBER_HEADER
@ ASTREAMER_MEMBER_CONTENTS
@ ASTREAMER_MEMBER_TRAILER
@ ASTREAMER_ARCHIVE_TRAILER
static void astreamer_buffer_bytes(astreamer *streamer, const char **data, int *len, int nbytes)
static const astreamer_ops astreamer_tar_terminator_ops
astreamer * astreamer_tar_parser_new(astreamer *next)
static const astreamer_ops astreamer_tar_parser_ops
static void astreamer_tar_parser_content(astreamer *streamer, astreamer_member *member, const char *data, int len, astreamer_archive_context context)
static void astreamer_tar_terminator_content(astreamer *streamer, astreamer_member *member, const char *data, int len, astreamer_archive_context context)
static void astreamer_tar_archiver_free(astreamer *streamer)
static bool astreamer_tar_header(astreamer_tar_parser *mystreamer)
astreamer * astreamer_tar_terminator_new(astreamer *next)
static void astreamer_tar_parser_finalize(astreamer *streamer)
static void astreamer_tar_archiver_finalize(astreamer *streamer)
static const astreamer_ops astreamer_tar_archiver_ops
astreamer * astreamer_tar_archiver_new(astreamer *next)
static void astreamer_tar_terminator_free(astreamer *streamer)
static void astreamer_tar_terminator_finalize(astreamer *streamer)
static void astreamer_tar_parser_free(astreamer *streamer)
static void astreamer_tar_archiver_content(astreamer *streamer, astreamer_member *member, const char *data, int len, astreamer_archive_context context)
#define Assert(condition)
#define palloc0_object(type)
void pfree(void *pointer)
uint64 read_tar_number(const char *s, int len)
static size_t tarPaddingBytesRequired(size_t len)
@ TAR_FILETYPE_PAX_EXTENDED_GLOBAL
@ TAR_FILETYPE_PAX_EXTENDED
enum tarError tarCreateHeader(char *h, const char *filename, const char *linktarget, pgoff_t size, mode_t mode, uid_t uid, gid_t gid, time_t mtime)
bool isValidTarHeader(const char *header)
size_t strlcpy(char *dst, const char *src, size_t siz)
void initStringInfo(StringInfo str)
char linktarget[MAXPGPATH]
void(* content)(astreamer *streamer, astreamer_member *member, const char *data, int len, astreamer_archive_context context)
astreamer_archive_context next_context
size_t pad_bytes_expected
StringInfoData bbs_buffer
const astreamer_ops * bbs_ops