changeset 7575:483757159eb6

* 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.
author Eric Blake <ebb9@byu.net>
date Fri, 27 Oct 2006 13:51:23 +0000
parents 70e0e23ed97a
children d1f82658ae5a
files ChangeLog MODULES.html.sh lib/mkstemp.c lib/stat_.h lib/tempname.c lib/tempname.h m4/mkstemp.m4 m4/sys_stat_h.m4 m4/tempname.m4 modules/mkstemp modules/sys_stat modules/tempname
diffstat 12 files changed, 147 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+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.
--- a/MODULES.html.sh
+++ b/MODULES.html.sh
@@ -1848,11 +1848,12 @@
   func_module inet_ntop
   func_module inet_pton
   func_module mkdir
+  func_module mkdtemp
   func_module mkstemp
-  func_module mkdtemp
   func_module poll
   func_module readlink
   func_module lstat
+  func_module tempname
   func_module time_r
   func_module timespec
   func_module nanosleep
--- a/lib/mkstemp.c
+++ b/lib/mkstemp.c
@@ -18,7 +18,9 @@
 #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>
--- a/lib/stat_.h
+++ b/lib/stat_.h
@@ -1,4 +1,4 @@
-/* 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.
 
@@ -24,6 +24,8 @@
    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
--- a/lib/tempname.c
+++ b/lib/tempname.c
@@ -17,8 +17,11 @@
    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>
@@ -63,10 +66,10 @@
 # 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
@@ -106,6 +109,7 @@
 # define uint64_t uintmax_t
 #endif
 
+#if _LIBC
 /* Return nonzero if DIR is an existent directory.  */
 static int
 direxists (const char *dir)
@@ -176,6 +180,7 @@
   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[] =
@@ -195,6 +200,7 @@
    __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)
 {
@@ -315,3 +321,15 @@
   __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 */
new file mode 100644
--- /dev/null
+++ b/lib/tempname.h
@@ -0,0 +1,40 @@
+/* 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);
--- a/m4/mkstemp.m4
+++ b/m4/mkstemp.m4
@@ -1,4 +1,4 @@
-#serial 14
+#serial 15
 
 # Copyright (C) 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
@@ -45,10 +45,8 @@
   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
 ])
 
@@ -56,10 +54,3 @@
 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)
-])
--- a/m4/sys_stat_h.m4
+++ b/m4/sys_stat_h.m4
@@ -17,8 +17,12 @@
   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])
new file mode 100644
--- /dev/null
+++ b/m4/tempname.m4
@@ -0,0 +1,24 @@
+#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])
+])
--- a/modules/mkstemp
+++ b/modules/mkstemp
@@ -4,14 +4,11 @@
 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
--- a/modules/sys_stat
+++ b/modules/sys_stat
@@ -7,6 +7,7 @@
 m4/sys_stat_h.m4
 
 Depends-on:
+stat-macros
 
 configure.ac:
 gl_HEADER_SYS_STAT_H
new file mode 100644
--- /dev/null
+++ b/modules/tempname
@@ -0,0 +1,26 @@
+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