> >> 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

Reply via email to