diff options
Diffstat (limited to 'src/bin/pg_dump/pg_backup_tar.c')
-rw-r--r-- | src/bin/pg_dump/pg_backup_tar.c | 164 |
1 files changed, 81 insertions, 83 deletions
diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c index 4a81f593d7a..38c84d9b482 100644 --- a/src/bin/pg_dump/pg_backup_tar.c +++ b/src/bin/pg_dump/pg_backup_tar.c @@ -16,15 +16,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.24 2002/07/04 15:35:07 momjian Exp $ - * - * Modifications - 28-Jun-2000 - pjw@rhyme.com.au - * - * Initial version. - * - * Modifications - 04-Jan-2001 - pjw@rhyme.com.au - * - * - Check results of IO routines more carefully. + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.25 2002/08/20 17:54:44 petere Exp $ * *------------------------------------------------------------------------- */ @@ -40,12 +32,12 @@ static void _ArchiveEntry(ArchiveHandle *AH, TocEntry *te); static void _StartData(ArchiveHandle *AH, TocEntry *te); -static int _WriteData(ArchiveHandle *AH, const void *data, int dLen); +static size_t _WriteData(ArchiveHandle *AH, const void *data, size_t dLen); static void _EndData(ArchiveHandle *AH, TocEntry *te); static int _WriteByte(ArchiveHandle *AH, const int i); static int _ReadByte(ArchiveHandle *); -static int _WriteBuf(ArchiveHandle *AH, const void *buf, int len); -static int _ReadBuf(ArchiveHandle *AH, void *buf, int len); +static size_t _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len); +static size_t _ReadBuf(ArchiveHandle *AH, void *buf, size_t len); static void _CloseArchive(ArchiveHandle *AH); static void _PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt); static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te); @@ -76,19 +68,19 @@ typedef struct FILE *tmpFH; char *targetFile; char mode; - int pos; - int fileLen; + off_t pos; + off_t fileLen; ArchiveHandle *AH; } TAR_MEMBER; typedef struct { int hasSeek; - int filePos; + off_t filePos; TAR_MEMBER *blobToc; FILE *tarFH; - int tarFHpos; - int tarNextMember; + off_t tarFHpos; + off_t tarNextMember; TAR_MEMBER *FH; int isSpecialScript; TAR_MEMBER *scriptTH; @@ -108,20 +100,20 @@ static TAR_MEMBER *tarOpen(ArchiveHandle *AH, const char *filename, char mode); static void tarClose(ArchiveHandle *AH, TAR_MEMBER *TH); #ifdef __NOT_USED__ -static char *tarGets(char *buf, int len, TAR_MEMBER *th); +static char *tarGets(char *buf, size_t len, TAR_MEMBER *th); #endif static int tarPrintf(ArchiveHandle *AH, TAR_MEMBER *th, const char *fmt,...); static void _tarAddFile(ArchiveHandle *AH, TAR_MEMBER *th); static int _tarChecksum(char *th); static TAR_MEMBER *_tarPositionTo(ArchiveHandle *AH, const char *filename); -static int tarRead(void *buf, int len, TAR_MEMBER *th); -static int tarWrite(const void *buf, int len, TAR_MEMBER *th); +static size_t tarRead(void *buf, size_t len, TAR_MEMBER *th); +static size_t tarWrite(const void *buf, size_t len, TAR_MEMBER *th); static void _tarWriteHeader(TAR_MEMBER *th); static int _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th); -static int _tarReadRaw(ArchiveHandle *AH, void *buf, int len, TAR_MEMBER *th, FILE *fh); +static size_t _tarReadRaw(ArchiveHandle *AH, void *buf, size_t len, TAR_MEMBER *th, FILE *fh); -static int _scriptOut(ArchiveHandle *AH, const void *buf, int len); +static size_t _scriptOut(ArchiveHandle *AH, const void *buf, size_t len); /* * Initializer @@ -161,8 +153,8 @@ InitArchiveFmt_Tar(ArchiveHandle *AH) /* Initialize LO buffering */ AH->lo_buf_size = LOBBUFSIZE; AH->lo_buf = (void *)malloc(LOBBUFSIZE); - if(AH->lo_buf == NULL) - die_horribly(AH, modulename, "out of memory\n"); + if (AH->lo_buf == NULL) + die_horribly(AH, modulename, "out of memory\n"); /* * Now open the TOC file @@ -187,7 +179,7 @@ InitArchiveFmt_Tar(ArchiveHandle *AH) */ /* setvbuf(ctx->tarFH, NULL, _IONBF, 0); */ - ctx->hasSeek = (fseek(ctx->tarFH, 0, SEEK_CUR) == 0); + ctx->hasSeek = (fseeko(ctx->tarFH, 0, SEEK_CUR) == 0); if (AH->compression < 0 || AH->compression > 9) AH->compression = Z_DEFAULT_COMPRESSION; @@ -224,7 +216,7 @@ InitArchiveFmt_Tar(ArchiveHandle *AH) ctx->tarFHpos = 0; - ctx->hasSeek = (fseek(ctx->tarFH, 0, SEEK_CUR) == 0); + ctx->hasSeek = (fseeko(ctx->tarFH, 0, SEEK_CUR) == 0); /* * Forcibly unmark the header as read since we use the lookahead @@ -421,10 +413,10 @@ tarClose(ArchiveHandle *AH, TAR_MEMBER *th) #ifdef __NOT_USED__ static char * -tarGets(char *buf, int len, TAR_MEMBER *th) +tarGets(char *buf, size_t len, TAR_MEMBER *th) { char *s; - int cnt = 0; + size_t cnt = 0; char c = ' '; int eof = 0; @@ -464,13 +456,13 @@ tarGets(char *buf, int len, TAR_MEMBER *th) * Just read bytes from the archive. This is the low level read routine * that is used for ALL reads on a tar file. */ -static int -_tarReadRaw(ArchiveHandle *AH, void *buf, int len, TAR_MEMBER *th, FILE *fh) +static size_t +_tarReadRaw(ArchiveHandle *AH, void *buf, size_t len, TAR_MEMBER *th, FILE *fh) { lclContext *ctx = (lclContext *) AH->formatData; - int avail; - int used = 0; - int res = 0; + size_t avail; + size_t used = 0; + size_t res = 0; avail = AH->lookaheadLen - AH->lookaheadPos; if (avail > 0) @@ -515,10 +507,10 @@ _tarReadRaw(ArchiveHandle *AH, void *buf, int len, TAR_MEMBER *th, FILE *fh) return (res + used); } -static int -tarRead(void *buf, int len, TAR_MEMBER *th) +static size_t +tarRead(void *buf, size_t len, TAR_MEMBER *th) { - int res; + size_t res; if (th->pos + len > th->fileLen) len = th->fileLen - th->pos; @@ -533,10 +525,10 @@ tarRead(void *buf, int len, TAR_MEMBER *th) return res; } -static int -tarWrite(const void *buf, int len, TAR_MEMBER *th) +static size_t +tarWrite(const void *buf, size_t len, TAR_MEMBER *th) { - int res; + size_t res; if (th->zFH != 0) res = GZWRITE((void *) buf, 1, len, th->zFH); @@ -545,14 +537,15 @@ tarWrite(const void *buf, int len, TAR_MEMBER *th) if (res != len) die_horribly(th->AH, modulename, - "could not write to tar member (wrote %d, attempted %d)\n", res, len); + "could not write to tar member (wrote %lu, attempted %lu)\n", + (unsigned long) res, (unsigned long) len); th->pos += res; return res; } -static int -_WriteData(ArchiveHandle *AH, const void *data, int dLen) +static size_t +_WriteData(ArchiveHandle *AH, const void *data, size_t dLen) { lclTocEntry *tctx = (lclTocEntry *) AH->currToc->formatData; @@ -579,7 +572,7 @@ _PrintFileData(ArchiveHandle *AH, char *filename, RestoreOptions *ropt) { lclContext *ctx = (lclContext *) AH->formatData; char buf[4096]; - int cnt; + size_t cnt; TAR_MEMBER *th; if (!filename) @@ -607,7 +600,7 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt) lclContext *ctx = (lclContext *) AH->formatData; lclTocEntry *tctx = (lclTocEntry *) te->formatData; char *tmpCopy; - int i, + size_t i, pos1, pos2; @@ -651,8 +644,8 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt) if (pos2 >= strlen(tmpCopy)) die_horribly(AH, modulename, - "bad COPY statement - could not find \"from stdin\" in string \"%s\" starting at position %d\n", - tmpCopy, pos1); + "bad COPY statement - could not find \"from stdin\" in string \"%s\" starting at position %lu\n", + tmpCopy, (unsigned long) pos1); ahwrite(tmpCopy, 1, pos2, AH); /* 'copy "table" [with oids]' */ ahprintf(AH, " from '$$PATH$$/%s' %s", tctx->filename, &tmpCopy[pos2 + 10]); @@ -672,7 +665,7 @@ _LoadBlobs(ArchiveHandle *AH, RestoreOptions *ropt) Oid oid; lclContext *ctx = (lclContext *) AH->formatData; TAR_MEMBER *th; - int cnt; + size_t cnt; char buf[4096]; StartRestoreBlobs(AH); @@ -736,22 +729,22 @@ _ReadByte(ArchiveHandle *AH) return c; } -static int -_WriteBuf(ArchiveHandle *AH, const void *buf, int len) +static size_t +_WriteBuf(ArchiveHandle *AH, const void *buf, size_t len) { lclContext *ctx = (lclContext *) AH->formatData; - int res; + size_t res; res = tarWrite((void *) buf, len, ctx->FH); ctx->filePos += res; return res; } -static int -_ReadBuf(ArchiveHandle *AH, void *buf, int len) +static size_t +_ReadBuf(ArchiveHandle *AH, void *buf, size_t len) { lclContext *ctx = (lclContext *) AH->formatData; - int res; + size_t res; res = tarRead(buf, len, ctx->FH); ctx->filePos += res; @@ -834,8 +827,8 @@ _CloseArchive(ArchiveHandle *AH) AH->FH = NULL; } -static int -_scriptOut(ArchiveHandle *AH, const void *buf, int len) +static size_t +_scriptOut(ArchiveHandle *AH, const void *buf, size_t len) { lclContext *ctx = (lclContext *) AH->formatData; @@ -942,7 +935,7 @@ tarPrintf(ArchiveHandle *AH, TAR_MEMBER *th, const char *fmt,...) { char *p = NULL; va_list ap; - int bSize = strlen(fmt) + 256; /* Should be enough */ + size_t bSize = strlen(fmt) + 256; /* Should be enough */ int cnt = -1; /* @@ -1002,18 +995,18 @@ _tarAddFile(ArchiveHandle *AH, TAR_MEMBER *th) lclContext *ctx = (lclContext *) AH->formatData; FILE *tmp = th->tmpFH; /* Grab it for convenience */ char buf[32768]; - int cnt; - int len = 0; - int res; - int i, + size_t cnt; + off_t len = 0; + size_t res; + size_t i, pad; /* * Find file len & go back to start. */ - fseek(tmp, 0, SEEK_END); - th->fileLen = ftell(tmp); - fseek(tmp, 0, SEEK_SET); + fseeko(tmp, 0, SEEK_END); + th->fileLen = ftello(tmp); + fseeko(tmp, 0, SEEK_SET); _tarWriteHeader(th); @@ -1021,7 +1014,9 @@ _tarAddFile(ArchiveHandle *AH, TAR_MEMBER *th) { res = fwrite(&buf[0], 1, cnt, th->tarFH); if (res != cnt) - die_horribly(AH, modulename, "write error appending to tar archive (wrote %d, attempted %d)\n", res, cnt); + die_horribly(AH, modulename, + "write error appending to tar archive (wrote %lu, attempted %lu)\n", + (unsigned long) res, (unsigned long) cnt); len += res; } @@ -1029,8 +1024,8 @@ _tarAddFile(ArchiveHandle *AH, TAR_MEMBER *th) die_horribly(AH, modulename, "could not close tar member: %s\n", strerror(errno)); if (len != th->fileLen) - die_horribly(AH, modulename, "actual file length (%d) does not match expected (%d)\n", - len, th->pos); + die_horribly(AH, modulename, "actual file length (" INT64_FORMAT ") does not match expected (" INT64_FORMAT ")\n", + (int64) len, (int64) th->pos); pad = ((len + 511) & ~511) - len; for (i = 0; i < pad; i++) @@ -1050,25 +1045,24 @@ _tarPositionTo(ArchiveHandle *AH, const char *filename) TAR_MEMBER *th = calloc(1, sizeof(TAR_MEMBER)); char c; char header[512]; - int i, + size_t i, len, - blks, - id; + blks; + int id; th->AH = AH; /* Go to end of current file, if any */ if (ctx->tarFHpos != 0) { - ahlog(AH, 4, "moving from position %d (%x) to next member at file position %d (%x)\n", - ctx->tarFHpos, ctx->tarFHpos, - ctx->tarNextMember, ctx->tarNextMember); + ahlog(AH, 4, "moving from position " INT64_FORMAT " to next member at file position " INT64_FORMAT "\n", + (int64) ctx->tarFHpos, (int64) ctx->tarNextMember); while (ctx->tarFHpos < ctx->tarNextMember) _tarReadRaw(AH, &c, 1, NULL, ctx->tarFH); } - ahlog(AH, 4, "now at file position %d (%x)\n", ctx->tarFHpos, ctx->tarFHpos); + ahlog(AH, 4, "now at file position " INT64_FORMAT "\n", (int64) ctx->tarFHpos); /* We are at the start of the file. or at the next member */ @@ -1122,18 +1116,18 @@ _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th) char tag[100]; int sum, chk; - int len; - int hPos; + size_t len; + off_t hPos; int i; bool gotBlock = false; while (!gotBlock) { #if 0 - if (ftell(ctx->tarFH) != ctx->tarFHpos) + if (ftello(ctx->tarFH) != ctx->tarFHpos) die_horribly(AH, modulename, - "mismatch in actual vs. predicted file position (%d vs. %d)\n", - ftell(ctx->tarFH), ctx->tarFHpos); + "mismatch in actual vs. predicted file position (" INT64_FORMAT " vs. " INT64_FORMAT ")\n", + (int64) ftello(ctx->tarFH), (int64) ctx->tarFHpos); #endif /* Save the pos for reporting purposes */ @@ -1145,7 +1139,9 @@ _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th) return 0; if (len != 512) - die_horribly(AH, modulename, "incomplete tar header found (%d bytes)\n", len); + die_horribly(AH, modulename, + "incomplete tar header found (%lu bytes)\n", + (unsigned long) len); /* Calc checksum */ chk = _tarChecksum(&h[0]); @@ -1174,13 +1170,14 @@ _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th) sscanf(&h[124], "%12o", &len); sscanf(&h[148], "%8o", &sum); - ahlog(AH, 3, "TOC Entry %s at %d (length %d, checksum %d)\n", &tag[0], hPos, len, sum); + ahlog(AH, 3, "TOC Entry %s at " INT64_FORMAT " (length %lu, checksum %d)\n", + &tag[0], (int64) hPos, (unsigned long) len, sum); if (chk != sum) die_horribly(AH, modulename, "corrupt tar header found in %s " - "(expected %d (%o), computed %d (%o)) file position %ld (%lx)\n", - &tag[0], sum, sum, chk, chk, ftell(ctx->tarFH), ftell(ctx->tarFH)); + "(expected %d, computed %d) file position " INT64_FORMAT "\n", + &tag[0], sum, chk, (int64) ftello(ctx->tarFH)); th->targetFile = strdup(tag); th->fileLen = len; @@ -1212,7 +1209,8 @@ _tarWriteHeader(TAR_MEMBER *th) sprintf(&h[116], " 02000 "); /* File size 12 */ - sprintf(&h[124], "%10o ", th->fileLen); + /* FIXME: This goes only up to 2^30. -- What about larger files? */ + sprintf(&h[124], "%10o ", (unsigned int) th->fileLen); /* Mod Time 12 */ sprintf(&h[136], "%10o ", (int) time(NULL)); |