[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freedesktop-xorg-devel
Subject:    [PATCH 2/3 xserver] xace: Add XACE hooks for Xtrans Accept/Disconnect/Close
From:       Andrew Eikum <aeikum () codeweavers ! com>
Date:       2012-12-21 20:33:00
Message-ID: 20121221203300.GC32255 () foghorn ! codeweavers ! com
[Download RAW message or body]

Signed-off-by: Andrew Eikum <aeikum@codeweavers.com>
---
 Xext/xace.c     |  2 +-
 Xext/xace.h     | 11 +++++++----
 Xext/xacestr.h  |  2 +-
 os/connection.c | 40 ++++++++++++++++++++++++++++++----------
 os/io.c         | 16 ++++++++--------
 os/osdep.h      |  3 +++
 6 files changed, 50 insertions(+), 24 deletions(-)


["0002-xace-Add-XACE-hooks-for-Xtrans-Accept-Disconnect-Clo.patch" (text/x-patch)]

diff --git a/Xext/xace.c b/Xext/xace.c
index d51a720..2394024 100644
--- a/Xext/xace.c
+++ b/Xext/xace.c
@@ -208,7 +208,7 @@ XaceHook(int hook, ...)
         break;
     case XACE_XTRANS_DISPATCH:
         u.xtrans.type = va_arg(ap, int);
-        u.xtrans.ciptr = va_arg(ap, XtransConnInfo);
+        u.xtrans.pciptr = va_arg(ap, XtransConnInfo *);
         u.xtrans.client = va_arg(ap, ClientPtr);
         u.xtrans.result = va_arg(ap, int *);
         u.xtrans.buf = va_arg(ap, char *);
diff --git a/Xext/xace.h b/Xext/xace.h
index 14f30e0..91c5815 100644
--- a/Xext/xace.h
+++ b/Xext/xace.h
@@ -57,10 +57,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define XACE_XTRANS_DISPATCH		17
 #define XACE_NUM_HOOKS			18
 
-#define XACE_XTRANS_READ 0
-#define XACE_XTRANS_WRITE 1
-#define XACE_XTRANS_READV 2
-#define XACE_XTRANS_WRITEV 3
+#define XACE_XTRANS_ACCEPT 0
+#define XACE_XTRANS_DISCONNECT 1
+#define XACE_XTRANS_CLOSE 2
+#define XACE_XTRANS_READ 3
+#define XACE_XTRANS_WRITE 4
+#define XACE_XTRANS_READV 5
+#define XACE_XTRANS_WRITEV 6
 
 extern _X_EXPORT CallbackListPtr XaceHooks[XACE_NUM_HOOKS];
 
diff --git a/Xext/xacestr.h b/Xext/xacestr.h
index 144fead..dee49a8 100644
--- a/Xext/xacestr.h
+++ b/Xext/xacestr.h
@@ -148,7 +148,7 @@ typedef struct {
 /* XACE_XTRANS_DISPATCH */
 typedef struct {
     int type; /* one of XACE_XTRANS_* */
-    XtransConnInfo ciptr;
+    XtransConnInfo *pciptr;
     ClientPtr client;
     int *result;
     char *buf;
diff --git a/os/connection.c b/os/connection.c
index 6ddb9aa..6688d14 100644
--- a/os/connection.c
+++ b/os/connection.c
@@ -507,12 +507,28 @@ ResetWellKnownSockets(void)
 }
 
 void
+CallXtransClose(ClientPtr client, XtransConnInfo *pciptr)
+{
+    if (XaceHook(XACE_XTRANS_DISPATCH, XACE_XTRANS_CLOSE, pciptr,
+            client, NULL, NULL, 0) == BadImplementation)
+        _XSERVTransClose(*pciptr);
+}
+
+void
+CallXtransDisconnect(ClientPtr client, XtransConnInfo *pciptr)
+{
+    if (XaceHook(XACE_XTRANS_DISPATCH, XACE_XTRANS_DISCONNECT, pciptr,
+            client, NULL, NULL, 0) == BadImplementation)
+        _XSERVTransDisconnect(*pciptr);
+}
+
+void
 CloseWellKnownConnections(void)
 {
     int i;
 
     for (i = 0; i < ListenTransCount; i++)
-        _XSERVTransClose(ListenTransConns[i]);
+        CallXtransClose(serverClient, &ListenTransConns[i]);
 }
 
 static void
@@ -805,7 +821,7 @@ EstablishNewConnections(ClientPtr clientUnused, pointer closure)
     register int newconn;       /* fd of new client */
     CARD32 connect_time;
     register int i;
-    register ClientPtr client;
+    register ClientPtr client = NULL;
     register OsCommPtr oc;
     fd_set tmask;
 
@@ -845,7 +861,11 @@ EstablishNewConnections(ClientPtr clientUnused, pointer closure)
         if ((trans_conn = lookup_trans_conn(curconn)) == NULL)
             continue;
 
-        if ((new_trans_conn = _XSERVTransAccept(trans_conn, &status)) == NULL)
+        new_trans_conn = trans_conn;
+        if (XaceHook(XACE_XTRANS_DISPATCH, XACE_XTRANS_ACCEPT, &new_trans_conn,
+                NULL, &status, NULL, 0) == BadImplementation)
+            new_trans_conn = _XSERVTransAccept(trans_conn, &status);
+        if (new_trans_conn == trans_conn || !new_trans_conn)
             continue;
 
         newconn = _XSERVTransGetConnectionNumber(new_trans_conn);
@@ -869,7 +889,7 @@ EstablishNewConnections(ClientPtr clientUnused, pointer closure)
 
         if (!AllocNewConnection(new_trans_conn, newconn, connect_time)) {
             ErrorConnMax(new_trans_conn);
-            _XSERVTransClose(new_trans_conn);
+            CallXtransClose(client, &new_trans_conn);
         }
     }
 #ifndef WIN32
@@ -907,7 +927,7 @@ ErrorConnMax(XtransConnInfo trans_conn)
     FD_SET(fd, &mask);
     (void) Select(fd + 1, &mask, NULL, NULL, &waittime);
     /* try to read the byte-order of the connection */
-    err = XaceHook(XACE_XTRANS_DISPATCH, XACE_XTRANS_READ, trans_conn,
+    err = XaceHook(XACE_XTRANS_DISPATCH, XACE_XTRANS_READ, &trans_conn,
             NULL, &result, &order, 1);
     if (err == BadImplementation)
         (void) _XSERVTransRead(trans_conn, &order, 1);
@@ -929,7 +949,7 @@ ErrorConnMax(XtransConnInfo trans_conn)
         iov[1].iov_base = NOROOM;
         iov[2].iov_len = (4 - (csp.lengthReason & 3)) & 3;
         iov[2].iov_base = pad;
-        err = XaceHook(XACE_XTRANS_DISPATCH, XACE_XTRANS_WRITEV, trans_conn,
+        err = XaceHook(XACE_XTRANS_DISPATCH, XACE_XTRANS_WRITEV, &trans_conn,
                 NULL, &result, iov, 3);
         if (err == BadImplementation)
             (void) _XSERVTransWritev(trans_conn, iov, 3);
@@ -942,13 +962,13 @@ ErrorConnMax(XtransConnInfo trans_conn)
  ************/
 
 static void
-CloseDownFileDescriptor(OsCommPtr oc)
+CloseDownFileDescriptor(ClientPtr client, OsCommPtr oc)
 {
     int connection = oc->fd;
 
     if (oc->trans_conn) {
-        _XSERVTransDisconnect(oc->trans_conn);
-        _XSERVTransClose(oc->trans_conn);
+        CallXtransDisconnect(client, &oc->trans_conn);
+        CallXtransClose(client, &oc->trans_conn);
     }
 #ifndef WIN32
     ConnectionTranslation[connection] = 0;
@@ -1049,7 +1069,7 @@ CloseDownConnection(ClientPtr client)
 #ifdef XDMCP
     XdmcpCloseDisplay(oc->fd);
 #endif
-    CloseDownFileDescriptor(oc);
+    CloseDownFileDescriptor(client, oc);
     FreeOsBuffers(oc);
     free(client->osPrivate);
     client->osPrivate = (pointer) NULL;
diff --git a/os/io.c b/os/io.c
index 3128c7f..6e3eab8 100644
--- a/os/io.c
+++ b/os/io.c
@@ -347,7 +347,7 @@ ReadRequestFromClient(ClientPtr client)
             YieldControlDeath();
             return -1;
         }
-        err = XaceHook(XACE_XTRANS_DISPATCH, XACE_XTRANS_READ, oc->trans_conn,
+        err = XaceHook(XACE_XTRANS_DISPATCH, XACE_XTRANS_READ, &oc->trans_conn,
                 client, &result, oci->buffer + oci->bufcnt, oci->size - oci->bufcnt);
         if (err == BadImplementation)
             result = _XSERVTransRead(oc->trans_conn, oci->buffer + oci->bufcnt,
@@ -770,8 +770,8 @@ WriteToClient(ClientPtr who, int count, const void *__buf)
         }
         else if (!(oco = AllocateOutputBuffer())) {
             if (oc->trans_conn) {
-                _XSERVTransDisconnect(oc->trans_conn);
-                _XSERVTransClose(oc->trans_conn);
+                CallXtransDisconnect(who, &oc->trans_conn);
+                CallXtransClose(who, &oc->trans_conn);
                 oc->trans_conn = NULL;
             }
             MarkClientException(who);
@@ -919,7 +919,7 @@ FlushClient(ClientPtr who, OsCommPtr oc, const void *__extraBuf, int extraCount)
             errno = 0;
 
         if (trans_conn) {
-            err = XaceHook(XACE_XTRANS_DISPATCH, XACE_XTRANS_WRITEV, trans_conn,
+            err = XaceHook(XACE_XTRANS_DISPATCH, XACE_XTRANS_WRITEV, &trans_conn,
                     who, &len, iov, i);
             if (err == BadImplementation)
                 len = _XSERVTransWritev(trans_conn, iov, i);
@@ -967,8 +967,8 @@ FlushClient(ClientPtr who, OsCommPtr oc, const void *__extraBuf, int extraCount)
                 obuf = (unsigned char *) realloc(oco->buf,
                                                  notWritten + BUFSIZE);
                 if (!obuf) {
-                    _XSERVTransDisconnect(oc->trans_conn);
-                    _XSERVTransClose(oc->trans_conn);
+                    CallXtransDisconnect(who, &oc->trans_conn);
+                    CallXtransClose(who, &oc->trans_conn);
                     oc->trans_conn = NULL;
                     MarkClientException(who);
                     oco->count = 0;
@@ -995,8 +995,8 @@ FlushClient(ClientPtr who, OsCommPtr oc, const void *__extraBuf, int extraCount)
 #endif
         else {
             if (oc->trans_conn) {
-                _XSERVTransDisconnect(oc->trans_conn);
-                _XSERVTransClose(oc->trans_conn);
+                CallXtransDisconnect(who, &oc->trans_conn);
+                CallXtransClose(who, &oc->trans_conn);
                 oc->trans_conn = NULL;
             }
             MarkClientException(who);
diff --git a/os/osdep.h b/os/osdep.h
index 0ccdb62..f8587e0 100644
--- a/os/osdep.h
+++ b/os/osdep.h
@@ -159,6 +159,9 @@ extern int FlushClient(ClientPtr /*who */ ,
 extern void FreeOsBuffers(OsCommPtr     /*oc */
     );
 
+extern void CallXtransDisconnect(ClientPtr /*client*/, struct _XtransConnInfo ** /*pciptr*/);
+extern void CallXtransClose(ClientPtr /*client*/, struct _XtransConnInfo ** /*pciptr*/);
+
 #include "dix.h"
 
 extern fd_set AllSockets;


_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic