#include "compress_io.h"#include "pg_backup_utils.h"#include "parallel.h"#include <dirent.h>#include <sys/stat.h>
Go to the source code of this file.
| static void _ArchiveEntry | ( | ArchiveHandle * | AH, | |
| TocEntry * | te | |||
| ) | [static] |
Definition at line 234 of file pg_backup_directory.c.
References _tocEntry::dataDumper, _tocEntry::desc, _tocEntry::dumpId, lclTocEntry::filename, fn(), _tocEntry::formatData, MAXPGPATH, pg_malloc0(), pg_strdup(), and snprintf().
{
lclTocEntry *tctx;
char fn[MAXPGPATH];
tctx = (lclTocEntry *) pg_malloc0(sizeof(lclTocEntry));
if (te->dataDumper)
{
snprintf(fn, MAXPGPATH, "%d.dat", te->dumpId);
tctx->filename = pg_strdup(fn);
}
else if (strcmp(te->desc, "BLOBS") == 0)
tctx->filename = pg_strdup("blobs.toc");
else
tctx->filename = NULL;
te->formatData = (void *) tctx;
}
| static void _Clone | ( | ArchiveHandle * | AH | ) | [static] |
Definition at line 725 of file pg_backup_directory.c.
References _archiveHandle::formatData, and pg_malloc().
{
lclContext *ctx = (lclContext *) AH->formatData;
AH->formatData = (lclContext *) pg_malloc(sizeof(lclContext));
memcpy(AH->formatData, ctx, sizeof(lclContext));
ctx = (lclContext *) AH->formatData;
/*
* Note: we do not make a local lo_buf because we expect at most one BLOBS
* entry per archive, so no parallelism is possible. Likewise,
* TOC-entry-local state isn't an issue because any one TOC entry is
* touched by just one worker child.
*/
/*
* We also don't copy the ParallelState pointer (pstate), only the master
* process ever writes to it.
*/
}
| static void _CloseArchive | ( | ArchiveHandle * | AH | ) | [static] |
Definition at line 564 of file pg_backup_directory.c.
References archModeWrite, cfclose(), cfopen_write(), lclContext::dataFH, exit_horribly(), _archiveHandle::FH, _archiveHandle::format, _archiveHandle::formatData, _archiveHandle::mode, modulename, NULL, ParallelBackupEnd(), ParallelBackupStart(), PG_BINARY_W, lclContext::pstate, setFilePath(), strerror(), WriteDataChunks(), WriteHead(), and WriteToc().
{
lclContext *ctx = (lclContext *) AH->formatData;
if (AH->mode == archModeWrite)
{
cfp *tocFH;
char fname[MAXPGPATH];
setFilePath(AH, fname, "toc.dat");
/* this will actually fork the processes for a parallel backup */
ctx->pstate = ParallelBackupStart(AH, NULL);
/* The TOC is always created uncompressed */
tocFH = cfopen_write(fname, PG_BINARY_W, 0);
if (tocFH == NULL)
exit_horribly(modulename, "could not open output file \"%s\": %s\n",
fname, strerror(errno));
ctx->dataFH = tocFH;
/*
* Write 'tar' in the format field of the toc.dat file. The directory
* is compatible with 'tar', so there's no point having a different
* format code for it.
*/
AH->format = archTar;
WriteHead(AH);
AH->format = archDirectory;
WriteToc(AH);
if (cfclose(tocFH) != 0)
exit_horribly(modulename, "could not close TOC file: %s\n",
strerror(errno));
WriteDataChunks(AH, ctx->pstate);
ParallelBackupEnd(AH, ctx->pstate);
}
AH->FH = NULL;
}
| static void _DeClone | ( | ArchiveHandle * | AH | ) | [static] |
Definition at line 747 of file pg_backup_directory.c.
References _archiveHandle::formatData, and free.
{
lclContext *ctx = (lclContext *) AH->formatData;
free(ctx);
}
| static void _EndBlob | ( | ArchiveHandle * | AH, | |
| TocEntry * | te, | |||
| Oid | oid | |||
| ) | [static] |
Definition at line 669 of file pg_backup_directory.c.
References lclContext::blobsTocFH, buf, cfclose(), cfwrite(), lclContext::dataFH, exit_horribly(), _archiveHandle::formatData, modulename, and snprintf().
{
lclContext *ctx = (lclContext *) AH->formatData;
char buf[50];
int len;
/* Close the BLOB data file itself */
cfclose(ctx->dataFH);
ctx->dataFH = NULL;
/* register the blob in blobs.toc */
len = snprintf(buf, sizeof(buf), "%u blob_%u.dat\n", oid, oid);
if (cfwrite(buf, len, ctx->blobsTocFH) != len)
exit_horribly(modulename, "could not write to blobs TOC file\n");
}
| static void _EndBlobs | ( | ArchiveHandle * | AH, | |
| TocEntry * | te | |||
| ) | [static] |
Definition at line 691 of file pg_backup_directory.c.
References lclContext::blobsTocFH, cfclose(), and _archiveHandle::formatData.
{
lclContext *ctx = (lclContext *) AH->formatData;
cfclose(ctx->blobsTocFH);
ctx->blobsTocFH = NULL;
}
| static void _EndData | ( | ArchiveHandle * | AH, | |
| TocEntry * | te | |||
| ) | [static] |
Definition at line 367 of file pg_backup_directory.c.
References cfclose(), lclContext::dataFH, and _archiveHandle::formatData.
{
lclContext *ctx = (lclContext *) AH->formatData;
/* Close the file */
cfclose(ctx->dataFH);
ctx->dataFH = NULL;
}
| static void _LoadBlobs | ( | ArchiveHandle * | AH, | |
| RestoreOptions * | ropt | |||
| ) | [static] |
Definition at line 432 of file pg_backup_directory.c.
References _PrintFileData(), lclContext::blobsTocFH, cfclose(), cfeof(), cfgets(), cfopen_read(), lclContext::directory, _restoreOptions::dropSchema, EndRestoreBlob(), EndRestoreBlobs(), exit_horribly(), _archiveHandle::formatData, MAXPGPATH, modulename, NULL, PG_BINARY_R, setFilePath(), snprintf(), StartRestoreBlob(), StartRestoreBlobs(), and strerror().
Referenced by _PrintTocData().
{
Oid oid;
lclContext *ctx = (lclContext *) AH->formatData;
char fname[MAXPGPATH];
char line[MAXPGPATH];
StartRestoreBlobs(AH);
setFilePath(AH, fname, "blobs.toc");
ctx->blobsTocFH = cfopen_read(fname, PG_BINARY_R);
if (ctx->blobsTocFH == NULL)
exit_horribly(modulename, "could not open large object TOC file \"%s\" for input: %s\n",
fname, strerror(errno));
/* Read the blobs TOC file line-by-line, and process each blob */
while ((cfgets(ctx->blobsTocFH, line, MAXPGPATH)) != NULL)
{
char fname[MAXPGPATH];
char path[MAXPGPATH];
if (sscanf(line, "%u %s\n", &oid, fname) != 2)
exit_horribly(modulename, "invalid line in large object TOC file \"%s\": \"%s\"\n",
fname, line);
StartRestoreBlob(AH, oid, ropt->dropSchema);
snprintf(path, MAXPGPATH, "%s/%s", ctx->directory, fname);
_PrintFileData(AH, path, ropt);
EndRestoreBlob(AH, oid);
}
if (!cfeof(ctx->blobsTocFH))
exit_horribly(modulename, "error reading large object TOC file \"%s\"\n",
fname);
if (cfclose(ctx->blobsTocFH) != 0)
exit_horribly(modulename, "could not close large object TOC file \"%s\": %s\n",
fname, strerror(errno));
ctx->blobsTocFH = NULL;
EndRestoreBlobs(AH);
}
| static int _MasterEndParallelItem | ( | ArchiveHandle * | AH, | |
| TocEntry * | te, | |||
| const char * | str, | |||
| T_Action | act | |||
| ) | [static] |
Definition at line 847 of file pg_backup_directory.c.
References ACT_DUMP, ACT_RESTORE, Assert, _tocEntry::dumpId, Archive::n_errors, _archiveHandle::public, and status().
{
DumpId dumpId;
int nBytes,
n_errors;
int status = 0;
if (act == ACT_DUMP)
{
sscanf(str, "%u%n", &dumpId, &nBytes);
Assert(dumpId == te->dumpId);
Assert(nBytes == strlen(str));
}
else if (act == ACT_RESTORE)
{
sscanf(str, "%u %u %u%n", &dumpId, &status, &n_errors, &nBytes);
Assert(dumpId == te->dumpId);
Assert(nBytes == strlen(str));
AH->public.n_errors += n_errors;
}
return status;
}
| static char * _MasterStartParallelItem | ( | ArchiveHandle * | AH, | |
| TocEntry * | te, | |||
| T_Action | act | |||
| ) | [static] |
Definition at line 760 of file pg_backup_directory.c.
References ACT_DUMP, ACT_RESTORE, buf, _tocEntry::dumpId, and snprintf().
{
/*
* A static char is okay here, even on Windows because we call this
* function only from one process (the master).
*/
static char buf[64];
if (act == ACT_DUMP)
snprintf(buf, sizeof(buf), "DUMP %d", te->dumpId);
else if (act == ACT_RESTORE)
snprintf(buf, sizeof(buf), "RESTORE %d", te->dumpId);
return buf;
}
| static void _PrintExtraToc | ( | ArchiveHandle * | AH, | |
| TocEntry * | te | |||
| ) | [static] |
Definition at line 305 of file pg_backup_directory.c.
References ahprintf(), lclTocEntry::filename, _tocEntry::formatData, _archiveHandle::public, and Archive::verbose.
{
lclTocEntry *tctx = (lclTocEntry *) te->formatData;
if (AH->public.verbose && tctx->filename)
ahprintf(AH, "-- File: %s\n", tctx->filename);
}
| static void _PrintFileData | ( | ArchiveHandle * | AH, | |
| char * | filename, | |||
| RestoreOptions * | ropt | |||
| ) | [static] |
Definition at line 381 of file pg_backup_directory.c.
References ahwrite(), buf, cfclose(), cfopen_read(), cfread(), exit_horribly(), free, modulename, PG_BINARY_R, pg_malloc(), strerror(), and ZLIB_OUT_SIZE.
Referenced by _LoadBlobs(), and _PrintTocData().
{
size_t cnt;
char *buf;
size_t buflen;
cfp *cfp;
if (!filename)
return;
cfp = cfopen_read(filename, PG_BINARY_R);
if (!cfp)
exit_horribly(modulename, "could not open input file \"%s\": %s\n",
filename, strerror(errno));
buf = pg_malloc(ZLIB_OUT_SIZE);
buflen = ZLIB_OUT_SIZE;
while ((cnt = cfread(buf, buflen, cfp)))
ahwrite(buf, 1, cnt, AH);
free(buf);
if (cfclose(cfp) !=0)
exit_horribly(modulename, "could not close data file: %s\n",
strerror(errno));
}
| static void _PrintTocData | ( | ArchiveHandle * | AH, | |
| TocEntry * | te, | |||
| RestoreOptions * | ropt | |||
| ) | [static] |
Definition at line 413 of file pg_backup_directory.c.
References _LoadBlobs(), _PrintFileData(), _tocEntry::desc, lclTocEntry::filename, _tocEntry::formatData, and setFilePath().
{
lclTocEntry *tctx = (lclTocEntry *) te->formatData;
if (!tctx->filename)
return;
if (strcmp(te->desc, "BLOBS") == 0)
_LoadBlobs(AH, ropt);
else
{
char fname[MAXPGPATH];
setFilePath(AH, fname, tctx->filename);
_PrintFileData(AH, fname, ropt);
}
}
| static size_t _ReadBuf | ( | ArchiveHandle * | AH, | |
| void * | buf, | |||
| size_t | len | |||
| ) | [static] |
Definition at line 541 of file pg_backup_directory.c.
References cfread(), lclContext::dataFH, and _archiveHandle::formatData.
{
lclContext *ctx = (lclContext *) AH->formatData;
size_t res;
res = cfread(buf, len, ctx->dataFH);
return res;
}
| static int _ReadByte | ( | ArchiveHandle * | AH | ) | [static] |
Definition at line 502 of file pg_backup_directory.c.
References cfgetc(), lclContext::dataFH, exit_horribly(), _archiveHandle::formatData, and modulename.
{
lclContext *ctx = (lclContext *) AH->formatData;
int res;
res = cfgetc(ctx->dataFH);
if (res == EOF)
exit_horribly(modulename, "unexpected end of file\n");
return res;
}
| static void _ReadExtraToc | ( | ArchiveHandle * | AH, | |
| TocEntry * | te | |||
| ) | [static] |
Definition at line 282 of file pg_backup_directory.c.
References lclTocEntry::filename, _tocEntry::formatData, free, NULL, pg_malloc0(), and ReadStr().
{
lclTocEntry *tctx = (lclTocEntry *) te->formatData;
if (tctx == NULL)
{
tctx = (lclTocEntry *) pg_malloc0(sizeof(lclTocEntry));
te->formatData = (void *) tctx;
}
tctx->filename = ReadStr(AH);
if (strlen(tctx->filename) == 0)
{
free(tctx->filename);
tctx->filename = NULL;
}
}
| static void _ReopenArchive | ( | ArchiveHandle * | AH | ) | [static] |
Definition at line 608 of file pg_backup_directory.c.
{
/*
* Our TOC is in memory, our data files are opened by each child anyway as
* they are separate. We support reopening the archive by just doing
* nothing.
*/
}
| static void _StartBlob | ( | ArchiveHandle * | AH, | |
| TocEntry * | te, | |||
| Oid | oid | |||
| ) | [static] |
Definition at line 649 of file pg_backup_directory.c.
References cfopen_write(), _archiveHandle::compression, lclContext::dataFH, lclContext::directory, exit_horribly(), _archiveHandle::formatData, MAXPGPATH, modulename, NULL, PG_BINARY_W, snprintf(), and strerror().
{
lclContext *ctx = (lclContext *) AH->formatData;
char fname[MAXPGPATH];
snprintf(fname, MAXPGPATH, "%s/blob_%u.dat", ctx->directory, oid);
ctx->dataFH = cfopen_write(fname, PG_BINARY_W, AH->compression);
if (ctx->dataFH == NULL)
exit_horribly(modulename, "could not open output file \"%s\": %s\n",
fname, strerror(errno));
}
| static void _StartBlobs | ( | ArchiveHandle * | AH, | |
| TocEntry * | te | |||
| ) | [static] |
Definition at line 629 of file pg_backup_directory.c.
References lclContext::blobsTocFH, cfopen_write(), exit_horribly(), _archiveHandle::formatData, MAXPGPATH, modulename, NULL, setFilePath(), and strerror().
{
lclContext *ctx = (lclContext *) AH->formatData;
char fname[MAXPGPATH];
setFilePath(AH, fname, "blobs.toc");
/* The blob TOC file is never compressed */
ctx->blobsTocFH = cfopen_write(fname, "ab", 0);
if (ctx->blobsTocFH == NULL)
exit_horribly(modulename, "could not open output file \"%s\": %s\n",
fname, strerror(errno));
}
| static void _StartData | ( | ArchiveHandle * | AH, | |
| TocEntry * | te | |||
| ) | [static] |
Definition at line 323 of file pg_backup_directory.c.
References cfopen_write(), _archiveHandle::compression, exit_horribly(), lclTocEntry::filename, _archiveHandle::formatData, _tocEntry::formatData, modulename, NULL, PG_BINARY_W, setFilePath(), and strerror().
{
lclTocEntry *tctx = (lclTocEntry *) te->formatData;
lclContext *ctx = (lclContext *) AH->formatData;
char fname[MAXPGPATH];
setFilePath(AH, fname, tctx->filename);
ctx->dataFH = cfopen_write(fname, PG_BINARY_W, AH->compression);
if (ctx->dataFH == NULL)
exit_horribly(modulename, "could not open output file \"%s\": %s\n",
fname, strerror(errno));
}
| static char * _WorkerJobDumpDirectory | ( | ArchiveHandle * | AH, | |
| TocEntry * | te | |||
| ) | [static] |
Definition at line 788 of file pg_backup_directory.c.
References buf, _tocEntry::dumpId, exit_horribly(), _tocEntry::formatData, modulename, pg_malloc(), snprintf(), and WriteDataChunksForTocEntry().
{
/*
* short fixed-size string + some ID so far, this needs to be malloc'ed
* instead of static because we work with threads on windows
*/
const int buflen = 64;
char *buf = (char *) pg_malloc(buflen);
lclTocEntry *tctx = (lclTocEntry *) te->formatData;
/* This should never happen */
if (!tctx)
exit_horribly(modulename, "Error during backup\n");
/*
* This function returns void. We either fail and die horribly or
* succeed... A failure will be detected by the parent when the child dies
* unexpectedly.
*/
WriteDataChunksForTocEntry(AH, te);
snprintf(buf, buflen, "OK DUMP %d", te->dumpId);
return buf;
}
| static char * _WorkerJobRestoreDirectory | ( | ArchiveHandle * | AH, | |
| TocEntry * | te | |||
| ) | [static] |
Definition at line 819 of file pg_backup_directory.c.
References ParallelArgs::AH, buf, _tocEntry::dumpId, Archive::n_errors, parallel_restore(), pg_malloc(), _archiveHandle::public, snprintf(), ParallelArgs::te, and WORKER_IGNORED_ERRORS.
{
/*
* short fixed-size string + some ID so far, this needs to be malloc'ed
* instead of static because we work with threads on windows
*/
const int buflen = 64;
char *buf = (char *) pg_malloc(buflen);
ParallelArgs pargs;
int status;
pargs.AH = AH;
pargs.te = te;
status = parallel_restore(&pargs);
snprintf(buf, buflen, "OK RESTORE %d %d %d", te->dumpId, status,
status == WORKER_IGNORED_ERRORS ? AH->public.n_errors : 0);
return buf;
}
| static size_t _WriteBuf | ( | ArchiveHandle * | AH, | |
| const void * | buf, | |||
| size_t | len | |||
| ) | [static] |
Definition at line 519 of file pg_backup_directory.c.
References cfwrite(), checkAborting(), lclContext::dataFH, exit_horribly(), _archiveHandle::formatData, modulename, and strerror().
{
lclContext *ctx = (lclContext *) AH->formatData;
size_t res;
/* Are we aborting? */
checkAborting(AH);
res = cfwrite(buf, len, ctx->dataFH);
if (res != len)
exit_horribly(modulename, "could not write to output file: %s\n",
strerror(errno));
return res;
}
| static int _WriteByte | ( | ArchiveHandle * | AH, | |
| const int | i | |||
| ) | [static] |
Definition at line 484 of file pg_backup_directory.c.
References cfwrite(), lclContext::dataFH, exit_horribly(), _archiveHandle::formatData, and modulename.
{
unsigned char c = (unsigned char) i;
lclContext *ctx = (lclContext *) AH->formatData;
if (cfwrite(&c, 1, ctx->dataFH) != 1)
exit_horribly(modulename, "could not write byte\n");
return 1;
}
| static size_t _WriteData | ( | ArchiveHandle * | AH, | |
| const void * | data, | |||
| size_t | dLen | |||
| ) | [static] |
Definition at line 347 of file pg_backup_directory.c.
References cfwrite(), checkAborting(), lclContext::dataFH, and _archiveHandle::formatData.
{
lclContext *ctx = (lclContext *) AH->formatData;
if (dLen == 0)
return 0;
/* Are we aborting? */
checkAborting(AH);
return cfwrite(data, dLen, ctx->dataFH);
}
| static void _WriteExtraToc | ( | ArchiveHandle * | AH, | |
| TocEntry * | te | |||
| ) | [static] |
Definition at line 261 of file pg_backup_directory.c.
References lclTocEntry::filename, _tocEntry::formatData, and WriteStr().
{
lclTocEntry *tctx = (lclTocEntry *) te->formatData;
/*
* A dumpable object has set tctx->filename, any other object has not.
* (see _ArchiveEntry).
*/
if (tctx->filename)
WriteStr(AH, tctx->filename);
else
WriteStr(AH, "");
}
| void InitArchiveFmt_Directory | ( | ArchiveHandle * | AH | ) |
Definition at line 111 of file pg_backup_directory.c.
References _archiveHandle::ArchiveEntryPtr, archModeWrite, lclContext::blobsTocFH, cfclose(), cfopen_read(), _archiveHandle::ClonePtr, closedir(), _archiveHandle::ClosePtr, dirent::d_name, lclContext::dataFH, _archiveHandle::DeClonePtr, lclContext::directory, _archiveHandle::EndBlobPtr, _archiveHandle::EndBlobsPtr, _archiveHandle::EndDataPtr, exit_horribly(), _archiveHandle::format, _archiveHandle::formatData, _archiveHandle::fSpec, _archiveHandle::lo_buf, _archiveHandle::lo_buf_size, LOBBUFSIZE, _archiveHandle::MasterEndParallelItemPtr, _archiveHandle::MasterStartParallelItemPtr, mkdir, _archiveHandle::mode, modulename, NULL, opendir(), PG_BINARY_R, pg_malloc(), pg_malloc0(), _archiveHandle::PrintExtraTocPtr, _archiveHandle::PrintTocDataPtr, _archiveHandle::ReadBufPtr, _archiveHandle::ReadBytePtr, readdir(), _archiveHandle::ReadExtraTocPtr, ReadHead(), ReadToc(), _archiveHandle::ReopenPtr, setFilePath(), _archiveHandle::StartBlobPtr, _archiveHandle::StartBlobsPtr, _archiveHandle::StartDataPtr, strerror(), _archiveHandle::WorkerJobDumpPtr, _archiveHandle::WorkerJobRestorePtr, _archiveHandle::WriteBufPtr, _archiveHandle::WriteBytePtr, _archiveHandle::WriteDataPtr, and _archiveHandle::WriteExtraTocPtr.
Referenced by _allocAH().
{
lclContext *ctx;
/* Assuming static functions, this can be copied for each format. */
AH->ArchiveEntryPtr = _ArchiveEntry;
AH->StartDataPtr = _StartData;
AH->WriteDataPtr = _WriteData;
AH->EndDataPtr = _EndData;
AH->WriteBytePtr = _WriteByte;
AH->ReadBytePtr = _ReadByte;
AH->WriteBufPtr = _WriteBuf;
AH->ReadBufPtr = _ReadBuf;
AH->ClosePtr = _CloseArchive;
AH->ReopenPtr = _ReopenArchive;
AH->PrintTocDataPtr = _PrintTocData;
AH->ReadExtraTocPtr = _ReadExtraToc;
AH->WriteExtraTocPtr = _WriteExtraToc;
AH->PrintExtraTocPtr = _PrintExtraToc;
AH->StartBlobsPtr = _StartBlobs;
AH->StartBlobPtr = _StartBlob;
AH->EndBlobPtr = _EndBlob;
AH->EndBlobsPtr = _EndBlobs;
AH->ClonePtr = _Clone;
AH->DeClonePtr = _DeClone;
AH->WorkerJobRestorePtr = _WorkerJobRestoreDirectory;
AH->WorkerJobDumpPtr = _WorkerJobDumpDirectory;
AH->MasterStartParallelItemPtr = _MasterStartParallelItem;
AH->MasterEndParallelItemPtr = _MasterEndParallelItem;
/* Set up our private context */
ctx = (lclContext *) pg_malloc0(sizeof(lclContext));
AH->formatData = (void *) ctx;
ctx->dataFH = NULL;
ctx->blobsTocFH = NULL;
/* Initialize LO buffering */
AH->lo_buf_size = LOBBUFSIZE;
AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE);
/*
* Now open the TOC file
*/
if (!AH->fSpec || strcmp(AH->fSpec, "") == 0)
exit_horribly(modulename, "no output directory specified\n");
ctx->directory = AH->fSpec;
if (AH->mode == archModeWrite)
{
struct stat st;
bool is_empty = false;
/* we accept an empty existing directory */
if (stat(ctx->directory, &st) == 0 && S_ISDIR(st.st_mode))
{
DIR *dir = opendir(ctx->directory);
if (dir)
{
struct dirent *d;
is_empty = true;
while ((d = readdir(dir)))
{
if (strcmp(d->d_name, ".") != 0 && strcmp(d->d_name, "..") != 0)
{
is_empty = false;
break;
}
}
closedir(dir);
}
}
if (!is_empty && mkdir(ctx->directory, 0700) < 0)
exit_horribly(modulename, "could not create directory \"%s\": %s\n",
ctx->directory, strerror(errno));
}
else
{ /* Read Mode */
char fname[MAXPGPATH];
cfp *tocFH;
setFilePath(AH, fname, "toc.dat");
tocFH = cfopen_read(fname, PG_BINARY_R);
if (tocFH == NULL)
exit_horribly(modulename,
"could not open input file \"%s\": %s\n",
fname, strerror(errno));
ctx->dataFH = tocFH;
/*
* The TOC of a directory format dump shares the format code of the
* tar format.
*/
AH->format = archTar;
ReadHead(AH);
AH->format = archDirectory;
ReadToc(AH);
/* Nothing else in the file, so close it again... */
if (cfclose(tocFH) != 0)
exit_horribly(modulename, "could not close TOC file: %s\n",
strerror(errno));
ctx->dataFH = NULL;
}
}
| static void setFilePath | ( | ArchiveHandle * | AH, | |
| char * | buf, | |||
| const char * | relativeFilename | |||
| ) | [static] |
Definition at line 706 of file pg_backup_directory.c.
References lclContext::directory, exit_horribly(), _archiveHandle::formatData, and modulename.
Referenced by _CloseArchive(), _LoadBlobs(), _PrintTocData(), _StartBlobs(), _StartData(), and InitArchiveFmt_Directory().
{
lclContext *ctx = (lclContext *) AH->formatData;
char *dname;
dname = ctx->directory;
if (strlen(dname) + 1 + strlen(relativeFilename) + 1 > MAXPGPATH)
exit_horribly(modulename, "file name too long: \"%s\"\n", dname);
strcpy(buf, dname);
strcat(buf, "/");
strcat(buf, relativeFilename);
}
const char* modulename = gettext_noop("directory archiver") [static] |
Definition at line 63 of file pg_backup_directory.c.
Referenced by _CloseArchive(), _EndBlob(), _LoadBlobs(), _PrintFileData(), _ReadByte(), _StartBlob(), _StartBlobs(), _StartData(), _WorkerJobDumpDirectory(), _WriteBuf(), _WriteByte(), InitArchiveFmt_Directory(), and setFilePath().
1.7.1