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>
6 b855148c 2004-05-16 devnull #define nil ((void*)0)
9 b855148c 2004-05-16 devnull mkfname(char *tmpdir, char *prefix)
12 b855148c 2004-05-16 devnull char *p, *fname;
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";
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");
31 b855148c 2004-05-16 devnull return fname;
34 e8fb1d3e 2004-05-17 devnull extern int mkstemp(char*);
37 b855148c 2004-05-16 devnull safe_tempnam(char *tmpdir, char *prefix)
40 b855148c 2004-05-16 devnull char *fname;
42 b855148c 2004-05-16 devnull if((fname = mkfname(tmpdir, prefix)) == nil)
43 b855148c 2004-05-16 devnull return nil;
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;
49 b855148c 2004-05-16 devnull return fname;
53 b855148c 2004-05-16 devnull safe_tmpnam(char *fname)
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);
61 b855148c 2004-05-16 devnull return mkstemp(fname);