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)
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 \
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;
/** \file net.c Networking-related helper functions. */
+#include <netdb.h> /* hostent */
+
#include "para.h"
#include "error.h"
#include "net.h"
* 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;
}
/**
- * 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;
}
/**
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, ...);