From 47a059915d6838f100afb9791aaef367022e3a03 Mon Sep 17 00:00:00 2001 From: jsorg71 Date: Wed, 12 Oct 2005 01:32:19 +0000 Subject: [PATCH] added rdp_tcp.c --- rdp/rdp_tcp.c | 165 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 rdp/rdp_tcp.c diff --git a/rdp/rdp_tcp.c b/rdp/rdp_tcp.c new file mode 100644 index 00000000..d5a13c9b --- /dev/null +++ b/rdp/rdp_tcp.c @@ -0,0 +1,165 @@ +/* + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + xrdp: A Remote Desktop Protocol server. + Copyright (C) Jay Sorg 2005 + + librdp tcp layer + +*/ + +#include "rdp.h" + +/*****************************************************************************/ +struct rdp_tcp* APP_CC +rdp_tcp_create(struct rdp_iso* owner) +{ + struct rdp_tcp* self; + + self = (struct rdp_tcp*)g_malloc(sizeof(struct rdp_tcp), 1); + self->iso_layer = owner; + return self; +} + +/*****************************************************************************/ +void APP_CC +rdp_tcp_delete(struct rdp_tcp* self) +{ + g_free(self); +} + +/*****************************************************************************/ +/* get out stream ready for data */ +/* returns error */ +int APP_CC +rdp_tcp_init(struct rdp_tcp* self, struct stream* s) +{ + init_stream(s, 8192); + return 0; +} + +/*****************************************************************************/ +/* returns error */ +int APP_CC +rdp_tcp_recv(struct rdp_tcp* self, struct stream* s, int len) +{ + int rcvd; + + if (self->sck_closed) + { + return 1; + } + init_stream(s, len); + while (len > 0) + { + rcvd = g_tcp_recv(self->sck, s->end, len, 0); + if (rcvd == -1) + { + if (g_tcp_last_error_would_block(self->sck)) + { + g_sleep(1); + } + else + { + self->sck_closed = 1; + return 1; + } + } + else if (rcvd == 0) + { + self->sck_closed = 1; + return 1; + } + else + { + s->end += rcvd; + len -= rcvd; + } + } + return 0; +} + +/*****************************************************************************/ +/* returns error */ +int APP_CC +rdp_tcp_send(struct rdp_tcp* self, struct stream* s) +{ + int len; + int total; + int sent; + + if (self->sck_closed) + { + return 1; + } + len = s->end - s->data; + total = 0; + while (total < len) + { + sent = g_tcp_send(self->sck, s->data + total, len - total, 0); + if (sent == -1) + { + if (g_tcp_last_error_would_block(self->sck)) + { + g_sleep(1); + } + else + { + self->sck_closed = 1; + return 1; + } + } + else if (sent == 0) + { + self->sck_closed = 1; + return 1; + } + else + { + total = total + sent; + } + } + return 0; +} + +/*****************************************************************************/ +/* returns error */ +int APP_CC +rdp_tcp_connect(struct rdp_tcp* self, char* ip, char* port) +{ + self->sck = g_tcp_socket(); + if (g_tcp_connect(self->sck, ip, port) == 0) + { + g_tcp_set_non_blocking(self->sck); + } + else + { + return 1; + } + return 0; +} + +/*****************************************************************************/ +/* returns error */ +int APP_CC +rdp_tcp_disconnect(struct rdp_tcp* self) +{ + if (self->sck != 0) + { + g_tcp_close(self->sck); + } + self->sck = 0; + return 0; +}