diff --git a/src/common/remoteio.c b/src/common/remoteio.c --- a/src/common/remoteio.c +++ b/src/common/remoteio.c @@ -23,18 +23,22 @@ #include "asprintf.h" #include +#include #include #include #include +#include +#include #include #ifndef WINDOWS -#include #include #endif /* local */ +#define REMOTEIO_DEFAULT_PORT "4050" + int _remoteio_ssh_open(struct remoteio *rem, struct remoteio_server *server); int _remoteio_ssh_read(struct remoteio *rem, void *buf, size_t len, size_t *bytesread); int _remoteio_ssh_write(struct remoteio *rem, void *buf, size_t len, size_t *byteswritten); @@ -401,12 +405,76 @@ int _remoteio_sock_write(struct remoteio */ int _remoteio_tcp_open(struct remoteio *rem, struct remoteio_server *server) { + int tmp; + int tmp2; + + int sock; + + char *hostname; + char *port; + + struct addrinfo addrinfo_hints; + struct addrinfo *addrinfo_res; + + /** + only hostname should be free()-ed, not port, + because both are from the same block of malloc()-ed + memory + */ + hostname = strdup(server->hostname); + for(port = hostname; + *port && *port != ':'; + port ++) + ; + if(*port) + { + *port = '\0'; + port ++; + } + else + port = REMOTEIO_DEFAULT_PORT; + + memset(&addrinfo_hints, '\0', sizeof(struct addrinfo)); + addrinfo_hints.ai_family = AF_UNSPEC; + addrinfo_hints.ai_flags = AI_V4MAPPED | AI_ADDRCONFIG; + addrinfo_hints.ai_socktype = SOCK_STREAM; + + tmp = getaddrinfo(server->hostname, port, &addrinfo_hints, &addrinfo_res); + if(tmp) + fprintf(stderr, "error resolving %s:%s: %s\n", server->hostname, port, gai_strerror(tmp)); + fprintf(stderr, "connecting to %s[%s]:%s\n", server->hostname, addrinfo_res->ai_canonname, port); + + free(hostname); + + sock = socket(addrinfo_res->ai_family, SOCK_STREAM, addrinfo_res->ai_protocol); + if(sock == -1) + { + perror("socket"); + freeaddrinfo(addrinfo_res); - return 1; + return 1; + } + + tmp = connect(sock, addrinfo_res->ai_addr, addrinfo_res->ai_addrlen); + tmp2 = errno; + freeaddrinfo(addrinfo_res); + errno = tmp2; + if(tmp == -1) + { + perror("connect"); + close(sock); + + return 1; + } + + rem->sock = sock; + + return 0; } int _remoteio_tcp_close(struct remoteio *rem) { + close(rem->sock); - return 1; + return 0; }