Swap to using proper windows pipes
We were using _pipe to create a pipe on windows. This uses the "int" type for its file descriptor for compatibility. However most windows functions expect to use a "HANDLE". Probably we could get away with just casting but it seems more robust to use the proper type and main stream windows functions. Reviewed-by: Rich Salz <rsalz@openssl.org>
This commit is contained in:
parent
e38565f536
commit
2b2c78d4f0
@ -91,17 +91,17 @@ int async_pool_can_grow(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int async_pipe(int *pipefds)
|
||||
int async_pipe(OSSL_ASYNC_FD *pipefds)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
int async_write1(int fd, const void *buf)
|
||||
int async_write1(OSSL_ASYNC_FD fd, const void *buf)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
int async_read1(int fd, void *buf)
|
||||
int async_read1(OSSL_ASYNC_FD fd, void *buf)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ void async_fibre_free(async_fibre *fibre)
|
||||
OPENSSL_free(fibre->fibre.uc_stack.ss_sp);
|
||||
}
|
||||
|
||||
int async_pipe(int *pipefds)
|
||||
int async_pipe(OSSL_ASYNC_FD *pipefds)
|
||||
{
|
||||
if (pipe(pipefds) == 0)
|
||||
return 1;
|
||||
@ -103,7 +103,7 @@ int async_pipe(int *pipefds)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int async_write1(int fd, const void *buf)
|
||||
int async_write1(OSSL_ASYNC_FD fd, const void *buf)
|
||||
{
|
||||
if (write(fd, buf, 1) > 0)
|
||||
return 1;
|
||||
@ -111,7 +111,7 @@ int async_write1(int fd, const void *buf)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int async_read1(int fd, void *buf)
|
||||
int async_read1(OSSL_ASYNC_FD fd, void *buf)
|
||||
{
|
||||
if (read(fd, buf, 1) > 0)
|
||||
return 1;
|
||||
|
@ -87,25 +87,29 @@ VOID CALLBACK async_start_func_win(PVOID unused)
|
||||
async_start_func();
|
||||
}
|
||||
|
||||
int async_pipe(int *pipefds)
|
||||
int async_pipe(OSSL_ASYNC_FD *pipefds)
|
||||
{
|
||||
if (_pipe(pipefds, 256, _O_BINARY) == 0)
|
||||
if (CreatePipe(&pipefds[0], &pipefds[1], NULL, 256) == 0)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int async_write1(OSSL_ASYNC_FD fd, const void *buf)
|
||||
{
|
||||
DWORD numwritten = 0;
|
||||
|
||||
if (WriteFile(fd, buf, 1, &numwritten, NULL) && numwritten == 1)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int async_write1(int fd, const void *buf)
|
||||
int async_read1(OSSL_ASYNC_FD fd, void *buf)
|
||||
{
|
||||
if (_write(fd, buf, 1) > 0)
|
||||
return 1;
|
||||
DWORD numread = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int async_read1(int fd, void *buf)
|
||||
{
|
||||
if (_read(fd, buf, 1) > 0)
|
||||
if (ReadFile(fd, buf, 1, &numread, NULL) && numread == 1)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
|
@ -109,7 +109,7 @@ static int async_ctx_free(void)
|
||||
static ASYNC_JOB *async_job_new(void)
|
||||
{
|
||||
ASYNC_JOB *job = NULL;
|
||||
int pipefds[2];
|
||||
OSSL_ASYNC_FD pipefds[2];
|
||||
|
||||
job = OPENSSL_malloc(sizeof (ASYNC_JOB));
|
||||
if (job == NULL) {
|
||||
@ -387,7 +387,7 @@ ASYNC_JOB *ASYNC_get_current_job(void)
|
||||
return ctx->currjob;
|
||||
}
|
||||
|
||||
int ASYNC_get_wait_fd(ASYNC_JOB *job)
|
||||
OSSL_ASYNC_FD ASYNC_get_wait_fd(ASYNC_JOB *job)
|
||||
{
|
||||
return job->wait_fd;
|
||||
}
|
||||
|
@ -73,8 +73,8 @@ struct async_job_st {
|
||||
int ret;
|
||||
int status;
|
||||
int wake_set;
|
||||
int wait_fd;
|
||||
int wake_fd;
|
||||
OSSL_ASYNC_FD wait_fd;
|
||||
OSSL_ASYNC_FD wake_fd;
|
||||
};
|
||||
|
||||
DECLARE_STACK_OF(ASYNC_JOB)
|
||||
@ -88,6 +88,6 @@ void async_release_job_to_pool(ASYNC_JOB *job);
|
||||
size_t async_pool_max_size(void);
|
||||
void async_release_pool(void);
|
||||
int async_pool_can_grow(void);
|
||||
int async_pipe(int *pipefds);
|
||||
int async_write1(int fd, const void *buf);
|
||||
int async_read1(int fd, void *buf);
|
||||
int async_pipe(OSSL_ASYNC_FD *pipefds);
|
||||
int async_write1(OSSL_ASYNC_FD fd, const void *buf);
|
||||
int async_read1(OSSL_ASYNC_FD fd, void *buf);
|
||||
|
@ -56,6 +56,14 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||
#include <windows.h>
|
||||
#define OSSL_ASYNC_FD HANDLE
|
||||
#else
|
||||
#define OSSL_ASYNC_FD int
|
||||
#endif
|
||||
|
||||
|
||||
# ifdef __cplusplus
|
||||
extern "C" {
|
||||
# endif
|
||||
@ -74,7 +82,7 @@ int ASYNC_start_job(ASYNC_JOB **job, int *ret, int (*func)(void *),
|
||||
void *args, size_t size);
|
||||
int ASYNC_pause_job(void);
|
||||
|
||||
int ASYNC_get_wait_fd(ASYNC_JOB *job);
|
||||
OSSL_ASYNC_FD ASYNC_get_wait_fd(ASYNC_JOB *job);
|
||||
ASYNC_JOB *ASYNC_get_current_job(void);
|
||||
void ASYNC_wake(ASYNC_JOB *job);
|
||||
void ASYNC_clear_wake(ASYNC_JOB *job);
|
||||
|
@ -67,7 +67,7 @@
|
||||
# if _POSIX_VERSION >= 200112L
|
||||
# define ASYNC_POSIX
|
||||
# endif
|
||||
#elif (defined(_WIN32) || defined(__CYGWIN__)) && defined(_WINDLL)
|
||||
#elif defined(_WIN32) || defined(__CYGWIN__)
|
||||
# define ASYNC_WIN
|
||||
#endif
|
||||
|
||||
@ -201,8 +201,9 @@ static int test_ASYNC_get_current_job()
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int hasdata(int fd)
|
||||
static int hasdata(OSSL_ASYNC_FD fd)
|
||||
{
|
||||
#ifdef ASYNC_POSIX
|
||||
fd_set checkfds;
|
||||
struct timeval tv;
|
||||
FD_ZERO(&checkfds);
|
||||
@ -213,12 +214,21 @@ static int hasdata(int fd)
|
||||
if (FD_ISSET(fd, &checkfds))
|
||||
return 1;
|
||||
return 0;
|
||||
#else
|
||||
DWORD avail = 0;
|
||||
|
||||
if (PeekNamedPipe(fd, NULL, 0, NULL, &avail, NULL) && avail > 0)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int test_ASYNC_get_wait_fd()
|
||||
{
|
||||
ASYNC_JOB *job = NULL;
|
||||
int funcret, fd;
|
||||
int funcret;
|
||||
OSSL_ASYNC_FD fd;
|
||||
|
||||
if ( !ASYNC_init_pool(1, 0)
|
||||
|| ASYNC_start_job(&job, &funcret, wake, NULL, 0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user