X-Git-Url: https://git.sesse.net/?p=rdpsrv;a=blobdiff_plain;f=tcp.c;h=0ae0d763f2f200e55facb0b4151d29990002ea82;hp=4e114223ef11e6a392544ff3e79cf6d85c1f3f0a;hb=132e47e292eea211b9ab0ba2f835cb7f41197ada;hpb=86ae6f2670e6d7a62d9fbb2243c8aae28b925645;ds=sidebyside diff --git a/tcp.c b/tcp.c index 4e11422..0ae0d76 100644 --- a/tcp.c +++ b/tcp.c @@ -133,86 +133,112 @@ tcp_recv(STREAM s, uint32 length) } /* Establish a connection on the TCP layer */ -BOOL -tcp_connect(char *server) +int +tcp_connect(char *server, int port) { - int true_value = 1; + int true_value = 1; + int sock; #ifdef IPv6 - int n; - struct addrinfo hints, *res, *ressave; - char tcp_port_rdp_s[10]; - - snprintf(tcp_port_rdp_s, 10, "%d", tcp_port_rdp); - - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - - n = getaddrinfo(server, tcp_port_rdp_s, &hints, &res); + int n; + struct addrinfo hints, *res, *ressave; + char tcp_port_rdp_s[10]; + + snprintf(tcp_port_rdp_s, 10, "%d", tcp_port_rdp); + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + n = getaddrinfo(server, tcp_port_rdp_s, &hints, &res); + + if (n < 0) + { + error("getaddrinfo: %s\n", gai_strerror(n)); + return -1; + } + + ressave = res; + sock = -1; + while (res) + { + sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol); + if (!(sock < 0)) + { + if (connect(sock, res->ai_addr, res->ai_addrlen) == 0) + break; + close(sock); + sock = -1; + } + res = res->ai_next; + } + freeaddrinfo(ressave); + + if (sock == -1) + { + error("%s: unable to connect\n", server); + return -1; + } - if (n < 0) - { - error("getaddrinfo: %s\n", gai_strerror(n)); - return False; - } - - ressave = res; - sock = -1; - while (res) - { - sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol); - if (!(sock < 0)) - { - if (connect(sock, res->ai_addr, res->ai_addrlen) == 0) - break; - close(sock); - sock = -1; - } - res = res->ai_next; - } - freeaddrinfo(ressave); +#else /* no IPv6 support */ - if (sock == -1) - { - error("%s: unable to connect\n", server); - return False; - } + struct hostent *nslookup; + struct sockaddr_in servaddr; + + if ((nslookup = gethostbyname(server)) != NULL) + { + memcpy(&servaddr.sin_addr, nslookup->h_addr, sizeof(servaddr.sin_addr)); + } + else if ((servaddr.sin_addr.s_addr = inet_addr(server)) == INADDR_NONE) + { + error("%s: unable to resolve host\n", server); + return -1; + } + + if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + error("socket: %s\n", strerror(errno)); + return -1; + } + + servaddr.sin_family = AF_INET; + servaddr.sin_port = htons(port); + + if (connect(sock, (struct sockaddr *) &servaddr, sizeof(struct sockaddr)) < 0) + { + error("connect: %s\n", strerror(errno)); + close(sock); + return -1; + } -#else /* no IPv6 support */ +#endif /* IPv6 */ - struct hostent *nslookup; - struct sockaddr_in servaddr; + setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void *) &true_value, sizeof(true_value)); - if ((nslookup = gethostbyname(server)) != NULL) - { - memcpy(&servaddr.sin_addr, nslookup->h_addr, sizeof(servaddr.sin_addr)); - } - else if ((servaddr.sin_addr.s_addr = inet_addr(server)) == INADDR_NONE) - { - error("%s: unable to resolve host\n", server); - return False; - } + in.size = 4096; + in.data = (uint8 *) xmalloc(in.size); - if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) - { - error("socket: %s\n", strerror(errno)); - return False; - } + out.size = 4096; + out.data = (uint8 *) xmalloc(out.size); - servaddr.sin_family = AF_INET; - servaddr.sin_port = htons(tcp_port_rdp); + return sock; +} - if (connect(sock, (struct sockaddr *) &servaddr, sizeof(struct sockaddr)) < 0) - { - error("connect: %s\n", strerror(errno)); - close(sock); - return False; +/* Establish a connection on the TCP layer */ +BOOL +tcp_recv_connect(int server_sock) +{ + struct sockaddr_in sin; + unsigned true_value = 1; + socklen_t len = sizeof(sin); + sock = accept(server_sock, (struct sockaddr *)&sin, &len); + + if (sock == -1) { + perror("accept()"); + exit(1); } -#endif /* IPv6 */ - setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void *) &true_value, sizeof(true_value)); in.size = 4096; @@ -230,3 +256,9 @@ tcp_disconnect(void) { close(sock); } + +// hack? :-) +int tcp_get_socket(void) +{ + return sock; +}