Create a branch for header work.
[reactos.git] / dll / win32 / rpcrt4 / unix_func.c
1 #include <string.h>
2 #include <winsock2.h>
3 #include <windows.h>
4 #include <io.h>
5 #include "unix_func.h"
6
7
8 int
9 poll(struct pollfd *fds,
10 unsigned long nfds,
11 int timo)
12 {
13 TIMEVAL timeout, *toptr;
14 FD_SET ifds, ofds, efds, *ip, *op;
15 int i, rc, n = -1;
16
17 ip = op = NULL;
18
19 FD_ZERO(&ifds);
20 FD_ZERO(&ofds);
21 FD_ZERO(&efds);
22
23 for (i = 0; i < nfds; ++i)
24 {
25 fds[i].revents = 0;
26
27 if (fds[i].fd < 0)
28 continue;
29
30 if (fds[i].fd > n)
31 n = fds[i].fd;
32
33 if (fds[i].events & (POLLIN|POLLPRI))
34 {
35 ip = &ifds;
36 FD_SET(fds[i].fd, ip);
37 }
38
39 if (fds[i].events & POLLOUT)
40 {
41 op = &ofds;
42 FD_SET(fds[i].fd, op);
43 }
44
45 FD_SET(fds[i].fd, &efds);
46 }
47
48 if (timo < 0)
49 toptr = 0;
50 else
51 {
52 toptr = &timeout;
53 timeout.tv_sec = timo / 1000;
54 timeout.tv_usec = (timo - timeout.tv_sec * 1000) * 1000;
55 }
56
57 rc = select(++n, ip, op, &efds, toptr);
58
59 if (rc <= 0)
60 return rc;
61
62 for (i = 0, n = 0; i < nfds; ++i)
63 {
64 if (fds[i].fd < 0) continue;
65
66 if (fds[i].events & (POLLIN|POLLPRI) && FD_ISSET(i, &ifds))
67 fds[i].revents |= POLLIN;
68
69 if (fds[i].events & POLLOUT && FD_ISSET(i, &ofds))
70 fds[i].revents |= POLLOUT;
71
72 if (FD_ISSET(i, &efds))
73 fds[i].revents |= POLLHUP;
74 }
75
76 return rc;
77 }
78
79
80 int socketpair(int af,
81 int type,
82 int protocol,
83 SOCKET socks[2])
84 {
85 struct sockaddr_in addr;
86 SOCKET listener;
87 int e;
88 int addrlen = sizeof(addr);
89 DWORD flags = 0; //(make_overlapped ? WSA_FLAG_OVERLAPPED : 0);
90
91 if (socks == 0)
92 {
93 WSASetLastError(WSAEINVAL);
94 return SOCKET_ERROR;
95 }
96
97 socks[0] = socks[1] = INVALID_SOCKET;
98 if ((listener = socket(af, type, 0)) == INVALID_SOCKET)
99 return SOCKET_ERROR;
100
101 memset(&addr, 0, sizeof(addr));
102 addr.sin_family = AF_INET;
103 addr.sin_addr.s_addr = htonl(0x7f000001);
104 addr.sin_port = 0;
105
106 e = bind(listener, (const struct sockaddr*) &addr, sizeof(addr));
107 if (e == SOCKET_ERROR)
108 {
109 e = WSAGetLastError();
110 closesocket(listener);
111 WSASetLastError(e);
112 return SOCKET_ERROR;
113 }
114 e = getsockname(listener, (struct sockaddr*) &addr, &addrlen);
115 if (e == SOCKET_ERROR)
116 {
117 e = WSAGetLastError();
118 closesocket(listener);
119 WSASetLastError(e);
120 return SOCKET_ERROR;
121 }
122
123 do
124 {
125 if (listen(listener, 1) == SOCKET_ERROR)
126 break;
127 if ((socks[0] = WSASocket(af, type, 0, NULL, 0, flags)) == INVALID_SOCKET)
128 break;
129 if (connect(socks[0], (const struct sockaddr*) &addr, sizeof(addr)) == SOCKET_ERROR)
130 break;
131 if ((socks[1] = accept(listener, NULL, NULL)) == INVALID_SOCKET)
132 break;
133
134 closesocket(listener);
135 return 0;
136
137 } while (0);
138
139 e = WSAGetLastError();
140 closesocket(listener);
141 closesocket(socks[0]);
142 closesocket(socks[1]);
143 WSASetLastError(e);
144 return SOCKET_ERROR;
145 }
146
147
148 const char *
149 inet_ntop (int af,
150 const void *src,
151 char *dst,
152 size_t cnt)
153 {
154 struct in_addr in;
155 char *text_addr;
156
157 if (af == AF_INET)
158 {
159 memcpy(&in.s_addr, src, sizeof(in.s_addr));
160 text_addr = inet_ntoa(in);
161 if (text_addr && dst)
162 {
163 strncpy(dst, text_addr, cnt);
164 return dst;
165 }
166 }
167
168 return 0;
169 }
170
171 int fcntl(int fd,
172 int cmd,
173 long arg)
174 {
175 // Stub
176 return 0;
177 }