From: VMware, Inc <> Date: Fri, 12 Apr 2013 19:52:17 +0000 (-0700) Subject: Add a vtable function to close a listening socket. X-Git-Tag: 2013.04.16-1098359~26 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c83894fb2d7fda79f3136ffc5f08cecbfc8e521c;p=thirdparty%2Fopen-vm-tools.git Add a vtable function to close a listening socket. Not all socket types install a periodic device callback for listening sockets. Signed-off-by: Dmitry Torokhov --- diff --git a/open-vm-tools/lib/asyncsocket/asyncSocketInt.h b/open-vm-tools/lib/asyncsocket/asyncSocketInt.h index 376d345b0..b63083f3a 100644 --- a/open-vm-tools/lib/asyncsocket/asyncSocketInt.h +++ b/open-vm-tools/lib/asyncsocket/asyncSocketInt.h @@ -272,6 +272,7 @@ typedef struct AsyncSocketVTable { int (*recv)(AsyncSocket *asock, void *buf, int len); PollerFunction recvCallback; Bool (*hasDataPending)(AsyncSocket *asock); + void (*cancelListenCb)(AsyncSocket *asock); void (*cancelRecvCb)(AsyncSocket *asock); void (*cancelCbForClose)(AsyncSocket *asock); Bool (*cancelCbForConnectingClose)(AsyncSocket *asock); @@ -313,6 +314,7 @@ AsyncSocket *AsyncSocketCreate(AsyncSocketPollParams *pollParams); void AsyncSocketDispatchConnect(AsyncSocket *asock, AsyncSocket *newsock); void AsyncSocketRecvCallback(void *clientData); int AsyncSocketRecvSocket(AsyncSocket *asock, void *buf, int len); +void AsyncSocketCancelListenCbSocket(AsyncSocket *asock); void AsyncSocketCancelRecvCbSocket(AsyncSocket *asock); void AsyncSocketCancelCbForCloseSocket(AsyncSocket *asock); Bool AsyncSocketCancelCbForConnectingCloseSocket(AsyncSocket *asock); diff --git a/open-vm-tools/lib/asyncsocket/asyncsocket.c b/open-vm-tools/lib/asyncsocket/asyncsocket.c index 17efa3f28..e17a2aaf7 100644 --- a/open-vm-tools/lib/asyncsocket/asyncsocket.c +++ b/open-vm-tools/lib/asyncsocket/asyncsocket.c @@ -113,6 +113,7 @@ static const AsyncSocketVTable asyncStreamSocketVTable = { AsyncSocketRecvSocket, AsyncSocketRecvCallback, AsyncSocketHasDataPendingSocket, + AsyncSocketCancelListenCbSocket, AsyncSocketCancelRecvCbSocket, AsyncSocketCancelCbForCloseSocket, AsyncSocketCancelCbForConnectingCloseSocket, @@ -128,6 +129,7 @@ static const AsyncSocketVTable asyncDgramSocketVTable = { AsyncSocketRecvSocket, AsyncSocketRecvUDPCallback, AsyncSocketHasDataPendingSocket, + AsyncSocketCancelListenCbSocket, AsyncSocketCancelRecvCbSocket, AsyncSocketCancelCbForCloseSocket, AsyncSocketCancelCbForConnectingCloseSocket, @@ -3358,6 +3360,36 @@ AsyncSocket_SetErrorFn(AsyncSocket *asock, // IN/OUT } +/* + *---------------------------------------------------------------------------- + * + * AsyncSocketCancelListenCbSocket -- + * + * Socket specific code for canceling callbacks for a listening socket. + * + * Results: + * None. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------------- + */ + +void +AsyncSocketCancelListenCbSocket(AsyncSocket *asock) // IN: +{ + Bool removed; + + ASSERT(AsyncSocketIsLocked(asock)); + + removed = AsyncSocketPollRemove(asock, TRUE, + POLL_FLAG_READ | POLL_FLAG_PERIODIC, + AsyncSocketAcceptCallback); + ASSERT(removed); +} + + /* *---------------------------------------------------------------------------- * @@ -3677,12 +3709,9 @@ AsyncSocket_Close(AsyncSocket *asock) switch(oldState) { case AsyncSocketListening: - ASSERT(asock->asockType != ASYNCSOCKET_TYPE_NAMEDPIPE); ASOCKLOG(1, asock, ("old state was listening, removing accept callback\n")); - removed = AsyncSocketPollRemove(asock, TRUE, - POLL_FLAG_READ | POLL_FLAG_PERIODIC, - AsyncSocketAcceptCallback); - ASSERT(removed); + ASSERT(asock->vt->cancelListenCb); + asock->vt->cancelListenCb(asock); break; case AsyncSocketConnecting: