diff options
author | jsorg71 <jsorg71> | 2005-10-12 01:32:19 +0000 |
---|---|---|
committer | jsorg71 <jsorg71> | 2005-10-12 01:32:19 +0000 |
commit | 47a059915d6838f100afb9791aaef367022e3a03 (patch) | |
tree | b49ae666b29c9b4898a8a26d90d59f0b3e6e5e3b /rdp/rdp_tcp.c | |
parent | 69693b9a8effce591e172a93abc46f07e506dd80 (diff) | |
download | xrdp-proprietary-47a059915d6838f100afb9791aaef367022e3a03.tar.gz xrdp-proprietary-47a059915d6838f100afb9791aaef367022e3a03.zip |
added rdp_tcp.c
Diffstat (limited to 'rdp/rdp_tcp.c')
-rw-r--r-- | rdp/rdp_tcp.c | 165 |
1 files changed, 165 insertions, 0 deletions
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; +} |