chiark / gitweb /
check responses are in right phase for article; implement notice_processed
[innduct.git] / lib / sockaddr.c
1 /*  $Id: sockaddr.c 5381 2002-03-31 22:35:47Z rra $
2 **
3 **  Routines for manipulating sockaddr structs
4 */
5
6 #include "config.h"
7 #include "clibrary.h"
8 #include "portable/socket.h"
9 #include <netdb.h>
10
11 #include "libinn.h"
12
13 char *sprint_sockaddr(const struct sockaddr *sa)
14 {
15 #ifdef HAVE_INET6
16     static char buff[256];
17     const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *) sa;
18
19     *buff = '\0';
20     if (sa->sa_family == AF_INET6 && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
21         struct sockaddr_in sin;
22         memcpy(&sin.sin_addr, sin6->sin6_addr.s6_addr + 12,
23                 sizeof sin.sin_addr);
24         sin.sin_port = sin6->sin6_port;
25         sin.sin_family = AF_INET;
26 #ifdef HAVE_SOCKADDR_LEN
27         sin.sin_len = sizeof(struct sockaddr_in);
28 #endif
29         return inet_ntoa(sin.sin_addr);
30     }
31     getnameinfo(sa, SA_LEN(sa), buff, sizeof buff, NULL, 0, NI_NUMERICHOST);
32
33     return buff;
34 #else
35     return inet_ntoa(((const struct sockaddr_in *)sa)->sin_addr);
36 #endif
37 }
38
39 void make_sin(struct sockaddr_in *s, const struct in_addr *src)
40 {
41     memset(s, 0, sizeof( struct sockaddr_in ));
42     s->sin_family = AF_INET;
43 #ifdef HAVE_SOCKADDR_LEN
44     s->sin_len = sizeof( struct sockaddr_in );
45 #endif
46     s->sin_addr = *src;
47 }