[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: refactor common code of 'execute' and 'spawn-pipe'
From: |
KO Myung-Hun |
Subject: |
Re: refactor common code of 'execute' and 'spawn-pipe' |
Date: |
Tue, 01 Dec 2020 23:13:10 +0900 |
User-agent: |
Mozilla/5.0 (OS/2; Warp 4.5; rv:10.0.6esrpre) Gecko/20120715 Firefox/10.0.6esrpre SeaMonkey/2.7.2 |
Hi/2.
Bruno Haible wrote:
>> 2020-11-28 Bruno Haible <bruno@clisp.org>
>>
>> windows-spawn: New module.
>
> This patch probably introduced a compilation error on OS/2 kLIBC.
>
> Here's a (probable) fix. It copies windows-spawn.[hc] to os2-spawn.[hc].
> I will soon modify windows-spawn.[hc], basing it on 'CreateProcess'
> instead of '_spawnvpe'. Such modifications are not possible on OS/2,
> because there 'spawnvpe' relies on a system call '__spawnve', not
> on 'CreateProcess'.
>
>
> 2020-11-29 Bruno Haible <bruno@clisp.org>
>
> spawn-pipe: Fix build on OS/2 kLIBC (regression 2020-11-28).
> * lib/os2-spawn.h: New file, based on lib/windows-spawn.h.
> * lib/os2-spawn.c: New file, based on lib/windows-spawn.c.
> * lib/spawn-pipe.c: On OS/2 kLIBC, include "os2-spawn.h".
> * lib/windows-spawn.c: Remove modifications for kLIBC.
> * modules/spawn-pipe (Files): Add the new files.
> (configure.ac): Arrange to compile os2-spawn.c on OS/2.
>
>
>
> 0001-spawn-pipe-Fix-build-on-OS-2-kLIBC-regression-2020-1.patch
>
>
> From 093ce865871947a28e20fd3802fd828d229d09c0 Mon Sep 17 00:00:00 2001
> From: Bruno Haible <bruno@clisp.org>
> Date: Sun, 29 Nov 2020 18:37:33 +0100
> Subject: [PATCH] spawn-pipe: Fix build on OS/2 kLIBC (regression 2020-11-28).
>
> * lib/os2-spawn.h: New file, based on lib/windows-spawn.h.
> * lib/os2-spawn.c: New file, based on lib/windows-spawn.c.
> * lib/spawn-pipe.c: On OS/2 kLIBC, include "os2-spawn.h".
> * lib/windows-spawn.c: Remove modifications for kLIBC.
> * modules/spawn-pipe (Files): Add the new files.
> (configure.ac): Arrange to compile os2-spawn.c on OS/2.
> ---
> ChangeLog | 10 ++++
> lib/os2-spawn.c | 128
> ++++++++++++++++++++++++++++++++++++++++++++++++++++
> lib/os2-spawn.h | 32 +++++++++++++
> lib/spawn-pipe.c | 8 +++-
> lib/windows-spawn.c | 15 ++----
> modules/spawn-pipe | 8 ++++
> 6 files changed, 189 insertions(+), 12 deletions(-)
> create mode 100644 lib/os2-spawn.c
> create mode 100644 lib/os2-spawn.h
>
> diff --git a/ChangeLog b/ChangeLog
> index fa21e9c..d6fd4ac 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,13 @@
> +2020-11-29 Bruno Haible <bruno@clisp.org>
> +
> + spawn-pipe: Fix build on OS/2 kLIBC (regression 2020-11-28).
> + * lib/os2-spawn.h: New file, based on lib/windows-spawn.h.
> + * lib/os2-spawn.c: New file, based on lib/windows-spawn.c.
> + * lib/spawn-pipe.c: On OS/2 kLIBC, include "os2-spawn.h".
> + * lib/windows-spawn.c: Remove modifications for kLIBC.
> + * modules/spawn-pipe (Files): Add the new files.
> + (configure.ac): Arrange to compile os2-spawn.c on OS/2.
> +
> 2020-11-28 Bruno Haible <bruno@clisp.org>
>
> asyncsafe-spin: Fix compilation error with GCC on 32-bit SPARC.
> diff --git a/lib/os2-spawn.c b/lib/os2-spawn.c
> new file mode 100644
> index 0000000..c15e200
> --- /dev/null
> +++ b/lib/os2-spawn.c
> @@ -0,0 +1,128 @@
> +/* Auxiliary functions for the creation of subprocesses. OS/2 kLIBC API.
> + Copyright (C) 2001, 2003-2020 Free Software Foundation, Inc.
> + Written by Bruno Haible <bruno@clisp.org>, 2003.
> +
> + This program is free software: you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> + the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program 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 General Public License for more details.
> +
> + You should have received a copy of the GNU General Public License
> + along with this program. If not, see <https://www.gnu.org/licenses/>. */
> +
> +#include <config.h>
> +
> +/* Specification. */
> +#include "os2-spawn.h"
> +
> +/* Get _open_osfhandle(). */
> +#include <io.h>
> +
> +#include <stdbool.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <unistd.h>
> +#include <errno.h>
> +
> +#include "cloexec.h"
> +#include "error.h"
> +#include "xalloc.h"
> +#include "gettext.h"
> +
> +#define _(str) gettext (str)
> +
> +
> +/* Duplicates a file handle, making the copy uninheritable.
> + Returns -1 for a file handle that is equivalent to closed. */
> +static int
> +dup_noinherit (int fd)
> +{
> + fd = dup_cloexec (fd);
> + if (fd < 0 && errno == EMFILE)
> + error (EXIT_FAILURE, errno, _("_open_osfhandle failed"));
> +
> + return fd;
> +}
> +
> +/* Returns a file descriptor equivalent to FD, except that the resulting file
> + descriptor is none of STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO.
> + FD must be open and non-inheritable. The result will be non-inheritable
> as
> + well.
> + If FD < 0, FD itself is returned. */
> +static int
> +fd_safer_noinherit (int fd)
> +{
> + if (STDIN_FILENO <= fd && fd <= STDERR_FILENO)
> + {
> + /* The recursion depth is at most 3. */
> + int nfd = fd_safer_noinherit (dup_noinherit (fd));
> + int saved_errno = errno;
> + close (fd);
> + errno = saved_errno;
> + return nfd;
> + }
> + return fd;
> +}
> +
> +int
> +dup_safer_noinherit (int fd)
> +{
> + return fd_safer_noinherit (dup_noinherit (fd));
> +}
> +
> +void
> +undup_safer_noinherit (int tempfd, int origfd)
> +{
> + if (tempfd >= 0)
> + {
> + if (dup2 (tempfd, origfd) < 0)
> + error (EXIT_FAILURE, errno, _("cannot restore fd %d: dup2 failed"),
> + origfd);
> + close (tempfd);
> + }
> + else
> + {
> + /* origfd was closed or open to no handle at all. Set it to a closed
> + state. This is (nearly) equivalent to the original state. */
> + close (origfd);
> + }
> +}
> +
> +char **
> +prepare_spawn (char **argv)
> +{
> + size_t argc;
> + char **new_argv;
> + size_t i;
> +
> + /* Count number of arguments. */
> + for (argc = 0; argv[argc] != NULL; argc++)
> + ;
> +
> + /* Allocate new argument vector. */
> + new_argv = XNMALLOC (1 + argc + 1, char *);
> +
> + /* Add an element upfront that can be used when argv[0] turns out to be a
> + script, not a program.
> + On Unix, this would be "/bin/sh". */
> + *new_argv++ = "sh.exe";
> +
> + /* Put quoted arguments into the new argument vector. */
> + for (i = 0; i < argc; i++)
> + {
> + const char *string = argv[i];
> +
> + if (string[0] == '\0')
> + new_argv[i] = xstrdup ("\"\"");
> + else
> + new_argv[i] = (char *) string;
> + }
> + new_argv[argc] = NULL;
> +
> + return new_argv;
> +}
> diff --git a/lib/os2-spawn.h b/lib/os2-spawn.h
> new file mode 100644
> index 0000000..701cc10
> --- /dev/null
> +++ b/lib/os2-spawn.h
> @@ -0,0 +1,32 @@
> +/* Auxiliary functions for the creation of subprocesses. OS/2 kLIBC API.
> + Copyright (C) 2001, 2003-2020 Free Software Foundation, Inc.
> + Written by Bruno Haible <bruno@clisp.org>, 2003.
> +
> + This program is free software: you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> + the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program 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 General Public License for more details.
> +
> + You should have received a copy of the GNU General Public License
> + along with this program. If not, see <https://www.gnu.org/licenses/>. */
> +
> +#ifndef _OS2_SPAWN_H
> +#define _OS2_SPAWN_H
> +
> +/* Duplicates a file handle, making the copy uninheritable and ensuring the
> + result is none of STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO.
> + Returns -1 for a file handle that is equivalent to closed. */
> +extern int dup_safer_noinherit (int fd);
> +
> +/* Undoes the effect of TEMPFD = dup_safer_noinherit (ORIGFD); */
> +extern void undup_safer_noinherit (int tempfd, int origfd);
> +
> +/* Prepares an argument vector before calling spawn(). */
> +extern char ** prepare_spawn (char **argv);
> +
> +#endif /* _OS2_SPAWN_H */
> diff --git a/lib/spawn-pipe.c b/lib/spawn-pipe.c
> index 1a7a1e1..b0f5314 100644
> --- a/lib/spawn-pipe.c
> +++ b/lib/spawn-pipe.c
> @@ -40,12 +40,18 @@
>
> #define _(str) gettext (str)
>
> -#if (defined _WIN32 && ! defined __CYGWIN__) || defined __KLIBC__
> +#if defined _WIN32 && ! defined __CYGWIN__
>
> /* Native Windows API. */
> # include <process.h>
> # include "windows-spawn.h"
>
> +#elif defined __KLIBC__
> +
> +/* OS/2 kLIBC API. */
> +# include <process.h>
> +# include "os2-spawn.h"
> +
> #else
>
> /* Unix API. */
> diff --git a/lib/windows-spawn.c b/lib/windows-spawn.c
> index eedb7e4..776303a 100644
> --- a/lib/windows-spawn.c
> +++ b/lib/windows-spawn.c
> @@ -20,11 +20,9 @@
> /* Specification. */
> #include "windows-spawn.h"
>
> -#ifndef __KLIBC__
> /* Get declarations of the native Windows API functions. */
> -# define WIN32_LEAN_AND_MEAN
> -# include <windows.h>
> -#endif
> +#define WIN32_LEAN_AND_MEAN
> +#include <windows.h>
>
> /* Get _open_osfhandle(). */
> #include <io.h>
> @@ -106,13 +104,8 @@ undup_safer_noinherit (int tempfd, int origfd)
> }
> }
>
> -#ifndef __KLIBC__
> -# define SHELL_SPECIAL_CHARS "\"\\
> \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037*?"
> -# define SHELL_SPACE_CHARS "
> \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
> -#else
> -# define SHELL_SPECIAL_CHARS ""
> -# define SHELL_SPACE_CHARS ""
> -#endif
> +#define SHELL_SPECIAL_CHARS "\"\\
> \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037*?"
> +#define SHELL_SPACE_CHARS "
> \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
> char **
> prepare_spawn (char **argv)
> {
> diff --git a/modules/spawn-pipe b/modules/spawn-pipe
> index 2c62586..7845afa 100644
> --- a/modules/spawn-pipe
> +++ b/modules/spawn-pipe
> @@ -4,6 +4,8 @@ Creation of subprocesses, communicating via pipes.
> Files:
> lib/spawn-pipe.h
> lib/spawn-pipe.c
> +lib/os2-spawn.h
> +lib/os2-spawn.c
> m4/spawn-pipe.m4
>
> Depends-on:
> @@ -35,6 +37,12 @@ windows-spawn
>
> configure.ac:
> gl_SPAWN_PIPE
> +AC_REQUIRE([AC_CANONICAL_HOST])
> +case "$host_os" in
> + os2)
s/os2/os2*/
Thanks!
--
KO Myung-Hun
Using Mozilla SeaMonkey 2.7.2
Under OS/2 Warp 4 for Korean with FixPak #15
In VirtualBox v6.1.10 on Intel Core i7-3615QM 2.30GHz with 8GB RAM
Korean OS/2 User Community : http://www.os2.kr/
- Re: refactor common code of 'execute' and 'spawn-pipe',
KO Myung-Hun <=