summaryrefslogtreecommitdiff
path: root/src/bin/pg_dump/compress_io.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/pg_dump/compress_io.c')
-rw-r--r--src/bin/pg_dump/compress_io.c38
1 files changed, 29 insertions, 9 deletions
diff --git a/src/bin/pg_dump/compress_io.c b/src/bin/pg_dump/compress_io.c
index 8540a75d113..c6652727a75 100644
--- a/src/bin/pg_dump/compress_io.c
+++ b/src/bin/pg_dump/compress_io.c
@@ -467,6 +467,16 @@ struct cfp
static int hasSuffix(const char *filename, const char *suffix);
#endif
+/* free() without changing errno; useful in several places below */
+static void
+free_keep_errno(void *p)
+{
+ int save_errno = errno;
+
+ free(p);
+ errno = save_errno;
+}
+
/*
* Open a file for reading. 'path' is the file to open, and 'mode' should
* be either "r" or "rb".
@@ -474,6 +484,8 @@ static int hasSuffix(const char *filename, const char *suffix);
* If the file at 'path' does not exist, we append the ".gz" suffix (if 'path'
* doesn't already have it) and try again. So if you pass "foo" as 'path',
* this will open either "foo" or "foo.gz".
+ *
+ * On failure, return NULL with an error code in errno.
*/
cfp *
cfopen_read(const char *path, const char *mode)
@@ -498,7 +510,7 @@ cfopen_read(const char *path, const char *mode)
snprintf(fname, fnamelen, "%s%s", path, ".gz");
fp = cfopen(fname, mode, 1);
- free(fname);
+ free_keep_errno(fname);
}
#endif
}
@@ -511,8 +523,10 @@ cfopen_read(const char *path, const char *mode)
* ("w", "wb", "a", or "ab").
*
* If 'compression' is non-zero, a gzip compressed stream is opened, and
- * and 'compression' indicates the compression level used. The ".gz" suffix
+ * 'compression' indicates the compression level used. The ".gz" suffix
* is automatically added to 'path' in that case.
+ *
+ * On failure, return NULL with an error code in errno.
*/
cfp *
cfopen_write(const char *path, const char *mode, int compression)
@@ -531,8 +545,8 @@ cfopen_write(const char *path, const char *mode, int compression)
die_horribly(NULL, modulename, "Out of memory\n");
snprintf(fname, fnamelen, "%s%s", path, ".gz");
- fp = cfopen(fname, mode, 1);
- free(fname);
+ fp = cfopen(fname, mode, compression);
+ free_keep_errno(fname);
#else
die_horribly(NULL, modulename, "not built with zlib support\n");
fp = NULL; /* keep compiler quiet */
@@ -543,7 +557,9 @@ cfopen_write(const char *path, const char *mode, int compression)
/*
* Opens file 'path' in 'mode'. If 'compression' is non-zero, the file
- * is opened with libz gzopen(), otherwise with plain fopen()
+ * is opened with libz gzopen(), otherwise with plain fopen().
+ *
+ * On failure, return NULL with an error code in errno.
*/
cfp *
cfopen(const char *path, const char *mode, int compression)
@@ -556,11 +572,15 @@ cfopen(const char *path, const char *mode, int compression)
if (compression != 0)
{
#ifdef HAVE_LIBZ
- fp->compressedfp = gzopen(path, mode);
+ char mode_compression[32];
+
+ snprintf(mode_compression, sizeof(mode_compression), "%s%d",
+ mode, compression);
+ fp->compressedfp = gzopen(path, mode_compression);
fp->uncompressedfp = NULL;
if (fp->compressedfp == NULL)
{
- free(fp);
+ free_keep_errno(fp);
fp = NULL;
}
#else
@@ -575,7 +595,7 @@ cfopen(const char *path, const char *mode, int compression)
fp->uncompressedfp = fopen(path, mode);
if (fp->uncompressedfp == NULL)
{
- free(fp);
+ free_keep_errno(fp);
fp = NULL;
}
}
@@ -650,7 +670,7 @@ cfclose(cfp *fp)
result = fclose(fp->uncompressedfp);
fp->uncompressedfp = NULL;
}
- free(fp);
+ free_keep_errno(fp);
return result;
}