mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
Import 'lstat' and 'mkstemp' modules from Gnulib.
* lib/mkstemp.c: * lib/secure_getenv.c: * lib/tempname.c: * lib/tempname.h: * m4/mkstemp.m4: * m4/secure_getenv.m4: * m4/tempname.m4: New files. * lib/Makefile.am: * m4/gnulib-cache.m4: * m4/gnulib-comp.m4: Add modules.
This commit is contained in:
parent
b0a3149955
commit
f9d4a040b4
10 changed files with 626 additions and 2 deletions
|
@ -21,7 +21,7 @@
|
||||||
# the same distribution terms as the rest of that program.
|
# the same distribution terms as the rest of that program.
|
||||||
#
|
#
|
||||||
# Generated by gnulib-tool.
|
# Generated by gnulib-tool.
|
||||||
# Reproduce by: gnulib-tool --import --dir=. --local-dir=gnulib-local --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl=3 --no-conditional-dependencies --libtool --macro-prefix=gl --no-vc-files accept alignof alloca-opt announce-gen autobuild bind byteswap c-strcase canonicalize-lgpl ceil clock-time close connect copysign dirfd duplocale environ extensions flock floor fpieee frexp fstat full-read full-write func gendocs getaddrinfo getlogin getpeername getsockname getsockopt git-version-gen gitlog-to-changelog gnu-web-doc-update gnupload havelib iconv_open-utf inet_ntop inet_pton isfinite isinf isnan ldexp lib-symbol-versions lib-symbol-visibility libunistring listen localcharset locale log1p maintainer-makefile malloc-gnu malloca nl_langinfo nproc open pipe-posix pipe2 poll putenv recv recvfrom regex rename select send sendto setenv setsockopt shutdown socket stat-time stdlib strftime striconveh string sys_stat time times trunc verify vsnprintf warnings wchar
|
# Reproduce by: gnulib-tool --import --dir=. --local-dir=gnulib-local --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl=3 --no-conditional-dependencies --libtool --macro-prefix=gl --no-vc-files accept alignof alloca-opt announce-gen autobuild bind byteswap c-strcase canonicalize-lgpl ceil clock-time close connect copysign dirfd duplocale environ extensions flock floor fpieee frexp fstat full-read full-write func gendocs getaddrinfo getlogin getpeername getsockname getsockopt git-version-gen gitlog-to-changelog gnu-web-doc-update gnupload havelib iconv_open-utf inet_ntop inet_pton isfinite isinf isnan ldexp lib-symbol-versions lib-symbol-visibility libunistring listen localcharset locale log1p lstat maintainer-makefile malloc-gnu malloca mkstemp nl_langinfo nproc open pipe-posix pipe2 poll putenv recv recvfrom regex rename select send sendto setenv setsockopt shutdown socket stat-time stdlib strftime striconveh string sys_stat time times trunc verify vsnprintf warnings wchar
|
||||||
|
|
||||||
AUTOMAKE_OPTIONS = 1.9.6 gnits subdir-objects
|
AUTOMAKE_OPTIONS = 1.9.6 gnits subdir-objects
|
||||||
|
|
||||||
|
@ -1417,6 +1417,15 @@ EXTRA_libgnu_la_SOURCES += memchr.c
|
||||||
|
|
||||||
## end gnulib module memchr
|
## end gnulib module memchr
|
||||||
|
|
||||||
|
## begin gnulib module mkstemp
|
||||||
|
|
||||||
|
|
||||||
|
EXTRA_DIST += mkstemp.c
|
||||||
|
|
||||||
|
EXTRA_libgnu_la_SOURCES += mkstemp.c
|
||||||
|
|
||||||
|
## end gnulib module mkstemp
|
||||||
|
|
||||||
## begin gnulib module msvc-inval
|
## begin gnulib module msvc-inval
|
||||||
|
|
||||||
|
|
||||||
|
@ -1701,6 +1710,15 @@ EXTRA_DIST += same-inode.h
|
||||||
|
|
||||||
## end gnulib module same-inode
|
## end gnulib module same-inode
|
||||||
|
|
||||||
|
## begin gnulib module secure_getenv
|
||||||
|
|
||||||
|
|
||||||
|
EXTRA_DIST += secure_getenv.c
|
||||||
|
|
||||||
|
EXTRA_libgnu_la_SOURCES += secure_getenv.c
|
||||||
|
|
||||||
|
## end gnulib module secure_getenv
|
||||||
|
|
||||||
## begin gnulib module select
|
## begin gnulib module select
|
||||||
|
|
||||||
|
|
||||||
|
@ -2737,6 +2755,14 @@ EXTRA_DIST += sys_uio.in.h
|
||||||
|
|
||||||
## end gnulib module sys_uio
|
## end gnulib module sys_uio
|
||||||
|
|
||||||
|
## begin gnulib module tempname
|
||||||
|
|
||||||
|
libgnu_la_SOURCES += tempname.c
|
||||||
|
|
||||||
|
EXTRA_DIST += tempname.h
|
||||||
|
|
||||||
|
## end gnulib module tempname
|
||||||
|
|
||||||
## begin gnulib module threadlib
|
## begin gnulib module threadlib
|
||||||
|
|
||||||
libgnu_la_SOURCES += glthread/threadlib.c
|
libgnu_la_SOURCES += glthread/threadlib.c
|
||||||
|
|
50
lib/mkstemp.c
Normal file
50
lib/mkstemp.c
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/* Copyright (C) 1998-1999, 2001, 2005-2007, 2009-2014 Free Software
|
||||||
|
Foundation, Inc.
|
||||||
|
This file is derived from the one in the GNU C Library.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#if !_LIBC
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#if !_LIBC
|
||||||
|
# include "tempname.h"
|
||||||
|
# define __gen_tempname gen_tempname
|
||||||
|
# ifndef __GT_FILE
|
||||||
|
# define __GT_FILE GT_FILE
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifndef __GT_FILE
|
||||||
|
# define __GT_FILE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Generate a unique temporary file name from XTEMPLATE.
|
||||||
|
The last six characters of XTEMPLATE must be "XXXXXX";
|
||||||
|
they are replaced with a string that makes the file name unique.
|
||||||
|
Then open the file and return a fd.
|
||||||
|
|
||||||
|
If you are creating temporary files which will later be removed,
|
||||||
|
consider using the clean-temp module, which avoids several pitfalls
|
||||||
|
of using mkstemp directly. */
|
||||||
|
int
|
||||||
|
mkstemp (char *xtemplate)
|
||||||
|
{
|
||||||
|
return __gen_tempname (xtemplate, 0, 0, __GT_FILE);
|
||||||
|
}
|
41
lib/secure_getenv.c
Normal file
41
lib/secure_getenv.c
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
/* Look up an environment variable more securely.
|
||||||
|
|
||||||
|
Copyright 2013-2014 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Lesser General Public License as published
|
||||||
|
by the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#if !HAVE___SECURE_GETENV
|
||||||
|
# if HAVE_ISSETUGID
|
||||||
|
# include <unistd.h>
|
||||||
|
# else
|
||||||
|
# undef issetugid
|
||||||
|
# define issetugid() 1
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
char *
|
||||||
|
secure_getenv (char const *name)
|
||||||
|
{
|
||||||
|
#if HAVE___SECURE_GETENV
|
||||||
|
return __secure_getenv (name);
|
||||||
|
#else
|
||||||
|
if (issetugid ())
|
||||||
|
return 0;
|
||||||
|
return getenv (name);
|
||||||
|
#endif
|
||||||
|
}
|
306
lib/tempname.c
Normal file
306
lib/tempname.c
Normal file
|
@ -0,0 +1,306 @@
|
||||||
|
/* tempname.c - generate the name of a temporary file.
|
||||||
|
|
||||||
|
Copyright (C) 1991-2003, 2005-2007, 2009-2014 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Extracted from glibc sysdeps/posix/tempname.c. See also tmpdir.c. */
|
||||||
|
|
||||||
|
#if !_LIBC
|
||||||
|
# include <config.h>
|
||||||
|
# include "tempname.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#ifndef __set_errno
|
||||||
|
# define __set_errno(Val) errno = (Val)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#ifndef P_tmpdir
|
||||||
|
# define P_tmpdir "/tmp"
|
||||||
|
#endif
|
||||||
|
#ifndef TMP_MAX
|
||||||
|
# define TMP_MAX 238328
|
||||||
|
#endif
|
||||||
|
#ifndef __GT_FILE
|
||||||
|
# define __GT_FILE 0
|
||||||
|
# define __GT_DIR 1
|
||||||
|
# define __GT_NOCREATE 2
|
||||||
|
#endif
|
||||||
|
#if !_LIBC && (GT_FILE != __GT_FILE || GT_DIR != __GT_DIR \
|
||||||
|
|| GT_NOCREATE != __GT_NOCREATE)
|
||||||
|
# error report this to bug-gnulib@gnu.org
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#if _LIBC
|
||||||
|
# define struct_stat64 struct stat64
|
||||||
|
#else
|
||||||
|
# define struct_stat64 struct stat
|
||||||
|
# define __gen_tempname gen_tempname
|
||||||
|
# define __getpid getpid
|
||||||
|
# define __gettimeofday gettimeofday
|
||||||
|
# define __mkdir mkdir
|
||||||
|
# define __open open
|
||||||
|
# define __lxstat64(version, file, buf) lstat (file, buf)
|
||||||
|
# define __secure_getenv secure_getenv
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <hp-timing.h>
|
||||||
|
# if HP_TIMING_AVAIL
|
||||||
|
# define RANDOM_BITS(Var) \
|
||||||
|
if (__builtin_expect (value == UINT64_C (0), 0)) \
|
||||||
|
{ \
|
||||||
|
/* If this is the first time this function is used initialize \
|
||||||
|
the variable we accumulate the value in to some somewhat \
|
||||||
|
random value. If we'd not do this programs at startup time \
|
||||||
|
might have a reduced set of possible names, at least on slow \
|
||||||
|
machines. */ \
|
||||||
|
struct timeval tv; \
|
||||||
|
__gettimeofday (&tv, NULL); \
|
||||||
|
value = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec; \
|
||||||
|
} \
|
||||||
|
HP_TIMING_NOW (Var)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Use the widest available unsigned type if uint64_t is not
|
||||||
|
available. The algorithm below extracts a number less than 62**6
|
||||||
|
(approximately 2**35.725) from uint64_t, so ancient hosts where
|
||||||
|
uintmax_t is only 32 bits lose about 3.725 bits of randomness,
|
||||||
|
which is better than not having mkstemp at all. */
|
||||||
|
#if !defined UINT64_MAX && !defined uint64_t
|
||||||
|
# define uint64_t uintmax_t
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if _LIBC
|
||||||
|
/* Return nonzero if DIR is an existent directory. */
|
||||||
|
static int
|
||||||
|
direxists (const char *dir)
|
||||||
|
{
|
||||||
|
struct_stat64 buf;
|
||||||
|
return __xstat64 (_STAT_VER, dir, &buf) == 0 && S_ISDIR (buf.st_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is
|
||||||
|
non-null and exists, uses it; otherwise uses the first of $TMPDIR,
|
||||||
|
P_tmpdir, /tmp that exists. Copies into TMPL a template suitable
|
||||||
|
for use with mk[s]temp. Will fail (-1) if DIR is non-null and
|
||||||
|
doesn't exist, none of the searched dirs exists, or there's not
|
||||||
|
enough space in TMPL. */
|
||||||
|
int
|
||||||
|
__path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx,
|
||||||
|
int try_tmpdir)
|
||||||
|
{
|
||||||
|
const char *d;
|
||||||
|
size_t dlen, plen;
|
||||||
|
|
||||||
|
if (!pfx || !pfx[0])
|
||||||
|
{
|
||||||
|
pfx = "file";
|
||||||
|
plen = 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
plen = strlen (pfx);
|
||||||
|
if (plen > 5)
|
||||||
|
plen = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (try_tmpdir)
|
||||||
|
{
|
||||||
|
d = __secure_getenv ("TMPDIR");
|
||||||
|
if (d != NULL && direxists (d))
|
||||||
|
dir = d;
|
||||||
|
else if (dir != NULL && direxists (dir))
|
||||||
|
/* nothing */ ;
|
||||||
|
else
|
||||||
|
dir = NULL;
|
||||||
|
}
|
||||||
|
if (dir == NULL)
|
||||||
|
{
|
||||||
|
if (direxists (P_tmpdir))
|
||||||
|
dir = P_tmpdir;
|
||||||
|
else if (strcmp (P_tmpdir, "/tmp") != 0 && direxists ("/tmp"))
|
||||||
|
dir = "/tmp";
|
||||||
|
else
|
||||||
|
{
|
||||||
|
__set_errno (ENOENT);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dlen = strlen (dir);
|
||||||
|
while (dlen > 1 && dir[dlen - 1] == '/')
|
||||||
|
dlen--; /* remove trailing slashes */
|
||||||
|
|
||||||
|
/* check we have room for "${dir}/${pfx}XXXXXX\0" */
|
||||||
|
if (tmpl_len < dlen + 1 + plen + 6 + 1)
|
||||||
|
{
|
||||||
|
__set_errno (EINVAL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf (tmpl, "%.*s/%.*sXXXXXX", (int) dlen, dir, (int) plen, pfx);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif /* _LIBC */
|
||||||
|
|
||||||
|
/* These are the characters used in temporary file names. */
|
||||||
|
static const char letters[] =
|
||||||
|
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||||
|
|
||||||
|
/* Generate a temporary file name based on TMPL. TMPL must match the
|
||||||
|
rules for mk[s]temp (i.e. end in "XXXXXX", possibly with a suffix).
|
||||||
|
The name constructed does not exist at the time of the call to
|
||||||
|
__gen_tempname. TMPL is overwritten with the result.
|
||||||
|
|
||||||
|
KIND may be one of:
|
||||||
|
__GT_NOCREATE: simply verify that the name does not exist
|
||||||
|
at the time of the call.
|
||||||
|
__GT_FILE: create the file using open(O_CREAT|O_EXCL)
|
||||||
|
and return a read-write fd. The file is mode 0600.
|
||||||
|
__GT_DIR: create a directory, which will be mode 0700.
|
||||||
|
|
||||||
|
We use a clever algorithm to get hard-to-predict names. */
|
||||||
|
int
|
||||||
|
__gen_tempname (char *tmpl, int suffixlen, int flags, int kind)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
char *XXXXXX;
|
||||||
|
static uint64_t value;
|
||||||
|
uint64_t random_time_bits;
|
||||||
|
unsigned int count;
|
||||||
|
int fd = -1;
|
||||||
|
int save_errno = errno;
|
||||||
|
struct_stat64 st;
|
||||||
|
|
||||||
|
/* A lower bound on the number of temporary files to attempt to
|
||||||
|
generate. The maximum total number of temporary file names that
|
||||||
|
can exist for a given template is 62**6. It should never be
|
||||||
|
necessary to try all of these combinations. Instead if a reasonable
|
||||||
|
number of names is tried (we define reasonable as 62**3) fail to
|
||||||
|
give the system administrator the chance to remove the problems. */
|
||||||
|
#define ATTEMPTS_MIN (62 * 62 * 62)
|
||||||
|
|
||||||
|
/* The number of times to attempt to generate a temporary file. To
|
||||||
|
conform to POSIX, this must be no smaller than TMP_MAX. */
|
||||||
|
#if ATTEMPTS_MIN < TMP_MAX
|
||||||
|
unsigned int attempts = TMP_MAX;
|
||||||
|
#else
|
||||||
|
unsigned int attempts = ATTEMPTS_MIN;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
len = strlen (tmpl);
|
||||||
|
if (len < 6 + suffixlen || memcmp (&tmpl[len - 6 - suffixlen], "XXXXXX", 6))
|
||||||
|
{
|
||||||
|
__set_errno (EINVAL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is where the Xs start. */
|
||||||
|
XXXXXX = &tmpl[len - 6 - suffixlen];
|
||||||
|
|
||||||
|
/* Get some more or less random data. */
|
||||||
|
#ifdef RANDOM_BITS
|
||||||
|
RANDOM_BITS (random_time_bits);
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
struct timeval tv;
|
||||||
|
__gettimeofday (&tv, NULL);
|
||||||
|
random_time_bits = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
value += random_time_bits ^ __getpid ();
|
||||||
|
|
||||||
|
for (count = 0; count < attempts; value += 7777, ++count)
|
||||||
|
{
|
||||||
|
uint64_t v = value;
|
||||||
|
|
||||||
|
/* Fill in the random bits. */
|
||||||
|
XXXXXX[0] = letters[v % 62];
|
||||||
|
v /= 62;
|
||||||
|
XXXXXX[1] = letters[v % 62];
|
||||||
|
v /= 62;
|
||||||
|
XXXXXX[2] = letters[v % 62];
|
||||||
|
v /= 62;
|
||||||
|
XXXXXX[3] = letters[v % 62];
|
||||||
|
v /= 62;
|
||||||
|
XXXXXX[4] = letters[v % 62];
|
||||||
|
v /= 62;
|
||||||
|
XXXXXX[5] = letters[v % 62];
|
||||||
|
|
||||||
|
switch (kind)
|
||||||
|
{
|
||||||
|
case __GT_FILE:
|
||||||
|
fd = __open (tmpl,
|
||||||
|
(flags & ~O_ACCMODE)
|
||||||
|
| O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case __GT_DIR:
|
||||||
|
fd = __mkdir (tmpl, S_IRUSR | S_IWUSR | S_IXUSR);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case __GT_NOCREATE:
|
||||||
|
/* This case is backward from the other three. __gen_tempname
|
||||||
|
succeeds if __xstat fails because the name does not exist.
|
||||||
|
Note the continue to bypass the common logic at the bottom
|
||||||
|
of the loop. */
|
||||||
|
if (__lxstat64 (_STAT_VER, tmpl, &st) < 0)
|
||||||
|
{
|
||||||
|
if (errno == ENOENT)
|
||||||
|
{
|
||||||
|
__set_errno (save_errno);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* Give up now. */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
|
||||||
|
default:
|
||||||
|
assert (! "invalid KIND in __gen_tempname");
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fd >= 0)
|
||||||
|
{
|
||||||
|
__set_errno (save_errno);
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
else if (errno != EEXIST)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We got out of the loop because we ran out of combinations to try. */
|
||||||
|
__set_errno (EEXIST);
|
||||||
|
return -1;
|
||||||
|
}
|
50
lib/tempname.h
Normal file
50
lib/tempname.h
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/* Create a temporary file or directory.
|
||||||
|
|
||||||
|
Copyright (C) 2006, 2009-2014 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* header written by Eric Blake */
|
||||||
|
|
||||||
|
#ifndef GL_TEMPNAME_H
|
||||||
|
# define GL_TEMPNAME_H
|
||||||
|
|
||||||
|
# include <stdio.h>
|
||||||
|
|
||||||
|
# ifdef __GT_FILE
|
||||||
|
# define GT_FILE __GT_FILE
|
||||||
|
# define GT_DIR __GT_DIR
|
||||||
|
# define GT_NOCREATE __GT_NOCREATE
|
||||||
|
# else
|
||||||
|
# define GT_FILE 0
|
||||||
|
# define GT_DIR 1
|
||||||
|
# define GT_NOCREATE 2
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Generate a temporary file name based on TMPL. TMPL must match the
|
||||||
|
rules for mk[s]temp (i.e. end in "XXXXXX", possibly with a suffix).
|
||||||
|
The name constructed does not exist at the time of the call to
|
||||||
|
gen_tempname. TMPL is overwritten with the result.
|
||||||
|
|
||||||
|
KIND may be one of:
|
||||||
|
GT_NOCREATE: simply verify that the name does not exist
|
||||||
|
at the time of the call.
|
||||||
|
GT_FILE: create a large file using open(O_CREAT|O_EXCL)
|
||||||
|
and return a read-write fd. The file is mode 0600.
|
||||||
|
GT_DIR: create a directory, which will be mode 0700.
|
||||||
|
|
||||||
|
We use a clever algorithm to get hard-to-predict names. */
|
||||||
|
extern int gen_tempname (char *tmpl, int suffixlen, int flags, int kind);
|
||||||
|
|
||||||
|
#endif /* GL_TEMPNAME_H */
|
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
|
|
||||||
# Specification in the form of a command-line invocation:
|
# Specification in the form of a command-line invocation:
|
||||||
# gnulib-tool --import --dir=. --local-dir=gnulib-local --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl=3 --no-conditional-dependencies --libtool --macro-prefix=gl --no-vc-files accept alignof alloca-opt announce-gen autobuild bind byteswap c-strcase canonicalize-lgpl ceil clock-time close connect copysign dirfd duplocale environ extensions flock floor fpieee frexp fstat full-read full-write func gendocs getaddrinfo getlogin getpeername getsockname getsockopt git-version-gen gitlog-to-changelog gnu-web-doc-update gnupload havelib iconv_open-utf inet_ntop inet_pton isfinite isinf isnan ldexp lib-symbol-versions lib-symbol-visibility libunistring listen localcharset locale log1p maintainer-makefile malloc-gnu malloca nl_langinfo nproc open pipe-posix pipe2 poll putenv recv recvfrom regex rename select send sendto setenv setsockopt shutdown socket stat-time stdlib strftime striconveh string sys_stat time times trunc verify vsnprintf warnings wchar
|
# gnulib-tool --import --dir=. --local-dir=gnulib-local --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl=3 --no-conditional-dependencies --libtool --macro-prefix=gl --no-vc-files accept alignof alloca-opt announce-gen autobuild bind byteswap c-strcase canonicalize-lgpl ceil clock-time close connect copysign dirfd duplocale environ extensions flock floor fpieee frexp fstat full-read full-write func gendocs getaddrinfo getlogin getpeername getsockname getsockopt git-version-gen gitlog-to-changelog gnu-web-doc-update gnupload havelib iconv_open-utf inet_ntop inet_pton isfinite isinf isnan ldexp lib-symbol-versions lib-symbol-visibility libunistring listen localcharset locale log1p lstat maintainer-makefile malloc-gnu malloca mkstemp nl_langinfo nproc open pipe-posix pipe2 poll putenv recv recvfrom regex rename select send sendto setenv setsockopt shutdown socket stat-time stdlib strftime striconveh string sys_stat time times trunc verify vsnprintf warnings wchar
|
||||||
|
|
||||||
# Specification in the form of a few gnulib-tool.m4 macro invocations:
|
# Specification in the form of a few gnulib-tool.m4 macro invocations:
|
||||||
gl_LOCAL_DIR([gnulib-local])
|
gl_LOCAL_DIR([gnulib-local])
|
||||||
|
@ -83,9 +83,11 @@ gl_MODULES([
|
||||||
localcharset
|
localcharset
|
||||||
locale
|
locale
|
||||||
log1p
|
log1p
|
||||||
|
lstat
|
||||||
maintainer-makefile
|
maintainer-makefile
|
||||||
malloc-gnu
|
malloc-gnu
|
||||||
malloca
|
malloca
|
||||||
|
mkstemp
|
||||||
nl_langinfo
|
nl_langinfo
|
||||||
nproc
|
nproc
|
||||||
open
|
open
|
||||||
|
|
|
@ -144,6 +144,7 @@ AC_DEFUN([gl_EARLY],
|
||||||
# Code from module mbsinit:
|
# Code from module mbsinit:
|
||||||
# Code from module mbtowc:
|
# Code from module mbtowc:
|
||||||
# Code from module memchr:
|
# Code from module memchr:
|
||||||
|
# Code from module mkstemp:
|
||||||
# Code from module msvc-inval:
|
# Code from module msvc-inval:
|
||||||
# Code from module msvc-nothrow:
|
# Code from module msvc-nothrow:
|
||||||
# Code from module multiarch:
|
# Code from module multiarch:
|
||||||
|
@ -171,6 +172,7 @@ AC_DEFUN([gl_EARLY],
|
||||||
# Code from module safe-read:
|
# Code from module safe-read:
|
||||||
# Code from module safe-write:
|
# Code from module safe-write:
|
||||||
# Code from module same-inode:
|
# Code from module same-inode:
|
||||||
|
# Code from module secure_getenv:
|
||||||
# Code from module select:
|
# Code from module select:
|
||||||
# Code from module send:
|
# Code from module send:
|
||||||
# Code from module sendto:
|
# Code from module sendto:
|
||||||
|
@ -212,6 +214,7 @@ AC_DEFUN([gl_EARLY],
|
||||||
# Code from module sys_times:
|
# Code from module sys_times:
|
||||||
# Code from module sys_types:
|
# Code from module sys_types:
|
||||||
# Code from module sys_uio:
|
# Code from module sys_uio:
|
||||||
|
# Code from module tempname:
|
||||||
# Code from module threadlib:
|
# Code from module threadlib:
|
||||||
gl_THREADLIB_EARLY
|
gl_THREADLIB_EARLY
|
||||||
# Code from module time:
|
# Code from module time:
|
||||||
|
@ -567,6 +570,12 @@ AC_SUBST([LTALLOCA])
|
||||||
gl_PREREQ_MEMCHR
|
gl_PREREQ_MEMCHR
|
||||||
fi
|
fi
|
||||||
gl_STRING_MODULE_INDICATOR([memchr])
|
gl_STRING_MODULE_INDICATOR([memchr])
|
||||||
|
gl_FUNC_MKSTEMP
|
||||||
|
if test $HAVE_MKSTEMP = 0 || test $REPLACE_MKSTEMP = 1; then
|
||||||
|
AC_LIBOBJ([mkstemp])
|
||||||
|
gl_PREREQ_MKSTEMP
|
||||||
|
fi
|
||||||
|
gl_STDLIB_MODULE_INDICATOR([mkstemp])
|
||||||
gl_MSVC_INVAL
|
gl_MSVC_INVAL
|
||||||
if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
|
if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
|
||||||
AC_LIBOBJ([msvc-inval])
|
AC_LIBOBJ([msvc-inval])
|
||||||
|
@ -662,6 +671,12 @@ AC_SUBST([LTALLOCA])
|
||||||
gl_MATH_MODULE_INDICATOR([round])
|
gl_MATH_MODULE_INDICATOR([round])
|
||||||
gl_PREREQ_SAFE_READ
|
gl_PREREQ_SAFE_READ
|
||||||
gl_PREREQ_SAFE_WRITE
|
gl_PREREQ_SAFE_WRITE
|
||||||
|
gl_FUNC_SECURE_GETENV
|
||||||
|
if test $HAVE_SECURE_GETENV = 0; then
|
||||||
|
AC_LIBOBJ([secure_getenv])
|
||||||
|
gl_PREREQ_SECURE_GETENV
|
||||||
|
fi
|
||||||
|
gl_STDLIB_MODULE_INDICATOR([secure_getenv])
|
||||||
gl_FUNC_SELECT
|
gl_FUNC_SELECT
|
||||||
if test $REPLACE_SELECT = 1; then
|
if test $REPLACE_SELECT = 1; then
|
||||||
AC_LIBOBJ([select])
|
AC_LIBOBJ([select])
|
||||||
|
@ -759,6 +774,7 @@ AC_SUBST([LTALLOCA])
|
||||||
AC_PROG_MKDIR_P
|
AC_PROG_MKDIR_P
|
||||||
gl_HEADER_SYS_UIO
|
gl_HEADER_SYS_UIO
|
||||||
AC_PROG_MKDIR_P
|
AC_PROG_MKDIR_P
|
||||||
|
gl_FUNC_GEN_TEMPNAME
|
||||||
gl_THREADLIB
|
gl_THREADLIB
|
||||||
gl_HEADER_TIME_H
|
gl_HEADER_TIME_H
|
||||||
gl_TIME_R
|
gl_TIME_R
|
||||||
|
@ -1059,6 +1075,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||||
lib/mbtowc.c
|
lib/mbtowc.c
|
||||||
lib/memchr.c
|
lib/memchr.c
|
||||||
lib/memchr.valgrind
|
lib/memchr.valgrind
|
||||||
|
lib/mkstemp.c
|
||||||
lib/msvc-inval.c
|
lib/msvc-inval.c
|
||||||
lib/msvc-inval.h
|
lib/msvc-inval.h
|
||||||
lib/msvc-nothrow.c
|
lib/msvc-nothrow.c
|
||||||
|
@ -1100,6 +1117,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||||
lib/safe-write.c
|
lib/safe-write.c
|
||||||
lib/safe-write.h
|
lib/safe-write.h
|
||||||
lib/same-inode.h
|
lib/same-inode.h
|
||||||
|
lib/secure_getenv.c
|
||||||
lib/select.c
|
lib/select.c
|
||||||
lib/send.c
|
lib/send.c
|
||||||
lib/sendto.c
|
lib/sendto.c
|
||||||
|
@ -1140,6 +1158,8 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||||
lib/sys_times.in.h
|
lib/sys_times.in.h
|
||||||
lib/sys_types.in.h
|
lib/sys_types.in.h
|
||||||
lib/sys_uio.in.h
|
lib/sys_uio.in.h
|
||||||
|
lib/tempname.c
|
||||||
|
lib/tempname.h
|
||||||
lib/time.in.h
|
lib/time.in.h
|
||||||
lib/time_r.c
|
lib/time_r.c
|
||||||
lib/times.c
|
lib/times.c
|
||||||
|
@ -1257,6 +1277,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||||
m4/mbstate_t.m4
|
m4/mbstate_t.m4
|
||||||
m4/mbtowc.m4
|
m4/mbtowc.m4
|
||||||
m4/memchr.m4
|
m4/memchr.m4
|
||||||
|
m4/mkstemp.m4
|
||||||
m4/mmap-anon.m4
|
m4/mmap-anon.m4
|
||||||
m4/mode_t.m4
|
m4/mode_t.m4
|
||||||
m4/msvc-inval.m4
|
m4/msvc-inval.m4
|
||||||
|
@ -1285,6 +1306,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||||
m4/round.m4
|
m4/round.m4
|
||||||
m4/safe-read.m4
|
m4/safe-read.m4
|
||||||
m4/safe-write.m4
|
m4/safe-write.m4
|
||||||
|
m4/secure_getenv.m4
|
||||||
m4/select.m4
|
m4/select.m4
|
||||||
m4/servent.m4
|
m4/servent.m4
|
||||||
m4/setenv.m4
|
m4/setenv.m4
|
||||||
|
@ -1316,6 +1338,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||||
m4/sys_times_h.m4
|
m4/sys_times_h.m4
|
||||||
m4/sys_types_h.m4
|
m4/sys_types_h.m4
|
||||||
m4/sys_uio_h.m4
|
m4/sys_uio_h.m4
|
||||||
|
m4/tempname.m4
|
||||||
m4/threadlib.m4
|
m4/threadlib.m4
|
||||||
m4/time_h.m4
|
m4/time_h.m4
|
||||||
m4/time_r.m4
|
m4/time_r.m4
|
||||||
|
|
82
m4/mkstemp.m4
Normal file
82
m4/mkstemp.m4
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
#serial 23
|
||||||
|
|
||||||
|
# Copyright (C) 2001, 2003-2007, 2009-2014 Free Software Foundation, Inc.
|
||||||
|
# This file is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# On some hosts (e.g., HP-UX 10.20, SunOS 4.1.4, Solaris 2.5.1), mkstemp has a
|
||||||
|
# silly limit that it can create no more than 26 files from a given template.
|
||||||
|
# Other systems lack mkstemp altogether.
|
||||||
|
# On OSF1/Tru64 V4.0F, the system-provided mkstemp function can create
|
||||||
|
# only 32 files per process.
|
||||||
|
# On some hosts, mkstemp creates files with mode 0666, which is a security
|
||||||
|
# problem and a violation of POSIX 2008.
|
||||||
|
# On systems like the above, arrange to use the replacement function.
|
||||||
|
AC_DEFUN([gl_FUNC_MKSTEMP],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
|
||||||
|
|
||||||
|
AC_CHECK_FUNCS_ONCE([mkstemp])
|
||||||
|
if test $ac_cv_func_mkstemp = yes; then
|
||||||
|
AC_CACHE_CHECK([for working mkstemp],
|
||||||
|
[gl_cv_func_working_mkstemp],
|
||||||
|
[
|
||||||
|
mkdir conftest.mkstemp
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[AC_INCLUDES_DEFAULT],
|
||||||
|
[[int result = 0;
|
||||||
|
int i;
|
||||||
|
off_t large = (off_t) 4294967295u;
|
||||||
|
if (large < 0)
|
||||||
|
large = 2147483647;
|
||||||
|
umask (0);
|
||||||
|
for (i = 0; i < 70; i++)
|
||||||
|
{
|
||||||
|
char templ[] = "conftest.mkstemp/coXXXXXX";
|
||||||
|
int (*mkstemp_function) (char *) = mkstemp;
|
||||||
|
int fd = mkstemp_function (templ);
|
||||||
|
if (fd < 0)
|
||||||
|
result |= 1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct stat st;
|
||||||
|
if (lseek (fd, large, SEEK_SET) != large)
|
||||||
|
result |= 2;
|
||||||
|
if (fstat (fd, &st) < 0)
|
||||||
|
result |= 4;
|
||||||
|
else if (st.st_mode & 0077)
|
||||||
|
result |= 8;
|
||||||
|
if (close (fd))
|
||||||
|
result |= 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;]])],
|
||||||
|
[gl_cv_func_working_mkstemp=yes],
|
||||||
|
[gl_cv_func_working_mkstemp=no],
|
||||||
|
[case "$host_os" in
|
||||||
|
# Guess yes on glibc systems.
|
||||||
|
*-gnu*) gl_cv_func_working_mkstemp="guessing yes" ;;
|
||||||
|
# If we don't know, assume the worst.
|
||||||
|
*) gl_cv_func_working_mkstemp="guessing no" ;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
rm -rf conftest.mkstemp
|
||||||
|
])
|
||||||
|
case "$gl_cv_func_working_mkstemp" in
|
||||||
|
*yes) ;;
|
||||||
|
*)
|
||||||
|
REPLACE_MKSTEMP=1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
HAVE_MKSTEMP=0
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
# Prerequisites of lib/mkstemp.c.
|
||||||
|
AC_DEFUN([gl_PREREQ_MKSTEMP],
|
||||||
|
[
|
||||||
|
])
|
25
m4/secure_getenv.m4
Normal file
25
m4/secure_getenv.m4
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
# Look up an environment variable more securely.
|
||||||
|
dnl Copyright 2013-2014 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FUNC_SECURE_GETENV],
|
||||||
|
[
|
||||||
|
dnl Persuade glibc <stdlib.h> to declare secure_getenv().
|
||||||
|
AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
|
||||||
|
|
||||||
|
AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
|
||||||
|
AC_CHECK_FUNCS_ONCE([secure_getenv])
|
||||||
|
if test $ac_cv_func_secure_getenv = no; then
|
||||||
|
HAVE_SECURE_GETENV=0
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
# Prerequisites of lib/secure_getenv.c.
|
||||||
|
AC_DEFUN([gl_PREREQ_SECURE_GETENV], [
|
||||||
|
AC_CHECK_FUNCS([__secure_getenv])
|
||||||
|
if test $ac_cv_func___secure_getenv = no; then
|
||||||
|
AC_CHECK_FUNCS([issetugid])
|
||||||
|
fi
|
||||||
|
])
|
19
m4/tempname.m4
Normal file
19
m4/tempname.m4
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#serial 5
|
||||||
|
|
||||||
|
# Copyright (C) 2006-2007, 2009-2014 Free Software Foundation, Inc.
|
||||||
|
# This file is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# glibc provides __gen_tempname as a wrapper for mk[ds]temp. Expose
|
||||||
|
# it as a public API, and provide it on systems that are lacking.
|
||||||
|
AC_DEFUN([gl_FUNC_GEN_TEMPNAME],
|
||||||
|
[
|
||||||
|
gl_PREREQ_TEMPNAME
|
||||||
|
])
|
||||||
|
|
||||||
|
# Prerequisites of lib/tempname.c.
|
||||||
|
AC_DEFUN([gl_PREREQ_TEMPNAME],
|
||||||
|
[
|
||||||
|
:
|
||||||
|
])
|
Loading…
Add table
Add a link
Reference in a new issue