]> git.eshelyaron.com Git - emacs.git/commitdiff
(sys_mktemp): Complete rewrite.
authorRichard M. Stallman <rms@gnu.org>
Fri, 7 Jun 1996 23:07:00 +0000 (23:07 +0000)
committerRichard M. Stallman <rms@gnu.org>
Fri, 7 Jun 1996 23:07:00 +0000 (23:07 +0000)
src/w32.c

index 7e9f59d1ae5f0a79e8d9397a86d220884aba63b8..adda8f0ee8595d8c710de386a48241d415760a93 100644 (file)
--- a/src/w32.c
+++ b/src/w32.c
@@ -988,10 +988,54 @@ sys_mkdir (const char * path)
   return _mkdir (map_win32_filename (path, NULL));
 }
 
+/* Because of long name mapping issues, we need to implement this
+   ourselves.  Also, MSVC's _mktemp returns NULL when it can't generate
+   a unique name, instead of setting the input template to an empty
+   string.
+
+   Standard algorithm seems to be use pid or tid with a letter on the
+   front (in place of the 6 X's) and cycle through the letters to find a
+   unique name.  We extend that to allow any reasonable character as the
+   first of the 6 X's.  */
 char *
 sys_mktemp (char * template)
 {
-  return (char *) map_win32_filename ((const char *) _mktemp (template), NULL);
+  char * p;
+  int i;
+  unsigned uid = GetCurrentThreadId ();
+  static char first_char[] = "abcdefghijklmnopqrstuvwyz0123456789!%-_@#";
+
+  if (template == NULL)
+    return NULL;
+  p = template + strlen (template);
+  i = 5;
+  /* replace up to the last 5 X's with uid in decimal */
+  while (--p >= template && p[0] == 'X' && --i >= 0)
+    {
+      p[0] = '0' + uid % 10;
+      uid /= 10;
+    }
+
+  if (i < 0 && p[0] == 'X')
+    {
+      i = 0;
+      do
+       {
+         int save_errno = errno;
+         p[0] = first_char[i];
+         if (sys_access (template, 0) < 0)
+           {
+             errno = save_errno;
+             return template;
+           }
+       }
+      while (++i < sizeof (first_char));
+    }
+
+  /* Template is badly formed or else we can't generate a unique name,
+     so return empty string */
+  template[0] = 0;
+  return template;
 }
 
 int