#include "mysys_priv.h"
#include <m_string.h>
#ifdef HPUX11
#undef HAVE_TEMPNAM
#endif
#include "my_static.h"
#include "mysys_err.h"
#define TMP_EXT ".tmp"
#if ! defined(P_tmpdir)
#define P_tmpdir ""
#endif
#ifdef HAVE_TEMPNAM
#if !defined( MSDOS) && !defined(OS2) && !defined(__NETWARE__)
extern char **environ;
#endif
#endif
my_string my_tempnam(const char *dir, const char *pfx,
myf MyFlags __attribute__((unused)))
{
#ifdef _MSC_VER
char temp[FN_REFLEN],*end,*res,**old_env,*temp_env[1];
old_env=environ;
if (dir)
{
end=strend(dir)-1;
if (!dir[0])
{
temp[0]= FN_CURLIB;
temp[1]= 0;
dir=temp;
}
else if (*end == FN_DEVCHAR)
{
_fullpath(temp,dir,FN_REFLEN);
dir=temp;
}
else if (*end == FN_LIBCHAR && dir < end && end[-1] != FN_DEVCHAR)
{
strmake(temp,dir,(uint) (end-dir));
dir=temp;
}
environ=temp_env;
temp_env[0]=0;
}
res=tempnam((char*) dir,(my_string) pfx);
environ=old_env;
return res;
#else
#ifdef __ZTC__
if (!dir)
{
dir=getenv("TMP");
}
return tempnam((char*) dir,(my_string) pfx);
#else
#ifdef HAVE_TEMPNAM
char temp[2],*res,**old_env,*temp_env[1];
if (dir && !dir[0])
{
temp[0]= FN_CURLIB;
temp[1]= 0;
dir=temp;
}
#ifdef OS2
char buffer[256];
sprintf( buffer, "TMP=%s", dir);
if (buffer[strlen(buffer)-1] == '\\')
buffer[strlen(buffer)-1] = '\0';
putenv( buffer);
#elif !defined(__NETWARE__)
old_env=(char**)environ;
if (dir)
{
(*(char***) &environ)=(char**) temp_env;
temp_env[0]=0;
}
#endif
res=tempnam((char*) dir,(my_string) pfx);
#if !defined(OS2) && !defined(__NETWARE__)
(*(char***) &environ)=(char**) old_env;
#endif
if (!res)
DBUG_PRINT("error",("Got error: %d from tempnam",errno));
return res;
#else
register long uniq;
register int length;
my_string pos,end_pos;
DBUG_ENTER("my_tempnam");
pthread_mutex_lock(&THR_LOCK_open);
uniq= ((long) getpid() << 20) + (long) _my_tempnam_used++ ;
pthread_mutex_unlock(&THR_LOCK_open);
if (!dir && !(dir=getenv("TMPDIR")))
dir=P_tmpdir;
length=strlen(dir)+strlen(pfx)+1;
DBUG_PRINT("test",("mallocing %d byte",length+8+sizeof(TMP_EXT)+1));
if (!(pos=(char*) malloc(length+8+sizeof(TMP_EXT)+1)))
{
if (MyFlags & MY_FAE+MY_WME)
my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG),
length+8+sizeof(TMP_EXT)+1);
DBUG_RETURN(NullS);
}
end_pos=strmov(pos,dir);
if (end_pos != pos && end_pos[-1] != FN_LIBCHAR)
*end_pos++=FN_LIBCHAR;
end_pos=strmov(end_pos,pfx);
for (length=0 ; length < 8 && uniq ; length++)
{
*end_pos++= _dig_vec[(int) (uniq & 31)];
uniq >>= 5;
}
VOID(strmov(end_pos,TMP_EXT));
DBUG_PRINT("exit",("tempnam: '%s'",pos));
DBUG_RETURN(pos);
#endif
#endif
#endif
}