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