62 lines · 973 B · C
RawDownload
#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;} intsafe_tmpnam(char *fname){	char *p; 	if((p = mkfname(nil, "tmpfile")) == nil)		return -1;	strcpy(fname, p);	free(p);	return mkstemp(fname);}