From patchwork Thu Feb 11 19:29:00 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucas Meneghel Rodrigues X-Patchwork-Id: 78798 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o1BJTLMj017127 for ; Thu, 11 Feb 2010 19:29:22 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756880Ab0BKT3U (ORCPT ); Thu, 11 Feb 2010 14:29:20 -0500 Received: from mx1.redhat.com ([209.132.183.28]:45370 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756782Ab0BKT3T (ORCPT ); Thu, 11 Feb 2010 14:29:19 -0500 Received: from int-mx08.intmail.prod.int.phx2.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o1BJT6ZM021986 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 11 Feb 2010 14:29:06 -0500 Received: from localhost.localdomain (vpn-11-113.rdu.redhat.com [10.11.11.113]) by int-mx08.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o1BJT2DD009829; Thu, 11 Feb 2010 14:29:03 -0500 From: Lucas Meneghel Rodrigues To: autotest@test.kernel.org Cc: kvm@vger.kernel.org, anantyog@linux.vnet.ibm.com, ryanh@us.ibm.com, Lucas Meneghel Rodrigues Subject: [PATCH] KVM test: Modifying finish.exe to support parallel installs Date: Thu, 11 Feb 2010 17:29:00 -0200 Message-Id: <1265916540-4530-1-git-send-email-lmr@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.21 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Thu, 11 Feb 2010 19:29:22 +0000 (UTC) diff --git a/client/tests/kvm/deps/finish.cpp b/client/tests/kvm/deps/finish.cpp index 9c2867c..e5ba128 100644 --- a/client/tests/kvm/deps/finish.cpp +++ b/client/tests/kvm/deps/finish.cpp @@ -1,12 +1,13 @@ -// Simple app that only sends an ack string to the KVM unattended install -// watch code. +// Simple application that creates a server socket, listening for connections +// of the unattended install test. Once it gets a client connected, the +// app will send back an ACK string, indicating the install process is done. // // You must link this code with Ws2_32.lib, Mswsock.lib, and Advapi32.lib // // Author: Lucas Meneghel Rodrigues // Code was adapted from an MSDN sample. -// Usage: finish.exe [Host OS IP] +// Usage: finish.exe // MinGW's ws2tcpip.h only defines getaddrinfo and other functions only for // the case _WIN32_WINNT >= 0x0501. @@ -21,24 +22,18 @@ #include #include -#define DEFAULT_BUFLEN 512 #define DEFAULT_PORT "12323" - int main(int argc, char **argv) { WSADATA wsaData; - SOCKET ConnectSocket = INVALID_SOCKET; - struct addrinfo *result = NULL, - *ptr = NULL, - hints; + SOCKET ListenSocket = INVALID_SOCKET, ClientSocket = INVALID_SOCKET; + struct addrinfo *result = NULL, hints; char *sendbuf = "done"; - char recvbuf[DEFAULT_BUFLEN]; - int iResult; - int recvbuflen = DEFAULT_BUFLEN; + int iResult, iSendResult; // Validate the parameters - if (argc != 2) { - printf("usage: %s server-name\n", argv[0]); + if (argc != 1) { + printf("usage: %s", argv[0]); return 1; } @@ -49,72 +44,84 @@ int main(int argc, char **argv) return 1; } - ZeroMemory( &hints, sizeof(hints) ); - hints.ai_family = AF_UNSPEC; + ZeroMemory(&hints, sizeof(hints)); + hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; + hints.ai_flags = AI_PASSIVE; // Resolve the server address and port - iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result); - if ( iResult != 0 ) { + iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); + if (iResult != 0) { printf("getaddrinfo failed: %d\n", iResult); WSACleanup(); return 1; } - // Attempt to connect to an address until one succeeds - for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) { - - // Create a SOCKET for connecting to server - ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, - ptr->ai_protocol); - if (ConnectSocket == INVALID_SOCKET) { - printf("Error at socket(): %ld\n", WSAGetLastError()); - freeaddrinfo(result); - WSACleanup(); - return 1; - } - - // Connect to server. - iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); - if (iResult == SOCKET_ERROR) { - closesocket(ConnectSocket); - ConnectSocket = INVALID_SOCKET; - continue; - } - break; + // Create a SOCKET for connecting to server + ListenSocket = socket(result->ai_family, result->ai_socktype, + result->ai_protocol); + if (ListenSocket == INVALID_SOCKET) { + printf("socket failed: %ld\n", WSAGetLastError()); + freeaddrinfo(result); + WSACleanup(); + return 1; + } + + // Setup the TCP listening socket + iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen); + if (iResult == SOCKET_ERROR) { + printf("bind failed: %d\n", WSAGetLastError()); + freeaddrinfo(result); + closesocket(ListenSocket); + WSACleanup(); + return 1; } freeaddrinfo(result); - if (ConnectSocket == INVALID_SOCKET) { - printf("Unable to connect to server!\n"); + iResult = listen(ListenSocket, SOMAXCONN); + if (iResult == SOCKET_ERROR) { + printf("listen failed: %d\n", WSAGetLastError()); + closesocket(ListenSocket); WSACleanup(); return 1; } - // Send the ACK buffer - iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 ); - if (iResult == SOCKET_ERROR) { - printf("send failed: %d\n", WSAGetLastError()); - closesocket(ConnectSocket); + // Accept a client socket + ClientSocket = accept(ListenSocket, NULL, NULL); + if (ClientSocket == INVALID_SOCKET) { + printf("accept failed: %d\n", WSAGetLastError()); + closesocket(ListenSocket); WSACleanup(); return 1; } - printf("Bytes Sent: %ld\n", iResult); + // No longer need the server socket + closesocket(ListenSocket); + + // Send the ack string to the client + iSendResult = send(ClientSocket, sendbuf, sizeof(sendbuf), 0); + if (iSendResult == SOCKET_ERROR) { + printf("send failed: %d\n", WSAGetLastError()); + closesocket(ClientSocket); + WSACleanup(); + return 1; + } + // Report the number of bytes sent + printf("Bytes sent: %d\n", iSendResult); - // shutdown the connection since no more data will be sent - iResult = shutdown(ConnectSocket, SD_SEND); + // Shutdown the connection since we're done + iResult = shutdown(ClientSocket, SD_SEND); if (iResult == SOCKET_ERROR) { printf("shutdown failed: %d\n", WSAGetLastError()); - closesocket(ConnectSocket); + closesocket(ClientSocket); WSACleanup(); return 1; } - // cleanup - closesocket(ConnectSocket); + // Cleanup + closesocket(ClientSocket); WSACleanup(); return 0;