/** \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;
}
/**