提交 fe491fb9 编写于 作者: B Bruce Momjian

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.
上级 560feb47
......@@ -16,7 +16,7 @@
*
*
* 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)
{
tm = calloc(1, sizeof(TAR_MEMBER));
#ifndef WIN32
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)
die_horribly(AH, modulename, "could not generate temporary file name: %s\n", strerror(errno));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册