aboutsummaryrefslogtreecommitdiff
path: root/src/bin/pg_dump/pg_backup_archiver.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/pg_dump/pg_backup_archiver.c')
-rw-r--r--src/bin/pg_dump/pg_backup_archiver.c83
1 files changed, 38 insertions, 45 deletions
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
index 946454019bd..adf91e1697c 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -855,7 +855,7 @@ _enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt
*/
/* Public */
-size_t
+void
WriteData(Archive *AHX, const void *data, size_t dLen)
{
ArchiveHandle *AH = (ArchiveHandle *) AHX;
@@ -863,7 +863,9 @@ WriteData(Archive *AHX, const void *data, size_t dLen)
if (!AH->currToc)
exit_horribly(modulename, "internal error -- WriteData cannot be called outside the context of a DataDumper routine\n");
- return (*AH->WriteDataPtr) (AH, data, dLen);
+ (*AH->WriteDataPtr) (AH, data, dLen);
+
+ return;
}
/*
@@ -1246,10 +1248,11 @@ SortTocFromFile(Archive *AHX, RestoreOptions *ropt)
**********************/
/* Public */
-int
+void
archputs(const char *s, Archive *AH)
{
- return WriteData(AH, s, strlen(s));
+ WriteData(AH, s, strlen(s));
+ return;
}
/* Public */
@@ -1486,11 +1489,11 @@ dump_lo_buf(ArchiveHandle *AH)
* format to create a custom output routine to 'fake' a restore if it
* wants to generate a script (see TAR output).
*/
-int
+void
ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH)
{
- size_t res;
-
+ int bytes_written = 0;
+
if (AH->writingBlob)
{
size_t remaining = size * nmemb;
@@ -1509,23 +1512,12 @@ ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH)
memcpy((char *) AH->lo_buf + AH->lo_buf_used, ptr, remaining);
AH->lo_buf_used += remaining;
- return size * nmemb;
+ bytes_written = size * nmemb;
}
else if (AH->gzOut)
- {
- res = GZWRITE(ptr, size, nmemb, AH->OF);
- if (res != (nmemb * size))
- exit_horribly(modulename, "could not write to output file: %s\n", strerror(errno));
- return res;
- }
+ bytes_written = GZWRITE(ptr, size, nmemb, AH->OF);
else if (AH->CustomOutPtr)
- {
- res = AH->CustomOutPtr (AH, ptr, size * nmemb);
-
- if (res != (nmemb * size))
- exit_horribly(modulename, "could not write to custom output routine\n");
- return res;
- }
+ bytes_written = AH->CustomOutPtr (AH, ptr, size * nmemb);
else
{
/*
@@ -1533,16 +1525,15 @@ ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH)
* connected then send it to the DB.
*/
if (RestoringToDB(AH))
- return ExecuteSqlCommandBuf(AH, (const char *) ptr, size * nmemb);
+ bytes_written = ExecuteSqlCommandBuf(AH, (const char *) ptr, size * nmemb);
else
- {
- res = fwrite(ptr, size, nmemb, AH->OF);
- if (res != nmemb)
- exit_horribly(modulename, "could not write to output file: %s\n",
- strerror(errno));
- return res;
- }
+ bytes_written = fwrite(ptr, size, nmemb, AH->OF) * size;
}
+
+ if (bytes_written != size * nmemb)
+ WRITE_ERROR_EXIT;
+
+ return;
}
/* on some error, we may decide to go on... */
@@ -1847,8 +1838,11 @@ WriteStr(ArchiveHandle *AH, const char *c)
if (c)
{
- res = WriteInt(AH, strlen(c));
- res += (*AH->WriteBufPtr) (AH, c, strlen(c));
+ int len = strlen(c);
+
+ res = WriteInt(AH, len);
+ (*AH->WriteBufPtr) (AH, c, len);
+ res += len;
}
else
res = WriteInt(AH, -1);
@@ -1868,8 +1862,7 @@ ReadStr(ArchiveHandle *AH)
else
{
buf = (char *) pg_malloc(l + 1);
- if ((*AH->ReadBufPtr) (AH, (void *) buf, l) != l)
- exit_horribly(modulename, "unexpected end of file\n");
+ (*AH->ReadBufPtr) (AH, (void *) buf, l);
buf[l] = '\0';
}
@@ -1950,9 +1943,7 @@ _discoverArchiveFormat(ArchiveHandle *AH)
strerror(errno));
}
- cnt = fread(sig, 1, 5, fh);
-
- if (cnt != 5)
+ if ((cnt = fread(sig, 1, 5, fh)) != 5)
{
if (ferror(fh))
exit_horribly(modulename, "could not read input file: %s\n", strerror(errno));
@@ -1975,12 +1966,12 @@ _discoverArchiveFormat(ArchiveHandle *AH)
* NB: this code must agree with ReadHead().
*/
if ((byteread = fgetc(fh)) == EOF)
- exit_horribly(modulename, "could not read input file: %s\n", strerror(errno));
+ READ_ERROR_EXIT(fh);
AH->vmaj = byteread;
if ((byteread = fgetc(fh)) == EOF)
- exit_horribly(modulename, "could not read input file: %s\n", strerror(errno));
+ READ_ERROR_EXIT(fh);
AH->vmin = byteread;
@@ -1992,7 +1983,7 @@ _discoverArchiveFormat(ArchiveHandle *AH)
if (AH->vmaj > 1 || ((AH->vmaj == 1) && (AH->vmin > 0))) /* Version > 1.0 */
{
if ((byteread = fgetc(fh)) == EOF)
- exit_horribly(modulename, "could not read input file: %s\n", strerror(errno));
+ READ_ERROR_EXIT(fh);
AH->vrev = byteread;
AH->lookahead[AH->lookaheadLen++] = AH->vrev;
@@ -2004,20 +1995,20 @@ _discoverArchiveFormat(ArchiveHandle *AH)
AH->version = ((AH->vmaj * 256 + AH->vmin) * 256 + AH->vrev) * 256 + 0;
if ((AH->intSize = fgetc(fh)) == EOF)
- exit_horribly(modulename, "could not read input file: %s\n", strerror(errno));
+ READ_ERROR_EXIT(fh);
AH->lookahead[AH->lookaheadLen++] = AH->intSize;
if (AH->version >= K_VERS_1_7)
{
if ((AH->offSize = fgetc(fh)) == EOF)
- exit_horribly(modulename, "could not read input file: %s\n", strerror(errno));
+ READ_ERROR_EXIT(fh);
AH->lookahead[AH->lookaheadLen++] = AH->offSize;
}
else
AH->offSize = AH->intSize;
if ((byteread = fgetc(fh)) == EOF)
- exit_horribly(modulename, "could not read input file: %s\n", strerror(errno));
+ READ_ERROR_EXIT(fh);
AH->format = byteread;
AH->lookahead[AH->lookaheadLen++] = AH->format;
@@ -2029,6 +2020,7 @@ _discoverArchiveFormat(ArchiveHandle *AH)
* read first 512 byte header...
*/
cnt = fread(&AH->lookahead[AH->lookaheadLen], 1, 512 - AH->lookaheadLen, fh);
+ /* read failure is checked below */
AH->lookaheadLen += cnt;
if (AH->lookaheadLen >= strlen(TEXT_DUMPALL_HEADER) &&
@@ -2042,8 +2034,10 @@ _discoverArchiveFormat(ArchiveHandle *AH)
exit_horribly(modulename, "input file appears to be a text format dump. Please use psql.\n");
}
- if (AH->lookaheadLen != 512)
+ if (AH->lookaheadLen != 512 && feof(fh))
exit_horribly(modulename, "input file does not appear to be a valid archive (too short?)\n");
+ else
+ READ_ERROR_EXIT(fh);
if (!isValidTarHeader(AH->lookahead))
exit_horribly(modulename, "input file does not appear to be a valid archive\n");
@@ -3318,8 +3312,7 @@ ReadHead(ArchiveHandle *AH)
*/
if (!AH->readHeader)
{
- if ((*AH->ReadBufPtr) (AH, tmpMag, 5) != 5)
- exit_horribly(modulename, "unexpected end of file\n");
+ (*AH->ReadBufPtr) (AH, tmpMag, 5);
if (strncmp(tmpMag, "PGDMP", 5) != 0)
exit_horribly(modulename, "did not find magic string in file header\n");