From 48e0a23aa5ddd288856268af751b73218ba31777 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Thu, 24 Dec 2020 22:18:27 +0100 Subject: [PATCH] windows-spawn: Export another auxiliary function. * lib/windows-spawn.h (convert_CreateProcess_error): New declaration. * lib/windows-spawn.c (convert_CreateProcess_error): New function, extracted from spawnpvech. (spawnpvech): Use it. --- ChangeLog | 8 ++++++ lib/windows-spawn.c | 77 ++++++++++++++++++++++++++++------------------------- lib/windows-spawn.h | 5 ++++ 3 files changed, 54 insertions(+), 36 deletions(-) diff --git a/ChangeLog b/ChangeLog index 39629f3dcc..fceaaa687b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2020-12-24 Bruno Haible + windows-spawn: Export another auxiliary function. + * lib/windows-spawn.h (convert_CreateProcess_error): New declaration. + * lib/windows-spawn.c (convert_CreateProcess_error): New function, + extracted from spawnpvech. + (spawnpvech): Use it. + +2020-12-24 Bruno Haible + windows-spawn: Export some more auxiliary functions. * lib/windows-spawn.h: Include . (struct inheritable_handles): New type. diff --git a/lib/windows-spawn.c b/lib/windows-spawn.c index a2f63b9166..a78109091b 100644 --- a/lib/windows-spawn.c +++ b/lib/windows-spawn.c @@ -526,6 +526,46 @@ free_inheritable_handles (struct inheritable_handles *inh_handles) free (inh_handles->handles); } +int +convert_CreateProcess_error (DWORD error) +{ + /* Some of these errors probably cannot happen. But who knows... */ + switch (error) + { + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + case ERROR_BAD_PATHNAME: + case ERROR_BAD_NET_NAME: + case ERROR_INVALID_NAME: + case ERROR_DIRECTORY: + return ENOENT; + break; + + case ERROR_ACCESS_DENIED: + case ERROR_SHARING_VIOLATION: + return EACCES; + break; + + case ERROR_OUTOFMEMORY: + return ENOMEM; + break; + + case ERROR_BUFFER_OVERFLOW: + case ERROR_FILENAME_EXCED_RANGE: + return ENAMETOOLONG; + break; + + case ERROR_BAD_FORMAT: + case ERROR_BAD_EXE_FORMAT: + return ENOEXEC; + break; + + default: + return EINVAL; + break; + } +} + intptr_t spawnpvech (int mode, const char *progname, const char * const *argv, @@ -622,42 +662,7 @@ spawnpvech (int mode, if (resolved_progname != progname) free ((char *) resolved_progname); - /* Some of these errors probably cannot happen. But who knows... */ - switch (error) - { - case ERROR_FILE_NOT_FOUND: - case ERROR_PATH_NOT_FOUND: - case ERROR_BAD_PATHNAME: - case ERROR_BAD_NET_NAME: - case ERROR_INVALID_NAME: - case ERROR_DIRECTORY: - errno = ENOENT; - break; - - case ERROR_ACCESS_DENIED: - case ERROR_SHARING_VIOLATION: - errno = EACCES; - break; - - case ERROR_OUTOFMEMORY: - errno = ENOMEM; - break; - - case ERROR_BUFFER_OVERFLOW: - case ERROR_FILENAME_EXCED_RANGE: - errno = ENAMETOOLONG; - break; - - case ERROR_BAD_FORMAT: - case ERROR_BAD_EXE_FORMAT: - errno = ENOEXEC; - break; - - default: - errno = EINVAL; - break; - } - + errno = convert_CreateProcess_error (error); return -1; } diff --git a/lib/windows-spawn.h b/lib/windows-spawn.h index 6e06652deb..1ff76f644b 100644 --- a/lib/windows-spawn.h +++ b/lib/windows-spawn.h @@ -122,6 +122,11 @@ extern int compose_handles_block (const struct inheritable_handles *inh_handles, extern void free_inheritable_handles (struct inheritable_handles *inh_handles); +/* Converts a CreateProcess() error code (retrieved through GetLastError()) to + an errno value. */ +extern int convert_CreateProcess_error (DWORD error); + + /* Creates a subprocess. MODE is either P_WAIT or P_NOWAIT. PROGNAME is the program to invoke. -- 2.11.4.GIT