Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit841baf2

Browse files
committed
Add mkdtemp() to libpgport.
This function is pervasive on free software operating systems; importNetBSD's implementation. Back-patch to 8.4, like the commit that willharness it.
1 parenta11577f commit841baf2

File tree

7 files changed

+306
-3
lines changed

7 files changed

+306
-3
lines changed

‎configure

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21319,7 +21319,8 @@ fi
2131921319

2132021320

2132121321

21322-
for ac_func in crypt fls getopt getrusage inet_aton random rint srandom strerror strlcat strlcpy
21322+
21323+
for ac_func in crypt fls getopt getrusage inet_aton mkdtemp random rint srandom strerror strlcat strlcpy
2132321324
do
2132421325
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
2132521326
{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5

‎configure.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1344,7 +1344,7 @@ else
13441344
AC_CHECK_FUNCS([fpclass fp_class fp_class_d class], [break])
13451345
fi
13461346

1347-
AC_REPLACE_FUNCS([crypt fls getopt getrusage inet_aton random rint srandom strerror strlcat strlcpy])
1347+
AC_REPLACE_FUNCS([crypt fls getopt getrusage inet_atonmkdtemprandom rint srandom strerror strlcat strlcpy])
13481348

13491349
case $host_os in
13501350

‎src/include/pg_config.h.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,9 @@
345345
/* Define to 1 if the system has the type `MINIDUMP_TYPE'. */
346346
#undef HAVE_MINIDUMP_TYPE
347347

348+
/* Define to 1 if you have the `mkdtemp' function. */
349+
#undef HAVE_MKDTEMP
350+
348351
/* Define to 1 if you have the <netinet/in.h> header file. */
349352
#undef HAVE_NETINET_IN_H
350353

‎src/include/pg_config.h.win32

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,9 @@
261261
/* Define to 1 if the system has the type `MINIDUMP_TYPE'. */
262262
#define HAVE_MINIDUMP_TYPE 1
263263

264+
/* Define to 1 if you have the `mkdtemp' function. */
265+
/* #undef HAVE_MKDTEMP */
266+
264267
/* Define to 1 if you have the <netinet/in.h> header file. */
265268
#define HAVE_NETINET_IN_H 1
266269

‎src/include/port.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,9 @@ extern intpg_check_dir(const char *dir);
476476
/* port/pgmkdirp.c */
477477
externintpg_mkdir_p(char*path,intomode);
478478

479+
/* port/mkdtemp.c */
480+
externchar*mkdtemp(char*path);
481+
479482
/* port/pqsignal.c */
480483
typedefvoid (*pqsigfunc) (intsigno);
481484
externpqsigfuncpqsignal(intsigno,pqsigfuncfunc);

‎src/port/mkdtemp.c

Lines changed: 293 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,293 @@
1+
/*-------------------------------------------------------------------------
2+
*
3+
* mkdtemp.c
4+
* create a mode-0700 temporary directory
5+
*
6+
* Portions Copyright (c) 1996-2014, PostgreSQL Global Development Group
7+
*
8+
*
9+
* IDENTIFICATION
10+
* src/port/mkdtemp.c
11+
*
12+
* This code was taken from NetBSD to provide an implementation for platforms
13+
* that lack it. (Among compatibly-licensed implementations, the OpenBSD
14+
* version better resists denial-of-service attacks. However, it has a
15+
* cryptographic dependency.) The NetBSD copyright terms follow.
16+
*-------------------------------------------------------------------------
17+
*/
18+
19+
#include"c.h"
20+
21+
#define_DIAGASSERT(x) do {} while (0)
22+
23+
24+
/*$NetBSD: gettemp.c,v 1.17 2014/01/21 19:09:48 seanb Exp $*/
25+
26+
/*
27+
* Copyright (c) 1987, 1993
28+
*The Regents of the University of California. All rights reserved.
29+
*
30+
* Redistribution and use in source and binary forms, with or without
31+
* modification, are permitted provided that the following conditions
32+
* are met:
33+
* 1. Redistributions of source code must retain the above copyright
34+
* notice, this list of conditions and the following disclaimer.
35+
* 2. Redistributions in binary form must reproduce the above copyright
36+
* notice, this list of conditions and the following disclaimer in the
37+
* documentation and/or other materials provided with the distribution.
38+
* 3. Neither the name of the University nor the names of its contributors
39+
* may be used to endorse or promote products derived from this software
40+
* without specific prior written permission.
41+
*
42+
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
43+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45+
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
46+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48+
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50+
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51+
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52+
* SUCH DAMAGE.
53+
*/
54+
55+
#ifHAVE_NBTOOL_CONFIG_H
56+
#include"nbtool_config.h"
57+
#endif
58+
59+
#if !HAVE_NBTOOL_CONFIG_H|| !HAVE_MKSTEMP|| !HAVE_MKDTEMP
60+
61+
#ifdefNOT_POSTGRESQL
62+
#include<sys/cdefs.h>
63+
#if defined(LIBC_SCCS)&& !defined(lint)
64+
#if0
65+
staticcharsccsid[]="@(#)mktemp.c8.1 (Berkeley) 6/4/93";
66+
#else
67+
__RCSID("$NetBSD: gettemp.c,v 1.17 2014/01/21 19:09:48 seanb Exp $");
68+
#endif
69+
#endif/* LIBC_SCCS and not lint */
70+
#endif
71+
72+
#include<sys/types.h>
73+
#include<sys/stat.h>
74+
75+
#include<assert.h>
76+
#include<ctype.h>
77+
#include<errno.h>
78+
#include<fcntl.h>
79+
#include<stdio.h>
80+
#include<stdlib.h>
81+
#include<unistd.h>
82+
83+
#ifdefNOT_POSTGRESQL
84+
#ifHAVE_NBTOOL_CONFIG_H
85+
#defineGETTEMP__nbcompat_gettemp
86+
#else
87+
#include"reentrant.h"
88+
#include"local.h"
89+
#defineGETTEMP__gettemp
90+
#endif
91+
#endif
92+
93+
staticint
94+
GETTEMP(char*path,int*doopen,intdomkdir)
95+
{
96+
char*start,
97+
*trv;
98+
structstatsbuf;
99+
u_intpid;
100+
101+
/*
102+
* To guarantee multiple calls generate unique names even if the file is
103+
* not created. 676 different possibilities with 7 or more X's, 26 with 6
104+
* or less.
105+
*/
106+
staticcharxtra[2]="aa";
107+
intxcnt=0;
108+
109+
_DIAGASSERT(path!=NULL);
110+
/* doopen may be NULL */
111+
112+
pid=getpid();
113+
114+
/* Move to end of path and count trailing X's. */
115+
for (trv=path;*trv;++trv)
116+
if (*trv=='X')
117+
xcnt++;
118+
else
119+
xcnt=0;
120+
121+
/* Use at least one from xtra. Use 2 if more than 6 X's. */
122+
if (xcnt>0)
123+
{
124+
*--trv=xtra[0];
125+
xcnt--;
126+
}
127+
if (xcnt>5)
128+
{
129+
*--trv=xtra[1];
130+
xcnt--;
131+
}
132+
133+
/* Set remaining X's to pid digits with 0's to the left. */
134+
for (;xcnt>0;xcnt--)
135+
{
136+
*--trv= (pid %10)+'0';
137+
pid /=10;
138+
}
139+
140+
/* update xtra for next call. */
141+
if (xtra[0]!='z')
142+
xtra[0]++;
143+
else
144+
{
145+
xtra[0]='a';
146+
if (xtra[1]!='z')
147+
xtra[1]++;
148+
else
149+
xtra[1]='a';
150+
}
151+
152+
/*
153+
* check the target directory; if you have six X's and it doesn't exist
154+
* this runs for a *very* long time.
155+
*/
156+
for (start=trv+1;;--trv)
157+
{
158+
if (trv <=path)
159+
break;
160+
if (*trv=='/')
161+
{
162+
inte;
163+
164+
*trv='\0';
165+
e=stat(path,&sbuf);
166+
*trv='/';
167+
if (e==-1)
168+
returndoopen==NULL&& !domkdir;
169+
if (!S_ISDIR(sbuf.st_mode))
170+
{
171+
errno=ENOTDIR;
172+
returndoopen==NULL&& !domkdir;
173+
}
174+
break;
175+
}
176+
}
177+
178+
for (;;)
179+
{
180+
if (doopen)
181+
{
182+
if ((*doopen=
183+
open(path,O_CREAT |O_EXCL |O_RDWR,0600)) >=0)
184+
return1;
185+
if (errno!=EEXIST)
186+
return0;
187+
}
188+
elseif (domkdir)
189+
{
190+
if (mkdir(path,0700) >=0)
191+
return1;
192+
if (errno!=EEXIST)
193+
return0;
194+
}
195+
elseif (lstat(path,&sbuf))
196+
returnerrno==ENOENT ?1 :0;
197+
198+
/* tricky little algorithm for backward compatibility */
199+
for (trv=start;;)
200+
{
201+
if (!*trv)
202+
return0;
203+
if (*trv=='z')
204+
*trv++='a';
205+
else
206+
{
207+
if (isdigit((unsignedchar)*trv))
208+
*trv='a';
209+
else
210+
++*trv;
211+
break;
212+
}
213+
}
214+
}
215+
/* NOTREACHED */
216+
}
217+
218+
#endif/* !HAVE_NBTOOL_CONFIG_H || !HAVE_MKSTEMP ||
219+
* !HAVE_MKDTEMP */
220+
221+
222+
/*$NetBSD: mkdtemp.c,v 1.11 2012/03/15 18:22:30 christos Exp $*/
223+
224+
/*
225+
* Copyright (c) 1987, 1993
226+
*The Regents of the University of California. All rights reserved.
227+
*
228+
* Redistribution and use in source and binary forms, with or without
229+
* modification, are permitted provided that the following conditions
230+
* are met:
231+
* 1. Redistributions of source code must retain the above copyright
232+
* notice, this list of conditions and the following disclaimer.
233+
* 2. Redistributions in binary form must reproduce the above copyright
234+
* notice, this list of conditions and the following disclaimer in the
235+
* documentation and/or other materials provided with the distribution.
236+
* 3. Neither the name of the University nor the names of its contributors
237+
* may be used to endorse or promote products derived from this software
238+
* without specific prior written permission.
239+
*
240+
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
241+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
242+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
243+
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
244+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
245+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
246+
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
247+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
248+
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
249+
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
250+
* SUCH DAMAGE.
251+
*/
252+
253+
#ifHAVE_NBTOOL_CONFIG_H
254+
#include"nbtool_config.h"
255+
#endif
256+
257+
#if !HAVE_NBTOOL_CONFIG_H|| !HAVE_MKDTEMP
258+
259+
#ifdefNOT_POSTGRESQL
260+
261+
#include<sys/cdefs.h>
262+
#if defined(LIBC_SCCS)&& !defined(lint)
263+
#if0
264+
staticcharsccsid[]="@(#)mktemp.c8.1 (Berkeley) 6/4/93";
265+
#else
266+
__RCSID("$NetBSD: mkdtemp.c,v 1.11 2012/03/15 18:22:30 christos Exp $");
267+
#endif
268+
#endif/* LIBC_SCCS and not lint */
269+
270+
#ifHAVE_NBTOOL_CONFIG_H
271+
#defineGETTEMP__nbcompat_gettemp
272+
#else
273+
#include<assert.h>
274+
#include<errno.h>
275+
#include<stdio.h>
276+
#include<stdlib.h>
277+
#include<unistd.h>
278+
#include"reentrant.h"
279+
#include"local.h"
280+
#defineGETTEMP__gettemp
281+
#endif
282+
283+
#endif
284+
285+
char*
286+
mkdtemp(char*path)
287+
{
288+
_DIAGASSERT(path!=NULL);
289+
290+
returnGETTEMP(path,NULL,1) ?path :NULL;
291+
}
292+
293+
#endif/* !HAVE_NBTOOL_CONFIG_H || !HAVE_MKDTEMP */

‎src/tools/msvc/Mkvcbuild.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ sub mkvcbuild
6969
srandom.c getaddrinfo.c gettimeofday.c inet_net_ntop.c kill.c open.c
7070
erand48.c snprintf.c strlcat.c strlcpy.c dirmod.c exec.c noblock.c path.c
7171
pgcheckdir.c pg_crc.c pgmkdirp.c pgsleep.c pgstrcasecmp.c pqsignal.c
72-
qsort.c qsort_arg.c quotes.c
72+
mkdtemp.cqsort.c qsort_arg.c quotes.c
7373
sprompt.c tar.c thread.c wait_error.c getopt.c getopt_long.c dirent.c
7474
win32env.c win32error.c win32setlocale.c);
7575

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp