diff options
| author | jsorg71 <jsorg71> | 2005-06-28 03:11:35 +0000 |
|---|---|---|
| committer | jsorg71 <jsorg71> | 2005-06-28 03:11:35 +0000 |
| commit | 992dbfa7b3fa568ee480aa3fe3242084d33c518f (patch) | |
| tree | c46af888c75e214fa2c1f18606c4d21ef83526e5 /libxrdp/xrdp_tcp.c | |
| parent | 41df89c7f2da57650948967a78afa352a3dfc4b6 (diff) | |
| download | xrdp-proprietary-992dbfa7b3fa568ee480aa3fe3242084d33c518f.tar.gz xrdp-proprietary-992dbfa7b3fa568ee480aa3fe3242084d33c518f.zip | |
moved a bunch of files around
Diffstat (limited to 'libxrdp/xrdp_tcp.c')
| -rw-r--r-- | libxrdp/xrdp_tcp.c | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/libxrdp/xrdp_tcp.c b/libxrdp/xrdp_tcp.c new file mode 100644 index 00000000..59d4a615 --- /dev/null +++ b/libxrdp/xrdp_tcp.c @@ -0,0 +1,146 @@ +/* + 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 2004-2005 + + tcp layer + +*/ + +#include "libxrdp.h" + +/*****************************************************************************/ +struct xrdp_tcp* APP_CC +xrdp_tcp_create(struct xrdp_iso* owner, int sck) +{ + struct xrdp_tcp* self; + + self = (struct xrdp_tcp*)g_malloc(sizeof(struct xrdp_tcp), 1); + self->iso_layer = owner; + self->sck = sck; + return self; +} + +/*****************************************************************************/ +void APP_CC +xrdp_tcp_delete(struct xrdp_tcp* self) +{ + g_free(self); +} + +/*****************************************************************************/ +/* get out stream ready for data */ +/* returns error */ +int APP_CC +xrdp_tcp_init(struct xrdp_tcp* self, struct stream* s) +{ + init_stream(s, 8192); + return 0; +} + +/*****************************************************************************/ +/* returns error */ +int APP_CC +xrdp_tcp_recv(struct xrdp_tcp* self, struct stream* s, int len) +{ + int rcvd; + + if (self->sck_closed) + { + DEBUG((" in xrdp_tcp_recv, sck closed\n\r")); + return 1; + } + DEBUG((" in xrdp_tcp_recv, gota get %d bytes\n\r", len)); + 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; + DEBUG((" error = -1 in xrdp_tcp_recv socket %d\n\r", self->sck)); + return 1; + } + } + else if (rcvd == 0) + { + self->sck_closed = 1; + DEBUG((" error = 0 in xrdp_tcp_recv socket %d\n\r", self->sck)); + return 1; + } + else + { + s->end += rcvd; + len -= rcvd; + } + } + DEBUG((" out xrdp_tcp_recv\n\r")); + return 0; +} + +/*****************************************************************************/ +/* returns error */ +int APP_CC +xrdp_tcp_send(struct xrdp_tcp* self, struct stream* s) +{ + int len; + int total; + int sent; + + if (self->sck_closed) + { + DEBUG((" in xrdp_tcp_send, sck closed\n\r")); + return 1; + } + len = s->end - s->data; + DEBUG((" in xrdp_tcp_send, gota send %d bytes\n\r", len)); + 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; + DEBUG((" error = -1 in xrdp_tcp_send socket %d\n\r", self->sck)); + return 1; + } + } + else if (sent == 0) + { + self->sck_closed = 1; + DEBUG((" error = 0 in xrdp_tcp_send socket %d\n\r", self->sck)); + return 1; + } + else + { + total = total + sent; + } + } + DEBUG((" out xrdp_tcp_send, sent %d bytes ok\n\r", len)); + return 0; +} |
