Skip to content
Snippets Groups Projects
Commit fe491fb9 authored by Bruce Momjian's avatar Bruce Momjian
Browse files

On Win32, use loop to create pg_dump temporary tar file in the current

directory, not in device root, for permission reasons.

Backpatch to 8.1.X.
parent 560feb47
No related branches found
No related tags found
No related merge requests found
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.52 2006/06/07 22:24:44 momjian Exp $ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.53 2006/06/27 01:16:58 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -359,7 +359,35 @@ tarOpen(ArchiveHandle *AH, const char *filename, char mode) ...@@ -359,7 +359,35 @@ tarOpen(ArchiveHandle *AH, const char *filename, char mode)
{ {
tm = calloc(1, sizeof(TAR_MEMBER)); tm = calloc(1, sizeof(TAR_MEMBER));
#ifndef WIN32
tm->tmpFH = tmpfile(); tm->tmpFH = tmpfile();
#else
/*
* On WIN32, tmpfile() generates a filename in the root directory,
* which requires administrative permissions on certain systems.
* Loop until we find a unique file name we can create.
*/
while (1)
{
char *name;
int fd;
name = _tempnam(NULL, "pg_temp_");
if (name == NULL)
break;
fd = open(name, O_RDWR | O_CREAT | O_EXCL | O_BINARY |
O_TEMPORARY, S_IREAD | S_IWRITE);
free(name);
if (fd != -1) /* created a file */
{
tm->tmpFH = fdopen(fd, "w+b");
break;
}
else if (errno != EEXIST) /* failure other than file exists */
break;
}
#endif
if (tm->tmpFH == NULL) if (tm->tmpFH == NULL)
die_horribly(AH, modulename, "could not generate temporary file name: %s\n", strerror(errno)); die_horribly(AH, modulename, "could not generate temporary file name: %s\n", strerror(errno));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment