From d157102a5430867b0f482ea7e6177f2f2fea0272 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Tue, 12 Jun 2018 16:00:13 +0100 Subject: [PATCH] gspawn: Factor out error code conversion function This will be used in gspawn-win32.c too in an upcoming commit. https://gitlab.gnome.org/GNOME/glib/issues/303 Signed-off-by: Philip Withnall --- glib/Makefile.am | 1 + glib/gspawn-private.h | 115 ++++++++++++++++++++++++++++++++++++++++++ glib/gspawn.c | 110 +--------------------------------------- 3 files changed, 118 insertions(+), 108 deletions(-) create mode 100644 glib/gspawn-private.h diff --git a/glib/Makefile.am b/glib/Makefile.am index 4d04e09da..7252a67d0 100644 --- a/glib/Makefile.am +++ b/glib/Makefile.am @@ -220,6 +220,7 @@ EXTRA_libglib_2_0_la_SOURCES = \ giounix.c \ giowin32.c \ gspawn.c \ + gspawn-private.h \ gspawn-win32.c \ gwin32.c diff --git a/glib/gspawn-private.h b/glib/gspawn-private.h new file mode 100644 index 000000000..16f816c89 --- /dev/null +++ b/glib/gspawn-private.h @@ -0,0 +1,115 @@ +/* gspawn.c - Process launching + * + * Copyright 2000 Red Hat, Inc. + * g_execvpe implementation based on GNU libc execvp: + * Copyright 1991, 92, 95, 96, 97, 98, 99 Free Software Foundation, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, see . + */ + +#include "config.h" + +#include + +#include "gspawn.h" + +static inline gint +_g_spawn_exec_err_to_g_error (gint en) +{ + switch (en) + { +#ifdef EACCES + case EACCES: + return G_SPAWN_ERROR_ACCES; +#endif + +#ifdef EPERM + case EPERM: + return G_SPAWN_ERROR_PERM; +#endif + +#ifdef E2BIG + case E2BIG: + return G_SPAWN_ERROR_TOO_BIG; +#endif + +#ifdef ENOEXEC + case ENOEXEC: + return G_SPAWN_ERROR_NOEXEC; +#endif + +#ifdef ENAMETOOLONG + case ENAMETOOLONG: + return G_SPAWN_ERROR_NAMETOOLONG; +#endif + +#ifdef ENOENT + case ENOENT: + return G_SPAWN_ERROR_NOENT; +#endif + +#ifdef ENOMEM + case ENOMEM: + return G_SPAWN_ERROR_NOMEM; +#endif + +#ifdef ENOTDIR + case ENOTDIR: + return G_SPAWN_ERROR_NOTDIR; +#endif + +#ifdef ELOOP + case ELOOP: + return G_SPAWN_ERROR_LOOP; +#endif + +#ifdef ETXTBUSY + case ETXTBUSY: + return G_SPAWN_ERROR_TXTBUSY; +#endif + +#ifdef EIO + case EIO: + return G_SPAWN_ERROR_IO; +#endif + +#ifdef ENFILE + case ENFILE: + return G_SPAWN_ERROR_NFILE; +#endif + +#ifdef EMFILE + case EMFILE: + return G_SPAWN_ERROR_MFILE; +#endif + +#ifdef EINVAL + case EINVAL: + return G_SPAWN_ERROR_INVAL; +#endif + +#ifdef EISDIR + case EISDIR: + return G_SPAWN_ERROR_ISDIR; +#endif + +#ifdef ELIBBAD + case ELIBBAD: + return G_SPAWN_ERROR_LIBBAD; +#endif + + default: + return G_SPAWN_ERROR_FAILED; + } +} diff --git a/glib/gspawn.c b/glib/gspawn.c index 89824d176..5e90d4c5b 100644 --- a/glib/gspawn.c +++ b/glib/gspawn.c @@ -40,6 +40,7 @@ #endif /* HAVE_SYS_RESOURCE_H */ #include "gspawn.h" +#include "gspawn-private.h" #include "gthread.h" #include "glib/gstdio.h" @@ -925,113 +926,6 @@ g_spawn_check_exit_status (gint exit_status, return ret; } -static gint -exec_err_to_g_error (gint en) -{ - switch (en) - { -#ifdef EACCES - case EACCES: - return G_SPAWN_ERROR_ACCES; - break; -#endif - -#ifdef EPERM - case EPERM: - return G_SPAWN_ERROR_PERM; - break; -#endif - -#ifdef E2BIG - case E2BIG: - return G_SPAWN_ERROR_TOO_BIG; - break; -#endif - -#ifdef ENOEXEC - case ENOEXEC: - return G_SPAWN_ERROR_NOEXEC; - break; -#endif - -#ifdef ENAMETOOLONG - case ENAMETOOLONG: - return G_SPAWN_ERROR_NAMETOOLONG; - break; -#endif - -#ifdef ENOENT - case ENOENT: - return G_SPAWN_ERROR_NOENT; - break; -#endif - -#ifdef ENOMEM - case ENOMEM: - return G_SPAWN_ERROR_NOMEM; - break; -#endif - -#ifdef ENOTDIR - case ENOTDIR: - return G_SPAWN_ERROR_NOTDIR; - break; -#endif - -#ifdef ELOOP - case ELOOP: - return G_SPAWN_ERROR_LOOP; - break; -#endif - -#ifdef ETXTBUSY - case ETXTBUSY: - return G_SPAWN_ERROR_TXTBUSY; - break; -#endif - -#ifdef EIO - case EIO: - return G_SPAWN_ERROR_IO; - break; -#endif - -#ifdef ENFILE - case ENFILE: - return G_SPAWN_ERROR_NFILE; - break; -#endif - -#ifdef EMFILE - case EMFILE: - return G_SPAWN_ERROR_MFILE; - break; -#endif - -#ifdef EINVAL - case EINVAL: - return G_SPAWN_ERROR_INVAL; - break; -#endif - -#ifdef EISDIR - case EISDIR: - return G_SPAWN_ERROR_ISDIR; - break; -#endif - -#ifdef ELIBBAD - case ELIBBAD: - return G_SPAWN_ERROR_LIBBAD; - break; -#endif - - default: - return G_SPAWN_ERROR_FAILED; - break; - } -} - static gssize write_all (gint fd, gconstpointer vbuf, gsize to_write) { @@ -1549,7 +1443,7 @@ fork_exec_with_pipes (gboolean intermediate_child, case CHILD_EXEC_FAILED: g_set_error (error, G_SPAWN_ERROR, - exec_err_to_g_error (buf[1]), + _g_spawn_exec_err_to_g_error (buf[1]), _("Failed to execute child process ā€œ%sā€ (%s)"), argv[0], g_strerror (buf[1]));