diff options
author | Richard M. Stallman <rms@gnu.org> | 1996-06-07 23:07:00 +0000 |
---|---|---|
committer | Richard M. Stallman <rms@gnu.org> | 1996-06-07 23:07:00 +0000 |
commit | 9d1778b1b7b22972ac6005874db999402b1846ee (patch) | |
tree | 57b3cd042f0640802e9e9682af772732bc1da07a | |
parent | b4ec679c1eac8651d65824960831d5048321d07a (diff) | |
download | emacs-9d1778b1b7b22972ac6005874db999402b1846ee.tar.gz |
(sys_mktemp): Complete rewrite.
-rw-r--r-- | src/w32.c | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/src/w32.c b/src/w32.c index 7e9f59d1ae5..adda8f0ee85 100644 --- 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 |