Comment #0 by verylonglogin.reg — 2012-02-18T00:42:44Z
---
import std.stdio;
void main() {
File.tmpfile();
}
---
dmd 2.058 compiled version running from non-administrator fails with: std.exception.ErrnoException Could not create temporary file with tmpfile() (Permission denied) at std\stdio.d(875)
Comment #1 by dlang-bugzilla — 2012-04-05T19:23:30Z
File.tmpfile is just a simple wrapper around core.stdc.stdio.tmpfile, so the issue is with the DMC's C standard library.
Comment #2 by lovelydear — 2012-04-19T09:01:44Z
This is not a bug. It works as intended. Should close.
Comment #3 by dlang-bugzilla — 2012-04-19T09:03:04Z
What?? How is this not a bug?
Comment #4 by lovelydear — 2012-04-19T09:09:13Z
(In reply to comment #3)
> What?? How is this not a bug?
The OS prevents to create the file, so tmpfile() throws an exception. I don't see how this can be considered a bug.
Comment #5 by dlang-bugzilla — 2012-04-19T09:10:28Z
The filename is chosen by the C runtime, not the operating system. It is a bug in the DigitalMars C runtime. It probably tries to use the hard-coded %WINDIR%\Temp directory, instead of the user profile directory or %TEMP%.
Comment #6 by lovelydear — 2012-04-19T09:19:52Z
Oh, I just saw the author of the issue. It's not "random Denis".
Anyway, has a bug report been done in DMC C bugzilla ?
Else this one will stay open forever, I'm affraid.
Comment #7 by bugzilla — 2012-04-19T11:23:55Z
(In reply to comment #5)
> The filename is chosen by the C runtime, not the operating system. It is a bug
> in the DigitalMars C runtime. It probably tries to use the hard-coded
> %WINDIR%\Temp directory, instead of the user profile directory or %TEMP%.
Actually, it uses stdio.h's _P_tmpdir, which on Windows is "\\". Did I say that implementation is rather old? I also noticed that Windows 7 does not allow writing to the root directory. XP allowed it.
Comment #8 by dlang-bugzilla — 2012-04-19T11:32:02Z
I have it fixed in snn.lib now. You can pick it up here:
ftp://ftp.digitalmars.com/dmc.zip
Comment #10 by dlang-bugzilla — 2014-01-28T01:52:42Z
(In reply to comment #3)
> What?? How is this not a bug?
I may have been wrong here. The problem is not present on Win32, but on Win64 the MS runtime does what the DMC runtime used to do - attempt to create the file in the drive root. And it's not a bug, it's working according to the documentation:
> The tmpfile function creates a temporary file and returns a pointer to that
> stream. The temporary file is created in the root directory. To create a
> temporary file in a directory other than the root, use tmpnam or tempnam in
> conjunction with fopen.
Conclusion: this function is horrible and needs to be replaced with something better.
Some relevant discussion here:
https://github.com/D-Programming-Language/phobos/pull/691
Comment #11 by bugzilla — 2019-12-12T16:58:52Z
Is this still not fixed?
Comment #12 by robert.schadek — 2024-12-01T16:14:55Z