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

Commit3243fa3

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 parent294a489 commit3243fa3

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
@@ -20646,7 +20646,8 @@ fi
2064620646

2064720647

2064820648

20649-
for ac_func in crypt erand48 getopt getrusage inet_aton random rint srandom strdup strerror strlcat strlcpy strtol strtoul
20649+
20650+
for ac_func in crypt erand48 getopt getrusage inet_aton mkdtemp random rint srandom strdup strerror strlcat strlcpy strtol strtoul
2065020651
do
2065120652
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
2065220653
{ $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
@@ -1325,7 +1325,7 @@ else
13251325
AC_CHECK_FUNCS([fpclass fp_class fp_class_d class], [break])
13261326
fi
13271327

1328-
AC_REPLACE_FUNCS([crypt erand48 getopt getrusage inet_aton random rint srandom strdup strerror strlcat strlcpy strtol strtoul])
1328+
AC_REPLACE_FUNCS([crypt erand48 getopt getrusage inet_atonmkdtemprandom rint srandom strdup strerror strlcat strlcpy strtol strtoul])
13291329

13301330
case $host_os in
13311331

‎src/include/pg_config.h.in

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

354+
/* Define to 1 if you have the `mkdtemp' function. */
355+
#undef HAVE_MKDTEMP
356+
354357
/* Define to 1 if you have the <netinet/in.h> header file. */
355358
#undef HAVE_NETINET_IN_H
356359

‎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
@@ -497,4 +497,7 @@ extern intpg_check_dir(const char *dir);
497497
/* port/pgmkdirp.c */
498498
externintpg_mkdir_p(char*path,intomode);
499499

500+
/* port/mkdtemp.c */
501+
externchar*mkdtemp(char*path);
502+
500503
#endif/* PG_PORT_H */

‎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
@@ -55,7 +55,7 @@ sub mkvcbuild
5555
snprintf.c strlcat.c strlcpy.c dirmod.c exec.c noblock.c path.c
5656
pgcheckdir.c pgmkdirp.c pgsleep.c pgstrcasecmp.c qsort.c qsort_arg.c
5757
sprompt.c thread.c getopt.c getopt_long.c dirent.c rint.c win32env.c
58-
win32error.c win32setlocale.c);
58+
win32error.c win32setlocale.c mkdtemp.c);
5959

6060
$libpgport =$solution->AddProject('libpgport','lib','misc');
6161
$libpgport->AddDefine('FRONTEND');

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp