> >> 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
Index: bin/pg_dump/pg_backup_tar.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/bin/pg_dump/pg_backup_tar.c,v retrieving revision 1.50 diff -c -r1.50 pg_backup_tar.c *** bin/pg_dump/pg_backup_tar.c 12 Feb 2006 06:11:50 -0000 1.50 --- bin/pg_dump/pg_backup_tar.c 21 Apr 2006 09:22:00 -0000 *************** *** 362,368 **** --- 362,388 ---- { 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 to write to. */ + while (1) + { + char *tmpname; + int fd; + + tmpname = _tempnam(NULL, "pg_temp_"); + if (tmpname == NULL) + break; + fd = _open(tmpname, _O_RDWR | _O_CREAT | _O_EXCL | _O_BINARY | _O_TEMPORARY, _S_IREAD | _S_IWRITE); + free(tmpname); + if (fd == -1 && errno == EEXIST) + continue; /* Try again with a new name if file exists */ + if (fd != -1) + tm->tmpFH = _fdopen(fd, "w+b"); + break; + } + #endif if (tm->tmpFH == NULL) die_horribly(AH, modulename, "could not generate temporary file name: %s\n", strerror(errno));
---------------------------(end of broadcast)--------------------------- TIP 2: Don't 'kill -9' the postmaster