tempnam.c (973B)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <unistd.h> 5 6 #define nil ((void*)0) 7 8 char* 9 mkfname(char *tmpdir, char *prefix) 10 { 11 int n; 12 char *p, *fname; 13 14 if((p = getenv("TMPDIR")) != nil) 15 goto Mktemp; 16 if((p = tmpdir) != nil) 17 goto Mktemp; 18 p = "/tmp"; 19 20 Mktemp: 21 n = strlen(p)+1+strlen(prefix)+1+8+1; 22 if((fname = malloc(n)) == nil) 23 return nil; 24 memset(fname, 0, n); 25 strcat(fname, p); 26 if((n = strlen(p)) > 0 && p[n-1] != '/') 27 strcat(fname, "/"); 28 strcat(fname, prefix); 29 strcat(fname, ".XXXXXXXX"); 30 31 return fname; 32 } 33 34 extern int mkstemp(char*); 35 36 char* 37 safe_tempnam(char *tmpdir, char *prefix) 38 { 39 int fd; 40 char *fname; 41 42 if((fname = mkfname(tmpdir, prefix)) == nil) 43 return nil; 44 45 if((fd = mkstemp(fname)) < 0){ /* XXX: leak fd, fname */ 46 free(fname); 47 return nil; 48 } 49 return fname; 50 } 51 52 int 53 safe_tmpnam(char *fname) 54 { 55 char *p; 56 57 if((p = mkfname(nil, "tmpfile")) == nil) 58 return -1; 59 strcpy(fname, p); 60 free(p); 61 return mkstemp(fname); 62 }