Remove warnings about conflicts with the stable version.
[platform/upstream/glib.git] / gfileutils.c
index e5cc56a..86b33bc 100644 (file)
 #include <unistd.h>
 #endif
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <errno.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#include <stdlib.h>
 
 #ifdef G_OS_WIN32
 #include <io.h>
@@ -60,7 +62,7 @@
 #define O_BINARY 0
 #endif
 
-#define _(x) x
+#include "glibintl.h"
 
 /**
  * g_file_test:
@@ -115,10 +117,25 @@ g_file_error_quark (void)
   return q;
 }
 
+/**
+ * g_file_error_from_errno:
+ * @err_no: an "errno" value
+ * 
+ * Gets a #GFileError constant based on the passed-in errno.
+ * For example, if you pass in EEXIST this function returns
+ * #G_FILE_ERROR_EXIST. Unlike errno values, you can portably
+ * assume that all #GFileError values will exist.
+ *
+ * Normally a #GFileError value goes into a #GError returned
+ * from a function that manipulates files. So you would use
+ * g_file_error_from_errno() when constructing a #GError.
+ * 
+ * Return value: #GFileError corresponding to the given errno
+ **/
 GFileError
-g_file_error_from_errno (gint en)
+g_file_error_from_errno (gint err_no)
 {
-  switch (en)
+  switch (err_no)
     {
 #ifdef EEXIST
     case EEXIST:
@@ -376,7 +393,8 @@ get_contents_posix (const gchar *filename,
   struct stat stat_buf;
   gint fd;
   
-  fd = open (filename, O_RDONLY);
+  /* O_BINARY useful on Cygwin */
+  fd = open (filename, O_RDONLY|O_BINARY);
 
   if (fd < 0)
     {
@@ -522,7 +540,6 @@ g_file_get_contents (const gchar *filename,
  * 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.
- *
  */
 int
 g_mkstemp (char *tmpl)
@@ -538,6 +555,7 @@ g_mkstemp (char *tmpl)
   static const int NLETTERS = sizeof (letters) - 1;
   glong value;
   GTimeVal tv;
+  static int counter = 0;
 
   len = strlen (tmpl);
   if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
@@ -548,7 +566,7 @@ g_mkstemp (char *tmpl)
 
   /* Get some more or less random data.  */
   g_get_current_time (&tv);
-  value = tv.tv_usec ^ tv.tv_sec;
+  value = (tv.tv_usec ^ tv.tv_sec) + counter++;
 
   for (count = 0; count < 100; value += 7777, ++count)
     {
@@ -585,62 +603,67 @@ g_mkstemp (char *tmpl)
 
 /**
  * g_file_open_tmp:
- * @template: Template for file name, as in g_mkstemp, basename only
+ * @tmpl: Template for file name, as in g_mkstemp, basename only
  * @name_used: location to store actual name used
  * @error: return location for a #GError
  *
  * Opens a file for writing in the preferred directory for temporary
  * files (as returned by g_get_tmp_dir()). 
  *
- * @template should be a string ending with six 'X' characters, as the
- * parameter to g_mkstemp() (or mktemp()). However, unlike these
+ * @tmpl should be a string ending with six 'X' characters, as the
+ * parameter to g_mkstemp() (or mkstemp()). However, unlike these
  * functions, the template should only be a basename, no directory
  * components are allowed. If template is NULL, a default template is
  * used.
  *
+ * Note that in contrast to g_mkstemp() (and mkstemp()) @tmpl is not
+ * modified, and might thus be a read-only literal string.
+ *
  * The actual name used is returned in @name_used if non-NULL. This
  * string should be freed with g_free when not needed any longer.
  *
- * If some error occurs, @error is set, and -1 is returned. Otherwise,
- * the file descriptor to a file opened for reading and writing with
- * g_mkstemp() is returned.
+ * Return value: A file handle (as from open()) to the 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 and
+ * @error will be set.
  **/
 int
-g_file_open_tmp (const char *template,
+g_file_open_tmp (const char *tmpl,
                 char      **name_used,
                 GError    **error)
 {
   int retval;
-  char mytemplate[10];
-  char *tmpdir;
+  const char *tmpdir;
   char *sep;
   char *fulltemplate;
 
-  if (template == NULL)
-    {
-      strcpy (mytemplate, ".XXXXXX");
-      template = mytemplate;
-    }
+  if (tmpl == NULL)
+    tmpl = ".XXXXXX";
 
-  if (strchr (template, G_DIR_SEPARATOR))
+  if (strchr (tmpl, G_DIR_SEPARATOR)
+#ifdef G_OS_WIN32
+      || strchr (tmpl, '/')
+#endif
+                                   )
     {
       g_set_error (error,
                   G_FILE_ERROR,
                   G_FILE_ERROR_FAILED,
                   _("Template '%s' illegal, should not contain a '%s'"),
-                  template, G_DIR_SEPARATOR_S);
+                  tmpl, G_DIR_SEPARATOR_S);
 
       return -1;
     }
   
-  if (strlen (template) < 6 ||
-      strcmp (template + strlen (template) - 6, "XXXXXX") != 0)
+  if (strlen (tmpl) < 6 ||
+      strcmp (tmpl + strlen (tmpl) - 6, "XXXXXX") != 0)
     {
       g_set_error (error,
                   G_FILE_ERROR,
                   G_FILE_ERROR_FAILED,
-                  _("Template '%s' doesn end with XXXXXX"),
-                  template);
+                  _("Template '%s' doesn't end with XXXXXX"),
+                  tmpl);
       return -1;
     }
 
@@ -651,7 +674,7 @@ g_file_open_tmp (const char *template,
   else
     sep = G_DIR_SEPARATOR_S;
 
-  fulltemplate = g_strconcat (tmpdir, sep, template, NULL);
+  fulltemplate = g_strconcat (tmpdir, sep, tmpl, NULL);
 
   retval = g_mkstemp (fulltemplate);