Blob


1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
6 #define nil ((void*)0)
8 char*
9 mkfname(char *tmpdir, char *prefix)
10 {
11 int n;
12 char *p, *fname;
14 if((p = getenv("TMPDIR")) != nil)
15 goto Mktemp;
16 if((p = tmpdir) != nil)
17 goto Mktemp;
18 p = "/tmp";
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");
31 return fname;
32 }
34 extern int mkstemp(char*);
36 char*
37 safe_tempnam(char *tmpdir, char *prefix)
38 {
39 int fd;
40 char *fname;
42 if((fname = mkfname(tmpdir, prefix)) == nil)
43 return nil;
45 if((fd = mkstemp(fname)) < 0){ /* XXX: leak fd, fname */
46 free(fname);
47 return nil;
48 }
49 return fname;
50 }
52 int
53 safe_tmpnam(char *fname)
54 {
55 char *p;
57 if((p = mkfname(nil, "tmpfile")) == nil)
58 return -1;
59 strcpy(fname, p);
60 free(p);
61 return mkstemp(fname);
62 }