/** \file net.c Networking-related helper functions. */
+/*
+ * Since glibc 2.8, the _GNU_SOURCE feature test macro must be defined in order
+ * to obtain the definition of the ucred structure.
+ */
+#define _GNU_SOURCE
+
#include <netdb.h>
/* At least NetBSD needs these. */
return host_and_port((struct sockaddr *)&ss, sslen);
}
+/**
+ * Look up the local side of a connected socket structure.
+ *
+ * \param sockfd The file descriptor of the socket.
+ *
+ * \return A pointer to a static buffer containing hostname an port. This
+ * buffer must not be freed by the caller.
+ *
+ * \sa remote_name().
+ */
char *local_name(int sockfd)
{
return __get_sock_name(sockfd, getsockname);
}
+/**
+ * Look up the remote side of a connected socket structure.
+ *
+ * \param sockfd The file descriptor of the socket.
+ *
+ * \return Analogous to the return value of \ref local_name() but for the
+ * remote side.
+ *
+ * \sa local_name().
+ */
char *remote_name(int sockfd)
{
return __get_sock_name(sockfd, getpeername);
struct in_addr ia = {.s_addr = 0};
if (ss->ss_family == AF_INET)
- ia.s_addr = ((struct sockaddr_in *)ss)->sin_addr.s_addr;
+ ia.s_addr = ((struct sockaddr_in *)ss)->sin_addr.s_addr;
if (ss->ss_family == AF_INET6) {
const struct in6_addr v6_addr = ((struct sockaddr_in6 *)ss)->sin6_addr;
* \param len The length of \a buf.
*
* Check if encryption is available. If yes, encrypt the given buffer. Send
- * out the buffer, encrypted or not, and try to resend the remaing part in case
- * of short writes.
+ * out the buffer, encrypted or not, and try to resend the remaining part in
+ * case of short writes.
*
* \return Standard.
*/
*/
ssize_t send_cred_buffer(int sock, char *buf)
{
- char control[sizeof(struct cmsghdr) + 10];
+ char control[sizeof(struct cmsghdr) + sizeof(struct ucred)];
struct msghdr msg;
struct cmsghdr *cmsg;
static struct iovec iov;