if (self->session != 0)
{
rv = libxrdp_process_data(self->session, s);
if ((self->wm == 0) && (self->session->up_and_running) && (rv == 0))
{
LOG_DEVEL(LOG_LEVEL_TRACE, "calling xrdp_wm_init and creating wm");
self->wm = xrdp_wm_create(self, self->session->client_info); /* at this point the wm(window manager) is created and wm::login_stateisWMLS_RESETandwm::login_state_eventisset soxrdp_wm_initshouldbecalledbyxrdp_wm_check_wait_objs
*/
}
}
return rv;
}
/*****************************************************************************/ /* returns boolean */ /* this is so libxrdp.so can known when to quit looping */ staticint
xrdp_is_term(void)
{ return g_is_term();
}
/*****************************************************************************/ staticint
xrdp_process_mod_end(struct xrdp_process *self)
{ if (self->wm != 0)
{ if (self->wm->mm != 0)
{ if (self->wm->mm->mod != 0)
{ if (self->wm->mm->mod->mod_end != 0)
{ return self->wm->mm->mod->mod_end(self->wm->mm->mod);
}
}
}
}
return0;
}
/*****************************************************************************/ staticint
xrdp_process_data_in(struct trans *self)
{ struct xrdp_process *pro; struct stream *s; int len;
LOG_DEVEL(LOG_LEVEL_TRACE, "xrdp_process_data_in");
pro = (struct xrdp_process *)(self->callback_data);
s = pro->server_trans->in_s; switch (pro->server_trans->extra_flags)
{ case0: /* early in connection sequence, we're in this mode */ if (xrdp_process_loop(pro, 0) != 0)
{
LOG(LOG_LEVEL_ERROR, "xrdp_process_data_in: " "xrdp_process_loop failed"); return1;
} if (pro->session->up_and_running)
{
pro->server_trans->header_size = 2;
pro->server_trans->extra_flags = 1;
init_stream(s, 0);
} break;
len = (int) (s->end - s->data); if (pro->server_trans->header_size > (unsignedint)len)
{ /* not enough data read yet */ break;
} /* FALLTHROUGH */
case2: /* we have enough now to get the PDU bytes */
len = libxrdp_get_pdu_bytes(s->p); if (len == -1)
{
LOG(LOG_LEVEL_ERROR, "xrdp_process_data_in: " "xrdp_process_get_packet_bytes failed"); return1;
}
pro->server_trans->header_size = len;
pro->server_trans->extra_flags = 3;
len = (int) (s->end - s->data); if (pro->server_trans->header_size > (unsignedint)len)
{ /* not enough data read yet */ break;
} /* FALLTHROUGH */
case3: /* the whole PDU is read in now process */
s->p = s->data; if (xrdp_process_loop(pro, s) != 0)
{
LOG(LOG_LEVEL_ERROR, "xrdp_process_data_in: " "xrdp_process_loop failed"); return1;
}
init_stream(s, 0);
pro->server_trans->header_size = 2;
pro->server_trans->extra_flags = 1; break;
} return0;
}
/*****************************************************************************/ int
xrdp_process_main_loop(struct xrdp_process *self)
{ int robjs_count; int wobjs_count; int cont; int timeout = 0;
tbus robjs[32];
tbus wobjs[32];
tbus term_obj;
LOG_DEVEL(LOG_LEVEL_TRACE, "xrdp_process_main_loop");
self->status = 1;
self->server_trans->extra_flags = 0;
self->server_trans->header_size = 0;
self->server_trans->no_stream_init_on_data_in = 1;
self->server_trans->trans_data_in = xrdp_process_data_in;
self->server_trans->callback_data = self;
init_stream(self->server_trans->in_s, 8192 * 4);
self->session = libxrdp_init((tbus)self, self->server_trans,
self->lis_layer->startup_params->xrdp_ini);
self->server_trans->si = &(self->session->si);
self->server_trans->my_source = XRDP_SOURCE_CLIENT; /* this callback function is in xrdp_wm.c */
self->session->callback = callback; /* this function is just above */
self->session->is_term = xrdp_is_term;
if (libxrdp_process_incoming(self->session) == 0)
{
init_stream(self->server_trans->in_s, 32 * 1024);
term_obj = g_get_term();
cont = 1;
while (cont)
{ /* build the wait obj list */
timeout = -1;
robjs_count = 0;
wobjs_count = 0;
robjs[robjs_count++] = term_obj;
robjs[robjs_count++] = self->self_term_event;
xrdp_wm_get_wait_objs(self->wm, robjs, &robjs_count,
wobjs, &wobjs_count, &timeout);
trans_get_wait_objs_rw(self->server_trans, robjs, &robjs_count,
wobjs, &wobjs_count, &timeout); /* wait */ if (g_obj_wait(robjs, robjs_count, wobjs, wobjs_count, timeout) != 0)
{ /* error, should not get here */
g_sleep(100);
}
if (g_is_wait_obj_set(term_obj)) /* term */
{
LOG(LOG_LEVEL_DEBUG, "Received termination signal, stopping the client message " "processor thread"); break;
}
if (g_is_wait_obj_set(self->self_term_event))
{ break;
}
if (xrdp_wm_check_wait_objs(self->wm) != 0)
{ break;
}
if (trans_check_wait_objs(self->server_trans) != 0)
{ break;
}
} /* send disconnect message if possible */
libxrdp_disconnect(self->session);
} else
{
LOG(LOG_LEVEL_ERROR, "xrdp_process_main_loop: libxrdp_process_incoming failed"); /* this will try to send a disconnect,
maybe should check that connection got far enough */
libxrdp_disconnect(self->session);
} /* Run end in module */
xrdp_process_mod_end(self);
xrdp_wm_delete(self->wm);
self->wm = NULL;
libxrdp_exit(self->session);
self->session = 0;
self->status = -1;
g_set_wait_obj(self->done_event); return0;
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-07-10)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.