104 return &streamer->
base;
175 nbytes =
Min(nbytes,
len);
244 pg_fatal(
"tar file trailer exceeds 2 blocks");
249 pg_fatal(
"unexpected state while parsing tar archive");
263 bool has_nonzero_byte =
false;
273 if (buffer[
i] !=
'\0')
275 has_nonzero_byte =
true;
284 if (!has_nonzero_byte)
296 pg_fatal(
"tar member has empty name");
302 member->
is_link = (buffer[156] ==
'2');
328 pg_fatal(
"COPY stream ended before last file was finished");
367 return &streamer->
base;
422 memset(buffer, 0, pad_bytes);
static void bbstreamer_content(bbstreamer *streamer, bbstreamer_member *member, const char *data, int len, bbstreamer_archive_context context)
static void bbstreamer_finalize(bbstreamer *streamer)
static void bbstreamer_buffer_bytes(bbstreamer *streamer, const char **data, int *len, int nbytes)
static bool bbstreamer_buffer_until(bbstreamer *streamer, const char **data, int *len, int target_bytes)
bbstreamer_archive_context
@ BBSTREAMER_ARCHIVE_TRAILER
@ BBSTREAMER_MEMBER_HEADER
@ BBSTREAMER_MEMBER_TRAILER
@ BBSTREAMER_MEMBER_CONTENTS
static void bbstreamer_free(bbstreamer *streamer)
static void bbstreamer_tar_parser_content(bbstreamer *streamer, bbstreamer_member *member, const char *data, int len, bbstreamer_archive_context context)
const bbstreamer_ops bbstreamer_tar_terminator_ops
struct bbstreamer_tar_archiver bbstreamer_tar_archiver
struct bbstreamer_tar_parser bbstreamer_tar_parser
static void bbstreamer_tar_parser_finalize(bbstreamer *streamer)
static void bbstreamer_tar_terminator_free(bbstreamer *streamer)
bbstreamer * bbstreamer_tar_terminator_new(bbstreamer *next)
static void bbstreamer_tar_archiver_finalize(bbstreamer *streamer)
static void bbstreamer_tar_parser_free(bbstreamer *streamer)
bbstreamer * bbstreamer_tar_parser_new(bbstreamer *next)
const bbstreamer_ops bbstreamer_tar_parser_ops
static void bbstreamer_tar_archiver_free(bbstreamer *streamer)
static bool bbstreamer_tar_header(bbstreamer_tar_parser *mystreamer)
static void bbstreamer_tar_archiver_content(bbstreamer *streamer, bbstreamer_member *member, const char *data, int len, bbstreamer_archive_context context)
static void bbstreamer_tar_terminator_content(bbstreamer *streamer, bbstreamer_member *member, const char *data, int len, bbstreamer_archive_context context)
bbstreamer * bbstreamer_tar_archiver_new(bbstreamer *next)
const bbstreamer_ops bbstreamer_tar_archiver_ops
static void bbstreamer_tar_terminator_finalize(bbstreamer *streamer)
Assert(fmt[strlen(fmt) - 1] !='\n')
void pfree(void *pointer)
void * palloc0(Size size)
uint64 read_tar_number(const char *s, int len)
static size_t tarPaddingBytesRequired(size_t len)
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)
size_t strlcpy(char *dst, const char *src, size_t siz)
void initStringInfo(StringInfo str)
char linktarget[MAXPGPATH]
void(* content)(bbstreamer *streamer, bbstreamer_member *member, const char *data, int len, bbstreamer_archive_context context)
size_t pad_bytes_expected
bbstreamer_archive_context next_context
const bbstreamer_ops * bbs_ops
StringInfoData bbs_buffer