/* * 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 #include #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); }