Introduce tcp_connect().
authorAndre Noll <maan@systemlinux.org>
Sun, 25 Nov 2007 12:36:37 +0000 (13:36 +0100)
committerAndre Noll <maan@systemlinux.org>
Sun, 25 Nov 2007 12:36:37 +0000 (13:36 +0100)
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.

client_common.c
error.h
http_recv.c
net.c
net.h

index 4266ddb..1aab14f 100644 (file)
@@ -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 5932fdb..d2d3dff 100644 (file)
--- 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 \
index 0a460ad..13c7fb5 100644 (file)
@@ -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 56edb8e..a5013b1 100644 (file)
--- a/net.c
+++ b/net.c
@@ -6,6 +6,8 @@
 
 /** \file net.c Networking-related helper functions. */
 
+#include <netdb.h> /* 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 d42031e..6613d3f 100644 (file)
--- a/net.h
+++ b/net.h
 typedef void crypt_function(unsigned long len,
        const unsigned char *indata, unsigned char *outdata, void *private_data);
 
-#include <netdb.h> /* 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, ...);