Dear Maurizio,
i count current 77 occurrences of ns_tmpnam in OpenACS and its packages. These places will have the same problem, so the fix is not sufficient in the general case. Since ns_tmpnam is implemented in C, it is most probably the best solution to address the problem in the aolserver implementation. Again, as i do not have a WIN32 environment, please test the following replacement of NsTclTmpNamObjCmd() in aolserver/nsd/tclfile.c. With this fix, set tmpnam [ns_tmpnam]
should be ok again.
best
-gustaf neumann
int
NsTclTmpNamObjCmd(ClientData arg, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
{
#ifdef WIN32
/*
The WIN32 implmentation of tmpnam() ignores the environment
variable TMP and generates filenames for the root
directory. Unfortunately, new WIN versions (Vista) don't allow
this. The suggested replacement is _tempnam().
The first argument of _tempnam() is the default directory, in case
the environment variable TMP is not set or points to a directory
that does not exist.
*/
char *buf = _tempnam("/tmp", NULL);
if (buf == NULL) {
Tcl_SetResult(interp, "could not generate temporary filename.", TCL_STATIC);
return TCL_ERROR;
}
/*
The documentation says that _tempnam() allocates memory via
malloc(); to be sure, that the "right" free() is used, we do
not use TCL_DYNAMIC but the TCL_VOLATILE followed by the manual
free().
*/
Tcl_SetResult(interp, buf, TCL_VOLATILE);
free(buf);
#else
char buf[L_tmpnam];
if (tmpnam(buf) == NULL) {
Tcl_SetResult(interp, "could not generate temporary filename.", TCL_STATIC);
return TCL_ERROR;
}
Tcl_SetResult(interp, buf, TCL_VOLATILE);
#endif
return TCL_OK;
}