X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=net.c;h=7207e528f8c1dd781858d88d8d1761782494c99f;hp=2a3fc72be0ad446fa101dcbd9459107fb49f50dd;hb=b2e6a24448a9e49e0766ab4f32163580eeff469e;hpb=0f1d8e4e182a48d366f06633b797a5dfbbfea407 diff --git a/net.c b/net.c index 2a3fc72b..7207e528 100644 --- a/net.c +++ b/net.c @@ -6,6 +6,12 @@ /** \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 /* At least NetBSD needs these. */ @@ -428,11 +434,31 @@ static char *__get_sock_name(int fd, int (*getname)(int, struct sockaddr*, 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); @@ -450,7 +476,7 @@ struct in_addr extract_v4_addr(const struct sockaddr_storage *ss) 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; @@ -468,8 +494,8 @@ struct in_addr extract_v4_addr(const struct sockaddr_storage *ss) * \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. */ @@ -736,7 +762,7 @@ int recv_cred_buffer(int fd, char *buf, size_t size) */ 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;