コード例 #1
0
ファイル: libxrdp.c プロジェクト: Osirium/xrdp
/* only used durring connection */
struct stream * APP_CC
libxrdp_force_read(struct trans* trans)
{
    int bytes;
    struct stream *s;

    s = trans->in_s;
    init_stream(s, 32 * 1024);

    if (trans_force_read(trans, 4) != 0)
    {
        g_writeln("libxrdp_force_read: error");
        return 0;
    }
    bytes = libxrdp_get_pdu_bytes(s->data);
    if (bytes < 1)
    {
        g_writeln("libxrdp_force_read: error");
        return 0;
    }
    if (bytes > 32 * 1024)
    {
        g_writeln("libxrdp_force_read: error");
        return 0;
    }

    if (trans_force_read(trans, bytes - 4) != 0)
    {
        g_writeln("libxrdp_force_read: error");
        return 0;
    }
    return s;
}
コード例 #2
0
ファイル: xrdp_process.c プロジェクト: speidy/xrdp
static int DEFAULT_CC
xrdp_process_data_in(struct trans *self)
{
    struct xrdp_process *pro;
    struct stream *s;
    int len;

    DEBUG(("xrdp_process_data_in"));
    pro = (struct xrdp_process *)(self->callback_data);

    s = pro->server_trans->in_s;
    switch (pro->server_trans->extra_flags)
    {
        case 0:
            /* early in connection sequence, we're in this mode */
            if (xrdp_process_loop(pro, 0) != 0)
            {
                g_writeln("xrdp_process_data_in: "
                          "xrdp_process_loop failed");
                return 1;
            }
            if (pro->session->up_and_running)
            {
                pro->server_trans->header_size = 2;
                pro->server_trans->extra_flags = 1;
                init_stream(s, 0);
            }
            break;

        case 1:
            /* we got 2 bytes */
            if (s->p[0] == 3)
            {
                pro->server_trans->header_size = 4;
                pro->server_trans->extra_flags = 2;
            }
            else
            {
                if (s->p[1] & 0x80)
                {
                    pro->server_trans->header_size = 3;
                    pro->server_trans->extra_flags = 2;
                }
                else
                {
                    len = (tui8)(s->p[1]);
                    pro->server_trans->header_size = len;
                    pro->server_trans->extra_flags = 3;
                }
            }

            len = (int) (s->end - s->data);
            if (pro->server_trans->header_size > len)
            {
                /* not enough data read yet */
                break;
            }
            /* FALLTHROUGH */

        case 2:
            /* we have enough now to get the PDU bytes */
            len = libxrdp_get_pdu_bytes(s->p);
            if (len == -1)
            {
                g_writeln("xrdp_process_data_in: "
                          "xrdp_process_get_packet_bytes failed");
                return 1;
            }
            pro->server_trans->header_size = len;
            pro->server_trans->extra_flags = 3;

            len = (int) (s->end - s->data);
            if (pro->server_trans->header_size > len)
            {
                /* not enough data read yet */
                break;
            }
            /* FALLTHROUGH */

        case 3:
            /* the whole PDU is read in now process */
            s->p = s->data;
            if (xrdp_process_loop(pro, s) != 0)
            {
                g_writeln("xrdp_process_data_in: "
                          "xrdp_process_loop failed");
                return 1;
            }
            init_stream(s, 0);
            pro->server_trans->header_size = 2;
            pro->server_trans->extra_flags = 1;
            break;
    }
    return 0;
}