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