]> git.sesse.net Git - rdpsrv/blobdiff - Xserver/lib/xtrans/Xtransutil.c
Import X server from vnc-3.3.7.
[rdpsrv] / Xserver / lib / xtrans / Xtransutil.c
diff --git a/Xserver/lib/xtrans/Xtransutil.c b/Xserver/lib/xtrans/Xtransutil.c
new file mode 100644 (file)
index 0000000..5473d2d
--- /dev/null
@@ -0,0 +1,467 @@
+/* $XConsortium: Xtransutil.c /main/32 1996/12/04 10:22:57 lehors $ */
+/* $XFree86: xc/lib/xtrans/Xtransutil.c,v 3.9 1996/12/23 06:04:18 dawes Exp $ */
+/*
+
+Copyright (c) 1993, 1994  X Consortium
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from the X Consortium.
+
+*/
+
+/* Copyright (c) 1993, 1994 NCR Corporation - Dayton, Ohio, USA
+ *
+ * All Rights Reserved
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name NCR not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.  NCR makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * NCRS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+ * NO EVENT SHALL NCR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * These are some utility functions created for convenience or to provide
+ * an interface that is similar to an existing interface. These are built
+ * only using the Transport Independant API, and have no knowledge of
+ * the internal implementation.
+ */
+
+#ifdef XTHREADS
+#include <X11/Xthreads.h>
+#endif
+
+#ifdef X11_t
+
+/*
+ * These values come from X.h and Xauth.h, and MUST match them. Some
+ * of these values are also defined by the ChangeHost protocol message.
+ */
+
+#define FamilyInternet         0
+#define FamilyDECnet           1
+#define FamilyChaos            2
+#define FamilyAmoeba           33
+#define FamilyLocalHost                252
+#define FamilyKrb5Principal    253
+#define FamilyNetname          254
+#define FamilyLocal            256
+#define FamilyWild             65535
+
+/*
+ * TRANS(ConvertAddress) converts a sockaddr based address to an
+ * X authorization based address. Some of this is defined as part of
+ * the ChangeHost protocol. The rest is just doen in a consistent manner.
+ */
+
+int
+TRANS(ConvertAddress)(familyp,addrlenp,addrp)
+int    *familyp;
+int    *addrlenp;
+Xtransaddr     **addrp;
+{
+
+    PRMSG(2,"ConvertAddress(%d,%d,%x)\n",*familyp,*addrlenp,*addrp);
+
+    switch( *familyp )
+    {
+#if defined(TCPCONN) || defined(STREAMSCONN) || defined(MNX_TCPCONN)
+    case AF_INET:
+    {
+       /*
+        * Check for the BSD hack localhost address 127.0.0.1.
+        * In this case, we are really FamilyLocal.
+        */
+
+       struct sockaddr_in saddr;
+#ifdef CRAY
+#ifdef OLDTCP
+       int len = sizeof(saddr.sin_addr);
+#else
+       int len = SIZEOF_in_addr;
+#endif /* OLDTCP */
+       char *cp = (char *) &saddr.sin_addr;
+#else /* else not CRAY */
+       int len = sizeof(saddr.sin_addr.s_addr);
+       char *cp = (char *) &saddr.sin_addr.s_addr;
+#endif /* CRAY */
+
+       memcpy (&saddr, *addrp, sizeof (struct sockaddr_in));
+
+       if ((len == 4) && (cp[0] == 127) && (cp[1] == 0) &&
+           (cp[2] == 0) && (cp[3] == 1))
+       {
+           *familyp=FamilyLocal;
+       }
+       else
+       {
+           *familyp=FamilyInternet;
+           *addrlenp=len;
+           memcpy(*addrp,&saddr.sin_addr,len);
+       }
+       break;
+    }
+#endif /* defined(TCPCONN) || defined(STREAMSCONN) || MNX_TCPCONN */
+
+#if defined(DNETCONN)
+    case AF_DECnet:
+    {
+       struct sockaddr_dn saddr;
+
+       memcpy (&saddr, *addrp, sizeof (struct sockaddr_dn));
+
+       *familyp=FamilyDECnet;
+       *addrlenp=sizeof(struct dn_naddr);
+       memcpy(*addrp,&saddr.sdn_add,*addrlenp);
+
+       break;
+    }
+#endif /* defined(DNETCONN) */
+
+#if defined(UNIXCONN) || defined(LOCALCONN) || defined(OS2PIPECONN)
+    case AF_UNIX:
+    {
+       *familyp=FamilyLocal;
+       break;
+    }
+#endif /* defined(UNIXCONN) || defined(LOCALCONN) || defined(OS2PIPECONN)*/
+
+#if defined(AMRPCCONN)
+    case AF_AMOEBA:
+    {
+       *familyp=FamilyAmoeba;
+       break;
+    }
+#endif
+#if defined(AMTCPCONN) && !(defined(TCPCONN) || defined(STREAMSCONN))
+    case AF_INET:
+    {
+       *familyp=FamilyInternet;
+       break;
+    }
+#endif
+
+    default:
+       PRMSG(1,"ConvertAddress: Unknown family type %d\n",
+             *familyp, 0,0 );
+       return -1;
+    }
+
+
+    if (*familyp == FamilyLocal)
+    {
+       /*
+        * In the case of a local connection, we need to get the
+        * host name for authentication.
+        */
+       
+       char hostnamebuf[256];
+       int len = TRANS(GetHostname) (hostnamebuf, sizeof hostnamebuf);
+
+       if (len > 0) {
+           if (*addrp && *addrlenp < (len + 1))
+           {
+               xfree ((char *) *addrp);
+               *addrp = NULL;
+           }
+           if (!*addrp)
+               *addrp = (Xtransaddr *) xalloc (len + 1);
+           if (*addrp) {
+               strcpy ((char *) *addrp, hostnamebuf);
+               *addrlenp = len;
+           } else {
+               *addrlenp = 0;
+           }
+       }
+       else
+       {
+           if (*addrp)
+               xfree ((char *) *addrp);
+           *addrp = NULL;
+           *addrlenp = 0;
+       }
+    }
+
+    return 0;
+}
+
+#endif /* X11_t */
+
+#ifdef ICE_t
+
+#include <signal.h>
+
+char *
+TRANS(GetMyNetworkId) (ciptr)
+
+XtransConnInfo  ciptr;
+
+{
+    int                family = ciptr->family;
+    int                addrlen = ciptr->addrlen;
+    char       *addr = ciptr->addr;
+    char       hostnamebuf[256];
+    char       *networkId = NULL;
+    char       *transName = ciptr->transptr->TransName;
+
+    if (gethostname (hostnamebuf, sizeof (hostnamebuf)) < 0)
+    {
+       return (NULL);
+    }
+
+    switch (family)
+    {
+#if defined(UNIXCONN) || defined(STREAMSCONN) || defined(LOCALCONN) || defined(OS2PIPECONN)
+    case AF_UNIX:
+    {
+       struct sockaddr_un *saddr = (struct sockaddr_un *) addr;
+       networkId = (char *) xalloc (3 + strlen (transName) +
+           strlen (hostnamebuf) + strlen (saddr->sun_path));
+       sprintf (networkId, "%s/%s:%s", transName,
+           hostnamebuf, saddr->sun_path);
+       break;
+    }
+#endif /* defined(UNIXCONN) || defined(STREAMSCONN) || defined(LOCALCONN) || defined(OS2PIPECONN)
+*/
+
+#if defined(TCPCONN) || defined(STREAMSCONN) || defined(MNX_TCPCONN)
+    case AF_INET:
+    {
+       struct sockaddr_in *saddr = (struct sockaddr_in *) addr;
+       char portnumbuf[10];
+
+       sprintf (portnumbuf, "%d", ntohs (saddr->sin_port));
+       networkId = (char *) xalloc (3 + strlen (transName) +
+           strlen (hostnamebuf) + strlen (portnumbuf));
+       sprintf (networkId, "%s/%s:%s", transName, hostnamebuf, portnumbuf);
+       break;
+    }
+#endif /* defined(TCPCONN) || defined(STREAMSCONN) || MNX_TCPCONN */
+
+#if defined(DNETCONN)
+    case AF_DECnet:
+    {
+       struct sockaddr_dn *saddr = (struct sockaddr_dn *) addr;
+
+       networkId = (char *) xalloc (
+           13 + strlen (hostnamebuf) + saddr->sdn_objnamel);
+       sprintf (networkId, "dnet/%s::%s",
+           hostnamebuf, saddr->sdn_objname);
+       break;
+    }
+#endif /* defined(DNETCONN) */
+
+    default:
+       break;
+    }
+
+    return (networkId);
+}
+
+#include <setjmp.h>
+static jmp_buf env;
+
+#ifdef SIGALRM
+static int nameserver_timedout = 0;
+
+static 
+#ifdef SIGNALRETURNSINT
+int
+#else
+void
+#endif
+nameserver_lost(sig)
+{
+  nameserver_timedout = 1;
+  longjmp (env, -1);
+  /* NOTREACHED */
+#ifdef SIGNALRETURNSINT
+  return -1;                           /* for picky compilers */
+#endif
+}
+#endif /* SIGALARM */
+
+
+char *
+TRANS(GetPeerNetworkId) (ciptr)
+
+XtransConnInfo  ciptr;
+
+{
+    int                family = ciptr->family;
+    int                peer_addrlen = ciptr->peeraddrlen;
+    char       *peer_addr = ciptr->peeraddr;
+    char       *hostname;
+    char       *networkId = NULL;
+    char       addrbuf[256];
+    char       *addr = NULL;
+
+    switch (family)
+    {
+    case AF_UNSPEC:
+#if defined(UNIXCONN) || defined(STREAMSCONN) || defined(LOCALCONN) || defined(OS2PIPECONN)
+    case AF_UNIX:
+    {
+       if (gethostname (addrbuf, sizeof (addrbuf)) == 0)
+           addr = addrbuf;
+       break;
+    }
+#endif /* defined(UNIXCONN) || defined(STREAMSCONN) || defined(LOCALCONN) || defined(OS2PIPECONN)
+*/
+
+#if defined(TCPCONN) || defined(STREAMSCONN) || defined(MNX_TCPCONN)
+    case AF_INET:
+    {
+       struct sockaddr_in *saddr = (struct sockaddr_in *) peer_addr;
+       _Xgethostbynameparams hparams;
+       struct hostent * hostp;
+
+#ifndef WIN32
+       char *inet_ntoa();
+#endif
+
+#ifdef SIGALRM
+       /*
+        * gethostbyaddr can take a LONG time if the host does not exist.
+        * Assume that if it does not respond in NAMESERVER_TIMEOUT seconds
+        * that something is wrong and do not make the user wait.
+        * gethostbyaddr will continue after a signal, so we have to
+        * jump out of it. 
+        */
+
+       nameserver_timedout = 0;
+       signal (SIGALRM, nameserver_lost);
+       alarm (4);
+       if (setjmp(env) == 0) {
+#endif
+           hostp = _XGethostbyaddr ((char *) &saddr->sin_addr,
+               sizeof (saddr->sin_addr), AF_INET, hparams);
+#ifdef SIGALRM
+       }
+       alarm (0);
+#endif
+       if (hostp != NULL)
+         addr = hostp->h_name;
+       else
+         addr = inet_ntoa (saddr->sin_addr);
+       break;
+    }
+
+#endif /* defined(TCPCONN) || defined(STREAMSCONN) || MNX_TCPCONN */
+
+#if defined(DNETCONN)
+    case AF_DECnet:
+    {
+       struct sockaddr_dn *saddr = (struct sockaddr_dn *) peer_addr;
+       struct nodeent *np;
+
+       if (np = getnodebyaddr(saddr->sdn_add.a_addr,
+           saddr->sdn_add.a_len, AF_DECnet)) {
+           sprintf(addrbuf, "%s:", np->n_name);
+       } else {
+           sprintf(addrbuf, "%s:", dnet_htoa(&saddr->sdn_add));
+       }
+       addr = addrbuf;
+       break;
+    }
+#endif /* defined(DNETCONN) */
+
+#if defined(AMRPCCONN)
+    case AF_AMOEBA:
+    {
+       addr = "Amoeba"; /* not really used */
+       break;
+    }
+#endif
+#if defined(AMTCPCONN) && !(defined(TCPCONN) || defined(STREAMSCONN))
+    case AF_INET:
+    {
+       if (gethostname (addrbuf, sizeof (addrbuf)) == 0) {
+           addr = addrbuf;
+       } else {
+           addr = "";
+       }
+       break;
+    }
+#endif
+
+    default:
+       return (NULL);
+    }
+
+
+    hostname = (char *) xalloc (
+       strlen (ciptr->transptr->TransName) + strlen (addr) + 2);
+    strcpy (hostname, ciptr->transptr->TransName);
+    strcat (hostname, "/");
+    if (addr)
+       strcat (hostname, addr);
+
+    return (hostname);
+}
+
+#endif /* ICE_t */
+
+
+#if defined(WIN32) && (defined(TCPCONN) || defined(DNETCONN))
+int
+TRANS(WSAStartup) ()
+{
+    static WSADATA wsadata;
+
+    PRMSG (2,"WSAStartup()\n", 0, 0, 0);
+
+    if (!wsadata.wVersion && WSAStartup(MAKEWORD(1,1), &wsadata))
+        return 1;
+    return 0;
+}
+#endif
+
+
+static int
+is_numeric (str)
+
+char *str;
+
+{
+    int i;
+
+    for (i = 0; i < (int) strlen (str); i++)
+       if (!isdigit (str[i]))
+           return (0);
+
+    return (1);
+}