summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Sorg <jay.sorg@gmail.com>2013-08-01 20:28:10 -0700
committerJay Sorg <jay.sorg@gmail.com>2013-08-01 20:28:10 -0700
commit6e3b7245aad0a768eecc66d52c4e32a6af8a7280 (patch)
tree801454b88f5d77ab54a6fc148684002a48a79341
parenta8c3a05e509dd4ee5bfb9eac20194f4c70319aac (diff)
downloadxrdp-proprietary-6e3b7245aad0a768eecc66d52c4e32a6af8a7280.tar.gz
xrdp-proprietary-6e3b7245aad0a768eecc66d52c4e32a6af8a7280.zip
xorg driver, work on client connection
-rw-r--r--xorg/server/module/rdp.h4
-rw-r--r--xorg/server/module/rdpClientCon.c63
-rw-r--r--xorg/server/module/rdpClientCon.h4
-rw-r--r--xorg/server/module/rdpMisc.h175
-rw-r--r--xorg/server/xrdpdev/xrdpdev.c5
5 files changed, 248 insertions, 3 deletions
diff --git a/xorg/server/module/rdp.h b/xorg/server/module/rdp.h
index ab9f2a8c..c3533e98 100644
--- a/xorg/server/module/rdp.h
+++ b/xorg/server/module/rdp.h
@@ -111,7 +111,9 @@ struct _rdpRec
RRSetPanningProcPtr rrSetPanning;
int listen_sck;
- rdpClientCon *clientCon;
+ char uds_data[256];
+ rdpClientCon *clientConHead;
+ rdpClientCon *clientConTail;
};
typedef struct _rdpRec rdpRec;
typedef struct _rdpRec * rdpPtr;
diff --git a/xorg/server/module/rdpClientCon.c b/xorg/server/module/rdpClientCon.c
index 5a5a4551..44ab97ff 100644
--- a/xorg/server/module/rdpClientCon.c
+++ b/xorg/server/module/rdpClientCon.c
@@ -47,7 +47,24 @@ Client connection to xrdp
static int
rdpClientConGotConnection(ScreenPtr pScreen, rdpPtr dev)
{
+ rdpClientCon *clientCon;
+
LLOGLN(0, ("rdpClientConGotConnection:"));
+ clientCon = (rdpClientCon *) g_malloc(sizeof(rdpClientCon), 1);
+ make_stream(clientCon->in_s);
+ init_stream(clientCon->in_s, 8192);
+ make_stream(clientCon->out_s);
+ init_stream(clientCon->out_s, 8192 * 4 + 100);
+ if (dev->clientConTail == NULL)
+ {
+ dev->clientConHead = clientCon;
+ dev->clientConTail = clientCon;
+ }
+ else
+ {
+ dev->clientConTail->next = clientCon;
+ dev->clientConTail = clientCon;
+ }
return 0;
}
@@ -102,7 +119,7 @@ rdpClientConCheck(ScreenPtr pScreen)
FD_SET(LTOUI32(dev->listen_sck), &rfds);
max = RDPMAX(dev->listen_sck, max);
}
- clientCon = dev->clientCon;
+ clientCon = dev->clientConHead;
while (clientCon != NULL)
{
if (clientCon->sck > 0)
@@ -145,7 +162,7 @@ rdpClientConCheck(ScreenPtr pScreen)
rdpClientConGotConnection(pScreen, dev);
}
}
- clientCon = dev->clientCon;
+ clientCon = dev->clientConHead;
while (clientCon != NULL)
{
if (clientCon->sck > 0)
@@ -173,3 +190,45 @@ rdpClientConCheck(ScreenPtr pScreen)
}
return 0;
}
+
+/******************************************************************************/
+int
+rdpClientConInit(rdpPtr dev)
+{
+ char text[256];
+ int i;
+
+ if (!g_directory_exist("/tmp/.xrdp"))
+ {
+ if (!g_create_dir("/tmp/.xrdp"))
+ {
+ if (!g_directory_exist("/tmp/.xrdp"))
+ {
+ LLOGLN(0, ("rdpup_init: g_create_dir failed"));
+ return 0;
+ }
+ }
+
+ g_chmod_hex("/tmp/.xrdp", 0x1777);
+ }
+
+ i = atoi(display);
+
+ if (i < 1)
+ {
+ return 0;
+ }
+ g_sprintf(dev->uds_data, "/tmp/.xrdp/xrdp_display_%s", display);
+ if (dev->listen_sck == 0)
+ {
+ dev->listen_sck = g_tcp_local_socket_stream();
+ if (g_tcp_local_bind(dev->listen_sck, dev->uds_data) != 0)
+ {
+ LLOGLN(0, ("rdpClientConInit: g_tcp_local_bind failed"));
+ return 1;
+ }
+ g_tcp_listen(dev->listen_sck);
+ AddEnabledDevice(dev->listen_sck);
+ }
+ return 0;
+}
diff --git a/xorg/server/module/rdpClientCon.h b/xorg/server/module/rdpClientCon.h
index fad17b68..717e4359 100644
--- a/xorg/server/module/rdpClientCon.h
+++ b/xorg/server/module/rdpClientCon.h
@@ -29,10 +29,14 @@ struct _rdpClientCon
int sck;
int sckControlListener;
int sckControl;
+ struct stream *out_s;
+ struct stream *in_s;
struct _rdpClientCon *next;
};
int
rdpClientConCheck(ScreenPtr pScreen);
+int
+rdpClientConInit(rdpPtr dev);
#endif
diff --git a/xorg/server/module/rdpMisc.h b/xorg/server/module/rdpMisc.h
index 8318f7bd..bed95891 100644
--- a/xorg/server/module/rdpMisc.h
+++ b/xorg/server/module/rdpMisc.h
@@ -24,6 +24,8 @@ the rest
#ifndef __RDPMISC_H
#define __RDPMISC_H
+#include <X11/Xos.h>
+
int
rdpBitsPerPixel(int depth);
int
@@ -75,4 +77,177 @@ g_chmod_hex(const char *filename, int flags);
void
g_hexdump(unsigned char *p, unsigned int len);
+#if defined(X_BYTE_ORDER)
+# if X_BYTE_ORDER == X_LITTLE_ENDIAN
+# define L_ENDIAN
+# else
+# define B_ENDIAN
+# endif
+#else
+# error Unknown endianness in rdp.h
+#endif
+/* check if we need to align data */
+/* check if we need to align data */
+#if defined(__sparc__) || defined(__alpha__) || defined(__hppa__) || \
+ defined(__AIX__) || defined(__PPC__) || defined(__mips__) || \
+ defined(__ia64__) || defined(__ppc__) || defined(__arm__)
+#define NEED_ALIGN
+#endif
+
+/* parser state */
+struct stream
+{
+ char* p;
+ char* end;
+ char* data;
+ int size;
+ /* offsets of various headers */
+ char* iso_hdr;
+ char* mcs_hdr;
+ char* sec_hdr;
+ char* rdp_hdr;
+ char* channel_hdr;
+ char* next_packet;
+};
+
+/******************************************************************************/
+#define s_push_layer(s, h, n) \
+{ \
+ (s)->h = (s)->p; \
+ (s)->p += (n); \
+}
+
+/******************************************************************************/
+#define s_pop_layer(s, h) \
+{ \
+ (s)->p = (s)->h; \
+}
+
+/******************************************************************************/
+#if defined(B_ENDIAN) || defined(NEED_ALIGN)
+#define out_uint16_le(s, v) \
+{ \
+ *((s)->p) = (unsigned char)((v) >> 0); \
+ (s)->p++; \
+ *((s)->p) = (unsigned char)((v) >> 8); \
+ (s)->p++; \
+}
+#else
+#define out_uint16_le(s, v) \
+{ \
+ *((unsigned short*)((s)->p)) = (unsigned short)(v); \
+ (s)->p += 2; \
+}
+#endif
+
+/******************************************************************************/
+#define init_stream(s, v) \
+{ \
+ if ((v) > (s)->size) \
+ { \
+ g_free((s)->data); \
+ (s)->data = (char*)g_malloc((v), 0); \
+ (s)->size = (v); \
+ } \
+ (s)->p = (s)->data; \
+ (s)->end = (s)->data; \
+ (s)->next_packet = 0; \
+}
+
+/******************************************************************************/
+#define out_uint8p(s, v, n) \
+{ \
+ g_memcpy((s)->p, (v), (n)); \
+ (s)->p += (n); \
+}
+
+/******************************************************************************/
+#define out_uint8a(s, v, n) \
+{ \
+ out_uint8p((s), (v), (n)); \
+}
+
+/******************************************************************************/
+#if defined(B_ENDIAN) || defined(NEED_ALIGN)
+#define out_uint32_le(s, v) \
+{ \
+ *((s)->p) = (unsigned char)((v) >> 0); \
+ (s)->p++; \
+ *((s)->p) = (unsigned char)((v) >> 8); \
+ (s)->p++; \
+ *((s)->p) = (unsigned char)((v) >> 16); \
+ (s)->p++; \
+ *((s)->p) = (unsigned char)((v) >> 24); \
+ (s)->p++; \
+}
+#else
+#define out_uint32_le(s, v) \
+{ \
+ *((unsigned int*)((s)->p)) = (v); \
+ (s)->p += 4; \
+}
+#endif
+
+/******************************************************************************/
+#if defined(B_ENDIAN) || defined(NEED_ALIGN)
+#define in_uint32_le(s, v) \
+{ \
+ (v) = (unsigned int) \
+ ( \
+ (*((unsigned char*)((s)->p + 0)) << 0) | \
+ (*((unsigned char*)((s)->p + 1)) << 8) | \
+ (*((unsigned char*)((s)->p + 2)) << 16) | \
+ (*((unsigned char*)((s)->p + 3)) << 24) \
+ ); \
+ (s)->p += 4; \
+}
+#else
+#define in_uint32_le(s, v) \
+{ \
+ (v) = *((unsigned int*)((s)->p)); \
+ (s)->p += 4; \
+}
+#endif
+
+/******************************************************************************/
+#if defined(B_ENDIAN) || defined(NEED_ALIGN)
+#define in_uint16_le(s, v) \
+{ \
+ (v) = (unsigned short) \
+ ( \
+ (*((unsigned char*)((s)->p + 0)) << 0) | \
+ (*((unsigned char*)((s)->p + 1)) << 8) \
+ ); \
+ (s)->p += 2; \
+}
+#else
+#define in_uint16_le(s, v) \
+{ \
+ (v) = *((unsigned short*)((s)->p)); \
+ (s)->p += 2; \
+}
+#endif
+
+/******************************************************************************/
+#define s_mark_end(s) \
+{ \
+ (s)->end = (s)->p; \
+}
+
+/******************************************************************************/
+#define make_stream(s) \
+{ \
+ (s) = (struct stream*)g_malloc(sizeof(struct stream), 1); \
+}
+
+/******************************************************************************/
+#define free_stream(s) do \
+{ \
+ if ((s) != 0) \
+ { \
+ g_free((s)->data); \
+ } \
+ g_free((s)); \
+} while (0)
+
#endif
diff --git a/xorg/server/xrdpdev/xrdpdev.c b/xorg/server/xrdpdev/xrdpdev.c
index a22c27fa..7f47d9fe 100644
--- a/xorg/server/xrdpdev/xrdpdev.c
+++ b/xorg/server/xrdpdev/xrdpdev.c
@@ -536,6 +536,11 @@ rdpScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
g_timer = TimerSet(g_timer, 0, 10, rdpDeferredRandR, pScreen);
+ if (rdpClientConInit(dev) != 0)
+ {
+ LLOGLN(0, ("rdpScreenInit: rdpClientConInit failed"));
+ }
+
LLOGLN(0, ("rdpScreenInit: out"));
return TRUE;
}