1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for send/sendto
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
6 */
7
8 #include "ws2_32.h"
9
10 static
11 PVOID
AllocateReadOnly(_In_ SIZE_T SizeRequested)12 AllocateReadOnly(
13 _In_ SIZE_T SizeRequested)
14 {
15 NTSTATUS Status;
16 SIZE_T Size = PAGE_ROUND_UP(SizeRequested);
17 PVOID VirtualMemory = NULL;
18
19 Status = NtAllocateVirtualMemory(NtCurrentProcess(), &VirtualMemory, 0, &Size, MEM_COMMIT, PAGE_READONLY);
20 if (!NT_SUCCESS(Status))
21 return NULL;
22
23 return VirtualMemory;
24 }
25
26 static
27 VOID
FreeReadOnly(_In_ PVOID VirtualMemory)28 FreeReadOnly(
29 _In_ PVOID VirtualMemory)
30 {
31 NTSTATUS Status;
32 SIZE_T Size = 0;
33
34 Status = NtFreeVirtualMemory(NtCurrentProcess(), &VirtualMemory, &Size, MEM_RELEASE);
35 ok(Status == STATUS_SUCCESS, "Status = %lx\n", Status);
36 }
37
38 static
39 VOID
test_send(void)40 test_send(void)
41 {
42 SOCKET sock;
43 int ret;
44 int error;
45 PVOID buffer;
46 ULONG bufferSize;
47 struct sockaddr_in addr;
48
49 bufferSize = 32;
50 buffer = AllocateReadOnly(bufferSize);
51 ok(buffer != NULL, "AllocateReadOnly failed\n");
52 if (!buffer)
53 {
54 skip("No memory\n");
55 return;
56 }
57
58 ret = send(0, NULL, 0, 0);
59 error = WSAGetLastError();
60 ok(ret == SOCKET_ERROR, "send returned %d\n", ret);
61 ok(error == WSAENOTSOCK, "error = %d\n", error);
62
63 ret = send(0, buffer, bufferSize, 0);
64 error = WSAGetLastError();
65 ok(ret == SOCKET_ERROR, "send returned %d\n", ret);
66 ok(error == WSAENOTSOCK, "error = %d\n", error);
67
68 sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
69 ok(sock != INVALID_SOCKET, "socket failed\n");
70 if (sock == INVALID_SOCKET)
71 {
72 skip("No socket\n");
73 FreeReadOnly(buffer);
74 return;
75 }
76
77 ret = send(sock, NULL, 0, 0);
78 error = WSAGetLastError();
79 ok(ret == SOCKET_ERROR, "send returned %d\n", ret);
80 ok(error == WSAENOTCONN, "error = %d\n", error);
81
82 ret = send(sock, buffer, bufferSize, 0);
83 error = WSAGetLastError();
84 ok(ret == SOCKET_ERROR, "send returned %d\n", ret);
85 ok(error == WSAENOTCONN, "error = %d\n", error);
86
87 memset(&addr, 0, sizeof(addr));
88 addr.sin_family = AF_INET;
89 addr.sin_addr.s_addr = inet_addr("8.8.8.8");
90 addr.sin_port = htons(53);
91 ret = connect(sock, (const struct sockaddr *)&addr, sizeof(addr));
92 error = WSAGetLastError();
93 ok(ret == 0, "connect returned %d\n", ret);
94 ok(error == 0, "error = %d\n", error);
95
96 ret = send(sock, NULL, 0, 0);
97 error = WSAGetLastError();
98 ok(ret == 0, "send returned %d\n", ret);
99 ok(error == 0, "error = %d\n", error);
100
101 ret = send(sock, buffer, bufferSize, 0);
102 error = WSAGetLastError();
103 ok(ret == bufferSize, "send returned %d\n", ret);
104 ok(error == 0, "error = %d\n", error);
105
106 closesocket(sock);
107
108 FreeReadOnly(buffer);
109 }
110
111 static
112 VOID
test_sendto(void)113 test_sendto(void)
114 {
115 SOCKET sock;
116 int ret;
117 int error;
118 PVOID buffer;
119 ULONG bufferSize;
120 struct sockaddr_in addr;
121
122 bufferSize = 32;
123 buffer = AllocateReadOnly(bufferSize);
124 ok(buffer != NULL, "AllocateReadOnly failed\n");
125 if (!buffer)
126 {
127 skip("No memory\n");
128 return;
129 }
130
131 memset(&addr, 0, sizeof(addr));
132 addr.sin_family = AF_INET;
133 addr.sin_addr.s_addr = inet_addr("8.8.8.8");
134 addr.sin_port = htons(53);
135
136 ret = sendto(0, NULL, 0, 0, (const struct sockaddr *)&addr, sizeof(addr));
137 error = WSAGetLastError();
138 ok(ret == SOCKET_ERROR, "sendto returned %d\n", ret);
139 ok(error == WSAENOTSOCK, "error = %d\n", error);
140
141 ret = sendto(0, buffer, bufferSize, 0, (const struct sockaddr *)&addr, sizeof(addr));
142 error = WSAGetLastError();
143 ok(ret == SOCKET_ERROR, "sendto returned %d\n", ret);
144 ok(error == WSAENOTSOCK, "error = %d\n", error);
145
146 sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
147 ok(sock != INVALID_SOCKET, "socket failed\n");
148 if (sock == INVALID_SOCKET)
149 {
150 skip("No socket\n");
151 FreeReadOnly(buffer);
152 return;
153 }
154
155 ret = sendto(sock, NULL, 0, 0, (const struct sockaddr *)&addr, sizeof(addr));
156 error = WSAGetLastError();
157 ok(ret == 0, "sendto returned %d\n", ret);
158 ok(error == 0, "error = %d\n", error);
159
160 ret = sendto(sock, buffer, bufferSize, 0, (const struct sockaddr *)&addr, sizeof(addr));
161 error = WSAGetLastError();
162 ok(ret == bufferSize, "sendto returned %d\n", ret);
163 ok(error == 0, "error = %d\n", error);
164
165 closesocket(sock);
166
167 FreeReadOnly(buffer);
168 }
169
START_TEST(send)170 START_TEST(send)
171 {
172 int ret;
173 WSADATA wsad;
174
175 ret = WSAStartup(MAKEWORD(2, 2), &wsad);
176 ok(ret == 0, "WSAStartup failed with %d\n", ret);
177 test_send();
178 test_sendto();
179 WSACleanup();
180 }
181