Files
Arquivotheca.SunOS-4.1.3/lib/libc/stdio/common/tempnam.c
seta75D 2e8a93c394 Init
2021-10-11 18:20:23 -03:00

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);
}