Check for mkstemp.
authorTor Lillqvist <tml@iki.fi>
Mon, 30 Oct 2000 21:55:21 +0000 (21:55 +0000)
committerTor Lillqvist <tml@src.gnome.org>
Mon, 30 Oct 2000 21:55:21 +0000 (21:55 +0000)
2000-10-30  Tor Lillqvist  <tml@iki.fi>

* configure.in: Check for mkstemp.

* gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call
it, otherwise use code lifted from glibc.

* gutils.h: Declare it.

* glib.def: Here, too.

17 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
configure.in
glib.def
glib/glib.def
glib/gutils.c
glib/gutils.h
glib/makefile.msc.in
gutils.c
gutils.h
makefile.msc.in

index 7fedca6..23d4930 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2000-10-30  Tor Lillqvist  <tml@iki.fi>
+
+       * configure.in: Check for mkstemp.
+
+       * gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call
+       it, otherwise use code lifted from glibc.
+
+       * gutils.h: Declare it.
+
+       * glib.def: Here, too.
+
 2000-10-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h:
index 7fedca6..23d4930 100644 (file)
@@ -1,3 +1,14 @@
+2000-10-30  Tor Lillqvist  <tml@iki.fi>
+
+       * configure.in: Check for mkstemp.
+
+       * gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call
+       it, otherwise use code lifted from glibc.
+
+       * gutils.h: Declare it.
+
+       * glib.def: Here, too.
+
 2000-10-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h:
index 7fedca6..23d4930 100644 (file)
@@ -1,3 +1,14 @@
+2000-10-30  Tor Lillqvist  <tml@iki.fi>
+
+       * configure.in: Check for mkstemp.
+
+       * gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call
+       it, otherwise use code lifted from glibc.
+
+       * gutils.h: Declare it.
+
+       * glib.def: Here, too.
+
 2000-10-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h:
index 7fedca6..23d4930 100644 (file)
@@ -1,3 +1,14 @@
+2000-10-30  Tor Lillqvist  <tml@iki.fi>
+
+       * configure.in: Check for mkstemp.
+
+       * gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call
+       it, otherwise use code lifted from glibc.
+
+       * gutils.h: Declare it.
+
+       * glib.def: Here, too.
+
 2000-10-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h:
index 7fedca6..23d4930 100644 (file)
@@ -1,3 +1,14 @@
+2000-10-30  Tor Lillqvist  <tml@iki.fi>
+
+       * configure.in: Check for mkstemp.
+
+       * gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call
+       it, otherwise use code lifted from glibc.
+
+       * gutils.h: Declare it.
+
+       * glib.def: Here, too.
+
 2000-10-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h:
index 7fedca6..23d4930 100644 (file)
@@ -1,3 +1,14 @@
+2000-10-30  Tor Lillqvist  <tml@iki.fi>
+
+       * configure.in: Check for mkstemp.
+
+       * gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call
+       it, otherwise use code lifted from glibc.
+
+       * gutils.h: Declare it.
+
+       * glib.def: Here, too.
+
 2000-10-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h:
index 7fedca6..23d4930 100644 (file)
@@ -1,3 +1,14 @@
+2000-10-30  Tor Lillqvist  <tml@iki.fi>
+
+       * configure.in: Check for mkstemp.
+
+       * gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call
+       it, otherwise use code lifted from glibc.
+
+       * gutils.h: Declare it.
+
+       * glib.def: Here, too.
+
 2000-10-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h:
index 7fedca6..23d4930 100644 (file)
@@ -1,3 +1,14 @@
+2000-10-30  Tor Lillqvist  <tml@iki.fi>
+
+       * configure.in: Check for mkstemp.
+
+       * gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call
+       it, otherwise use code lifted from glibc.
+
+       * gutils.h: Declare it.
+
+       * glib.def: Here, too.
+
 2000-10-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h:
index 695c715..4cfafaa 100644 (file)
@@ -351,7 +351,7 @@ GLIB_SIZEOF([$size_includes], ptrdiff_t, ptrdiff_t)
 GLIB_SIZEOF([$size_includes], intmax_t, intmax_t)
 
 # Check for some functions
-AC_CHECK_FUNCS(lstat strerror strsignal memmove vsnprintf strcasecmp strncasecmp poll getcwd)
+AC_CHECK_FUNCS(lstat strerror strsignal memmove mkstemp vsnprintf strcasecmp strncasecmp poll getcwd)
 
 # Check if bcopy can be used for overlapping copies, if memmove isn't found.
 # The check is borrowed from the PERL Configure script.
index 543288a..37f9f9a 100644 (file)
--- a/glib.def
+++ b/glib.def
@@ -239,6 +239,7 @@ EXPORTS
        g_mem_profile
        g_memdup
        g_messages_init
+       g_mkstemp
        g_mutex_init
        g_node_child_index
        g_node_child_position
index 543288a..37f9f9a 100644 (file)
@@ -239,6 +239,7 @@ EXPORTS
        g_mem_profile
        g_memdup
        g_messages_init
+       g_mkstemp
        g_mutex_init
        g_node_child_index
        g_node_child_position
index fac6737..b7b786d 100644 (file)
@@ -40,6 +40,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
+#include <fcntl.h>
 #ifdef HAVE_PWD_H
 #include <pwd.h>
 #endif
 #include <langinfo.h>
 #endif
 
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
 const guint glib_major_version = GLIB_MAJOR_VERSION;
 const guint glib_minor_version = GLIB_MINOR_VERSION;
 const guint glib_micro_version = GLIB_MICRO_VERSION;
@@ -964,3 +969,78 @@ g_get_codeset (void)
 #endif
 #endif
 }
+
+/**
+ * g_mkstemp:
+ *
+ * Open a temporary file
+ *
+ * The parameter is a string that should match the rules for mktemp, i.e.
+ * end in "XXXXXX". The X string will be modified to form the name
+ * of a file that didn't exist.
+ *
+ * Return value: A file handle (as from open()) to the file file
+ * opened for reading and writing. The file is opened in binary mode
+ * on platforms where there is a difference. The file handle should be
+ * closed with close(). In case of errors, -1 is returned.
+ *
+ * From the GNU C library.
+ * Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc.
+ */
+int
+g_mkstemp (char *tmpl)
+{
+#ifdef HAVE_MKSTEMP
+  return mkstemp (tmpl);
+#else
+  int len;
+  char *XXXXXX;
+  int count, fd;
+  static const char letters[] =
+    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+  glong value;
+  GTimeVal tv;
+
+  len = strlen (tmpl);
+  if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
+    return -1;
+
+  /* This is where the Xs start.  */
+  XXXXXX = &tmpl[len - 6];
+
+  /* Get some more or less random data.  */
+  g_get_current_time (&tv);
+  value = tv.tv_usec ^ tv.tv_sec;
+
+  for (count = 0; count < 100; value += 7777, ++count)
+    {
+      glong 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];
+
+      fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600);
+
+      if (fd >= 0)
+       return fd;
+      else if (errno != EEXIST)
+       /* Any other error will apply also to other names we might
+        *  try, and there are 2^32 or so of them, so give up now.
+        */
+       return -1;
+    }
+
+  /* We got out of the loop because we ran out of combinations to try.  */
+  return -1;
+#endif
+}
index c4dcb1b..e70ec48 100644 (file)
@@ -161,6 +161,9 @@ gchar*      g_path_get_dirname      (const gchar *file_name);
 /* Get the codeset for the current locale */
 /* gchar * g_get_codeset    (void); */
 
+/* Wrapper / workalike for mkstemp() */
+int     g_mkstemp (char *tmpl);
+
 /* return the environment string for the variable. The returned memory
  * must not be freed. */
 gchar*  g_getenv               (const gchar *variable);
index 53002c3..e78672c 100644 (file)
@@ -96,6 +96,7 @@ glib-$(GLIB_VER).dll : $(glib_OBJECTS) glib.def
 
 gspawn-win32-helper.exe : gspawn-win32.c glib-$(GLIB_VER).dll
        $(CC) $(CFLAGS) -Fe$@ -DGSPAWN_HELPER -DG_LOG_DOMAIN=\"gspawn-win32-helper\" gspawn-win32.c glib-$(GLIB_VER).lib $(LDFLAGS) /subsystem:windows user32.lib
+       @erase gspawn-win32.obj
 
 ################ subdirectories
 
index fac6737..b7b786d 100644 (file)
--- a/gutils.c
+++ b/gutils.c
@@ -40,6 +40,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
+#include <fcntl.h>
 #ifdef HAVE_PWD_H
 #include <pwd.h>
 #endif
 #include <langinfo.h>
 #endif
 
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
 const guint glib_major_version = GLIB_MAJOR_VERSION;
 const guint glib_minor_version = GLIB_MINOR_VERSION;
 const guint glib_micro_version = GLIB_MICRO_VERSION;
@@ -964,3 +969,78 @@ g_get_codeset (void)
 #endif
 #endif
 }
+
+/**
+ * g_mkstemp:
+ *
+ * Open a temporary file
+ *
+ * The parameter is a string that should match the rules for mktemp, i.e.
+ * end in "XXXXXX". The X string will be modified to form the name
+ * of a file that didn't exist.
+ *
+ * Return value: A file handle (as from open()) to the file file
+ * opened for reading and writing. The file is opened in binary mode
+ * on platforms where there is a difference. The file handle should be
+ * closed with close(). In case of errors, -1 is returned.
+ *
+ * From the GNU C library.
+ * Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc.
+ */
+int
+g_mkstemp (char *tmpl)
+{
+#ifdef HAVE_MKSTEMP
+  return mkstemp (tmpl);
+#else
+  int len;
+  char *XXXXXX;
+  int count, fd;
+  static const char letters[] =
+    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+  glong value;
+  GTimeVal tv;
+
+  len = strlen (tmpl);
+  if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
+    return -1;
+
+  /* This is where the Xs start.  */
+  XXXXXX = &tmpl[len - 6];
+
+  /* Get some more or less random data.  */
+  g_get_current_time (&tv);
+  value = tv.tv_usec ^ tv.tv_sec;
+
+  for (count = 0; count < 100; value += 7777, ++count)
+    {
+      glong 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];
+
+      fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600);
+
+      if (fd >= 0)
+       return fd;
+      else if (errno != EEXIST)
+       /* Any other error will apply also to other names we might
+        *  try, and there are 2^32 or so of them, so give up now.
+        */
+       return -1;
+    }
+
+  /* We got out of the loop because we ran out of combinations to try.  */
+  return -1;
+#endif
+}
index c4dcb1b..e70ec48 100644 (file)
--- a/gutils.h
+++ b/gutils.h
@@ -161,6 +161,9 @@ gchar*      g_path_get_dirname      (const gchar *file_name);
 /* Get the codeset for the current locale */
 /* gchar * g_get_codeset    (void); */
 
+/* Wrapper / workalike for mkstemp() */
+int     g_mkstemp (char *tmpl);
+
 /* return the environment string for the variable. The returned memory
  * must not be freed. */
 gchar*  g_getenv               (const gchar *variable);
index 53002c3..e78672c 100644 (file)
@@ -96,6 +96,7 @@ glib-$(GLIB_VER).dll : $(glib_OBJECTS) glib.def
 
 gspawn-win32-helper.exe : gspawn-win32.c glib-$(GLIB_VER).dll
        $(CC) $(CFLAGS) -Fe$@ -DGSPAWN_HELPER -DG_LOG_DOMAIN=\"gspawn-win32-helper\" gspawn-win32.c glib-$(GLIB_VER).lib $(LDFLAGS) /subsystem:windows user32.lib
+       @erase gspawn-win32.obj
 
 ################ subdirectories