inet.h
3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*
* Copyright (C) 2013-15 Freie Universität Berlin
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @addtogroup posix_sockets
* @{
*/
/**
* @file
* @brief Definitions for internet operations
* @see <a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/arpa_inet.h.html">
* The Open Group Base Specifications Issue 7, <arpa/inet.h>
* </a>
*
* @author Martine Lenders <mlenders@inf.fu-berlin.de>
*/
#ifndef ARPA_INET_H
#define ARPA_INET_H
#include <errno.h>
#include <inttypes.h>
#include <stdio.h>
#include "byteorder.h"
#include "net/af.h"
#include "net/ipv4/addr.h"
#include "net/ipv6/addr.h"
#include "sys/bytes.h"
#include "netinet/in.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Size in byte of an IPv4 address
*/
#ifndef INADDRSZ
#define INADDRSZ (sizeof(ipv4_addr_t))
#endif
/**
* @brief Size in byte of an IPv6 address
*/
#ifndef IN6ADDRSZ
#define IN6ADDRSZ (sizeof(ipv6_addr_t))
#endif
/**
* @brief Converts an IP address to its string representation
*
* @pre (af == AF_INET) || (af == AF_INET6)
*
* @param[in] af Address family of @p src. Must be @ref AF_INET or @ref AF_INET6.
* @param[in] src An IP address.
* @param[out] dst The resulting string representation.
* @param[in] size Length of @p result.
*
* @return @p dst, on success
* @return NULL, if @p size was smaller than needed
* @return NULL, if @p src or @p dst was NULL
*/
static inline const char *inet_ntop(int af, const void *restrict src, char *restrict dst,
socklen_t size)
{
switch (af) {
#ifdef MODULE_IPV4_ADDR
case AF_INET:
if (ipv4_addr_to_str(dst, src, (size_t)size) == NULL) {
errno = ENOSPC;
return NULL;
}
break;
#endif
#ifdef MODULE_IPV6_ADDR
case AF_INET6:
if (ipv6_addr_to_str(dst, src, (size_t)size) == NULL) {
errno = ENOSPC;
return NULL;
}
break;
#endif
default:
(void)src;
(void)dst;
(void)size;
errno = EAFNOSUPPORT;
return NULL;
}
return dst;
}
/**
* @brief Converts an IP address string representation to a byte-represented
* IP address
*
* @pre (af == AF_INET) || (af == AF_INET6)
*
* @param[in] af Address family of @p src. Must be @ref AF_INET or @ref AF_INET6.
* @param[in] src An IP address string representation
* @param[out] dst The resulting byte representation
*
* @return 1, on success.
* @return 0, if @p src was malformed or input pointers were NULL.
* @return -1, if @p af is not supported.
*/
static inline int inet_pton(int af, const char *src, void *dst)
{
switch (af) {
#ifdef MODULE_IPV4_ADDR
case AF_INET:
if (ipv4_addr_from_str(dst, src) == NULL) {
return 0;
}
break;
#endif
#ifdef MODULE_IPV6_ADDR
case AF_INET6:
if (ipv6_addr_from_str(dst, src) == NULL) {
return 0;
}
break;
#endif
default:
(void)src;
(void)dst;
errno = EAFNOSUPPORT;
return -1;
}
return 1;
}
#ifdef __cplusplus
}
#endif
/**
* @}
*/
#endif /* ARPA_INET_H */