#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define max(A,B) (((A)<(B))?(B):(A))
extern
char
*mktemp();
extern
int
access();
static
char
*cpdir();
static
char
seed[4]=
"AAA"
;
#ifndef P_tmpdir
static
char
*P_tmpdir =
"/tmp"
;
#endif
char
*
tempnam(dir, prefix)
char
*dir;
char
*prefix;
{
register
char
*p, *q, *tmpdir;
int
tl=0, dl=0, pl;
pl =
strlen
(P_tmpdir);
if
( (tmpdir =
getenv
(
"TMPDIR"
)) != NULL ) tl =
strlen
(tmpdir);
if
( dir != NULL ) dl =
strlen
(dir);
if
( (p =
malloc
((unsigned)(max(max(dl,tl),pl)+16))) == NULL )
return
(NULL);
*p =
'\0'
;
if
( (tl == 0) || (access( cpdir(p, tmpdir), 3) != 0) )
if
( (dl == 0) || (access( cpdir(p, dir), 3) != 0) )
if
( access( cpdir(p, P_tmpdir), 3) != 0 )
if
( access( cpdir(p,
"/tmp"
), 3) != 0 )
return
(NULL);
(
void
)
strcat
(p,
"/"
);
if
(prefix)
{
*(p+
strlen
(p)+5) =
'\0'
;
(
void
)
strncat
(p, prefix, 5);
}
(
void
)
strcat
(p, seed);
(
void
)
strcat
(p,
"XXXXXX"
);
q = seed;
while
(*q ==
'Z'
) *q++ =
'A'
;
++*q;
if
(*mktemp(p) ==
'\0'
)
return
(NULL);
return
(p);
}
static
char
*
cpdir(buf, str)
char
*buf;
char
*str;
{
char
*p;
if
(str != NULL)
{
(
void
)
strcpy
(buf, str);
p = buf - 1 +
strlen
(buf);
if
(*p ==
'/'
) *p =
'\0'
;
}
return
(buf);
}