1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-24 20:30:28 +02:00

Update Gnulib to v0.1-5703-g356a414e8c and add 'posix_spawn' module.

This is a followup to edfca3b7e5, which
added the 'posix_spawnp' module but not 'posix_spawn'.

* m4/gnulib-cache.m4: Add 'posix_spawn' module.
* gnulib-local/m4/clock_time.m4.diff: Adjust.
* configure.ac: Move 'gl_EARLY' use right after 'AC_PROG_CC'.
This commit is contained in:
Ludovic Courtès 2023-01-18 18:25:25 +01:00
parent 4404b553a5
commit aeb22f4861
509 changed files with 2764 additions and 1730 deletions

View file

@ -1,5 +1,5 @@
/* Auxiliary functions for the creation of subprocesses. Native Windows API.
Copyright (C) 2001, 2003-2022 Free Software Foundation, Inc.
Copyright (C) 2001, 2003-2023 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2003.
This file is free software: you can redistribute it and/or modify
@ -24,7 +24,6 @@
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -324,14 +323,21 @@ init_inheritable_handles (struct inheritable_handles *inh_handles,
HANDLE handle = (HANDLE) _get_osfhandle (fd);
if (handle != INVALID_HANDLE_VALUE)
{
DWORD hflags;
/* GetHandleInformation
<https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-gethandleinformation> */
if (GetHandleInformation (handle, &hflags))
if (duplicate)
/* We will add fd to the array, regardless of whether it is
inheritable or not. */
break;
else
{
if ((hflags & HANDLE_FLAG_INHERIT) != 0)
/* fd denotes an inheritable descriptor. */
break;
DWORD hflags;
/* GetHandleInformation
<https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-gethandleinformation> */
if (GetHandleInformation (handle, &hflags))
{
if ((hflags & HANDLE_FLAG_INHERIT) != 0)
/* fd denotes an inheritable descriptor. */
break;
}
}
}
}
@ -339,31 +345,23 @@ init_inheritable_handles (struct inheritable_handles *inh_handles,
}
/* Note: handles_count >= 3. */
/* Allocate the arrays. */
/* Allocate the array. */
size_t handles_allocated = handles_count;
HANDLE *handles_array =
(HANDLE *) malloc (handles_allocated * sizeof (HANDLE));
if (handles_array == NULL)
struct IHANDLE *ih =
(struct IHANDLE *) malloc (handles_allocated * sizeof (struct IHANDLE));
if (ih == NULL)
{
errno = ENOMEM;
return -1;
}
unsigned char *flags_array =
(unsigned char *) malloc (handles_allocated * sizeof (unsigned char));
if (flags_array == NULL)
{
free (handles_array);
errno = ENOMEM;
return -1;
}
/* Fill in the two arrays. */
/* Fill in the array. */
{
HANDLE curr_process = (duplicate ? GetCurrentProcess () : INVALID_HANDLE_VALUE);
unsigned int fd;
for (fd = 0; fd < handles_count; fd++)
{
handles_array[fd] = INVALID_HANDLE_VALUE;
ih[fd].handle = INVALID_HANDLE_VALUE;
/* _get_osfhandle
<https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/get-osfhandle> */
HANDLE handle = (HANDLE) _get_osfhandle (fd);
@ -374,29 +372,42 @@ init_inheritable_handles (struct inheritable_handles *inh_handles,
<https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-gethandleinformation> */
if (GetHandleInformation (handle, &hflags))
{
if ((hflags & HANDLE_FLAG_INHERIT) != 0)
if (duplicate)
{
/* fd denotes an inheritable descriptor. */
if (duplicate)
/* Add fd to the array, regardless of whether it is
inheritable or not. */
if ((hflags & HANDLE_FLAG_INHERIT) != 0)
{
/* Instead of duplicating it, just mark it as shared. */
ih[fd].handle = handle;
ih[fd].flags = KEEP_OPEN_IN_PARENT | KEEP_OPEN_IN_CHILD;
}
else
{
if (!DuplicateHandle (curr_process, handle,
curr_process, &handles_array[fd],
curr_process, &ih[fd].handle,
0, TRUE, DUPLICATE_SAME_ACCESS))
{
unsigned int i;
for (i = 0; i < fd; i++)
if (handles_array[i] != INVALID_HANDLE_VALUE)
CloseHandle (handles_array[i]);
free (flags_array);
free (handles_array);
if (ih[i].handle != INVALID_HANDLE_VALUE
&& !(ih[i].flags & KEEP_OPEN_IN_PARENT))
CloseHandle (ih[i].handle);
free (ih);
errno = EBADF; /* arbitrary */
return -1;
}
ih[fd].flags = 0;
}
}
else
{
if ((hflags & HANDLE_FLAG_INHERIT) != 0)
{
/* fd denotes an inheritable descriptor. */
ih[fd].handle = handle;
ih[fd].flags = KEEP_OPEN_IN_CHILD;
}
else
handles_array[fd] = handle;
flags_array[fd] = 0;
}
}
}
@ -406,8 +417,7 @@ init_inheritable_handles (struct inheritable_handles *inh_handles,
/* Return the result. */
inh_handles->count = handles_count;
inh_handles->allocated = handles_allocated;
inh_handles->handles = handles_array;
inh_handles->flags = flags_array;
inh_handles->ih = ih;
return 0;
}
@ -418,9 +428,9 @@ compose_handles_block (const struct inheritable_handles *inh_handles,
/* STARTUPINFO
<https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-startupinfoa> */
sinfo->dwFlags = STARTF_USESTDHANDLES;
sinfo->hStdInput = inh_handles->handles[0];
sinfo->hStdOutput = inh_handles->handles[1];
sinfo->hStdError = inh_handles->handles[2];
sinfo->hStdInput = inh_handles->ih[0].handle;
sinfo->hStdOutput = inh_handles->ih[1].handle;
sinfo->hStdError = inh_handles->ih[2].handle;
/* On newer versions of Windows, more file descriptors / handles than the
first three can be passed.
@ -471,11 +481,11 @@ compose_handles_block (const struct inheritable_handles *inh_handles,
handles_aligned[fd] = INVALID_HANDLE_VALUE;
flags[fd] = 0;
HANDLE handle = inh_handles->handles[fd];
HANDLE handle = inh_handles->ih[fd].handle;
if (handle != INVALID_HANDLE_VALUE
/* The first three are possibly already passed above.
But they need to passed here as well, if they have some flags. */
&& (fd >= 3 || inh_handles->flags[fd] != 0))
&& (fd >= 3 || (unsigned char) inh_handles->ih[fd].flags != 0))
{
DWORD hflags;
/* GetHandleInformation
@ -490,7 +500,7 @@ compose_handles_block (const struct inheritable_handles *inh_handles,
flags[fd] = 1. But on ReactOS or Wine, adding the bit
that indicates the handle type may be necessary. So,
just do it everywhere. */
flags[fd] = 1 | inh_handles->flags[fd];
flags[fd] = 1 | (unsigned char) inh_handles->ih[fd].flags;
switch (GetFileType (handle))
{
case FILE_TYPE_CHAR:
@ -522,8 +532,7 @@ compose_handles_block (const struct inheritable_handles *inh_handles,
void
free_inheritable_handles (struct inheritable_handles *inh_handles)
{
free (inh_handles->flags);
free (inh_handles->handles);
free (inh_handles->ih);
}
int
@ -619,9 +628,12 @@ spawnpvech (int mode,
errno = saved_errno;
return -1;
}
inh_handles.handles[0] = stdin_handle; inh_handles.flags[0] = 0;
inh_handles.handles[1] = stdout_handle; inh_handles.flags[1] = 0;
inh_handles.handles[2] = stderr_handle; inh_handles.flags[2] = 0;
inh_handles.ih[0].handle = stdin_handle;
inh_handles.ih[0].flags = KEEP_OPEN_IN_CHILD;
inh_handles.ih[1].handle = stdout_handle;
inh_handles.ih[1].flags = KEEP_OPEN_IN_CHILD;
inh_handles.ih[2].handle = stderr_handle;
inh_handles.ih[2].flags = KEEP_OPEN_IN_CHILD;
/* CreateProcess
<https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa> */