gspawn: Remove old win32 codepage ABI compat code

Makes new code link against the normal symbol names again.
Variants with utf8 suffix are there for existing binaries/ABI compat.

https://bugzilla.gnome.org/show_bug.cgi?id=780634
This commit is contained in:
Christoph Reiter
2017-03-28 08:02:55 +02:00
parent fad5f5bd17
commit 23dffdd949
2 changed files with 174 additions and 362 deletions

View File

@@ -211,25 +211,25 @@ G_DEFINE_QUARK (g-exec-error-quark, g_spawn_error)
G_DEFINE_QUARK (g-spawn-exit-error-quark, g_spawn_exit_error) G_DEFINE_QUARK (g-spawn-exit-error-quark, g_spawn_exit_error)
gboolean gboolean
g_spawn_async_utf8 (const gchar *working_directory, g_spawn_async (const gchar *working_directory,
gchar **argv, gchar **argv,
gchar **envp, gchar **envp,
GSpawnFlags flags, GSpawnFlags flags,
GSpawnChildSetupFunc child_setup, GSpawnChildSetupFunc child_setup,
gpointer user_data, gpointer user_data,
GPid *child_handle, GPid *child_handle,
GError **error) GError **error)
{ {
g_return_val_if_fail (argv != NULL, FALSE); g_return_val_if_fail (argv != NULL, FALSE);
return g_spawn_async_with_pipes_utf8 (working_directory, return g_spawn_async_with_pipes (working_directory,
argv, envp, argv, envp,
flags, flags,
child_setup, child_setup,
user_data, user_data,
child_handle, child_handle,
NULL, NULL, NULL, NULL, NULL, NULL,
error); error);
} }
/* Avoids a danger in threaded situations (calling close() /* Avoids a danger in threaded situations (calling close()
@@ -876,16 +876,16 @@ do_spawn_with_pipes (gint *exit_status,
} }
gboolean gboolean
g_spawn_sync_utf8 (const gchar *working_directory, g_spawn_sync (const gchar *working_directory,
gchar **argv, gchar **argv,
gchar **envp, gchar **envp,
GSpawnFlags flags, GSpawnFlags flags,
GSpawnChildSetupFunc child_setup, GSpawnChildSetupFunc child_setup,
gpointer user_data, gpointer user_data,
gchar **standard_output, gchar **standard_output,
gchar **standard_error, gchar **standard_error,
gint *exit_status, gint *exit_status,
GError **error) GError **error)
{ {
gint outpipe = -1; gint outpipe = -1;
gint errpipe = -1; gint errpipe = -1;
@@ -1118,17 +1118,17 @@ g_spawn_sync_utf8 (const gchar *working_directory,
} }
gboolean gboolean
g_spawn_async_with_pipes_utf8 (const gchar *working_directory, g_spawn_async_with_pipes (const gchar *working_directory,
gchar **argv, gchar **argv,
gchar **envp, gchar **envp,
GSpawnFlags flags, GSpawnFlags flags,
GSpawnChildSetupFunc child_setup, GSpawnChildSetupFunc child_setup,
gpointer user_data, gpointer user_data,
GPid *child_handle, GPid *child_handle,
gint *standard_input, gint *standard_input,
gint *standard_output, gint *standard_output,
gint *standard_error, gint *standard_error,
GError **error) GError **error)
{ {
g_return_val_if_fail (argv != NULL, FALSE); g_return_val_if_fail (argv != NULL, FALSE);
g_return_val_if_fail (standard_output == NULL || g_return_val_if_fail (standard_output == NULL ||
@@ -1155,11 +1155,11 @@ g_spawn_async_with_pipes_utf8 (const gchar *working_directory,
} }
gboolean gboolean
g_spawn_command_line_sync_utf8 (const gchar *command_line, g_spawn_command_line_sync (const gchar *command_line,
gchar **standard_output, gchar **standard_output,
gchar **standard_error, gchar **standard_error,
gint *exit_status, gint *exit_status,
GError **error) GError **error)
{ {
gboolean retval; gboolean retval;
gchar **argv = 0; gchar **argv = 0;
@@ -1171,24 +1171,24 @@ g_spawn_command_line_sync_utf8 (const gchar *command_line,
error)) error))
return FALSE; return FALSE;
retval = g_spawn_sync_utf8 (NULL, retval = g_spawn_sync (NULL,
argv, argv,
NULL, NULL,
G_SPAWN_SEARCH_PATH, G_SPAWN_SEARCH_PATH,
NULL, NULL,
NULL, NULL,
standard_output, standard_output,
standard_error, standard_error,
exit_status, exit_status,
error); error);
g_strfreev (argv); g_strfreev (argv);
return retval; return retval;
} }
gboolean gboolean
g_spawn_command_line_async_utf8 (const gchar *command_line, g_spawn_command_line_async (const gchar *command_line,
GError **error) GError **error)
{ {
gboolean retval; gboolean retval;
gchar **argv = 0; gchar **argv = 0;
@@ -1200,14 +1200,14 @@ g_spawn_command_line_async_utf8 (const gchar *command_line,
error)) error))
return FALSE; return FALSE;
retval = g_spawn_async_utf8 (NULL, retval = g_spawn_async (NULL,
argv, argv,
NULL, NULL,
G_SPAWN_SEARCH_PATH, G_SPAWN_SEARCH_PATH,
NULL, NULL,
NULL, NULL,
NULL, NULL,
error); error);
g_strfreev (argv); g_strfreev (argv);
return retval; return retval;
@@ -1238,273 +1238,138 @@ g_spawn_check_exit_status (gint exit_status,
return ret; return ret;
} }
#if !defined (_WIN64) #endif /* !GSPAWN_HELPER */
/* Binary compatibility versions that take system codepage pathnames, #ifdef G_OS_WIN32
* argument vectors and environments. These get used only by code
* built against 2.8.1 or earlier. Code built against 2.8.2 or later
* will use the _utf8 versions above (see the #defines in gspawn.h).
*/
#undef g_spawn_async /* Binary compatibility versions. Not for newly compiled code. */
#undef g_spawn_async_with_pipes
#undef g_spawn_sync
#undef g_spawn_command_line_sync
#undef g_spawn_command_line_async
static gboolean _GLIB_EXTERN gboolean g_spawn_async_utf8 (const gchar *working_directory,
setup_utf8_copies (const gchar *working_directory, gchar **argv,
gchar **utf8_working_directory, gchar **envp,
gchar **argv, GSpawnFlags flags,
gchar ***utf8_argv, GSpawnChildSetupFunc child_setup,
gchar **envp, gpointer user_data,
gchar ***utf8_envp, GPid *child_pid,
GError **error) GError **error);
_GLIB_EXTERN gboolean g_spawn_async_with_pipes_utf8 (const gchar *working_directory,
gchar **argv,
gchar **envp,
GSpawnFlags flags,
GSpawnChildSetupFunc child_setup,
gpointer user_data,
GPid *child_pid,
gint *standard_input,
gint *standard_output,
gint *standard_error,
GError **error);
_GLIB_EXTERN gboolean g_spawn_sync_utf8 (const gchar *working_directory,
gchar **argv,
gchar **envp,
GSpawnFlags flags,
GSpawnChildSetupFunc child_setup,
gpointer user_data,
gchar **standard_output,
gchar **standard_error,
gint *exit_status,
GError **error);
_GLIB_EXTERN gboolean g_spawn_command_line_sync_utf8 (const gchar *command_line,
gchar **standard_output,
gchar **standard_error,
gint *exit_status,
GError **error);
_GLIB_EXTERN gboolean g_spawn_command_line_async_utf8 (const gchar *command_line,
GError **error);
gboolean
g_spawn_async_utf8 (const gchar *working_directory,
gchar **argv,
gchar **envp,
GSpawnFlags flags,
GSpawnChildSetupFunc child_setup,
gpointer user_data,
GPid *child_handle,
GError **error)
{ {
gint i, argc, envc; return g_spawn_async (working_directory,
argv,
if (working_directory == NULL) envp,
*utf8_working_directory = NULL; flags,
else child_setup,
{ user_data,
GError *conv_error = NULL; child_handle,
error);
*utf8_working_directory = g_locale_to_utf8 (working_directory, -1, NULL, NULL, &conv_error);
if (*utf8_working_directory == NULL)
{
g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_CHDIR,
_("Invalid working directory: %s"),
conv_error->message);
g_error_free (conv_error);
return FALSE;
}
}
argc = 0;
while (argv[argc])
++argc;
*utf8_argv = g_new (gchar *, argc + 1);
for (i = 0; i < argc; i++)
{
GError *conv_error = NULL;
(*utf8_argv)[i] = g_locale_to_utf8 (argv[i], -1, NULL, NULL, &conv_error);
if ((*utf8_argv)[i] == NULL)
{
g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
_("Invalid string in argument vector at %d: %s"),
i, conv_error->message);
g_error_free (conv_error);
g_strfreev (*utf8_argv);
*utf8_argv = NULL;
g_free (*utf8_working_directory);
*utf8_working_directory = NULL;
return FALSE;
}
}
(*utf8_argv)[argc] = NULL;
if (envp == NULL)
{
*utf8_envp = NULL;
}
else
{
envc = 0;
while (envp[envc])
++envc;
*utf8_envp = g_new (gchar *, envc + 1);
for (i = 0; i < envc; i++)
{
GError *conv_error = NULL;
(*utf8_envp)[i] = g_locale_to_utf8 (envp[i], -1, NULL, NULL, &conv_error);
if ((*utf8_envp)[i] == NULL)
{
g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
_("Invalid string in environment: %s"),
conv_error->message);
g_error_free (conv_error);
g_strfreev (*utf8_envp);
*utf8_envp = NULL;
g_strfreev (*utf8_argv);
*utf8_argv = NULL;
g_free (*utf8_working_directory);
*utf8_working_directory = NULL;
return FALSE;
}
}
(*utf8_envp)[envc] = NULL;
}
return TRUE;
}
static void
free_utf8_copies (gchar *utf8_working_directory,
gchar **utf8_argv,
gchar **utf8_envp)
{
g_free (utf8_working_directory);
g_strfreev (utf8_argv);
g_strfreev (utf8_envp);
} }
gboolean gboolean
g_spawn_async_with_pipes (const gchar *working_directory, g_spawn_async_with_pipes_utf8 (const gchar *working_directory,
gchar **argv, gchar **argv,
gchar **envp, gchar **envp,
GSpawnFlags flags, GSpawnFlags flags,
GSpawnChildSetupFunc child_setup, GSpawnChildSetupFunc child_setup,
gpointer user_data, gpointer user_data,
GPid *child_handle, GPid *child_handle,
gint *standard_input, gint *standard_input,
gint *standard_output, gint *standard_output,
gint *standard_error, gint *standard_error,
GError **error) GError **error)
{
gchar *utf8_working_directory;
gchar **utf8_argv;
gchar **utf8_envp;
gboolean retval;
if (!setup_utf8_copies (working_directory, &utf8_working_directory,
argv, &utf8_argv,
envp, &utf8_envp,
error))
return FALSE;
retval = g_spawn_async_with_pipes_utf8 (utf8_working_directory,
utf8_argv, utf8_envp,
flags, child_setup, user_data,
child_handle,
standard_input, standard_output, standard_error,
error);
free_utf8_copies (utf8_working_directory, utf8_argv, utf8_envp);
return retval;
}
gboolean
g_spawn_async (const gchar *working_directory,
gchar **argv,
gchar **envp,
GSpawnFlags flags,
GSpawnChildSetupFunc child_setup,
gpointer user_data,
GPid *child_handle,
GError **error)
{ {
return g_spawn_async_with_pipes (working_directory, return g_spawn_async_with_pipes (working_directory,
argv, envp, argv,
flags, envp,
child_setup, flags,
user_data, child_setup,
child_handle, user_data,
NULL, NULL, NULL, child_handle,
error); standard_input,
standard_output,
standard_error,
error);
} }
gboolean gboolean
g_spawn_sync (const gchar *working_directory, g_spawn_sync_utf8 (const gchar *working_directory,
gchar **argv, gchar **argv,
gchar **envp, gchar **envp,
GSpawnFlags flags, GSpawnFlags flags,
GSpawnChildSetupFunc child_setup, GSpawnChildSetupFunc child_setup,
gpointer user_data, gpointer user_data,
gchar **standard_output, gchar **standard_output,
gchar **standard_error, gchar **standard_error,
gint *exit_status, gint *exit_status,
GError **error) GError **error)
{ {
gchar *utf8_working_directory; return g_spawn_sync (working_directory,
gchar **utf8_argv; argv,
gchar **utf8_envp; envp,
gboolean retval; flags,
child_setup,
if (!setup_utf8_copies (working_directory, &utf8_working_directory, user_data,
argv, &utf8_argv, standard_output,
envp, &utf8_envp, standard_error,
error)) exit_status,
return FALSE; error);
retval = g_spawn_sync_utf8 (utf8_working_directory,
utf8_argv, utf8_envp,
flags, child_setup, user_data,
standard_output, standard_error, exit_status,
error);
free_utf8_copies (utf8_working_directory, utf8_argv, utf8_envp);
return retval;
} }
gboolean gboolean
g_spawn_command_line_sync (const gchar *command_line, g_spawn_command_line_sync_utf8 (const gchar *command_line,
gchar **standard_output, gchar **standard_output,
gchar **standard_error, gchar **standard_error,
gint *exit_status, gint *exit_status,
GError **error) GError **error)
{ {
gboolean retval; return g_spawn_command_line_sync (command_line,
gchar **argv = 0; standard_output,
standard_error,
g_return_val_if_fail (command_line != NULL, FALSE); exit_status,
error);
if (!g_shell_parse_argv (command_line,
NULL, &argv,
error))
return FALSE;
retval = g_spawn_sync (NULL,
argv,
NULL,
G_SPAWN_SEARCH_PATH,
NULL,
NULL,
standard_output,
standard_error,
exit_status,
error);
g_strfreev (argv);
return retval;
} }
gboolean gboolean
g_spawn_command_line_async (const gchar *command_line, g_spawn_command_line_async_utf8 (const gchar *command_line,
GError **error) GError **error)
{ {
gboolean retval; return g_spawn_command_line_async (command_line, error);
gchar **argv = 0;
g_return_val_if_fail (command_line != NULL, FALSE);
if (!g_shell_parse_argv (command_line,
NULL, &argv,
error))
return FALSE;
retval = g_spawn_async (NULL,
argv,
NULL,
G_SPAWN_SEARCH_PATH,
NULL,
NULL,
NULL,
error);
g_strfreev (argv);
return retval;
} }
#endif /* !_WIN64 */ #endif
#endif /* !GSPAWN_HELPER */

View File

@@ -249,59 +249,6 @@ gboolean g_spawn_check_exit_status (gint exit_status,
GLIB_AVAILABLE_IN_ALL GLIB_AVAILABLE_IN_ALL
void g_spawn_close_pid (GPid pid); void g_spawn_close_pid (GPid pid);
#ifndef __GTK_DOC_IGNORE__
#ifdef G_OS_WIN32
#define g_spawn_async g_spawn_async_utf8
#define g_spawn_async_with_pipes g_spawn_async_with_pipes_utf8
#define g_spawn_sync g_spawn_sync_utf8
#define g_spawn_command_line_sync g_spawn_command_line_sync_utf8
#define g_spawn_command_line_async g_spawn_command_line_async_utf8
GLIB_AVAILABLE_IN_ALL
gboolean g_spawn_async_utf8 (const gchar *working_directory,
gchar **argv,
gchar **envp,
GSpawnFlags flags,
GSpawnChildSetupFunc child_setup,
gpointer user_data,
GPid *child_pid,
GError **error);
GLIB_AVAILABLE_IN_ALL
gboolean g_spawn_async_with_pipes_utf8 (const gchar *working_directory,
gchar **argv,
gchar **envp,
GSpawnFlags flags,
GSpawnChildSetupFunc child_setup,
gpointer user_data,
GPid *child_pid,
gint *standard_input,
gint *standard_output,
gint *standard_error,
GError **error);
GLIB_AVAILABLE_IN_ALL
gboolean g_spawn_sync_utf8 (const gchar *working_directory,
gchar **argv,
gchar **envp,
GSpawnFlags flags,
GSpawnChildSetupFunc child_setup,
gpointer user_data,
gchar **standard_output,
gchar **standard_error,
gint *exit_status,
GError **error);
GLIB_AVAILABLE_IN_ALL
gboolean g_spawn_command_line_sync_utf8 (const gchar *command_line,
gchar **standard_output,
gchar **standard_error,
gint *exit_status,
GError **error);
GLIB_AVAILABLE_IN_ALL
gboolean g_spawn_command_line_async_utf8 (const gchar *command_line,
GError **error);
#endif
#endif
G_END_DECLS G_END_DECLS
#endif /* __G_SPAWN_H__ */ #endif /* __G_SPAWN_H__ */