In pg_upgrade, simplify function copy_file() by using pg_malloc() and
centralizing error/shutdown code.
This commit is contained in:
parent
16e1ae77f9
commit
6b711cf37c
@ -133,6 +133,8 @@ copy_file(const char *srcfile, const char *dstfile, bool force)
|
|||||||
int src_fd;
|
int src_fd;
|
||||||
int dest_fd;
|
int dest_fd;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
|
int ret = 0;
|
||||||
|
int save_errno = 0;
|
||||||
|
|
||||||
if ((srcfile == NULL) || (dstfile == NULL))
|
if ((srcfile == NULL) || (dstfile == NULL))
|
||||||
return -1;
|
return -1;
|
||||||
@ -150,17 +152,6 @@ copy_file(const char *srcfile, const char *dstfile, bool force)
|
|||||||
|
|
||||||
buffer = (char *) pg_malloc(COPY_BUF_SIZE);
|
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 */
|
/* perform data copying i.e read src source, write to destination */
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
@ -168,19 +159,9 @@ copy_file(const char *srcfile, const char *dstfile, bool force)
|
|||||||
|
|
||||||
if (nbytes < 0)
|
if (nbytes < 0)
|
||||||
{
|
{
|
||||||
int save_errno = errno;
|
save_errno = errno;
|
||||||
|
ret = -1;
|
||||||
if (buffer != NULL)
|
break;
|
||||||
pg_free(buffer);
|
|
||||||
|
|
||||||
if (src_fd != 0)
|
|
||||||
close(src_fd);
|
|
||||||
|
|
||||||
if (dest_fd != 0)
|
|
||||||
close(dest_fd);
|
|
||||||
|
|
||||||
errno = save_errno;
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nbytes == 0)
|
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(dest_fd, buffer, nbytes) != nbytes)
|
||||||
{
|
{
|
||||||
/* if write didn't set errno, assume problem is no disk space */
|
save_errno = errno;
|
||||||
int save_errno = errno ? errno : ENOSPC;
|
ret = -1;
|
||||||
|
break;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buffer != NULL)
|
pg_free(buffer);
|
||||||
pg_free(buffer);
|
|
||||||
|
|
||||||
if (src_fd != 0)
|
if (src_fd != 0)
|
||||||
close(src_fd);
|
close(src_fd);
|
||||||
@ -216,7 +185,10 @@ copy_file(const char *srcfile, const char *dstfile, bool force)
|
|||||||
if (dest_fd != 0)
|
if (dest_fd != 0)
|
||||||
close(dest_fd);
|
close(dest_fd);
|
||||||
|
|
||||||
return 1;
|
if (save_errno != 0)
|
||||||
|
errno = save_errno;
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user