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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
|
typedef enum {
/** An unknown address family. */
OFSocketAddressFamilyUnknown,
/** IPv4 */
OFSocketAddressFamilyIPv4,
/** IPv6 */
OFSocketAddressFamilyIPv6,
/** IPX */
OFSocketAddressFamilyIPX,
/** UNIX */
OFSocketAddressFamilyUNIX,
/** Any address family */
OFSocketAddressFamilyAny = 255
} OFSocketAddressFamily;
#ifndef OF_HAVE_IPV6
struct sockaddr_in6 {
sa_family_t sin6_family;
in_port_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr {
uint8_t s6_addr[16];
} sin6_addr;
uint32_t sin6_scope_id;
};
#endif
#ifndef OF_HAVE_IPX
# define IPX_NODE_LEN 6
struct sockaddr_ipx {
sa_family_t sipx_family;
uint32_t sipx_network;
unsigned char sipx_node[IPX_NODE_LEN];
uint16_t sipx_port;
uint8_t sipx_type;
};
#endif
#ifdef OF_WINDOWS
# define IPX_NODE_LEN 6
# define sipx_family sa_family
# define sipx_network sa_netnum
# define sipx_node sa_nodenum
# define sipx_port sa_socket
#endif
#if !defined(OF_HAVE_UNIX_SOCKETS) && !defined(OF_MORPHOS) && !defined(OF_MINT)
struct sockaddr_un {
sa_family_t sun_family;
char sun_path[108];
};
#endif
/**
* @struct OFSocketAddress OFSocket.h ObjFW/OFSocket.h
*
* @brief A struct which represents a host / port pair for a socket.
*/
typedef struct OF_BOXABLE {
/*
* Even though struct sockaddr contains the family, we need to use our
* own family, as we need to support storing an IPv6 address on systems
* that don't support IPv6. These may not have AF_INET6 defined and we
* can't just define it, as the value is system-dependent and might
* clash with an existing value.
*/
OFSocketAddressFamily family;
union {
struct sockaddr sockaddr;
struct sockaddr_in in;
struct sockaddr_in6 in6;
struct sockaddr_ipx ipx;
struct sockaddr_un un;
} sockaddr;
socklen_t length;
} OFSocketAddress;
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Parses the specified IP (either v4 or v6) and port into an
* @ref OFSocketAddress.
*
* @param IP The IP to parse
* @param port The port to use
* @return The parsed IP and port as an OFSocketAddress
*/
extern OFSocketAddress OFSocketAddressParseIP(OFString *IP, uint16_t port);
/**
* @brief Parses the specified IPv4 and port into an @ref OFSocketAddress.
*
* @param IP The IPv4 to parse
* @param port The port to use
* @return The parsed IPv4 and port as an OFSocketAddress
*/
extern OFSocketAddress OFSocketAddressParseIPv4(OFString *IP, uint16_t port);
/**
* @brief Parses the specified IPv6 and port into an @ref OFSocketAddress.
*
* @param IP The IPv6 to parse
* @param port The port to use
* @return The parsed IPv6 and port as an OFSocketAddress
*/
extern OFSocketAddress OFSocketAddressParseIPv6(OFString *IP, uint16_t port);
/**
* @brief Creates an IPX address for the specified node, network and port.
*
* @param node The node in the IPX network
* @param network The IPX network
* @param port The IPX port (sometimes called socket number) on the node
* @return An IPX socket address with the specified node, network and port.
*/
extern OFSocketAddress OFSocketAddressMakeIPX(
const unsigned char node[_Nonnull IPX_NODE_LEN], uint32_t network,
uint16_t port);
/**
* @brief Creates a UNIX socket address from the specified path.
*
* @param path The path of the UNIX socket
* @return A UNIX socket address with the specified path
*/
extern OFSocketAddress OFSocketAddressMakeUNIX(OFString *path);
/**
* @brief Compares two OFSocketAddress for equality.
*
* @param address1 The address to compare with the second address
* @param address2 The second address
* @return Whether the two addresses are equal
*/
|
|
|
|
|
>
>
>
>
>
>
>
<
<
<
<
<
<
<
>
|
<
<
<
|
<
<
|
|
>
>
>
<
<
<
<
<
<
<
<
<
<
<
<
>
>
>
>
>
>
>
>
>
>
>
|
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
|
typedef enum {
/** An unknown address family. */
OFSocketAddressFamilyUnknown,
/** IPv4 */
OFSocketAddressFamilyIPv4,
/** IPv6 */
OFSocketAddressFamilyIPv6,
/** UNIX */
OFSocketAddressFamilyUNIX,
/** IPX */
OFSocketAddressFamilyIPX,
/** Any address family */
OFSocketAddressFamilyAny = 255
} OFSocketAddressFamily;
#ifndef OF_HAVE_IPV6
struct sockaddr_in6 {
sa_family_t sin6_family;
in_port_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr {
uint8_t s6_addr[16];
} sin6_addr;
uint32_t sin6_scope_id;
};
#endif
#if !defined(OF_HAVE_UNIX_SOCKETS) && !defined(OF_MORPHOS) && !defined(OF_MINT)
struct sockaddr_un {
sa_family_t sun_family;
char sun_path[108];
};
#endif
#ifndef OF_HAVE_IPX
# define IPX_NODE_LEN 6
struct sockaddr_ipx {
sa_family_t sipx_family;
uint32_t sipx_network;
unsigned char sipx_node[IPX_NODE_LEN];
uint16_t sipx_port;
uint8_t sipx_type;
};
#endif
#ifdef OF_WINDOWS
# define IPX_NODE_LEN 6
# define sipx_family sa_family
# define sipx_network sa_netnum
# define sipx_node sa_nodenum
# define sipx_port sa_socket
#endif
/**
* @struct OFSocketAddress OFSocket.h ObjFW/OFSocket.h
*
* @brief A struct which represents a host / port pair for a socket.
*/
typedef struct OF_BOXABLE {
OFSocketAddressFamily family;
/*
* We can't use struct sockaddr as it can contain variable length
* arrays.
*/
union {
struct sockaddr_in in;
struct sockaddr_in6 in6;
struct sockaddr_un un;
struct sockaddr_ipx ipx;
} sockaddr;
socklen_t length;
} OFSocketAddress;
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Parses the specified IP (either v4 or v6) and port into an
* @ref OFSocketAddress.
*
* @param IP The IP to parse
* @param port The port to use
* @return The parsed IP and port as an OFSocketAddress
* @throw OFInvalidFormatException The specified string is not a valid IP
*/
extern OFSocketAddress OFSocketAddressParseIP(OFString *IP, uint16_t port);
/**
* @brief Parses the specified IPv4 and port into an @ref OFSocketAddress.
*
* @param IP The IPv4 to parse
* @param port The port to use
* @return The parsed IPv4 and port as an OFSocketAddress
* @throw OFInvalidFormatException The specified string is not a valid IPv4
*/
extern OFSocketAddress OFSocketAddressParseIPv4(OFString *IP, uint16_t port);
/**
* @brief Parses the specified IPv6 and port into an @ref OFSocketAddress.
*
* @param IP The IPv6 to parse
* @param port The port to use
* @return The parsed IPv6 and port as an OFSocketAddress
* @throw OFInvalidFormatException The specified string is not a valid IPv6
*/
extern OFSocketAddress OFSocketAddressParseIPv6(OFString *IP, uint16_t port);
/**
* @brief Creates a UNIX socket address from the specified path.
*
* @param path The path of the UNIX socket
* @return A UNIX socket address with the specified path
*/
extern OFSocketAddress OFSocketAddressMakeUNIX(OFString *path);
/**
* @brief Creates an IPX address for the specified node, network and port.
*
* @param network The IPX network
* @param node The node in the IPX network
* @param port The IPX port (sometimes called socket number) on the node
* @return An IPX socket address with the specified node, network and port.
*/
extern OFSocketAddress OFSocketAddressMakeIPX(uint32_t network,
const unsigned char node[_Nonnull IPX_NODE_LEN], uint16_t port);
/**
* @brief Compares two OFSocketAddress for equality.
*
* @param address1 The address to compare with the second address
* @param address2 The second address
* @return Whether the two addresses are equal
*/
|
262
263
264
265
266
267
268
269
270
271
272
273
274
275
|
* the address family used.
*
* @param address The address on which to get the port
* @return The port of the address
*/
extern uint16_t OFSocketAddressPort(const OFSocketAddress *_Nonnull address);
/**
* @brief Sets the IPX network of the specified @ref OFSocketAddress.
*
* @param address The address on which to set the IPX network
* @param network The IPX network to set on the address
*/
extern void OFSocketAddressSetIPXNetwork(OFSocketAddress *_Nonnull address,
|
>
>
>
>
>
>
>
>
>
|
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
|
* the address family used.
*
* @param address The address on which to get the port
* @return The port of the address
*/
extern uint16_t OFSocketAddressPort(const OFSocketAddress *_Nonnull address);
/**
* @brief Gets the UNIX socket path of the specified @ref OFSocketAddress.
*
* @param address The address on which to get the UNIX socket path
* @return The UNIX socket path
*/
extern OFString *_Nullable OFSocketAddressUNIXPath(
const OFSocketAddress *_Nonnull address);
/**
* @brief Sets the IPX network of the specified @ref OFSocketAddress.
*
* @param address The address on which to set the IPX network
* @param network The IPX network to set on the address
*/
extern void OFSocketAddressSetIPXNetwork(OFSocketAddress *_Nonnull address,
|
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
|
*
* @param address The address on which to get the IPX node
* @param node A byte array to store the IPX node of the address
*/
extern void OFSocketAddressIPXNode(const OFSocketAddress *_Nonnull address,
unsigned char node[_Nonnull IPX_NODE_LEN]);
/**
* @brief Gets the UNIX socket path of the specified @ref OFSocketAddress.
*
* @param address The address on which to get the UNIX socket path
* @return The UNIX socket path
*/
extern OFString *_Nullable OFSocketAddressUNIXPath(
const OFSocketAddress *_Nonnull address);
extern bool OFSocketInit(void);
#if defined(OF_HAVE_THREADS) && defined(OF_AMIGAOS) && !defined(OF_MORPHOS)
extern void OFSocketDeinit(void);
#endif
extern int OFSocketErrNo(void);
#if !defined(OF_WII) && !defined(OF_NINTENDO_3DS)
extern int OFGetSockName(OFSocketHandle sock, struct sockaddr *restrict addr,
|
<
<
<
<
<
<
<
<
<
|
305
306
307
308
309
310
311
312
313
314
315
316
317
318
|
*
* @param address The address on which to get the IPX node
* @param node A byte array to store the IPX node of the address
*/
extern void OFSocketAddressIPXNode(const OFSocketAddress *_Nonnull address,
unsigned char node[_Nonnull IPX_NODE_LEN]);
extern bool OFSocketInit(void);
#if defined(OF_HAVE_THREADS) && defined(OF_AMIGAOS) && !defined(OF_MORPHOS)
extern void OFSocketDeinit(void);
#endif
extern int OFSocketErrNo(void);
#if !defined(OF_WII) && !defined(OF_NINTENDO_3DS)
extern int OFGetSockName(OFSocketHandle sock, struct sockaddr *restrict addr,
|