From: Andre Noll Date: Sun, 25 Nov 2007 12:36:37 +0000 (+0100) Subject: Introduce tcp_connect(). X-Git-Tag: v0.3.0~89 X-Git-Url: http://git.tue.mpg.de/?a=commitdiff_plain;h=e1890028c21d233087266fd7997d68a88cb9afce;p=paraslash.git Introduce tcp_connect(). This replaces get_host_info(). The two callers of the latter, client_connect() and http_recv_open(), did exactly the same, namely initializing a struct sockaddr_in which was then used for PARA_CONNECT(). So move this common code to tcp_connect(). Additional benefit of this is that the only remaining callers of init_sockaddr() are in net.c, so make this function static. --- diff --git a/client_common.c b/client_common.c index 4266ddb2..1aab14fb 100644 --- a/client_common.c +++ b/client_common.c @@ -79,23 +79,12 @@ void client_close(struct private_client_data *pcd) static int client_connect(struct private_client_data *pcd) { int ret; - struct hostent *he; - struct sockaddr_in their_addr; pcd->fd = -1; - ret = get_host_info(pcd->conf.hostname_arg, &he); - if (ret < 0) - return ret; - /* get new socket */ - ret = get_stream_socket(AF_INET); + ret = tcp_connect(pcd->conf.hostname_arg, pcd->conf.server_port_arg); if (ret < 0) return ret; pcd->fd = ret; - /* init their_addr */ - init_sockaddr(&their_addr, pcd->conf.server_port_arg, he); - ret = PARA_CONNECT(pcd->fd, &their_addr); - if (ret < 0) - goto err_out; pcd->status = CL_CONNECTED; ret = mark_fd_nonblocking(pcd->fd); if (ret < 0) diff --git a/error.h b/error.h index 5932fdb3..d2d3dff8 100644 --- a/error.h +++ b/error.h @@ -184,7 +184,6 @@ extern const char **para_errlist[]; PARA_ERROR(SCM_CREDENTIALS, "did not receive SCM credentials"), \ PARA_ERROR(LISTEN, "listen error"), \ PARA_ERROR(RECV_PATTERN, "did not receive expected pattern"), \ - PARA_ERROR(HOST_INFO, "gethostbyname() failed"), \ #define ORTP_RECV_ERRORS \ diff --git a/http_recv.c b/http_recv.c index 0a460adf..13c7fb57 100644 --- a/http_recv.c +++ b/http_recv.c @@ -166,30 +166,16 @@ static void *http_recv_parse_config(int argc, char **argv) static int http_recv_open(struct receiver_node *rn) { struct private_http_recv_data *phd; - struct hostent *he; struct http_recv_args_info *conf = rn->conf; - struct sockaddr_in their_addr; int ret; rn->buf = para_calloc(BUFSIZE); rn->private_data = para_calloc(sizeof(struct private_http_recv_data)); phd = rn->private_data; - ret = get_host_info(conf->host_arg, &he); - if (ret < 0) - goto err_out; - ret = get_stream_socket(AF_INET); + ret = tcp_connect(conf->host_arg, conf->port_arg); if (ret < 0) goto err_out; phd->fd = ret; - /* init their_addr */ - init_sockaddr(&their_addr, conf->port_arg, he); - PARA_NOTICE_LOG("connecting to %s:%d\n", conf->host_arg, - conf->port_arg); - ret = PARA_CONNECT(phd->fd, &their_addr); - if (ret < 0) { - close(phd->fd); - goto err_out; - } mark_fd_nonblocking(phd->fd); phd->status = HTTP_CONNECTED; return 1; diff --git a/net.c b/net.c index 56edb8e7..a5013b16 100644 --- a/net.c +++ b/net.c @@ -6,6 +6,8 @@ /** \file net.c Networking-related helper functions. */ +#include /* hostent */ + #include "para.h" #include "error.h" #include "net.h" @@ -80,7 +82,7 @@ void disable_crypt(int fd) * If \a he is null (server mode), \a addr->sin_addr is initialized with \p * INADDR_ANY. Otherwise, the address given by \a he is copied to addr. */ -void init_sockaddr(struct sockaddr_in *addr, int port, const struct hostent *he) +static void init_sockaddr(struct sockaddr_in *addr, int port, const struct hostent *he) { /* host byte order */ addr->sin_family = AF_INET; @@ -254,22 +256,34 @@ int recv_buffer(int fd, char *buf, size_t size) } /** - * wrapper around gethostbyname - * - * \param host hostname or IPv4 address - * \param ret the hostent structure is returned here + * Establish a tcp connection. * - * \return positive on success, negative on errors. On success, \a ret - * contains the return value of the underlying gethostbyname() call. + * \param host Hostname or IPv4 address. + * \param port The tcp port. * - * \sa gethostbyname(2) + * \return Negative on errors, a valid file descriptor on success. */ -int get_host_info(char *host, struct hostent **ret) +int tcp_connect(char *host, int port) { + struct sockaddr_in addr; + struct hostent *he; + int ret, fd; + PARA_INFO_LOG("getting host info of %s\n", host); /* FIXME: gethostbyname() is obsolete */ - *ret = gethostbyname(host); - return *ret? 1 : -E_HOST_INFO; + he = gethostbyname(host); + if (!he) + return -ERRNO_TO_PARA_ERROR(h_errno); + init_sockaddr(&addr, port, he); + ret = get_stream_socket(AF_INET); + if (ret < 0) + return ret; + fd = ret; + ret = PARA_CONNECT(fd, &addr); + if (ret >= 0) + return fd; + close(fd); + return ret; } /** diff --git a/net.h b/net.h index d42031e8..6613d3f9 100644 --- a/net.h +++ b/net.h @@ -20,10 +20,8 @@ typedef void crypt_function(unsigned long len, const unsigned char *indata, unsigned char *outdata, void *private_data); -#include /* hostent */ -int get_host_info(char *host, struct hostent **ret); +int tcp_connect(char *host, int port); int get_stream_socket(int domain); -void init_sockaddr(struct sockaddr_in*, int, const struct hostent*); int send_buffer(int, const char *); int send_bin_buffer(int, const char *, size_t); __printf_2_3 int send_va_buffer(int fd, const char *fmt, ...);