+extern char *myport;
+
+DWORD WINAPI tapreader(void *bla) {
+ int sock, err, status;
+ struct addrinfo *ai;
+ struct addrinfo hint = {
+ .ai_family = AF_UNSPEC,
+ .ai_socktype = SOCK_DGRAM,
+ .ai_protocol = IPPROTO_UDP,
+ .ai_flags = 0,
+ };
+ char buf[MTU];
+ long len;
+ OVERLAPPED overlapped;
+
+ /* Open a socket to the parent process */
+
+ err = getaddrinfo(NULL, myport, &hint, &ai);
+
+ if(err || !ai) {
+ logger(LOG_ERR, _("System call `%s' failed: %s"), "getaddrinfo", gai_strerror(errno));
+ return -1;
+ }
+
+ sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+
+ freeaddrinfo(ai);
+
+ if(sock < 0) {
+ logger(LOG_ERR, _("System call `%s' failed: %s"), "socket", strerror(errno));
+ return -1;
+ }
+
+ if(connect(sock, ai->ai_addr, ai->ai_addrlen)) {
+ logger(LOG_ERR, _("System call `%s' failed: %s"), "connect", strerror(errno));
+ return -1;
+ }
+
+ logger(LOG_DEBUG, _("Tap reader running"));
+
+ /* Read from tap device and send to parent */
+
+ overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+
+ for(;;) {
+ overlapped.Offset = 0;
+ overlapped.OffsetHigh = 0;
+ ResetEvent(overlapped.hEvent);
+
+ status = ReadFile(device_handle, buf, sizeof(buf), &len, &overlapped);
+
+ if(!status) {
+ if(GetLastError() == ERROR_IO_PENDING) {
+ WaitForSingleObject(overlapped.hEvent, INFINITE);
+ if(!GetOverlappedResult(device_handle, &overlapped, &len, FALSE))
+ continue;
+ } else {
+ logger(LOG_ERR, _("Error while reading from %s %s: %s"), device_info,
+ device, strerror(errno));
+ return -1;
+ }
+ }
+
+ if(send(sock, buf, len, 0) <= 0)
+ return -1;
+ }
+}
+