]> git.ipfire.org Git - thirdparty/open-vm-tools.git/commitdiff
Add a vtable function to close a listening socket.
authorVMware, Inc <>
Fri, 12 Apr 2013 19:52:17 +0000 (12:52 -0700)
committerDmitry Torokhov <dtor@vmware.com>
Wed, 17 Apr 2013 19:16:55 +0000 (12:16 -0700)
Not all socket types install a periodic device callback for listening
sockets.

Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
open-vm-tools/lib/asyncsocket/asyncSocketInt.h
open-vm-tools/lib/asyncsocket/asyncsocket.c

index 376d345b09bbf7fb06aa43fde7463c152fafebbd..b63083f3ae9194aa4384cfb689a3dca899755b4b 100644 (file)
@@ -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);
index 17efa3f28adaf4d8751ee8205f49f764bfd592a1..e17a2aaf787f1f7b0facd13e86adb6885e68cca9 100644 (file)
@@ -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: