@@ -32,16 +32,22 @@ # include #endif #ifdef OF_HAVE_NETINET_TCP_H # include #endif +#ifdef OF_HAVE_NETIPX_IPX_H +# include +#endif #include "platform.h" #ifdef OF_WINDOWS # include # include +# ifdef OF_HAVE_IPX +# include +# endif #endif /*! @file */ #ifdef OF_WII @@ -87,10 +93,12 @@ OF_SOCKET_ADDRESS_FAMILY_UNKNOWN, /** IPv4 */ OF_SOCKET_ADDRESS_FAMILY_IPV4, /** IPv6 */ OF_SOCKET_ADDRESS_FAMILY_IPV6, + /** IPX */ + OF_SOCKET_ADDRESS_FAMILY_IPX, /** Any address family */ OF_SOCKET_ADDRESS_FAMILY_ANY = 255 } of_socket_address_family_t; #ifndef OF_HAVE_IPV6 @@ -102,10 +110,28 @@ 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 /*! * @struct of_socket_address_t socket.h ObjFW/socket.h * * @brief A struct which represents a host / port pair for a socket. @@ -121,10 +147,11 @@ of_socket_address_family_t family; union { struct sockaddr sockaddr; struct sockaddr_in in; struct sockaddr_in6 in6; + struct sockaddr_ipx ipx; } sockaddr; socklen_t length; }; typedef struct of_socket_address_t of_socket_address_t; @@ -149,21 +176,29 @@ * @return The parsed IPv4 and port as an of_socket_address_t */ extern of_socket_address_t of_socket_address_parse_ipv4( OFString *IP, uint16_t port); -#ifdef OF_HAVE_IPV6 /*! * @brief Parses the specified IPv6 and port into an of_socket_address_t. * * @param IP The IPv6 to parse * @param port The port to use * @return The parsed IPv6 and port as an of_socket_address_t */ extern of_socket_address_t of_socket_address_parse_ipv6( OFString *IP, uint16_t port); -#endif + +/*! + * @brief Creates an IPX address for the specified network, node 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 + */ +extern of_socket_address_t of_socket_address_ipx(uint32_t network, + const unsigned char node[_Nonnull IPX_NODE_LEN], uint16_t port); /*! * @brief Compares two of_socket_address_t for equality. * * @param address1 The address to compare with the second address @@ -212,10 +247,22 @@ * @return The port of the address */ extern uint16_t of_socket_address_get_port( const of_socket_address_t *_Nonnull address); +/*! + * @brief Gets the IPX network, node and port from an IPX address. + * + * @param address The address on which to get the IPX network, node and port + * @param network The IPX network + * @param node A buffer to store the node + * @param port The IPX port (sometimes called socket number) on the node + */ +extern void of_socket_address_ipx_get( + const of_socket_address_t *_Nonnull address, uint32_t *_Nonnull network, + unsigned char node[_Nonnull IPX_NODE_LEN], uint16_t *_Nonnull port); + extern bool of_socket_init(void); #if defined(OF_HAVE_THREADS) && defined(OF_AMIGAOS) extern void of_socket_deinit(void); #endif extern int of_socket_errno(void);