Eli Zaretskii wrote: > The problem is that callers of > make-temp-file reasonably expect it to return a new name every call. > And evidently, it does that on GNU/Linux (not sure how, given that the > tempname.c code is supposed to be in glibc?). So if there's no > intention to change gen_tempname on non-glibc platforms so that it > doesn't repeat the same "random characters" upon each call, I think > Emacs should call a different function to generate "random" names of > temporary files, for consistency across platforms if not for other > reasons.
You are making incorrect assumptions or hypotheses. I am adding the unit test below. It proves that (at least) on Linux, FreeBSD 11, NetBSD 7, OpenBSD 6.0, macOS, AIX 7.1, Solaris 10, Cygwin, and native Windows, gen_tempname *does* return a new file name on each call, with a very high probability. So, gen_tempname does *not* repeat the same "random characters" upon each call. 2022-08-16 Bruno Haible <br...@clisp.org> tempname: Add tests. * tests/test-tempname.c: New file. * modules/tempname-tests: New file. =========================== tests/test-tempname.c ========================== /* Test of creating a temporary file. Copyright (C) 2022 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ /* Written by Bruno Haible <br...@clisp.org>, 2022. */ #include <config.h> #include "tempname.h" #include <string.h> #include <unistd.h> #include "macros.h" int main () { /* Verify that two consecutive calls to gen_tempname return two different file names, with a high probability. */ const char *templ18 = "gl-temp-XXXXXX.xyz"; char filename1[18 + 1]; char filename2[18 + 1]; strcpy (filename1, templ18); int fd1 = gen_tempname (filename1, strlen (".xyz"), 0, GT_FILE); ASSERT (fd1 >= 0); strcpy (filename2, templ18); int fd2 = gen_tempname (filename2, strlen (".xyz"), 0, GT_FILE); ASSERT (fd2 >= 0); /* With 6 'X' and a good pseudo-random number generator behind the scenes, the probability of getting the same file name twice in a row should be 1/62^6 < 1/10^10. */ ASSERT (strcmp (filename1, filename2) != 0); /* Clean up. */ close (fd1); close (fd2); unlink (filename1); unlink (filename2); return 0; } =========================== modules/tempname-tests ========================= Files: tests/test-tempname.c tests/macros.h Depends-on: unlink configure.ac: Makefile.am: TESTS += test-tempname check_PROGRAMS += test-tempname test_tempname_LDADD = $(LDADD) $(LIB_GETRANDOM) $(LIB_CLOCK_GETTIME) ============================================================================