On Sun, 2010-02-14 at 11:21 -0500, Michael Goldish wrote: > ----- "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? If we can guarantee that the sshd daemon is up and running by the end of linux guest installs, then that is a perfectly fine solution. Need to check though. > > 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