Open LukeShu opened 5 years ago
Is this still an issue? Seems as though the PRs have been merged
A workaround was merged in to godownloader, but no PR was ever submitted upstream here. client9/shlib.git#branch=master
still contains the original inconsistent behavior.
@LukeShu Can you link me to the fix in godownloader? Would love to backport a fix into shlib as well.
Nevermind - I see you tagged it, I"ll see what I can make from it.
The fix in godownloader (https://github.com/goreleaser/godownloader/pull/105) was just "don't use mktmpdir
".
In my opinion, both of the "correct implementations" I included in the issue body are "PR-worthy", but I'm not sure which behavior is desired.
See: https://github.com/goreleaser/godownloader/issues/104
TMPDIR
is a shared temporary directory (specified by POSIX); being unset should be mostly equivalent toTMPDIR=/tmp
. Many systems will setTMPDIR
to a new temporary directory on each login; I have seen this on many GNU/Linux systems, and know that it is the default behavior on macOS. Multiple programs shareTMPDIR
for the duration of that login.If a program uses more than 1 temporary file, it is likely desirable to contain them in a per-program-invocation temporary subdirectory of
TMPDIR
. In C,mkdtemp(3)
(POSIX) is helpful for this purpose; in shell, the wrapper around that,mktemp -d
(non-POSIX, but widely implemented) is helpful. The program should remember to remove that subdirectory before it exits.mktmpdir
has wildly different behavior whenTMPDIR
is set compared to when it's not set:TMPDIR
is not already set: it is necessary to clean up the returned directory when the program is done; it has created a new temporary directory that would otherwise be leaked.TMPDIR
is already set: it is impermissible to clean up the returned directory when the program is done; it returns the shared temporary directory, other programs may be using it, the user may not have permission to remove it.I believe the intent of the
mktmpdir
author was thatTMPDIR
be a private "static" variable to makemktmpdir
return the same value if you call it multiple times (let us call this property "idempotence". However, that use conflicts with the use ofTMPDIR
as specified by POSIX. Maybe it was just sloppy thinking.Besides idempotency,
mktmpdir
also has the property that it handlesTMPDIR
being set to a directory that does not exist; a scenario thatmktemp -d
does not handle.A correct implementation would look like:
If idempotency is not a desired property:
If idempotency is a desired property: