33 const char *(*link_map) (
const char *);
87 streamer->
file = file;
91 streamer->
file = fopen(pathname,
"wb");
92 if (streamer->
file == NULL)
93 pg_fatal(
"could not create file \"%s\": %m", pathname);
97 return &streamer->
base;
121 pg_fatal(
"could not write to file \"%s\": %m",
138 pg_fatal(
"could not close file \"%s\": %m",
141 mystreamer->
file = NULL;
184 const char *(*link_map) (
const char *),
185 void (*report_output_file) (
const char *))
196 return &streamer->
base;
223 fnamelen = strlen(mystreamer->
filename);
224 if (mystreamer->
filename[fnamelen - 1] ==
'/')
225 mystreamer->
filename[fnamelen - 1] =
'\0';
235 linktarget = mystreamer->
link_map(linktarget);
249 if (mystreamer->
file == NULL)
258 pg_fatal(
"could not write to file \"%s\": %m",
264 if (mystreamer->
file == NULL)
266 fclose(mystreamer->
file);
267 mystreamer->
file = NULL;
275 pg_fatal(
"unexpected state while extracting archive");
296 if (strcmp(
filename,
"pg_wal") == 0 ||
298 strcmp(
filename,
"archive_status") == 0 ||
304 const char *pg_tblspc = strstr(pathname,
"/pg_tblspc/");
306 return pg_tblspc != NULL && pg_tblspc + 11 ==
filename;
320 pg_fatal(
"could not create directory \"%s\": %m",
325 pg_fatal(
"could not set permissions on directory \"%s\": %m",
344 pg_fatal(
"could not create symbolic link from \"%s\" to \"%s\": %m",
364 pg_fatal(
"could not set permissions on file \"%s\": %m",
382 Assert(mystreamer->file == NULL);
bbstreamer_archive_context
@ BBSTREAMER_ARCHIVE_TRAILER
@ BBSTREAMER_MEMBER_HEADER
@ BBSTREAMER_MEMBER_TRAILER
@ BBSTREAMER_MEMBER_CONTENTS
static void bbstreamer_extractor_free(bbstreamer *streamer)
static void bbstreamer_plain_writer_free(bbstreamer *streamer)
static void extract_directory(const char *filename, mode_t mode)
static FILE * create_file_for_extract(const char *filename, mode_t mode)
static void bbstreamer_plain_writer_content(bbstreamer *streamer, bbstreamer_member *member, const char *data, int len, bbstreamer_archive_context context)
const bbstreamer_ops bbstreamer_extractor_ops
struct bbstreamer_plain_writer bbstreamer_plain_writer
static void bbstreamer_plain_writer_finalize(bbstreamer *streamer)
struct bbstreamer_extractor bbstreamer_extractor
const bbstreamer_ops bbstreamer_plain_writer_ops
static void bbstreamer_extractor_finalize(bbstreamer *streamer)
static void bbstreamer_extractor_content(bbstreamer *streamer, bbstreamer_member *member, const char *data, int len, bbstreamer_archive_context context)
bbstreamer * bbstreamer_plain_writer_new(char *pathname, FILE *file)
bbstreamer * bbstreamer_extractor_new(const char *basepath, const char *(*link_map)(const char *), void(*report_output_file)(const char *))
static bool should_allow_existing_directory(const char *pathname)
static void extract_link(const char *filename, const char *linktarget)
#define PG_USED_FOR_ASSERTS_ONLY
Assert(fmt[strlen(fmt) - 1] !='\n')
char * pstrdup(const char *in)
void pfree(void *pointer)
void * palloc0(Size size)
static PgChecksumMode mode
char * last_dir_separator(const char *filename)
char linktarget[MAXPGPATH]
void(* content)(bbstreamer *streamer, bbstreamer_member *member, const char *data, int len, bbstreamer_archive_context context)
const bbstreamer_ops * bbs_ops
#define symlink(oldpath, newpath)