blob: 1469e579859c0e3c2c754dcc341a9da59935036c [file] [log] [blame]
James Kuszmaul82f6c042021-01-17 11:30:16 -08001/**
2 * @file pipe.c Pipe-emulation for Windows
3 *
4 * Copyright (C) 2010 Creytiv.com
5 */
6#include <winsock2.h>
7#include <re_types.h>
8#include "../mqueue.h"
9
10
11/*
12 * Emulate pipe on Windows -- pipe() with select() is not working
13 */
14int pipe(int fds[2])
15{
16 SOCKET s, rd, wr;
17 struct sockaddr_in serv_addr;
18 int len = sizeof(serv_addr);
19
20 if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
21 return ENOSYS;
22
23 memset((void *) &serv_addr, 0, sizeof(serv_addr));
24 serv_addr.sin_family = AF_INET;
25 serv_addr.sin_port = htons(0);
26 serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
27 if (bind(s, (SOCKADDR *) & serv_addr, len) == SOCKET_ERROR)
28 goto error;
29
30 if (listen(s, 1) == SOCKET_ERROR)
31 goto error;
32
33 if (getsockname(s, (SOCKADDR *) &serv_addr, &len) == SOCKET_ERROR)
34 goto error;
35
36 if ((wr = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
37 goto error;
38
39 if (connect(wr, (SOCKADDR *) &serv_addr, len) == SOCKET_ERROR) {
40 closesocket(wr);
41 goto error;
42 }
43
44 rd = accept(s, (SOCKADDR *) &serv_addr, &len);
45 if (rd == INVALID_SOCKET) {
46 closesocket(wr);
47 goto error;
48 }
49
50 fds[0] = rd;
51 fds[1] = wr;
52
53 closesocket(s);
54 return 0;
55
56error:
57 closesocket(s);
58 return ENOSYS;
59}
60
61
62ssize_t pipe_read(int s, void *buf, size_t len)
63{
64 int ret = recv(s, buf, len, 0);
65
66 if (ret < 0 && WSAGetLastError() == WSAECONNRESET)
67 ret = 0;
68
69 return ret;
70}
71
72
73ssize_t pipe_write(int s, const void *buf, size_t len)
74{
75 return send(s, buf, len, 0);
76}
77