Modified patch attached and applied to HEAD and 8.1.X. I restructured the loop exit, and used the symbols without the leading underscores. I didn't see any Win32 underscore symbol usage in our existing code.
Thanks. ------------------------------------------------------------------------- Zeugswetter Andreas DCP SD wrote: > > > >> Apparently it won't work at all if TMP isn't set? > > > > > I'm not *too* concerned about that, since TMP is normally set by the > OS > > > itself. There's one set in the "system environment" (to > c:\windows\temp > > > or whatrever) and then it's overridden by one set by the OS when it > > > loads a user profile. > > > > OK, then maybe not having it would be equivalent to /tmp-not-writable > > on Unix, ie, admin error. > > > > > Also to the point, what would you fall back to? > > > > Current directory maybe? > > It tries \ (tested on Win 2000), if the dir argument is NULL and TMP is > not set. > But TMP is usually set. > > Attached is a working version not yet adapted to port/. > - memoryleak fixed > - use _tmpname and _fdopen not the compatibility tmpname and fdopen > (imho only cosmetic) > - EACCES fixed (Win2000 needs _S_IREAD | _S_IWRITE or fails with EACCES, > even as Admin) > - I suggest adding a prefix pg_temp_ (for leftover temp files after > crash, > the name I get is then usually pg_temp_2) > > Andreas Content-Description: pg_dump_tempfile.patch.txt [ Attachment, skipping... ] > > ---------------------------(end of broadcast)--------------------------- > TIP 2: Don't 'kill -9' the postmaster -- Bruce Momjian [EMAIL PROTECTED] EnterpriseDB http://www.enterprisedb.com + If your life is a hard drive, Christ can be your backup. +
Index: src/bin/pg_dump/pg_backup_tar.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_tar.c,v retrieving revision 1.52 diff -c -c -r1.52 pg_backup_tar.c *** src/bin/pg_dump/pg_backup_tar.c 7 Jun 2006 22:24:44 -0000 1.52 --- src/bin/pg_dump/pg_backup_tar.c 27 Jun 2006 00:32:06 -0000 *************** *** 359,365 **** --- 359,393 ---- { 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));
---------------------------(end of broadcast)--------------------------- TIP 4: Have you searched our list archives? http://archives.postgresql.org