-
Notifications
You must be signed in to change notification settings - Fork 127
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
freerdp: add singleton support with PDU error handling
Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
- Loading branch information
Showing
2 changed files
with
211 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters