----- "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