18 |
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
19 |
*/ |
*/ |
20 |
|
|
21 |
#include <unistd.h> /* select read write close */ |
#include <unistd.h> /* select read write close */ |
22 |
#include <sys/socket.h> /* socket connect setsockopt */ |
#include <sys/socket.h> /* socket connect setsockopt */ |
23 |
#include <sys/time.h> /* timeval */ |
#include <sys/time.h> /* timeval */ |
24 |
#include <netdb.h> /* gethostbyname */ |
#include <netdb.h> /* gethostbyname */ |
25 |
#include <netinet/in.h> /* sockaddr_in */ |
#include <netinet/in.h> /* sockaddr_in */ |
26 |
#include <netinet/tcp.h> /* TCP_NODELAY */ |
#include <netinet/tcp.h> /* TCP_NODELAY */ |
27 |
#include <arpa/inet.h> /* inet_addr */ |
#include <arpa/inet.h> /* inet_addr */ |
28 |
#include <errno.h> /* errno */ |
#include <errno.h> /* errno */ |
29 |
#include "rdesktop.h" |
#include "rdesktop.h" |
30 |
|
|
31 |
static int sock; |
static int sock; |
49 |
/* Send TCP transport data packet */ |
/* Send TCP transport data packet */ |
50 |
void tcp_send(STREAM s) |
void tcp_send(STREAM s) |
51 |
{ |
{ |
52 |
int length = s->end - s->data; |
int length = s->end - s->data; |
53 |
int sent, total = 0; |
int sent, total = 0; |
54 |
|
|
55 |
while (total < length) |
while (total < length) |
90 |
tv.tv_sec = 0; |
tv.tv_sec = 0; |
91 |
tv.tv_usec = 100; |
tv.tv_usec = 100; |
92 |
|
|
93 |
ret = select(sock+1, &rfds, NULL, NULL, &tv); |
ret = select(sock + 1, &rfds, NULL, NULL, &tv); |
94 |
|
|
95 |
if (ret) |
if (ret) |
96 |
{ |
{ |
119 |
|
|
120 |
if ((nslookup = gethostbyname(server)) != NULL) |
if ((nslookup = gethostbyname(server)) != NULL) |
121 |
{ |
{ |
122 |
memcpy(&servaddr.sin_addr, nslookup->h_addr, sizeof(servaddr.sin_addr)); |
memcpy(&servaddr.sin_addr, nslookup->h_addr, |
123 |
|
sizeof(servaddr.sin_addr)); |
124 |
} |
} |
125 |
else if (!(servaddr.sin_addr.s_addr = inet_addr(server))) |
else if (!(servaddr.sin_addr.s_addr = inet_addr(server))) |
126 |
{ |
{ |
137 |
servaddr.sin_family = AF_INET; |
servaddr.sin_family = AF_INET; |
138 |
servaddr.sin_port = htons(TCP_PORT_RDP); |
servaddr.sin_port = htons(TCP_PORT_RDP); |
139 |
|
|
140 |
if (connect(sock, (struct sockaddr *)&servaddr, sizeof(struct sockaddr)) < 0) |
if (connect |
141 |
|
(sock, (struct sockaddr *) &servaddr, |
142 |
|
sizeof(struct sockaddr)) < 0) |
143 |
{ |
{ |
144 |
STATUS("connect: %s\n", strerror(errno)); |
STATUS("connect: %s\n", strerror(errno)); |
145 |
close(sock); |
close(sock); |
146 |
return False; |
return False; |
147 |
} |
} |
148 |
|
|
149 |
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void *)&true, sizeof(true)); |
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void *) &true, |
150 |
|
sizeof(true)); |
151 |
|
|
152 |
in.size = 4096; |
in.size = 4096; |
153 |
in.data = xmalloc(in.size); |
in.data = xmalloc(in.size); |