diff --git a/vnc/Makefile b/vnc/Makefile index cff86210..7c1ed0a5 100644 --- a/vnc/Makefile +++ b/vnc/Makefile @@ -1,5 +1,7 @@ # libvnc makefile -VNCOBJ = vnc.o os_calls.o d3des.o +LIBSCPOBJ = libscp_v0.o tcp.o + +VNCOBJ = vnc.o os_calls.o d3des.o $(LIBSCPOBJ) DESTDIR = /usr/local/xrdp CFGDIR = /etc/xrdp @@ -10,7 +12,7 @@ DOCDIR = /usr/doc/xrdp DEFINES = CFLAGS = -Wall -O2 -I../common -fPIC $(DEFINES) -C_OS_FLAGS = $(CFLAGS) -c +C_OS_FLAGS = $(CFLAGS) -c -g LDFLAGS = -shared LIBS = -ldl CC = gcc @@ -34,3 +36,9 @@ install: installdeb: install libvnc.so $(DESTDIRDEB)/usr/lib/xrdp/libvnc.so + +libscp_v0.o: + $(CC) $(C_OS_FLAGS) ../sesman/libscp_v0.c + +tcp.o: + $(CC) $(C_OS_FLAGS) -DLIBSCP_CLIENT ../sesman/tcp.c \ No newline at end of file diff --git a/vnc/vnc.c b/vnc/vnc.c index f753c9a7..44d7721e 100644 --- a/vnc/vnc.c +++ b/vnc/vnc.c @@ -904,11 +904,10 @@ lib_mod_connect(struct vnc* v) int error; int i; int check_sec_result; - int version; - int size; - int code; - int ok; - int display; + + struct SCP_SESSION scp_s; + struct SCP_CONNECTION scp_c; + enum SCP_CLIENT_STATES_E scp_e; v->server_msg(v, "started connecting", 0); check_sec_result = 1; @@ -927,82 +926,66 @@ lib_mod_connect(struct vnc* v) /* if port = -1, use sesman to get port / desktop */ if (g_strncmp(v->port, "-1", 2) == 0) { - display = 0; + scp_s.type=SCP_SESSION_TYPE_XVNC; + scp_s.display=0; + scp_s.height=v->server_height; + scp_s.width=v->server_width; + scp_s.bpp=v->server_bpp; + scp_s.username=g_strdup(v->username); + scp_s.password=g_strdup(v->password); + error = 0; init_stream(s, 8192); - v->sck = g_tcp_socket(); - v->sck_closed = 0; + scp_c.in_sck=g_tcp_socket(); + make_stream((scp_c.in_s)); + make_stream((scp_c.out_s)); + init_stream((scp_c.in_s), 8192); + init_stream((scp_c.out_s), 8192); v->server_msg(v, "connecting to sesman", 0); - if (g_tcp_connect(v->sck, v->ip, "3350") == 0) + v->sck_closed = 0; + if (g_tcp_connect(scp_c.in_sck, v->ip, "3350") == 0) { - g_tcp_set_non_blocking(v->sck); - g_tcp_set_no_delay(v->sck); - s_push_layer(s, channel_hdr, 8); - out_uint16_be(s, 0); // code - i = g_strlen(v->username); - out_uint16_be(s, i); - out_uint8a(s, v->username, i); - i = g_strlen(v->password); - out_uint16_be(s, i); - out_uint8a(s, v->password, i); - out_uint16_be(s, v->server_width); - out_uint16_be(s, v->server_height); - out_uint16_be(s, v->server_bpp); - s_mark_end(s); - s_pop_layer(s, channel_hdr); - out_uint32_be(s, 0); // version - out_uint32_be(s, s->end - s->data); // size - v->server_msg(v, "sending login info to sesman", 0); - error = lib_send(v, s->data, s->end - s->data); - if (error == 0) - { - init_stream(s, 8192); - v->server_msg(v, "receiving sesman header", 0); - error = lib_recv(v, s->data, 8); - } - if (error == 0) + error=1; + scp_e=scp_v0c_connect(&scp_c, &scp_s); + switch (scp_e) { - in_uint32_be(s, version); - in_uint32_be(s, size); - init_stream(s, 8192); - v->server_msg(v, "receiving sesman data", 0); - error = lib_recv(v, s->data, size - 8); - } - if (error == 0) - { - if (version == 0) - { - in_uint16_be(s, code); - if (code == 3) - { - in_uint16_be(s, ok); - if (ok) - { - in_uint16_be(s, display); - } - else - { - in_uint8s(s, 2); - v->server_msg(v, "error - sesman returned no", 0); - } - } - } + case SCP_CLIENT_STATE_CONNECTION_DENIED: + v->server_msg(v, "error - sesman returned no", 0); + break; + case SCP_CLIENT_STATE_VERSION_ERR: + v->server_msg(v, "error - libscp version error", 0); + break; + case SCP_CLIENT_STATE_SIZE_ERR: + v->server_msg(v, "error - libscp size error", 0); + break; + case SCP_CLIENT_STATE_NETWORK_ERR: + v->server_msg(v, "error - libscp network error", 0); + break; + case SCP_CLIENT_STATE_SEQUENCE_ERR: + v->server_msg(v, "error - libscp sequence error", 0); + break; + case SCP_CLIENT_STATE_END: + v->server_msg(v, "error - sesman returned ok", 0); + error=0; + break; + default: + v->server_msg(v, "error - unknown error", 0); } } else { v->server_msg(v, "error - connecting to sesman", 0); } - g_tcp_close(v->sck); - if (error != 0 || display == 0) + g_tcp_close(scp_c.in_sck); + if (error != 0 || scp_s.display == 0) { v->server_msg(v, "error - connection failed", 0); free_stream(s); return 1; } v->server_msg(v, "sesman started a session", 0); - g_sprintf(con_port, "%d", 5900 + display); - v->vnc_desktop = display; + g_sprintf(con_port, "%d", 5900 + scp_s.display); + v->vnc_desktop = scp_s.display; } else { diff --git a/vnc/vnc.h b/vnc/vnc.h index 3189f262..658b41ea 100644 --- a/vnc/vnc.h +++ b/vnc/vnc.h @@ -26,6 +26,8 @@ #include "os_calls.h" #include "d3des.h" +#include "../sesman/libscp.h" + struct vnc { int size; /* size of this struct */ @@ -38,7 +40,7 @@ struct vnc int (*mod_signal)(struct vnc* v); int (*mod_end)(struct vnc* v); int (*mod_set_param)(struct vnc* v, char* name, char* value); - long mod_dumby[100 - 6]; /* align, 100 minus the number of mod + long mod_dumby[100 - 6]; /* align, 100 minus the number of mod functions above */ /* server functions */ int (*server_begin_update)(struct vnc* v); @@ -79,7 +81,7 @@ struct vnc int (*server_get_channel_id)(struct vnc* v, char* name); int (*server_send_to_channel)(struct vnc* v, int channel_id, char* data, int data_len); - long server_dumby[100 - 24]; /* align, 100 minus the number of server + long server_dumby[100 - 24]; /* align, 100 minus the number of server functions above */ /* common */ long handle; /* pointer to self as long */