|
|
|
@ -54,14 +54,9 @@ sync_load(long param1, long param2)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
void APP_CC
|
|
|
|
|
xrdp_mm_delete(struct xrdp_mm* self)
|
|
|
|
|
static void APP_CC
|
|
|
|
|
xrdp_mm_module_cleanup(struct xrdp_mm* self)
|
|
|
|
|
{
|
|
|
|
|
if (self == 0)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
/* free any modual stuff */
|
|
|
|
|
if (self->mod != 0)
|
|
|
|
|
{
|
|
|
|
|
if (self->mod_exit != 0)
|
|
|
|
@ -73,6 +68,22 @@ xrdp_mm_delete(struct xrdp_mm* self)
|
|
|
|
|
{
|
|
|
|
|
g_xrdp_sync(sync_unload, self->mod_handle, 0);
|
|
|
|
|
}
|
|
|
|
|
self->mod_init = 0;
|
|
|
|
|
self->mod_exit = 0;
|
|
|
|
|
self->mod = 0;
|
|
|
|
|
self->mod_handle = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
void APP_CC
|
|
|
|
|
xrdp_mm_delete(struct xrdp_mm* self)
|
|
|
|
|
{
|
|
|
|
|
if (self == 0)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
/* free any modual stuff */
|
|
|
|
|
xrdp_mm_module_cleanup(self);
|
|
|
|
|
if (self->sck != 0)
|
|
|
|
|
{
|
|
|
|
|
g_tcp_close(self->sck);
|
|
|
|
@ -237,6 +248,204 @@ xrdp_mm_send_login(struct xrdp_mm* self)
|
|
|
|
|
return rv;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/* returns error */
|
|
|
|
|
/* this goes through the login_names looking for one called 'lib'
|
|
|
|
|
then it copies the corisponding login_values item into 'dest'
|
|
|
|
|
'dest' must be at least 'dest_len' + 1 bytes in size */
|
|
|
|
|
static int APP_CC
|
|
|
|
|
xrdp_mm_get_lib(struct xrdp_mm* self, char* dest, int dest_len)
|
|
|
|
|
{
|
|
|
|
|
char* name;
|
|
|
|
|
char* value;
|
|
|
|
|
int index;
|
|
|
|
|
int count;
|
|
|
|
|
int rv;
|
|
|
|
|
|
|
|
|
|
rv = 1;
|
|
|
|
|
/* find the library name */
|
|
|
|
|
dest[0] = 0;
|
|
|
|
|
count = self->login_names->count;
|
|
|
|
|
for (index = 0; index < count; index++)
|
|
|
|
|
{
|
|
|
|
|
name = (char*)list_get_item(self->login_names, index);
|
|
|
|
|
value = (char*)list_get_item(self->login_values, index);
|
|
|
|
|
if ((name == 0) || (value == 0))
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (g_strcasecmp(name, "lib") == 0)
|
|
|
|
|
{
|
|
|
|
|
g_strncpy(dest, value, dest_len);
|
|
|
|
|
rv = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return rv;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
static int APP_CC
|
|
|
|
|
xrdp_mm_setup_mod1(struct xrdp_mm* self)
|
|
|
|
|
{
|
|
|
|
|
void* func;
|
|
|
|
|
char lib[256];
|
|
|
|
|
|
|
|
|
|
if (self == 0)
|
|
|
|
|
{
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
lib[0] = 0;
|
|
|
|
|
if (xrdp_mm_get_lib(self, lib, 255) != 0)
|
|
|
|
|
{
|
|
|
|
|
g_writeln("error finding lib");
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
if (lib[0] == 0)
|
|
|
|
|
{
|
|
|
|
|
g_writeln("error finding lib");
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
if (self->mod_handle == 0)
|
|
|
|
|
{
|
|
|
|
|
self->mod_handle = g_xrdp_sync(sync_load, (long)lib, 0);
|
|
|
|
|
if (self->mod_handle != 0)
|
|
|
|
|
{
|
|
|
|
|
func = g_get_proc_address(self->mod_handle, "mod_init");
|
|
|
|
|
if (func == 0)
|
|
|
|
|
{
|
|
|
|
|
func = g_get_proc_address(self->mod_handle, "_mod_init");
|
|
|
|
|
}
|
|
|
|
|
if (func == 0)
|
|
|
|
|
{
|
|
|
|
|
g_writeln("error finding proc mod_init in %s", lib);
|
|
|
|
|
}
|
|
|
|
|
self->mod_init = (struct xrdp_mod* (*)(void))func;
|
|
|
|
|
func = g_get_proc_address(self->mod_handle, "mod_exit");
|
|
|
|
|
if (func == 0)
|
|
|
|
|
{
|
|
|
|
|
func = g_get_proc_address(self->mod_handle, "_mod_exit");
|
|
|
|
|
}
|
|
|
|
|
if (func == 0)
|
|
|
|
|
{
|
|
|
|
|
g_writeln("error finding proc mod_exit in %s", lib);
|
|
|
|
|
}
|
|
|
|
|
self->mod_exit = (int (*)(struct xrdp_mod*))func;
|
|
|
|
|
if ((self->mod_init != 0) && (self->mod_exit != 0))
|
|
|
|
|
{
|
|
|
|
|
self->mod = self->mod_init();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
g_writeln("error loading %s", lib);
|
|
|
|
|
}
|
|
|
|
|
if (self->mod != 0)
|
|
|
|
|
{
|
|
|
|
|
self->mod->wm = (long)(self->wm);
|
|
|
|
|
self->mod->server_begin_update = server_begin_update;
|
|
|
|
|
self->mod->server_end_update = server_end_update;
|
|
|
|
|
self->mod->server_fill_rect = server_fill_rect;
|
|
|
|
|
self->mod->server_screen_blt = server_screen_blt;
|
|
|
|
|
self->mod->server_paint_rect = server_paint_rect;
|
|
|
|
|
self->mod->server_set_pointer = server_set_pointer;
|
|
|
|
|
self->mod->server_palette = server_palette;
|
|
|
|
|
self->mod->server_msg = server_msg;
|
|
|
|
|
self->mod->server_is_term = server_is_term;
|
|
|
|
|
self->mod->server_set_clip = server_set_clip;
|
|
|
|
|
self->mod->server_reset_clip = server_reset_clip;
|
|
|
|
|
self->mod->server_set_fgcolor = server_set_fgcolor;
|
|
|
|
|
self->mod->server_set_bgcolor = server_set_bgcolor;
|
|
|
|
|
self->mod->server_set_opcode = server_set_opcode;
|
|
|
|
|
self->mod->server_set_mixmode = server_set_mixmode;
|
|
|
|
|
self->mod->server_set_brush = server_set_brush;
|
|
|
|
|
self->mod->server_set_pen = server_set_pen;
|
|
|
|
|
self->mod->server_draw_line = server_draw_line;
|
|
|
|
|
self->mod->server_add_char = server_add_char;
|
|
|
|
|
self->mod->server_draw_text = server_draw_text;
|
|
|
|
|
self->mod->server_reset = server_reset;
|
|
|
|
|
self->mod->server_query_channel = server_query_channel;
|
|
|
|
|
self->mod->server_get_channel_id = server_get_channel_id;
|
|
|
|
|
self->mod->server_send_to_channel = server_send_to_channel;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/* id self->mod is null, there must be a problem */
|
|
|
|
|
if (self->mod == 0)
|
|
|
|
|
{
|
|
|
|
|
DEBUG(("problem loading lib in xrdp_mm_setup_mod1"));
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
static int APP_CC
|
|
|
|
|
xrdp_mm_setup_mod2(struct xrdp_mm* self)
|
|
|
|
|
{
|
|
|
|
|
char text[256];
|
|
|
|
|
char* name;
|
|
|
|
|
char* value;
|
|
|
|
|
int i;
|
|
|
|
|
int rv;
|
|
|
|
|
|
|
|
|
|
rv = 1;
|
|
|
|
|
text[0] = 0;
|
|
|
|
|
if (!(self->wm->pro_layer->term))
|
|
|
|
|
{
|
|
|
|
|
if (self->mod->mod_start(self->mod, self->wm->screen->width,
|
|
|
|
|
self->wm->screen->height,
|
|
|
|
|
self->wm->screen->bpp) != 0)
|
|
|
|
|
{
|
|
|
|
|
self->wm->pro_layer->term = 1; /* kill session */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!(self->wm->pro_layer->term))
|
|
|
|
|
{
|
|
|
|
|
if (self->display > 0)
|
|
|
|
|
{
|
|
|
|
|
if (self->code == 0) /* Xvnc */
|
|
|
|
|
{
|
|
|
|
|
g_snprintf(text, 255, "%d", 5900 + self->display);
|
|
|
|
|
}
|
|
|
|
|
else if (self->code == 10) /* X11rdp */
|
|
|
|
|
{
|
|
|
|
|
g_snprintf(text, 255, "%d", 6200 + self->display);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
self->wm->pro_layer->term = 1; /* kill session */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!(self->wm->pro_layer->term))
|
|
|
|
|
{
|
|
|
|
|
/* this adds the port to the end of the list, it will already be in
|
|
|
|
|
the list as -1
|
|
|
|
|
the module should use the last one */
|
|
|
|
|
if (g_strlen(text) > 0)
|
|
|
|
|
{
|
|
|
|
|
list_add_item(self->login_names, (long)g_strdup("port"));
|
|
|
|
|
list_add_item(self->login_values, (long)g_strdup(text));
|
|
|
|
|
}
|
|
|
|
|
/* always set these */
|
|
|
|
|
name = self->wm->session->client_info->hostname;
|
|
|
|
|
self->mod->mod_set_param(self->mod, "hostname", name);
|
|
|
|
|
g_snprintf(text, 255, "%d", self->wm->session->client_info->keylayout);
|
|
|
|
|
self->mod->mod_set_param(self->mod, "keylayout", text);
|
|
|
|
|
for (i = 0; i < self->login_names->count; i++)
|
|
|
|
|
{
|
|
|
|
|
name = (char*)list_get_item(self->login_names, i);
|
|
|
|
|
value = (char*)list_get_item(self->login_values, i);
|
|
|
|
|
self->mod->mod_set_param(self->mod, name, value);
|
|
|
|
|
}
|
|
|
|
|
/* connect */
|
|
|
|
|
if (self->mod->mod_connect(self->mod) == 0)
|
|
|
|
|
{
|
|
|
|
|
rv = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return rv;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
static int APP_CC
|
|
|
|
|
xrdp_mm_process_login_response(struct xrdp_mm* self, struct stream* s)
|
|
|
|
@ -275,6 +484,7 @@ xrdp_mm_process_login_response(struct xrdp_mm* self, struct stream* s)
|
|
|
|
|
{
|
|
|
|
|
self->wm->pro_layer->app_sck = 0;
|
|
|
|
|
self->wm->login_mode = 11;
|
|
|
|
|
xrdp_mm_module_cleanup(self);
|
|
|
|
|
}
|
|
|
|
|
return rv;
|
|
|
|
|
}
|
|
|
|
@ -371,6 +581,23 @@ xrdp_mm_connect(struct xrdp_mm* self)
|
|
|
|
|
rv = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else /* no sesman */
|
|
|
|
|
{
|
|
|
|
|
if (xrdp_mm_setup_mod1(self) == 0)
|
|
|
|
|
{
|
|
|
|
|
if (xrdp_mm_setup_mod2(self) == 0)
|
|
|
|
|
{
|
|
|
|
|
self->wm->login_mode = 10;
|
|
|
|
|
self->wm->pro_layer->app_sck = self->mod->sck;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (self->wm->login_mode != 10)
|
|
|
|
|
{
|
|
|
|
|
self->wm->pro_layer->app_sck = 0;
|
|
|
|
|
self->wm->login_mode = 11;
|
|
|
|
|
xrdp_mm_module_cleanup(self);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return rv;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -412,7 +639,7 @@ xrdp_mm_signal(struct xrdp_mm* self)
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
g_writeln("unknown code %d in xrdp_mm_signal", code);
|
|
|
|
|
break;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
free_stream(s);
|
|
|
|
@ -420,198 +647,6 @@ xrdp_mm_signal(struct xrdp_mm* self)
|
|
|
|
|
return rv;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/* returns error */
|
|
|
|
|
/* this goes through the login_names looking for one called 'lib'
|
|
|
|
|
then it copies the corisponding login_values item into 'dest'
|
|
|
|
|
'dest' must be at least 'dest_len' + 1 bytes in size */
|
|
|
|
|
static int APP_CC
|
|
|
|
|
xrdp_mm_get_lib(struct xrdp_mm* self, char* dest, int dest_len)
|
|
|
|
|
{
|
|
|
|
|
char* name;
|
|
|
|
|
char* value;
|
|
|
|
|
int index;
|
|
|
|
|
int count;
|
|
|
|
|
int rv;
|
|
|
|
|
|
|
|
|
|
rv = 1;
|
|
|
|
|
/* find the library name */
|
|
|
|
|
dest[0] = 0;
|
|
|
|
|
count = self->login_names->count;
|
|
|
|
|
for (index = 0; index < count; index++)
|
|
|
|
|
{
|
|
|
|
|
name = (char*)list_get_item(self->login_names, index);
|
|
|
|
|
value = (char*)list_get_item(self->login_values, index);
|
|
|
|
|
if ((name == 0) || (value == 0))
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (g_strcasecmp(name, "lib") == 0)
|
|
|
|
|
{
|
|
|
|
|
g_strncpy(dest, value, dest_len);
|
|
|
|
|
rv = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return rv;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
int APP_CC
|
|
|
|
|
xrdp_mm_setup_mod1(struct xrdp_mm* self)
|
|
|
|
|
{
|
|
|
|
|
void* func;
|
|
|
|
|
char lib[256];
|
|
|
|
|
|
|
|
|
|
if (self == 0)
|
|
|
|
|
{
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
lib[0] = 0;
|
|
|
|
|
if (xrdp_mm_get_lib(self, lib, 255) != 0)
|
|
|
|
|
{
|
|
|
|
|
g_writeln("error finding lib");
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
if (lib[0] == 0)
|
|
|
|
|
{
|
|
|
|
|
g_writeln("error finding lib");
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
if (self->mod_handle == 0)
|
|
|
|
|
{
|
|
|
|
|
self->mod_handle = g_xrdp_sync(sync_load, (long)lib, 0);
|
|
|
|
|
if (self->mod_handle != 0)
|
|
|
|
|
{
|
|
|
|
|
func = g_get_proc_address(self->mod_handle, "mod_init");
|
|
|
|
|
if (func == 0)
|
|
|
|
|
{
|
|
|
|
|
func = g_get_proc_address(self->mod_handle, "_mod_init");
|
|
|
|
|
}
|
|
|
|
|
if (func == 0)
|
|
|
|
|
{
|
|
|
|
|
g_writeln("error finding proc mod_init in %s", lib);
|
|
|
|
|
}
|
|
|
|
|
self->mod_init = (struct xrdp_mod* (*)(void))func;
|
|
|
|
|
func = g_get_proc_address(self->mod_handle, "mod_exit");
|
|
|
|
|
if (func == 0)
|
|
|
|
|
{
|
|
|
|
|
func = g_get_proc_address(self->mod_handle, "_mod_exit");
|
|
|
|
|
}
|
|
|
|
|
if (func == 0)
|
|
|
|
|
{
|
|
|
|
|
g_writeln("error finding proc mod_exit in %s", lib);
|
|
|
|
|
}
|
|
|
|
|
self->mod_exit = (int (*)(struct xrdp_mod*))func;
|
|
|
|
|
if ((self->mod_init != 0) && (self->mod_exit != 0))
|
|
|
|
|
{
|
|
|
|
|
self->mod = self->mod_init();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
g_writeln("error loading %s", lib);
|
|
|
|
|
}
|
|
|
|
|
if (self->mod != 0)
|
|
|
|
|
{
|
|
|
|
|
self->mod->wm = (long)(self->wm);
|
|
|
|
|
self->mod->server_begin_update = server_begin_update;
|
|
|
|
|
self->mod->server_end_update = server_end_update;
|
|
|
|
|
self->mod->server_fill_rect = server_fill_rect;
|
|
|
|
|
self->mod->server_screen_blt = server_screen_blt;
|
|
|
|
|
self->mod->server_paint_rect = server_paint_rect;
|
|
|
|
|
self->mod->server_set_pointer = server_set_pointer;
|
|
|
|
|
self->mod->server_palette = server_palette;
|
|
|
|
|
self->mod->server_msg = server_msg;
|
|
|
|
|
self->mod->server_is_term = server_is_term;
|
|
|
|
|
self->mod->server_set_clip = server_set_clip;
|
|
|
|
|
self->mod->server_reset_clip = server_reset_clip;
|
|
|
|
|
self->mod->server_set_fgcolor = server_set_fgcolor;
|
|
|
|
|
self->mod->server_set_bgcolor = server_set_bgcolor;
|
|
|
|
|
self->mod->server_set_opcode = server_set_opcode;
|
|
|
|
|
self->mod->server_set_mixmode = server_set_mixmode;
|
|
|
|
|
self->mod->server_set_brush = server_set_brush;
|
|
|
|
|
self->mod->server_set_pen = server_set_pen;
|
|
|
|
|
self->mod->server_draw_line = server_draw_line;
|
|
|
|
|
self->mod->server_add_char = server_add_char;
|
|
|
|
|
self->mod->server_draw_text = server_draw_text;
|
|
|
|
|
self->mod->server_reset = server_reset;
|
|
|
|
|
self->mod->server_query_channel = server_query_channel;
|
|
|
|
|
self->mod->server_get_channel_id = server_get_channel_id;
|
|
|
|
|
self->mod->server_send_to_channel = server_send_to_channel;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/* id self->mod is null, there must be a problem */
|
|
|
|
|
if (self->mod == 0)
|
|
|
|
|
{
|
|
|
|
|
DEBUG(("problem loading lib in xrdp_mm_setup_mod1"));
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
int APP_CC
|
|
|
|
|
xrdp_mm_setup_mod2(struct xrdp_mm* self)
|
|
|
|
|
{
|
|
|
|
|
char text[256];
|
|
|
|
|
char* name;
|
|
|
|
|
char* value;
|
|
|
|
|
int i;
|
|
|
|
|
int rv;
|
|
|
|
|
|
|
|
|
|
rv = 1;
|
|
|
|
|
text[0] = 0;
|
|
|
|
|
if (!(self->wm->pro_layer->term))
|
|
|
|
|
{
|
|
|
|
|
if (self->mod->mod_start(self->mod, self->wm->screen->width,
|
|
|
|
|
self->wm->screen->height,
|
|
|
|
|
self->wm->screen->bpp) != 0)
|
|
|
|
|
{
|
|
|
|
|
self->wm->pro_layer->term = 1; /* kill session */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!(self->wm->pro_layer->term))
|
|
|
|
|
{
|
|
|
|
|
if (self->code == 0) /* Xvnc */
|
|
|
|
|
{
|
|
|
|
|
g_snprintf(text, 255, "%d", 5900 + self->display);
|
|
|
|
|
}
|
|
|
|
|
else if (self->code == 10) /* X11rdp */
|
|
|
|
|
{
|
|
|
|
|
g_snprintf(text, 255, "%d", 6200 + self->display);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
self->wm->pro_layer->term = 1; /* kill session */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!(self->wm->pro_layer->term))
|
|
|
|
|
{
|
|
|
|
|
/* this adds the port to the end of the list, it will already be in
|
|
|
|
|
the list as -1
|
|
|
|
|
the module should use the last one */
|
|
|
|
|
list_add_item(self->login_names, (long)g_strdup("port"));
|
|
|
|
|
list_add_item(self->login_values, (long)g_strdup(text));
|
|
|
|
|
/* always set these */
|
|
|
|
|
name = self->wm->session->client_info->hostname;
|
|
|
|
|
self->mod->mod_set_param(self->mod, "hostname", name);
|
|
|
|
|
g_snprintf(text, 255, "%d", self->wm->session->client_info->keylayout);
|
|
|
|
|
self->mod->mod_set_param(self->mod, "keylayout", text);
|
|
|
|
|
for (i = 0; i < self->login_names->count; i++)
|
|
|
|
|
{
|
|
|
|
|
name = (char*)list_get_item(self->login_names, i);
|
|
|
|
|
value = (char*)list_get_item(self->login_values, i);
|
|
|
|
|
self->mod->mod_set_param(self->mod, name, value);
|
|
|
|
|
}
|
|
|
|
|
/* connect */
|
|
|
|
|
if (self->mod->mod_connect(self->mod) == 0)
|
|
|
|
|
{
|
|
|
|
|
rv = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return rv;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
int DEFAULT_CC
|
|
|
|
|
server_begin_update(struct xrdp_mod* mod)
|
|
|
|
|