75 lines
1.4 KiB
C
75 lines
1.4 KiB
C
#if !defined(lint) && defined(SCCSIDS)
|
|
static char sccsid[] = "@(#)tempnam.c 1.1 92/07/30 SMI"; /* from S5R2 1.1 */
|
|
#endif
|
|
|
|
/*LINTLIBRARY*/
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#define max(A,B) (((A)<(B))?(B):(A))
|
|
|
|
extern char *malloc(), *getenv(), *mktemp();
|
|
extern int access();
|
|
|
|
static char *pcopy();
|
|
static char seed[3];
|
|
|
|
char *
|
|
tempnam(dir, pfx)
|
|
char *dir; /* use this directory please (if non-NULL) */
|
|
char *pfx; /* use this (if non-NULL) as filename prefix */
|
|
{
|
|
register char *p, *q, *tdir;
|
|
int x=0, y=0, z;
|
|
|
|
if (seed[0] == 0)
|
|
seed[0] = seed[1] = seed[2] = 'A';
|
|
z=strlen(P_tmpdir);
|
|
if((tdir = getenv("TMPDIR")) != NULL) {
|
|
x = strlen(tdir);
|
|
}
|
|
if(dir != NULL) {
|
|
y=strlen(dir);
|
|
}
|
|
if((p=malloc((unsigned)(max(max(x,y),z)+16))) == NULL)
|
|
return(NULL);
|
|
if(x > 0 && access(pcopy(p, tdir), 3) == 0)
|
|
goto OK;
|
|
if(y > 0 && access(pcopy(p, dir), 3) == 0)
|
|
goto OK;
|
|
if(access(pcopy(p, P_tmpdir), 3) == 0)
|
|
goto OK;
|
|
if(access(pcopy(p, "/tmp"), 3) != 0)
|
|
return(NULL);
|
|
OK:
|
|
(void)strcat(p, "/");
|
|
if(pfx) {
|
|
*(p+strlen(p)+5) = '\0';
|
|
(void)strncat(p, pfx, 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*
|
|
pcopy(space, arg)
|
|
char *space, *arg;
|
|
{
|
|
char *p;
|
|
|
|
if(arg) {
|
|
(void)strcpy(space, arg);
|
|
p = space-1+strlen(space);
|
|
if(*p == '/')
|
|
*p = '\0';
|
|
}
|
|
return(space);
|
|
}
|