mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-24 03:02:10 +01:00
Bug 566348 - g_file_open_tmp uses the wrong g_mkstemp on win32
2009-01-05 Tor Lillqvist <tml@iki.fi> Bug 566348 - g_file_open_tmp uses the wrong g_mkstemp on win32 * glib/gfileutils.c: Move the binary compatibility versions of g_file_test(), g_file_get_contents(), g_mkstemp() and g_file_open_tmp() last in the file. Remove the restriction that the XXXXXX is last in the template in the binary compatibility version of g_mkstemp(). Thanks to Morten Welinder and Jody Goldberg. svn path=/branches/glib-2-18/; revision=7768
This commit is contained in:
parent
db4a20cae9
commit
b76458d893
11
ChangeLog
11
ChangeLog
@ -1,3 +1,14 @@
|
|||||||
|
2009-01-05 Tor Lillqvist <tml@iki.fi>
|
||||||
|
|
||||||
|
Bug 566348 - g_file_open_tmp uses the wrong g_mkstemp on win32
|
||||||
|
|
||||||
|
* glib/gfileutils.c: Move the binary compatibility versions of
|
||||||
|
g_file_test(), g_file_get_contents(), g_mkstemp() and
|
||||||
|
g_file_open_tmp() last in the file. Remove the restriction that
|
||||||
|
the XXXXXX is last in the template in the binary compatibility
|
||||||
|
version of g_mkstemp(). Thanks to Morten Welinder and Jody
|
||||||
|
Goldberg.
|
||||||
|
|
||||||
2008-11-28 Matthias Clasen <mclasen@redhat.com>
|
2008-11-28 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
bug 562562 – glib-2-18 branch does not build because g_assert_error
|
bug 562562 – glib-2-18 branch does not build because g_assert_error
|
||||||
|
@ -316,31 +316,6 @@ g_file_test (const gchar *filename,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined (G_OS_WIN32) && !defined (_WIN64)
|
|
||||||
|
|
||||||
#undef g_file_test
|
|
||||||
|
|
||||||
/* Binary compatibility version. Not for newly compiled code. */
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
g_file_test (const gchar *filename,
|
|
||||||
GFileTest test)
|
|
||||||
{
|
|
||||||
gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL);
|
|
||||||
gboolean retval;
|
|
||||||
|
|
||||||
if (utf8_filename == NULL)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
retval = g_file_test_utf8 (utf8_filename, test);
|
|
||||||
|
|
||||||
g_free (utf8_filename);
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
GQuark
|
GQuark
|
||||||
g_file_error_quark (void)
|
g_file_error_quark (void)
|
||||||
{
|
{
|
||||||
@ -860,33 +835,6 @@ g_file_get_contents (const gchar *filename,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined (G_OS_WIN32) && !defined (_WIN64)
|
|
||||||
|
|
||||||
#undef g_file_get_contents
|
|
||||||
|
|
||||||
/* Binary compatibility version. Not for newly compiled code. */
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
g_file_get_contents (const gchar *filename,
|
|
||||||
gchar **contents,
|
|
||||||
gsize *length,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, error);
|
|
||||||
gboolean retval;
|
|
||||||
|
|
||||||
if (utf8_filename == NULL)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
retval = g_file_get_contents_utf8 (utf8_filename, contents, length, error);
|
|
||||||
|
|
||||||
g_free (utf8_filename);
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
rename_file (const char *old_name,
|
rename_file (const char *old_name,
|
||||||
const char *new_name,
|
const char *new_name,
|
||||||
@ -1238,75 +1186,6 @@ g_mkstemp (gchar *tmpl)
|
|||||||
return create_temp_file (tmpl, 0600);
|
return create_temp_file (tmpl, 0600);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined (G_OS_WIN32) && !defined (_WIN64)
|
|
||||||
|
|
||||||
#undef g_mkstemp
|
|
||||||
|
|
||||||
/* Binary compatibility version. Not for newly compiled code. */
|
|
||||||
|
|
||||||
gint
|
|
||||||
g_mkstemp (gchar *tmpl)
|
|
||||||
{
|
|
||||||
char *XXXXXX;
|
|
||||||
int count, fd;
|
|
||||||
static const char letters[] =
|
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
||||||
static const int NLETTERS = sizeof (letters) - 1;
|
|
||||||
glong value;
|
|
||||||
GTimeVal tv;
|
|
||||||
static int counter = 0;
|
|
||||||
|
|
||||||
/* find the last occurrence of 'XXXXXX' */
|
|
||||||
XXXXXX = g_strrstr (tmpl, "XXXXXX");
|
|
||||||
|
|
||||||
if (!XXXXXX || strcmp (XXXXXX, "XXXXXX"))
|
|
||||||
{
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get some more or less random data. */
|
|
||||||
g_get_current_time (&tv);
|
|
||||||
value = (tv.tv_usec ^ tv.tv_sec) + counter++;
|
|
||||||
|
|
||||||
for (count = 0; count < 100; value += 7777, ++count)
|
|
||||||
{
|
|
||||||
glong v = value;
|
|
||||||
|
|
||||||
/* Fill in the random bits. */
|
|
||||||
XXXXXX[0] = letters[v % NLETTERS];
|
|
||||||
v /= NLETTERS;
|
|
||||||
XXXXXX[1] = letters[v % NLETTERS];
|
|
||||||
v /= NLETTERS;
|
|
||||||
XXXXXX[2] = letters[v % NLETTERS];
|
|
||||||
v /= NLETTERS;
|
|
||||||
XXXXXX[3] = letters[v % NLETTERS];
|
|
||||||
v /= NLETTERS;
|
|
||||||
XXXXXX[4] = letters[v % NLETTERS];
|
|
||||||
v /= NLETTERS;
|
|
||||||
XXXXXX[5] = letters[v % NLETTERS];
|
|
||||||
|
|
||||||
/* This is the backward compatibility system codepage version,
|
|
||||||
* thus use normal open().
|
|
||||||
*/
|
|
||||||
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. */
|
|
||||||
errno = EEXIST;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* g_file_open_tmp:
|
* g_file_open_tmp:
|
||||||
* @tmpl: Template for file name, as in g_mkstemp(), basename only,
|
* @tmpl: Template for file name, as in g_mkstemp(), basename only,
|
||||||
@ -1417,39 +1296,6 @@ g_file_open_tmp (const gchar *tmpl,
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined (G_OS_WIN32) && !defined (_WIN64)
|
|
||||||
|
|
||||||
#undef g_file_open_tmp
|
|
||||||
|
|
||||||
/* Binary compatibility version. Not for newly compiled code. */
|
|
||||||
|
|
||||||
gint
|
|
||||||
g_file_open_tmp (const gchar *tmpl,
|
|
||||||
gchar **name_used,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
gchar *utf8_tmpl = g_locale_to_utf8 (tmpl, -1, NULL, NULL, error);
|
|
||||||
gchar *utf8_name_used;
|
|
||||||
gint retval;
|
|
||||||
|
|
||||||
if (utf8_tmpl == NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
retval = g_file_open_tmp_utf8 (utf8_tmpl, &utf8_name_used, error);
|
|
||||||
|
|
||||||
if (retval == -1)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (name_used)
|
|
||||||
*name_used = g_locale_from_utf8 (utf8_name_used, -1, NULL, NULL, NULL);
|
|
||||||
|
|
||||||
g_free (utf8_name_used);
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static gchar *
|
static gchar *
|
||||||
g_build_path_va (const gchar *separator,
|
g_build_path_va (const gchar *separator,
|
||||||
const gchar *first_element,
|
const gchar *first_element,
|
||||||
@ -1926,5 +1772,149 @@ g_file_read_link (const gchar *filename,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* NOTE : Keep this part last to ensure nothing in this file uses the
|
||||||
|
* below binary compatibility versions.
|
||||||
|
*/
|
||||||
|
#if defined (G_OS_WIN32) && !defined (_WIN64)
|
||||||
|
|
||||||
|
/* Binary compatibility versions. Will be called by code compiled
|
||||||
|
* against quite old (pre-2.8, I think) headers only, not from more
|
||||||
|
* recently compiled code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef g_file_test
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
g_file_test (const gchar *filename,
|
||||||
|
GFileTest test)
|
||||||
|
{
|
||||||
|
gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL);
|
||||||
|
gboolean retval;
|
||||||
|
|
||||||
|
if (utf8_filename == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
retval = g_file_test_utf8 (utf8_filename, test);
|
||||||
|
|
||||||
|
g_free (utf8_filename);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef g_file_get_contents
|
||||||
|
|
||||||
|
/* Binary compatibility version. Not for newly compiled code. */
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
g_file_get_contents (const gchar *filename,
|
||||||
|
gchar **contents,
|
||||||
|
gsize *length,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, error);
|
||||||
|
gboolean retval;
|
||||||
|
|
||||||
|
if (utf8_filename == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
retval = g_file_get_contents_utf8 (utf8_filename, contents, length, error);
|
||||||
|
|
||||||
|
g_free (utf8_filename);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef g_mkstemp
|
||||||
|
|
||||||
|
gint
|
||||||
|
g_mkstemp (gchar *tmpl)
|
||||||
|
{
|
||||||
|
char *XXXXXX;
|
||||||
|
int count, fd;
|
||||||
|
static const char letters[] =
|
||||||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||||
|
static const int NLETTERS = sizeof (letters) - 1;
|
||||||
|
glong value;
|
||||||
|
GTimeVal tv;
|
||||||
|
static int counter = 0;
|
||||||
|
|
||||||
|
/* find the last occurrence of 'XXXXXX' */
|
||||||
|
XXXXXX = g_strrstr (tmpl, "XXXXXX");
|
||||||
|
|
||||||
|
if (!XXXXXX)
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get some more or less random data. */
|
||||||
|
g_get_current_time (&tv);
|
||||||
|
value = (tv.tv_usec ^ tv.tv_sec) + counter++;
|
||||||
|
|
||||||
|
for (count = 0; count < 100; value += 7777, ++count)
|
||||||
|
{
|
||||||
|
glong v = value;
|
||||||
|
|
||||||
|
/* Fill in the random bits. */
|
||||||
|
XXXXXX[0] = letters[v % NLETTERS];
|
||||||
|
v /= NLETTERS;
|
||||||
|
XXXXXX[1] = letters[v % NLETTERS];
|
||||||
|
v /= NLETTERS;
|
||||||
|
XXXXXX[2] = letters[v % NLETTERS];
|
||||||
|
v /= NLETTERS;
|
||||||
|
XXXXXX[3] = letters[v % NLETTERS];
|
||||||
|
v /= NLETTERS;
|
||||||
|
XXXXXX[4] = letters[v % NLETTERS];
|
||||||
|
v /= NLETTERS;
|
||||||
|
XXXXXX[5] = letters[v % NLETTERS];
|
||||||
|
|
||||||
|
/* This is the backward compatibility system codepage version,
|
||||||
|
* thus use normal open().
|
||||||
|
*/
|
||||||
|
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. */
|
||||||
|
errno = EEXIST;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef g_file_open_tmp
|
||||||
|
|
||||||
|
gint
|
||||||
|
g_file_open_tmp (const gchar *tmpl,
|
||||||
|
gchar **name_used,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
gchar *utf8_tmpl = g_locale_to_utf8 (tmpl, -1, NULL, NULL, error);
|
||||||
|
gchar *utf8_name_used;
|
||||||
|
gint retval;
|
||||||
|
|
||||||
|
if (utf8_tmpl == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
retval = g_file_open_tmp_utf8 (utf8_tmpl, &utf8_name_used, error);
|
||||||
|
|
||||||
|
if (retval == -1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (name_used)
|
||||||
|
*name_used = g_locale_from_utf8 (utf8_name_used, -1, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
g_free (utf8_name_used);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#define __G_FILEUTILS_C__
|
#define __G_FILEUTILS_C__
|
||||||
#include "galiasdef.c"
|
#include "galiasdef.c"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user