aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/pg_upgrade/file.c54
1 files changed, 13 insertions, 41 deletions
diff --git a/contrib/pg_upgrade/file.c b/contrib/pg_upgrade/file.c
index 93ffd7b798b..b5d78a57deb 100644
--- a/contrib/pg_upgrade/file.c
+++ b/contrib/pg_upgrade/file.c
@@ -133,6 +133,8 @@ copy_file(const char *srcfile, const char *dstfile, bool force)
int src_fd;
int dest_fd;
char *buffer;
+ int ret = 0;
+ int save_errno = 0;
if ((srcfile == NULL) || (dstfile == NULL))
return -1;
@@ -150,17 +152,6 @@ copy_file(const char *srcfile, const char *dstfile, bool force)
buffer = (char *) pg_malloc(COPY_BUF_SIZE);
- if (buffer == NULL)
- {
- if (src_fd != 0)
- close(src_fd);
-
- if (dest_fd != 0)
- close(dest_fd);
-
- return -1;
- }
-
/* perform data copying i.e read src source, write to destination */
while (true)
{
@@ -168,19 +159,9 @@ copy_file(const char *srcfile, const char *dstfile, bool force)
if (nbytes < 0)
{
- int save_errno = errno;
-
- if (buffer != NULL)
- pg_free(buffer);
-
- if (src_fd != 0)
- close(src_fd);
-
- if (dest_fd != 0)
- close(dest_fd);
-
- errno = save_errno;
- return -1;
+ save_errno = errno;
+ ret = -1;
+ break;
}
if (nbytes == 0)
@@ -190,25 +171,13 @@ copy_file(const char *srcfile, const char *dstfile, bool force)
if (write(dest_fd, buffer, nbytes) != nbytes)
{
- /* if write didn't set errno, assume problem is no disk space */
- int save_errno = errno ? errno : ENOSPC;
-
- if (buffer != NULL)
- pg_free(buffer);
-
- if (src_fd != 0)
- close(src_fd);
-
- if (dest_fd != 0)
- close(dest_fd);
-
- errno = save_errno;
- return -1;
+ save_errno = errno;
+ ret = -1;
+ break;
}
}
- if (buffer != NULL)
- pg_free(buffer);
+ pg_free(buffer);
if (src_fd != 0)
close(src_fd);
@@ -216,7 +185,10 @@ copy_file(const char *srcfile, const char *dstfile, bool force)
if (dest_fd != 0)
close(dest_fd);
- return 1;
+ if (save_errno != 0)
+ errno = save_errno;
+
+ return ret;
}
#endif