Start the drdynvc channel within xrdp_wm

The responsibility for starting the drdynvc channel is moved out of
libxrdp into the application. This will make it easier to allow the
application to check the channel is enabled before starting it.
This commit is contained in:
matt335672 2024-03-11 11:00:53 +00:00
parent 0187daeb59
commit 697dcbb24d
5 changed files with 61 additions and 35 deletions

View File

@ -1406,6 +1406,23 @@ libxrdp_disable_channel(struct xrdp_session *session, int channel_id,
return 1;
}
/*****************************************************************************/
int
libxrdp_drdynvc_start(struct xrdp_session *session)
{
struct xrdp_rdp *rdp;
struct xrdp_sec *sec;
struct xrdp_channel *chan;
LOG_DEVEL(LOG_LEVEL_TRACE, "libxrdp_drdynvc_start:");
rdp = (struct xrdp_rdp *) (session->rdp);
sec = rdp->sec_layer;
chan = sec->chan_layer;
return xrdp_channel_drdynvc_start(chan);
}
/*****************************************************************************/
int
libxrdp_drdynvc_open(struct xrdp_session *session, const char *name,

View File

@ -241,6 +241,8 @@ int
libxrdp_disable_channel(struct xrdp_session *session, int channel_id,
int is_disabled);
int
libxrdp_drdynvc_start(struct xrdp_session *session);
int
libxrdp_drdynvc_open(struct xrdp_session *session, const char *name,
int flags, struct xrdp_drdynvc_procs *procs,
int *chan_id);

View File

@ -752,46 +752,53 @@ xrdp_channel_drdynvc_send_capability_request(struct xrdp_channel *self)
int
xrdp_channel_drdynvc_start(struct xrdp_channel *self)
{
int index;
int count;
struct mcs_channel_item *ci;
struct mcs_channel_item *dci;
LOG_DEVEL(LOG_LEVEL_INFO, "xrdp_channel_drdynvc_start: drdynvc_channel_id %d", self->drdynvc_channel_id);
int rv = 0;
LOG_DEVEL(LOG_LEVEL_INFO,
"xrdp_channel_drdynvc_start: drdynvc_channel_id %d",
self->drdynvc_channel_id);
if (self->drdynvc_channel_id != -1)
{
LOG_DEVEL(LOG_LEVEL_INFO, "xrdp_channel_drdynvc_start: already started");
return 0;
}
dci = NULL;
count = self->mcs_layer->channel_list->count;
for (index = 0; index < count; index++)
{
ci = (struct mcs_channel_item *)
list_get_item(self->mcs_layer->channel_list, index);
if (ci != NULL)
{
if (g_strcasecmp(ci->name, "drdynvc") == 0)
{
dci = ci;
}
}
}
if (dci != NULL)
{
self->drdynvc_channel_id = (dci->chanid - MCS_GLOBAL_CHANNEL) - 1;
LOG_DEVEL(LOG_LEVEL_DEBUG,
"Initializing Dynamic Virtual Channel with channel id %d",
self->drdynvc_channel_id);
xrdp_channel_drdynvc_send_capability_request(self);
LOG_DEVEL(LOG_LEVEL_INFO,
"xrdp_channel_drdynvc_start: already started");
}
else
{
LOG(LOG_LEVEL_WARNING,
"Dynamic Virtual Channel named 'drdynvc' not found, "
"channel not initialized");
int index;
int count;
struct mcs_channel_item *ci;
struct mcs_channel_item *dci;
dci = NULL;
count = self->mcs_layer->channel_list->count;
for (index = 0; index < count; index++)
{
ci = (struct mcs_channel_item *)
list_get_item(self->mcs_layer->channel_list, index);
if (ci != NULL)
{
if (g_strcasecmp(ci->name, DRDYNVC_SVC_CHANNEL_NAME) == 0)
{
dci = ci;
break;
}
}
}
if (dci != NULL)
{
self->drdynvc_channel_id = (dci->chanid - MCS_GLOBAL_CHANNEL) - 1;
LOG_DEVEL(LOG_LEVEL_DEBUG, DRDYNVC_SVC_CHANNEL_NAME
"Initializing Dynamic Virtual Channel with channel id %d",
self->drdynvc_channel_id);
xrdp_channel_drdynvc_send_capability_request(self);
}
else
{
LOG(LOG_LEVEL_WARNING,
"Static channel '%s' not found. "
"Channel not initialized", DRDYNVC_SVC_CHANNEL_NAME);
rv = -1;
}
}
return 0;
return rv;
}
/*****************************************************************************/

View File

@ -1323,7 +1323,6 @@ xrdp_rdp_process_data_font(struct xrdp_rdp *self, struct stream *s)
self->session->callback(self->session->id, 0x555a, 0, 0,
0, 0);
}
xrdp_channel_drdynvc_start(self->sec_layer->chan_layer);
}
else
{

View File

@ -2031,6 +2031,7 @@ callback(intptr_t id, int msg, intptr_t param1, intptr_t param2,
LOWORD(param3), HIWORD(param3));
case 0x555a:
// "yeah, up_and_running"
libxrdp_drdynvc_start(wm->session);
xrdp_mm_up_and_running(wm->mm);
break;
}