+2006-10-27 Eric Blake <ebb9@byu.net>
+
+ * MODULES.html.sh: Document tempname.
+ * modules/mkstemp (Depends-on): Add tempname, and drop transitive
+ dependencies.
+ (Files): Move lib/tempname.c...
+ * modules/tempname: ...to this new module.
+ * m4/mkstemp.m4 (gl_FUNC_MKSTEMP): Remove tempname checks.
+ (gl_PREREQ_TEMPNAME): Move...
+ * m4/tempname.m4: ...to this new file.
+ * lib/mkstemp.c (includes) [!_LIBC]: Use tempname.h.
+ * modules/sys_stat (Depends-on): Add stat-macros.
+ * lib/stat_.h (includes): Pick up stat macros.
+ * m4/sys_stat_h.m4 (gl_HEADER_SYS_STAT_H): Replace <sys/stat.h>
+ if stat macros are broken.
+ * lib/tempname.c (includes): No need to include "stat-macros.h".
+ (__gen_tempname) [!_LIBC]: Expose as gen_tempname.
+ (direxists, __path_search) [!_LIBC]: Don't compile these in
+ gnulib; the tmpdir module covers that.
+ * lib/tempname.h: New file.
+
2006-10-26 Paul Eggert <eggert@cs.ucla.edu>
* COPYING: Explain how gnulib-tool converts licence headers.
func_module inet_ntop
func_module inet_pton
func_module mkdir
- func_module mkstemp
func_module mkdtemp
+ func_module mkstemp
func_module poll
func_module readlink
func_module lstat
+ func_module tempname
func_module time_r
func_module timespec
func_module nanosleep
#if !_LIBC
# include <config.h>
# include "mkstemp.h"
-int __gen_tempname ();
+# include "tempname.h"
+# define __gen_tempname gen_tempname
+# define __GT_FILE GT_FILE
#endif
#include <stdio.h>
-/* Provide a complete sys/stat header file.
+/* Provide a more complete sys/stat header file.
Copyright (C) 2006 Free Software Foundation, Inc.
Written by Eric Blake.
needed by an application. Start with what the system provides. */
#include @ABSOLUTE_SYS_STAT_H@
+#include "stat-macros.h"
+
/* mingw does not support symlinks, therefore it does not have lstat. But
without links, stat does just fine. */
#if ! HAVE_LSTAT
with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+/* Extracted from glibc sysdeps/posix/tempname.c. See also tmpdir.c. */
+
#if !_LIBC
# include <config.h>
+# include "tempname.h"
#endif
#include <sys/types.h>
# define small_open __open
# define large_open __open64
#else
-# include "stat-macros.h"
# define struct_stat64 struct stat
# define small_open open
# define large_open open
+# define __gen_tempname gen_tempname
# define __getpid getpid
# define __gettimeofday gettimeofday
# define __mkdir mkdir
# define uint64_t uintmax_t
#endif
+#if _LIBC
/* Return nonzero if DIR is an existent directory. */
static int
direxists (const char *dir)
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[] =
__GT_DIR: create a directory, which will be mode 0700.
We use a clever algorithm to get hard-to-predict names. */
+#if _LIBC || !HAVE___GEN_TEMPNAME
int
__gen_tempname (char *tmpl, int kind)
{
__set_errno (EEXIST);
return -1;
}
+
+#else /* !_LIBC && HAVE___GEN_TEMPNAME */
+
+# undef __gen_tempname
+extern int __gen_tempname (char *, int);
+int
+gen_tempname (char *tmpl, int kind)
+{
+ return __gen_tempname (tmpl, kind);
+}
+
+#endif /* !_LIBC && HAVE___GEN_TEMPNAME */
--- /dev/null
+/* Create a temporary file or directory.
+
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* header written by Eric Blake */
+
+/* In gnulib, always prefer large files. GT_FILE maps to
+ __GT_BIGFILE, not __GT_FILE, for a reason. */
+#define GT_FILE 1
+#define GT_DIR 2
+#define GT_NOCREATE 3
+
+/* Generate a temporary file name based on TMPL. TMPL must match the
+ rules for mk[s]temp (i.e. end in "XXXXXX"). 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 kind);
-#serial 14
+#serial 15
# Copyright (C) 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
if test $gl_cv_func_working_mkstemp != yes; then
AC_DEFINE([__MKSTEMP_PREFIX], [[rpl_]],
[Define to rpl_ if the mkstemp replacement function should be used.])
- AC_LIBOBJ(mkstemp)
- AC_LIBOBJ(tempname)
+ AC_LIBOBJ([mkstemp])
gl_PREREQ_MKSTEMP
- gl_PREREQ_TEMPNAME
fi
])
AC_DEFUN([gl_PREREQ_MKSTEMP],
[
])
-
-# Prerequisites of lib/tempname.c.
-AC_DEFUN([gl_PREREQ_TEMPNAME],
-[
- AC_CHECK_HEADERS_ONCE(sys/time.h)
- AC_CHECK_FUNCS(__secure_getenv gettimeofday)
-])
dnl instead.
AC_CHECK_DECLS([mkdir], [], [], [#include <sys/stat.h>])
+ dnl Check for broken stat macros.
+ AC_REQUIRE([AC_HEADER_STAT])
+
SYS_STAT_H=
- if test $ac_cv_func_lstat:$ac_cv_have_decl_mkdir != yes:yes ; then
+ if test $ac_cv_func_lstat:$ac_cv_have_decl_mkdir:$ac_cv_header_stat_broken \
+ != yes:yes:no ; then
gl_ABSOLUTE_HEADER([sys/stat.h])
ABSOLUTE_SYS_STAT_H=\"$gl_cv_absolute_sys_stat_h\"
AC_CHECK_HEADERS([io.h])
--- /dev/null
+#serial 1
+
+# Copyright (C) 2006 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],
+[
+ AC_REQUIRE([AC_SYS_LARGEFILE])
+ AC_CHECK_FUNCS_ONCE([__gen_tempname])
+
+ AC_LIBOBJ([tempname])
+ gl_PREREQ_TEMPNAME
+])
+
+# Prerequisites of lib/tempname.c.
+AC_DEFUN([gl_PREREQ_TEMPNAME],
+[
+ AC_CHECK_HEADERS_ONCE([sys/time.h])
+ AC_CHECK_FUNCS_ONCE([gettimeofday])
+])
Files:
lib/mkstemp.h
lib/mkstemp.c
-lib/tempname.c
m4/mkstemp.m4
Depends-on:
extensions
-stat-macros
-stdint
-sys_stat
+tempname
configure.ac:
gl_FUNC_MKSTEMP
m4/sys_stat_h.m4
Depends-on:
+stat-macros
configure.ac:
gl_HEADER_SYS_STAT_H
--- /dev/null
+Description:
+gen_tempname() function: create a private temporary file or directory.
+
+Files:
+lib/tempname.c
+lib/tempname.h
+m4/tempname.m4
+
+Depends-on:
+extensions
+stdint
+sys_stat
+
+configure.ac:
+gl_FUNC_GEN_TEMPNAME
+
+Makefile.am:
+
+Include:
+"tempname.h"
+
+License:
+GPL
+
+Maintainer:
+Eric Blake and Jim Meyering