]> git.saurik.com Git - apple/libc.git/blob - stdio/FreeBSD/tempnam.c.patch
Libc-594.1.4.tar.gz
[apple/libc.git] / stdio / FreeBSD / tempnam.c.patch
1 --- tempnam.c.orig 2008-11-12 17:08:45.000000000 -0800
2 +++ tempnam.c 2008-11-12 17:41:23.000000000 -0800
3 @@ -57,35 +57,68 @@ tempnam(dir, pfx)
4 int sverrno;
5 char *f, *name;
6
7 - if (!(name = malloc(MAXPATHLEN)))
8 + if (!(name = malloc(MAXPATHLEN))) {
9 return(NULL);
10 + }
11
12 if (!pfx)
13 pfx = "tmp.";
14
15 +#if !__DARWIN_UNIX03
16 if (issetugid() == 0 && (f = getenv("TMPDIR"))) {
17 (void)snprintf(name, MAXPATHLEN, "%s%s%sXXXXXX", f,
18 *(f + strlen(f) - 1) == '/'? "": "/", pfx);
19 - if ((f = _mktemp(name)))
20 + if ((f = _mktemp(name))) {
21 return(f);
22 + }
23 }
24 -
25 +#endif /* !__DARWIN_UNIX03 */
26 if ((f = (char *)dir)) {
27 +#if __DARWIN_UNIX03
28 + if (access(dir, W_OK) == 0) {
29 +#endif /* __DARWIN_UNIX03 */
30 (void)snprintf(name, MAXPATHLEN, "%s%s%sXXXXXX", f,
31 *(f + strlen(f) - 1) == '/'? "": "/", pfx);
32 - if ((f = _mktemp(name)))
33 + if ((f = _mktemp(name))) {
34 return(f);
35 + }
36 +#if __DARWIN_UNIX03
37 + }
38 +#endif /* __DARWIN_UNIX03 */
39 }
40
41 f = P_tmpdir;
42 +#if __DARWIN_UNIX03
43 + if (access(f, W_OK) == 0) { /* directory accessible? */
44 +#endif /* __DARWIN_UNIX03 */
45 (void)snprintf(name, MAXPATHLEN, "%s%sXXXXXX", f, pfx);
46 - if ((f = _mktemp(name)))
47 + if ((f = _mktemp(name))) {
48 return(f);
49 + }
50
51 +#if __DARWIN_UNIX03
52 + }
53 + if (issetugid() == 0 && (f = getenv("TMPDIR")) && access(f, W_OK) == 0) {
54 + (void)snprintf(name, MAXPATHLEN, "%s%s%sXXXXXX", f,
55 + *(f + strlen(f) - 1) == '/'? "": "/", pfx);
56 + if ((f = _mktemp(name))) {
57 + return(f);
58 + }
59 + }
60 +#endif /* __DARWIN_UNIX03 */
61 f = _PATH_TMP;
62 +#if __DARWIN_UNIX03
63 + if (access(f, W_OK) < 0) {
64 + f = "./"; /* directory inaccessible */
65 + if (access(f, W_OK) < 0) {
66 + return(NULL);
67 + }
68 + }
69 +#endif /* __DARWIN_UNIX03 */
70 (void)snprintf(name, MAXPATHLEN, "%s%sXXXXXX", f, pfx);
71 - if ((f = _mktemp(name)))
72 + if ((f = _mktemp(name))) {
73 return(f);
74 + }
75
76 sverrno = errno;
77 free(name);