Sounds like a protocol change that should be documented in the core protocol
spec.   (Maybe even finally bump the protocol version from R6 to R7.)

Does seem like a neat solution to the problem though.

        -alan-

On 06/17/11 11:36 AM, Adam Jackson wrote:
> Forwarding proxies like sshd will appear to be local, even though they
> aren't really.  This leads to weird behaviour for extensions that truly
> require running under the same OS services as the client, like MIT-SHM
> and DRI2.
> 
> Add two new legal values for the initial connection's byteOrder field,
> 'r' and 'R'.  These act like 'l' and 'B' respectively, but have the side
> effect of forcing the client to be treated as non-local.  Forwarding
> proxies should attempt to munge the first packet of the connection
> accordingly; older servers will reject connections thusly munged, so the
> proxy should fall back to passthrough if the munged connection attempt
> fails.
> 
> Signed-off-by: Adam Jackson <[email protected]>
> ---
>  dix/dispatch.c  |   12 +++++++++---
>  os/connection.c |   10 +++++-----
>  2 files changed, 14 insertions(+), 8 deletions(-)
> 
> diff --git a/dix/dispatch.c b/dix/dispatch.c
> index 192c8c3..ac9d7f9 100644
> --- a/dix/dispatch.c
> +++ b/dix/dispatch.c
> @@ -3569,12 +3569,14 @@ ProcInitialConnection(ClientPtr client)
>      REQUEST(xReq);
>      xConnClientPrefix *prefix;
>      int whichbyte = 1;
> +    char order;
>  
>      prefix = (xConnClientPrefix *)((char *)stuff + sz_xReq);
> -    if ((prefix->byteOrder != 'l') && (prefix->byteOrder != 'B'))
> +    order = prefix->byteOrder;
> +    if (order != 'l' && order != 'B' && order != 'r' && order != 'R')
>       return client->noClientException = -1;
> -    if (((*(char *) &whichbyte) && (prefix->byteOrder == 'B')) ||
> -     (!(*(char *) &whichbyte) && (prefix->byteOrder == 'l')))
> +    if (((*(char *) &whichbyte) && (order == 'B' || order == 'R')) ||
> +     (!(*(char *) &whichbyte) && (order == 'l' || order == 'r')))
>      {
>       client->swapped = TRUE;
>       SwapConnClientPrefix(prefix);
> @@ -3586,6 +3588,10 @@ ProcInitialConnection(ClientPtr client)
>      {
>       swaps(&stuff->length, whichbyte);
>      }
> +    if (order == 'r' || order == 'R')
> +    {
> +     client->local = FALSE;
> +    }
>      ResetCurrentRequest(client);
>      return Success;
>  }
> diff --git a/os/connection.c b/os/connection.c
> index fbc8e40..dd7b066 100644
> --- a/os/connection.c
> +++ b/os/connection.c
> @@ -881,7 +881,7 @@ ErrorConnMax(XtransConnInfo trans_conn)
>      xConnSetupPrefix csp;
>      char pad[3];
>      struct iovec iov[3];
> -    char byteOrder = 0;
> +    char order = 0;
>      int whichbyte = 1;
>      struct timeval waittime;
>      fd_set mask;
> @@ -894,16 +894,16 @@ 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 */
> -    (void)_XSERVTransRead(trans_conn, &byteOrder, 1);
> -    if ((byteOrder == 'l') || (byteOrder == 'B'))
> +    (void)_XSERVTransRead(trans_conn, &order, 1);
> +    if (order == 'l' || order == 'B' || order == 'r' || order == 'R')
>      {
>       csp.success = xFalse;
>       csp.lengthReason = sizeof(NOROOM) - 1;
>       csp.length = (sizeof(NOROOM) + 2) >> 2;
>       csp.majorVersion = X_PROTOCOL;
>       csp.minorVersion = X_PROTOCOL_REVISION;
> -     if (((*(char *) &whichbyte) && (byteOrder == 'B')) ||
> -         (!(*(char *) &whichbyte) && (byteOrder == 'l')))
> +     if (((*(char *) &whichbyte) && (order == 'B' || order == 'R')) ||
> +         (!(*(char *) &whichbyte) && (order == 'l' || order == 'r')))
>       {
>           swaps(&csp.majorVersion, whichbyte);
>           swaps(&csp.minorVersion, whichbyte);


-- 
        -Alan Coopersmith-        [email protected]
         Oracle Solaris Platform Engineering: X Window System

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to