Merge pull request #515 from msekletar/icmp-socket-leak
[mtr.git] / packet / sockaddr.c
blob892d7ee29735654fc60a23f50a7475f4c994b526
1 #include <stddef.h>
2 #include <sys/socket.h>
3 #include <netinet/in.h>
4 #include <arpa/inet.h>
6 void *sockaddr_addr_offset(const void *x)
8 if ( x == NULL )
9 return NULL;
11 if ( ((struct sockaddr *)(x))->sa_family == AF_INET )
13 return ((void *)(x) + offsetof(struct sockaddr_in, sin_addr));
14 } else
15 if ( ((struct sockaddr *)(x))->sa_family == AF_INET6 )
17 return ((void *)(x) + offsetof(struct sockaddr_in6, sin6_addr));
20 return NULL;
23 unsigned int sockaddr_addr_size(const void *x)
25 if ( x == NULL )
26 return 0;
27 if ( ((struct sockaddr *)(x))->sa_family == AF_INET )
29 return sizeof(struct in_addr);
30 } else
31 if ( ((struct sockaddr *)(x))->sa_family == AF_INET6 )
33 return sizeof(struct in6_addr);
35 return 0;
39 unsigned int sockaddr_size(const void *x)
41 if ( x == NULL )
42 return 0;
43 if ( ((struct sockaddr *)(x))->sa_family == AF_INET )
45 return sizeof(struct sockaddr_in);
46 } else
47 if ( ((struct sockaddr *)(x))->sa_family == AF_INET6 )
49 return sizeof(struct sockaddr_in6);
51 return 0;
54 in_port_t *sockaddr_port_offset(const void *x)
56 if ( x == NULL )
57 return NULL;
59 if ( ((struct sockaddr *)(x))->sa_family == AF_INET )
61 return ((void *)(x) + offsetof(struct sockaddr_in, sin_port));
62 } else
63 if ( ((struct sockaddr *)(x))->sa_family == AF_INET6 )
65 return ((void *)(x) + offsetof(struct sockaddr_in6, sin6_port));
68 return NULL;