Re: [HACKERS] pg_dump -Ft failed on Windows XP - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: [HACKERS] pg_dump -Ft failed on Windows XP
Date
Msg-id 200606270118.k5R1IiW02062@momjian.us
Whole thread Raw
List pgsql-patches
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   bruce@momjian.us
  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));

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: LDAP lookup of connection parameters
Next
From: Tom Lane
Date:
Subject: Re: [HACKERS] PQescapeIdentifier