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 <withnall@endlessm.com>
This commit is contained in:
Philip Withnall 2018-06-12 16:00:13 +01:00
parent 6c8da69443
commit d157102a54
3 changed files with 118 additions and 108 deletions

View File

@ -220,6 +220,7 @@ EXTRA_libglib_2_0_la_SOURCES = \
giounix.c \
giowin32.c \
gspawn.c \
gspawn-private.h \
gspawn-win32.c \
gwin32.c

115
glib/gspawn-private.h Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <errno.h>
#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;
}
}

View File

@ -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]));