[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