Re: [PATCH] KVM test: Modifying finish.exe to support parallel installs

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

 



----- "Lucas Meneghel Rodrigues" <lmr@xxxxxxxxxx> wrote:

> In order to adapt all the OS unattended installs to parallel
> installs, finish.exe also had to be adapted to be a server
> instead of a client. These are the modifications needed.
> 
> Once the whole patchset is worked out, an updated version
> of finish.exe will be shipped on version control.
> 
> Signed-off-by: Lucas Meneghel Rodrigues <lmr@xxxxxxxxxx>

Now that finish.exe is a server it looks like a stripped version
of rss.exe.  Since we're already running rss.exe at the end of
each unattended_install, why not just use VM.remote_login() to
verify that the installation was successful?

>  client/tests/kvm/deps/finish.cpp |  111
> ++++++++++++++++++++------------------
>  1 files changed, 59 insertions(+), 52 deletions(-)
> 
> 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 <lmr@xxxxxxxxxx>
>  // 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 <stdlib.h>
>  #include <stdio.h>
>  
> -#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;
> -- 
> 1.6.6.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux