/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 1993 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984 AT&T */
/* All Rights Reserved */
#pragma ident "%Z%%M% %I% %E% SMI" /* from S5R2 1.1 */
/*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[4];
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);
}