]> granicus.if.org Git - postgresql/commitdiff
In pg_upgrade, simplify function copy_file() by using pg_malloc() and
authorBruce Momjian <bruce@momjian.us>
Sun, 25 Nov 2012 03:39:03 +0000 (22:39 -0500)
committerBruce Momjian <bruce@momjian.us>
Sun, 25 Nov 2012 03:39:03 +0000 (22:39 -0500)
centralizing error/shutdown code.

contrib/pg_upgrade/file.c

index 93ffd7b798ba07278870a192ee1242f66345d51c..b5d78a57debdc8e05c3e6b38034f9cdefe3729a2 100644 (file)
@@ -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