* Licensed under the GPL v2. For licencing details see COPYING.
*/
-/** \file net.c networking-related helper functions */
+/** \file net.c Networking-related helper functions. */
+
+#include <netdb.h> /* hostent */
#include "para.h"
#include "error.h"
static unsigned cda_size = 0;
/**
- * activate encryption for one file descriptor
+ * Activate encryption for one file descriptor.
*
- * \param fd the file descriptor
- * \param recv_f the function used for decrypting received data
- * \param send_f the function used for encrypting before sending
- * \param private_data user data supplied by the caller
+ * \param fd The file descriptor.
+ * \param recv_f The function used for decrypting received data.
+ * \param send_f The function used for encrypting before sending.
+ * \param private_data User data supplied by the caller.
*/
void enable_crypt(int fd, crypt_function *recv_f, crypt_function *send_f,
void *private_data)
}
/**
- * deactivate encryption for a given fd
+ * Deactivate encryption for a given fd.
*
- * \param fd the file descriptor
+ * \param fd The file descriptor.
*
* This must be called if and only if \p fd was activated via enable_crypt().
*/
/**
- * initialize a struct sockaddr_in
+ * Initialize a struct sockaddr_in.
*
- * \param addr A pointer to the struct to be initialized
- * \param port The port number to use
- * \param he The address to use
+ * \param addr A pointer to the struct to be initialized.
+ * \param port The port number to use.
+ * \param he The address to use.
*
* 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;
}
/**
- * receive and decrypt.
+ * Receive and decrypt.
*
- * \param fd the file descriptor
- * \param buf the buffer to write the decrypted data to
- * \param size the size of \a buf
+ * \param fd The file descriptor.
+ * \param buf The buffer to write the decrypted data to.
+ * \param size The size of \a buf.
*
* Receive at most \a size bytes from file descriptor \a fd. If encryption is
* available, decrypt the received buffer.
}
/**
- * receive, decrypt and write terminating NULL byte
+ * Receive, decrypt and write terminating NULL byte.
*
- * \param fd the file descriptor
- * \param buf the buffer to write the decrypted data to
- * \param size the size of \a buf
+ * \param fd The file descriptor.
+ * \param buf The buffer to write the decrypted data to.
+ * \param size The size of \a buf.
*
* Read and decrypt at most \a size - 1 bytes from file descriptor \a fd and
* write a NULL byte at the end of the received data.
*
- * \return: The return value of the underlying call to \a recv_bin_buffer().
+ * \return The return value of the underlying call to \a recv_bin_buffer().
*
* \sa recv_bin_buffer()
*/
}
/**
- * 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;
}
/**
* \param buf the buffer to be sent
*
* \return On success, this call returns the number of characters sent. On
- * error, \p -E_SENDMSG ist returned.
+ * error, \p -E_SENDMSG is returned.
*
* \sa okir's Black Hats Manual
* \sa sendmsg(2)