Sam Steingold wrote: > > strerror and perror now depend on strerror_r ... > > I do _not_ want strerror_r.
Actually you do want strerror_r in clisp, not strerror. There are two kinds of uses of strerror() in clisp: 1) In code that ends up in lisp.run (e.g. errunix.d). This executable has the option to use multiple threads. Therefore strerror_r should be used instead of strerror(), because - as Eric explained - when you call strerror(EACCES) in one thread and strerror(ENOENT) in another thread at nearly the same time, by the time you retrieve the error message in the first thread, it might read "Permissionle or directory". YES, even for fixed error messages, strerror() uses a static buffer in the majority of OSes (at least on NetBSD, HP-UX, native Win32, Cygwin). 2) In the launcher program _clisp.c, the use of strerror() is misplaced: if (!CloseHandle(pinfo.hProcess)) goto w32err; if (com_initialized) CoUninitialize(); return exitcode; w32err: fprintf(stderr,"%s:\n * %s\n * %s\n * [%s]\n = %s\n",program_name, executable,resolved,command_line,strerror(GetLastError())); On native Windows, there are two distinct enumerations of error codes: - the Win32 one, to be retrieved via GetLastError() and to be formatted via FormatMessage. - the ANSI C one, to be retrieved via 'errno' and to be formatted via 'strerror' (which makes a lookup in _sys_errlist, *not* a call to FormatMessage). So you really need to use FormatMessage here, not strerror(). Bruno -- In memoriam Georges Darboy <http://en.wikipedia.org/wiki/Georges_Darboy>