Blame


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