* MODULES.html.sh: Document tempname.
[gnulib.git] / m4 / mkstemp.m4
index 7059687..27367cb 100644 (file)
@@ -1,46 +1,56 @@
-#serial 1
+#serial 15
 
-# On some systems (e.g., HPUX-10.20), mkstemp has the silly limit that it
-# can create no more than 26 files from a given template.  Other systems
-# lack mkstemp altogether.  On either type of system, arrange to use the
-# replacement function.
-AC_DEFUN([UTILS_FUNC_MKSTEMP],
-[dnl
-  AC_REPLACE_FUNCS(mkstemp)
-  if test $ac_cv_func_mkstemp = no; then
-    utils_cv_func_mkstemp_limitations=yes
-  else
-    AC_CACHE_CHECK([for mkstemp limitations],
-      utils_cv_func_mkstemp_limitations,
-      [
-       AC_TRY_RUN([
-#         include <stdlib.h>
-         int main ()
-         {
-           int i;
-           for (i = 0; i < 30; i++)
+# Copyright (C) 2001, 2003, 2004, 2005, 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.
+
+# 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 systems like the above, arrange to use the replacement function.
+AC_DEFUN([gl_FUNC_MKSTEMP],
+[
+  AC_REQUIRE([AC_SYS_LARGEFILE])
+
+  AC_CACHE_CHECK([for working mkstemp],
+    [gl_cv_func_working_mkstemp],
+    [
+      mkdir conftest.mkstemp
+      AC_RUN_IFELSE(
+       [AC_LANG_PROGRAM(
+         [AC_INCLUDES_DEFAULT],
+         [[int i;
+           off_t large = (off_t) 4294967295u;
+           if (large < 0)
+             large = 2147483647;
+           for (i = 0; i < 70; i++)
              {
-               char template[] = "conftestXXXXXX";
-               int fd = mkstemp (template);
-               if (fd == -1)
-                 exit (1);
+               char template[] = "conftest.mkstemp/coXXXXXX";
+               int (*mkstemp_function) (char *) = mkstemp;
+               int fd = mkstemp_function (template);
+               if (fd < 0 || lseek (fd, large, SEEK_SET) != large)
+                 return 1;
                close (fd);
              }
-           exit (0);
-         }
-         ],
-       utils_cv_func_mkstemp_limitations=no,
-       utils_cv_func_mkstemp_limitations=yes,
-       utils_cv_func_mkstemp_limitations=yes
-       )
-      ]
-    )
-  fi
+           return 0;]])],
+       [gl_cv_func_working_mkstemp=yes],
+       [gl_cv_func_working_mkstemp=no],
+       [gl_cv_func_working_mkstemp=no])
+      rm -rf conftest.mkstemp
+    ])
 
-  if test $utils_cv_func_mkstemp_limitations = yes; then
-    AC_LIBOBJ(mkstemp)
-    AC_LIBOBJ(tempname)
-    AC_DEFINE(mkstemp, rpl_mkstemp,
-      [Define to rpl_mkstemp if the replacement function should be used.])
+  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])
+    gl_PREREQ_MKSTEMP
   fi
 ])
+
+# Prerequisites of lib/mkstemp.c.
+AC_DEFUN([gl_PREREQ_MKSTEMP],
+[
+])