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>
-int async_pipe(int *pipefds)
+int async_pipe(OSSL_ASYNC_FD *pipefds)
-int async_write1(int fd, const void *buf)
+int async_write1(OSSL_ASYNC_FD fd, const void *buf)
-int async_read1(int fd, void *buf)
+int async_read1(OSSL_ASYNC_FD fd, void *buf)
OPENSSL_free(fibre->fibre.uc_stack.ss_sp);
}
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;
{
if (pipe(pipefds) == 0)
return 1;
-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;
{
if (write(fd, buf, 1) > 0)
return 1;
-int async_read1(int fd, void *buf)
+int async_read1(OSSL_ASYNC_FD fd, void *buf)
{
if (read(fd, buf, 1) > 0)
return 1;
{
if (read(fd, buf, 1) > 0)
return 1;
-int async_pipe(int *pipefds)
+int async_pipe(OSSL_ASYNC_FD *pipefds)
- if (_pipe(pipefds, 256, _O_BINARY) == 0)
- return 1;
+ if (CreatePipe(&pipefds[0], &pipefds[1], NULL, 256) == 0)
+ 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)
+ DWORD numwritten = 0;
+
+ if (WriteFile(fd, buf, 1, &numwritten, NULL) && numwritten == 1)
-int async_read1(int fd, void *buf)
+int async_read1(OSSL_ASYNC_FD fd, void *buf)
- if (_read(fd, buf, 1) > 0)
+ DWORD numread = 0;
+
+ if (ReadFile(fd, buf, 1, &numread, NULL) && numread == 1)
static ASYNC_JOB *async_job_new(void)
{
ASYNC_JOB *job = NULL;
static ASYNC_JOB *async_job_new(void)
{
ASYNC_JOB *job = NULL;
+ OSSL_ASYNC_FD pipefds[2];
job = OPENSSL_malloc(sizeof (ASYNC_JOB));
if (job == NULL) {
job = OPENSSL_malloc(sizeof (ASYNC_JOB));
if (job == NULL) {
-int ASYNC_get_wait_fd(ASYNC_JOB *job)
+OSSL_ASYNC_FD ASYNC_get_wait_fd(ASYNC_JOB *job)
int ret;
int status;
int wake_set;
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)
};
DECLARE_STACK_OF(ASYNC_JOB)
size_t async_pool_max_size(void);
void async_release_pool(void);
int async_pool_can_grow(void);
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);
+#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
# ifdef __cplusplus
extern "C" {
# endif
void *args, size_t size);
int ASYNC_pause_job(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);
ASYNC_JOB *ASYNC_get_current_job(void);
void ASYNC_wake(ASYNC_JOB *job);
void ASYNC_clear_wake(ASYNC_JOB *job);
# if _POSIX_VERSION >= 200112L
# define ASYNC_POSIX
# endif
# if _POSIX_VERSION >= 200112L
# define ASYNC_POSIX
# endif
-#elif (defined(_WIN32) || defined(__CYGWIN__)) && defined(_WINDLL)
+#elif defined(_WIN32) || defined(__CYGWIN__)
# define ASYNC_WIN
#endif
# define ASYNC_WIN
#endif
-static int hasdata(int fd)
+static int hasdata(OSSL_ASYNC_FD fd)
fd_set checkfds;
struct timeval tv;
FD_ZERO(&checkfds);
fd_set checkfds;
struct timeval tv;
FD_ZERO(&checkfds);
if (FD_ISSET(fd, &checkfds))
return 1;
return 0;
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;
}
static int test_ASYNC_get_wait_fd()
{
ASYNC_JOB *job = NULL;
+ int funcret;
+ OSSL_ASYNC_FD fd;
if ( !ASYNC_init_pool(1, 0)
|| ASYNC_start_job(&job, &funcret, wake, NULL, 0)
if ( !ASYNC_init_pool(1, 0)
|| ASYNC_start_job(&job, &funcret, wake, NULL, 0)