blob: b6b5fd1fe455b14e4f711a772037bcf66d804431 [file] [log] [blame]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define nil ((void*)0)
char*
mkfname(char *tmpdir, char *prefix)
{
int n;
char *p, *fname;
if((p = getenv("TMPDIR")) != nil)
goto Mktemp;
if((p = tmpdir) != nil)
goto Mktemp;
p = "/tmp";
Mktemp:
n = strlen(p)+1+strlen(prefix)+1+8+1;
if((fname = malloc(n)) == nil)
return nil;
memset(fname, 0, n);
strcat(fname, p);
if((n = strlen(p)) > 0 && p[n-1] != '/')
strcat(fname, "/");
strcat(fname, prefix);
strcat(fname, ".XXXXXXXX");
return fname;
}
extern int mkstemp(char*);
char*
safe_tempnam(char *tmpdir, char *prefix)
{
int fd;
char *fname;
if((fname = mkfname(tmpdir, prefix)) == nil)
return nil;
if((fd = mkstemp(fname)) < 0){ /* XXX: leak fd, fname */
free(fname);
return nil;
}
return fname;
}
int
safe_tmpnam(char *fname)
{
char *p;
if((p = mkfname(nil, "tmpfile")) == nil)
return -1;
strcpy(fname, p);
free(p);
return mkstemp(fname);
}