ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
ip.h File Reference

🌍 IP Address Parsing and Formatting Utilities More...

Go to the source code of this file.

Functions

int is_valid_ipv4 (const char *ip)
 Check if a string is a valid IPv4 address.
int is_valid_ipv6 (const char *ip)
 Check if a string is a valid IPv6 address.
int parse_ipv6_address (const char *input, char *output, size_t output_size)
 Parse IPv6 address, removing brackets if present.
int parse_ip_with_port (const char *input, char *ip_output, size_t ip_output_size, uint16_t *port_output)
 Parse IP address and port from string.
int parse_address_with_optional_port (const char *input, char *address_output, size_t address_output_size, uint16_t *port_output, uint16_t default_port)
 Parse address with optional port from string.
asciichat_error_t format_ip_address (int family, const struct sockaddr *addr, char *output, size_t output_size)
 Format IP address from socket address structure.
asciichat_error_t parse_numeric_socket_address (const char *host, uint16_t port, struct sockaddr_storage *address, socklen_t *length)
asciichat_error_t format_ip_with_port (const char *ip, uint16_t port, char *output, size_t output_size)
 Format IP address with port number.
int get_ip_version (const char *ip)
 Get IP address version.
int is_valid_ip (const char *ip)
 Check if string is a valid IP address (IPv4 or IPv6).
int ip_equals (const char *ip1, const char *ip2)
 Compare two IP addresses for equality.
int ip_compare (const char *ip1, const char *ip2)
 Compare two IP addresses for sorting.
int compare_ip_port_strings (const char *ip_port1, const char *ip_port2)
 Compare two "IP:port" strings with IPv6 normalization.
int parse_cidr (const char *cidr, char *ip_out, size_t ip_out_size, int *prefix_out)
 Parse CIDR notation into IP and prefix length.
int ip_in_cidr (const char *ip, const char *cidr)
 Check if IP address is within CIDR range.
int ip_in_cidr_parsed (const char *ip, const char *network, int prefix_len)
 Check if IP is within CIDR range (parsed form).
asciichat_error_t ipv4_to_ipv6_mapped (const char *ipv4, char *ipv6_out, size_t out_size)
 Convert IPv4 address to IPv6-mapped format.
asciichat_error_t extract_ipv4_from_mapped_ipv6 (const char *ipv6, char *ipv4_out, size_t out_size)
 Extract IPv4 address from IPv6-mapped format.
int is_ipv4_mapped_ipv6 (const char *ipv6)
 Check if IPv6 address is IPv4-mapped.
asciichat_error_t canonicalize_ipv6 (const char *ipv6, char *canonical_out, size_t out_size)
 Canonicalize IPv6 address to standard form.
asciichat_error_t expand_ipv6 (const char *ipv6, char *expanded_out, size_t out_size)
 Expand IPv6 address to full form.
asciichat_error_t compact_ipv6 (const char *ipv6, char *compact_out, size_t out_size)
 Compress IPv6 address using :: notation.
int is_anycast_ipv6 (const char *ipv6)
 Check if IPv6 address is anycast.
int is_lan_ipv4 (const char *ip)
 Check if IPv4 address is a private/LAN address.
int is_lan_ipv6 (const char *ip)
 Check if IPv6 address is a private/LAN address.
int is_broadcast_ipv4 (const char *ip)
 Check if IPv4 address is a broadcast address.
int is_broadcast_ipv6 (const char *ip)
 Check if IPv6 address is a multicast address.
int is_localhost_ipv4 (const char *ip)
 Check if IPv4 address is localhost.
int is_localhost_ipv6 (const char *ip)
 Check if IPv6 address is localhost.
int is_link_local_ipv4 (const char *ip)
 Check if IPv4 address is a link-local address.
int is_link_local_ipv6 (const char *ip)
 Check if IPv6 address is a link-local address.
int is_internet_ipv4 (const char *ip)
 Check if IPv4 address is a public internet address.
int is_internet_ipv6 (const char *ip)
 Check if IPv6 address is a public internet address.
int extract_ip_from_address (const char *addr_with_port, char *ip_out, size_t ip_out_size)
 Extract IP address (without port) from formatted address string.
const char * get_ip_type_string (const char *ip)
 Get human-readable string describing IP address type.

Detailed Description

🌍 IP Address Parsing and Formatting Utilities

Definition in file ip.h.

Function Documentation

◆ parse_numeric_socket_address()

asciichat_error_t parse_numeric_socket_address ( const char * host,
uint16_t port,
struct sockaddr_storage * address,
socklen_t * length )

Convert an unbracketed numeric IPv4 or IPv6 address and port to a socket address.

Definition at line 154 of file ip.c.

155 {
156 if (!host || !*host || !address || !length)
157 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid numeric socket address");
158 struct sockaddr_in ipv4 = {.sin_family = AF_INET, .sin_port = htons(port)};
159 struct sockaddr_in6 ipv6 = {.sin6_family = AF_INET6, .sin6_port = htons(port)};
160 memset(address, 0, sizeof(*address));
161 if (inet_pton(AF_INET, host, &ipv4.sin_addr) == 1) {
162 memcpy(address, &ipv4, sizeof(ipv4));
163 *length = sizeof(ipv4);
164 return ASCIICHAT_OK;
165 }
166 if (inet_pton(AF_INET6, host, &ipv6.sin6_addr) == 1) {
167 memcpy(address, &ipv6, sizeof(ipv6));
168 *length = sizeof(ipv6);
169 return ASCIICHAT_OK;
170 }
171 *length = 0;
172 return SET_ERRNO(ERROR_INVALID_PARAM, "Expected a numeric IPv4 or IPv6 address");
173}
#define SET_ERRNO(code,...)
@ ASCIICHAT_OK
Definition error_codes.h:46
@ ERROR_INVALID_PARAM

References ASCIICHAT_OK, ERROR_INVALID_PARAM, and SET_ERRNO.

Referenced by api_server_main(), and session_quic_listeners_open().