aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/freerdp
diff options
context:
space:
mode:
authorOtavio Salvador <otavio@ossystems.com.br>2011-03-03 20:20:18 +0000
committerOtavio Salvador <otavio@ossystems.com.br>2011-03-12 19:16:41 +0000
commit48de0d8117e2beb5a17b22f66bcae826e92f7df0 (patch)
tree71fac5685a97b5892ba19cc42c1f7ac99a55e3c0 /recipes/freerdp
parent751599197284b031788e482a5b632ac7eda22a02 (diff)
downloadopenembedded-48de0d8117e2beb5a17b22f66bcae826e92f7df0.tar.gz
freerdp: add singleton support with PDU error handling
Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
Diffstat (limited to 'recipes/freerdp')
-rw-r--r--recipes/freerdp/freerdp/singleton-mode.patch208
-rw-r--r--recipes/freerdp/freerdp_git.bb5
2 files changed, 211 insertions, 2 deletions
diff --git a/recipes/freerdp/freerdp/singleton-mode.patch b/recipes/freerdp/freerdp/singleton-mode.patch
new file mode 100644
index 0000000000..980ec96b99
--- /dev/null
+++ b/recipes/freerdp/freerdp/singleton-mode.patch
@@ -0,0 +1,208 @@
+From dd81b7b7902015d35e48117db7fb664aa75fdf62 Mon Sep 17 00:00:00 2001
+From: Eduardo Beloni <beloni@ossystems.com.br>
+Date: Thu, 3 Mar 2011 14:41:32 -0300
+Subject: [PATCH] xfreerdp: singleton mode
+
+Allows return code according to the Set Error Info PDU
+---
+ X11/xf_types.h | 21 +++++++++++++++++++++
+ X11/xfreerdp.c | 45 ++++++++++++++++++++++++++++++++++++---------
+ doc/xfreerdp.1 | 4 ++++
+ 3 files changed, 61 insertions(+), 9 deletions(-)
+
+diff --git a/X11/xf_types.h b/X11/xf_types.h
+index 0d355e2..75c7d88 100644
+--- a/X11/xf_types.h
++++ b/X11/xf_types.h
+@@ -88,6 +88,27 @@ struct xf_info
+ };
+ typedef struct xf_info xfInfo;
+
++
++enum STANDARD_EXIT_CODE
++{
++ EX_OK = 0,
++ EX_USAGE = 64,
++ EX_DATAERR = 65,
++ EX_NOINPUT = 66,
++ EX_NOUSER = 67,
++ EX_NOHOST = 68,
++ EX_UNAVAILABLE = 69,
++ EX_SOFTWARE = 70,
++ EX_OSERR = 71,
++ EX_OSFILE = 72,
++ EX_CANTCREAT = 73,
++ EX_IOERR = 74,
++ EX_TEMPFAIL = 75,
++ EX_PROTOCOL = 76,
++ EX_NOPERM = 77,
++ EX_CONFIG = 78,
++};
++
+ #ifdef WITH_DEBUG
+ #define DEBUG(fmt, ...) printf("DBG %s (%d): " fmt, __FUNCTION__, __LINE__, ## __VA_ARGS__)
+ #else
+diff --git a/X11/xfreerdp.c b/X11/xfreerdp.c
+index 994e8ee..f9236e7 100644
+--- a/X11/xfreerdp.c
++++ b/X11/xfreerdp.c
+@@ -155,7 +155,7 @@ out_args(void)
+
+ /* Returns "true" on errors or other reasons to not continue normal operation */
+ static int
+-process_params(xfInfo * xfi, int argc, char ** argv, int * pindex)
++process_params(xfInfo * xfi, int argc, char ** argv, int * pindex, _Bool * singleton)
+ {
+ rdpSet * settings;
+ rdpKeyboardLayout * layouts;
+@@ -165,6 +165,9 @@ process_params(xfInfo * xfi, int argc, char ** argv, int * pindex)
+ int i, j;
+ struct passwd * pw;
+ int num_extensions;
++ int first_index;
++
++ first_index = *pindex;
+
+ set_default_params(xfi);
+ settings = xfi->settings;
+@@ -512,6 +515,16 @@ process_params(xfInfo * xfi, int argc, char ** argv, int * pindex)
+ }
+ num_extensions++;
+ }
++ else if (strcmp("--singleton", argv[*pindex]) == 0)
++ {
++ if (first_index != 1) /* this is not the first parse */
++ {
++ printf("Parsing error: you can't run more than one thread in singleton mode\n");
++ exit(EX_USAGE);
++ }
++
++ *singleton = 1;
++ }
+ else if ((strcmp("-h", argv[*pindex]) == 0) || strcmp("--help", argv[*pindex]) == 0)
+ {
+ out_args();
+@@ -577,6 +590,7 @@ run_xfreerdp(xfInfo * xfi)
+ int max_sck;
+ fd_set rfds;
+ fd_set wfds;
++ uint32 disc_reason;
+
+ /* create an instance of the library */
+ inst = freerdp_new(xfi->settings);
+@@ -611,7 +625,7 @@ run_xfreerdp(xfInfo * xfi)
+ if (inst->rdp_connect(inst) != 0)
+ {
+ printf("run_xfreerdp: inst->rdp_connect failed\n");
+- return 1;
++ return EX_PROTOCOL;
+ }
+ if (freerdp_chanman_post_connect(xfi->chan_man, inst) != 0)
+ {
+@@ -687,7 +701,7 @@ run_xfreerdp(xfInfo * xfi)
+ /* check the libfreerdp fds */
+ if (inst->rdp_check_fds(inst) != 0)
+ {
+- printf("run_xfreerdp: inst->rdp_check_fds failed\n");
++ printf("run_xfreerdp: inst->rdp_check_fds failed reason %u\n", inst->disc_reason);
+ break;
+ }
+ /* check x fds */
+@@ -703,21 +717,24 @@ run_xfreerdp(xfInfo * xfi)
+ break;
+ }
+ }
++
++ disc_reason = inst->disc_reason;
+ /* cleanup */
+ freerdp_chanman_close(xfi->chan_man, inst);
+ inst->rdp_disconnect(inst);
+ freerdp_free(inst);
+ xf_uninit(xfi);
+- return 0;
++ return disc_reason;
+ }
+
+ static void *
+ thread_func(void * arg)
+ {
+ xfInfo * xfi;
++ uint32 disc_reason;
+
+ xfi = (xfInfo *) arg;
+- run_xfreerdp(xfi);
++ disc_reason = run_xfreerdp(xfi);
+ free(xfi->settings);
+ freerdp_chanman_free(xfi->chan_man);
+ free(xfi);
+@@ -728,7 +745,7 @@ thread_func(void * arg)
+ {
+ freerdp_sem_signal(&g_sem);
+ }
+- return NULL;
++ return (void *)disc_reason;
+ }
+
+ int
+@@ -738,6 +755,8 @@ main(int argc, char ** argv)
+ xfInfo * xfi;
+ pthread_t thread;
+ int index = 1;
++ _Bool singleton = 0;
++ int disc_reason = 0;
+
+ setlocale(LC_CTYPE, "");
+ if (argc == 1)
+@@ -760,7 +779,7 @@ main(int argc, char ** argv)
+ memset(xfi, 0, sizeof(xfInfo));
+ xfi->settings = (rdpSet *) malloc(sizeof(rdpSet));
+ xfi->chan_man = freerdp_chanman_new();
+- rv = process_params(xfi, argc, argv, &index);
++ rv = process_params(xfi, argc, argv, &index, &singleton);
+ if (rv)
+ {
+ free(xfi->settings);
+@@ -776,9 +795,17 @@ main(int argc, char ** argv)
+ {
+ g_thread_count++;
+ }
++
++ if (singleton)
++ break;
+ }
+
+- if (g_thread_count > 0)
++ if (singleton)
++ {
++ pthread_join(thread, (void **)&disc_reason);
++ printf("thread joint disconnect reason %d\n", disc_reason);
++ }
++ else if (g_thread_count > 0)
+ {
+ printf("main thread, waiting for all threads to exit\n");
+ freerdp_sem_wait(&g_sem);
+@@ -787,5 +814,5 @@ main(int argc, char ** argv)
+
+ freerdp_chanman_uninit();
+ freerdp_global_finish();
+- return 0;
++ return disc_reason;
+ }
+diff --git a/doc/xfreerdp.1 b/doc/xfreerdp.1
+index 9fa07ca..1ad0d70 100644
+--- a/doc/xfreerdp.1
++++ b/doc/xfreerdp.1
+@@ -92,6 +92,10 @@ Disable TLS encryption.
+ .BR "--no-osb"
+ Disable off screen bitmaps.
+ .TP
++.BR "--singleton"
++Singleton mode. This mode allows only one thread of execution and also returns
++the Set Error Info PDU as the program exit code.
++.TP
+ .BR "-h"
+ Print help message.
+ .TP
+--
+1.6.6.1
+
diff --git a/recipes/freerdp/freerdp_git.bb b/recipes/freerdp/freerdp_git.bb
index 1ed2a19158..beed2b8018 100644
--- a/recipes/freerdp/freerdp_git.bb
+++ b/recipes/freerdp/freerdp_git.bb
@@ -7,9 +7,10 @@ inherit gitpkgv
PV = "gitr${SRCPV}"
PKGV = "${GITPKGVTAG}"
-PR = "${INC_PR}.0"
+PR = "${INC_PR}.1"
SRCREV = "6f7eb2abb077d60a09eeb66a10ad97d102336d3c"
-SRC_URI = "git://freerdp.git.sourceforge.net/gitroot/freerdp/freerdp.git;protocol=git"
+SRC_URI = "git://freerdp.git.sourceforge.net/gitroot/freerdp/freerdp.git;protocol=git \
+ file://singleton-mode.patch"
S = "${WORKDIR}/git"