monotone-commits-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Monotone-commits-diffs] net.venge.monotone.visualc: 8d707e5ee0b0b3a9a3


From: code
Subject: [Monotone-commits-diffs] net.venge.monotone.visualc: 8d707e5ee0b0b3a9a35f2e15f797550f7356be44
Date: Wed, 22 Dec 2010 05:32:18 GMT

revision:            8d707e5ee0b0b3a9a35f2e15f797550f7356be44
date:                2010-12-22T05:31:25
author:              Timothy Brownawell  <address@hidden>
branch:              net.venge.monotone.visualc
changelog:
Make the win32 check_net program actually do something.

manifest:
format_version "1"

new_manifest [2be751e7cce05e22bdb9239a9f7518f96a9d1f24]

old_revision [8d4e5b258f2346827e2f43d88f1511bd2b3e4dc0]

patch "visualc/check_net.vcxproj"
 from [0860ea6a0ee8ffacace4a1883a4153207f37c4b1]
   to [d76076ffecac9ce497970991c46f4528d5ddcffc]

patch "win32/tester-check-net.cc"
 from [1fb16b6a801951299889667d726a96894ec77121]
   to [2287668986d3d9048fba937142222ae3703556ab]
============================================================
--- win32/tester-check-net.cc	1fb16b6a801951299889667d726a96894ec77121
+++ win32/tester-check-net.cc	2287668986d3d9048fba937142222ae3703556ab
@@ -1,4 +1,4 @@
-// Copyright (C) 2008 Zack Weinberg <address@hidden>
+// Copyright (C) 2010 Timothy Brownawell <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
 // greater. See the accompanying file COPYING for details.
@@ -7,10 +7,124 @@
 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 // PURPOSE.
 
-/* Stub - needs implementing.  See lua-testsuite.lua (very end) for rationale,
-   and unix/tester-check-net.cc for behavior to emulate.  */
+// threads
+#define WIN32_LEAN_AND_MEAN
+#include <Windows.h>
+
+// sockets
+#include <WinSock2.h>
+#include <WS2tcpip.h>
+
+#include <stdio.h>
+
+DWORD WINAPI timer(void *)
+{
+    Sleep(5000);
+    ExitProcess(5);
+}
+
 int main(void)
 {
+  char const myname[] = "check_net";
+  CreateThread(0, 0, &timer, 0, 0, 0);
+
+  WSADATA wsa_data;
+  int started = WSAStartup(MAKEWORD(2,2), &wsa_data);
+  if (started != 0)
+  {
+    fprintf(stderr, "%s: failed to init Winsock: %d\n", myname, started);
+    ExitProcess(1);
+  }
+  bool use_ip6 = false;
+  
+  SOCKET listen_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, WSA_FLAG_OVERLAPPED);
+  if (listen_sock == INVALID_SOCKET)
+  {
+    use_ip6 = true;
+    SOCKET listen_sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, 0, 0, WSA_FLAG_OVERLAPPED);
+    if (listen_sock == INVALID_SOCKET)
+        ExitProcess(1);
+  }
+
+  struct sockaddr_in my_addr_4;
+  struct sockaddr_in6 my_addr_6;
+  struct sockaddr *my_addr;
+  int my_addr_size;
+  if (use_ip6)
+  {
+      my_addr_6.sin6_family = AF_INET6;
+      my_addr_6.sin6_port = 0x5555;
+      for (int i = 0; i < 15; ++i)
+        my_addr_6.sin6_addr.u.Byte[i] = 0;
+      my_addr_6.sin6_addr.u.Byte[15] = 1;
+
+      my_addr = (struct sockaddr *) &my_addr_6;
+      my_addr_size = sizeof(my_addr_6);
+  }
+  else
+  {
+      my_addr_4.sin_family = AF_INET;
+      my_addr_4.sin_port = 0x5555;
+      WSAHtonl(listen_sock, 0x7f000001, &my_addr_4.sin_addr.S_un.S_addr);
+
+      my_addr = (struct sockaddr *) &my_addr_4;
+      my_addr_size = sizeof(my_addr_4);
+  }
+
+  if (bind(listen_sock, my_addr, my_addr_size) != 0)
+      ExitProcess(1);
+  if (listen(listen_sock, 1) != 0)
+      ExitProcess(1);
+  
+  SOCKET client_sock =  WSASocket(use_ip6 ? AF_INET6 : AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, WSA_FLAG_OVERLAPPED);
+  if (WSAConnect(client_sock, my_addr, my_addr_size, 0, 0, 0, 0) != 0)
+  {
+      fprintf(stderr, "%s: WSAConnect: %d\n", myname, WSAGetLastError());
+      ExitProcess(1);
+  }
+  SOCKET server_sock = WSAAccept(listen_sock, 0, 0, 0, 0);
+  if (server_sock == INVALID_SOCKET)
+      ExitProcess(1);
+
+  WSABUF buffer;
+  buffer.buf = "abc123";
+  buffer.len = 7;
+  DWORD amount_sent;
+  WSAOVERLAPPED overlapped;
+  overlapped.hEvent = WSACreateEvent();
+  int sent = WSASend(client_sock, &buffer, 1, &amount_sent, 0, &overlapped, 0);
+  if (sent != 0 && WSAGetLastError() != WSA_IO_PENDING)
+      ExitProcess(1);
+  
+  WSABUF rbuffer;
+  char foo[8] = {0, 0, 0, 0, 0, 0, 1, 0};
+  rbuffer.buf = foo;
+  rbuffer.len = 8;
+  DWORD amount_rcvd;
+  WSAOVERLAPPED roverlapped;
+  roverlapped.hEvent = WSACreateEvent();
+  DWORD rcvflags = 0;
+  int rcvd = WSARecv(server_sock, &rbuffer, 1, &amount_rcvd, &rcvflags, &roverlapped, 0);
+  if (rcvd != 0)
+  {
+      int er = WSAGetLastError();
+      if (er != WSA_IO_PENDING)
+      {
+        fprintf(stderr, "%s: WSARecv: %d\n", myname, er);
+        ExitProcess(1);
+      }
+  }
+  
+  if (sent != 0)
+      if (WSAWaitForMultipleEvents(1, &overlapped.hEvent, FALSE, WSA_INFINITE, FALSE) == WSA_WAIT_FAILED)
+          ExitProcess(1);
+  if (rcvd != 0)
+      if (WSAWaitForMultipleEvents(1, &roverlapped.hEvent, FALSE, WSA_INFINITE, FALSE) == WSA_WAIT_FAILED)
+          ExitProcess(1);
+
+  if (strcmp("abc123", rbuffer.buf) != 0)
+      ExitProcess(1);
+
   return 0;
 }
 
============================================================
--- visualc/check_net.vcxproj	0860ea6a0ee8ffacace4a1883a4153207f37c4b1
+++ visualc/check_net.vcxproj	d76076ffecac9ce497970991c46f4528d5ddcffc
@@ -71,6 +71,7 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>

reply via email to

[Prev in Thread] Current Thread [Next in Thread]