From b855148c9b6d28fedfd083d037bcf246f1913d92 Mon Sep 17 00:00:00 2001 From: wkj Date: Sun, 16 May 2004 07:54:22 +0000 Subject: Checkpoint. --- src/cmd/postscript/common/tempnam.c | 83 ++++++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 24 deletions(-) (limited to 'src/cmd/postscript/common/tempnam.c') diff --git a/src/cmd/postscript/common/tempnam.c b/src/cmd/postscript/common/tempnam.c index 529025ed..a759876e 100644 --- a/src/cmd/postscript/common/tempnam.c +++ b/src/cmd/postscript/common/tempnam.c @@ -1,27 +1,62 @@ #include -#include - -#if defined(V9) || defined(BSD4_2) || defined(plan9) -char *tempnam(char *dir, char *pfx) { - int pid; - unsigned int len; - char *tnm, *malloc(); - static int seq = 0; - - pid = getpid(); - len = strlen(dir) + strlen(pfx) + 10; - if ((tnm = malloc(len)) != NULL) { - sprintf(tnm, "%s", dir); - if (access(tnm, 7) == -1) - return(NULL); - do { - sprintf(tnm, "%s/%s%d%d", dir, pfx, pid, seq++); - errno = 0; - if (access(tnm, 7) == -1) - if (errno == ENOENT) - return(tnm); - } while (1); +#include +#include +#include + +#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* +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(tnm); + 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); } -#endif -- cgit v1.2.3