diff options
Diffstat (limited to 'sockaddr_functions.c')
-rw-r--r-- | sockaddr_functions.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/sockaddr_functions.c b/sockaddr_functions.c new file mode 100644 index 0000000..6148414 --- /dev/null +++ b/sockaddr_functions.c @@ -0,0 +1,68 @@ +#include <stdint.h> +#include <string.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> + + +extern const uint8_t milter_api_address_type_ipv4; +extern const uint8_t milter_api_address_type_ipv6; +extern const uint8_t milter_api_address_type_unknown; + + +uint8_t milter_api_address_type(struct sockaddr const* const endpoint) { + if(endpoint->sa_family == AF_INET) { + return milter_api_address_type_ipv4; + } else if(endpoint->sa_family == AF_INET6) { + return milter_api_address_type_ipv6; + } else { + return milter_api_address_type_unknown; + } +} + + +void milter_api_ipv4_address(struct sockaddr_in const* const endpoint, // in + uint8_t* const buffer) // out +{ + memcpy(buffer, &endpoint->sin_addr, 4); +} + + +void milter_api_ipv6_address(struct sockaddr_in6 const* const endpoint, // in + uint8_t* const buffer) // out +{ + memcpy(buffer, &endpoint->sin6_addr, 16); +} + + +void milter_api_address_string(struct sockaddr const* const endpoint, // in + char* const buffer, // out + const uint8_t size) // in +{ + char const* result = NULL; + + if(endpoint->sa_family == AF_INET) { + result = inet_ntop(endpoint->sa_family, + &((struct sockaddr_in const*)endpoint)->sin_addr, + buffer, size); + } else if(endpoint->sa_family == AF_INET6) { + result = inet_ntop(endpoint->sa_family, + &((struct sockaddr_in6 const*)endpoint)->sin6_addr, + buffer, size); + } + if(result == NULL) { + strncpy(buffer, "(error in address conversion)", size); + buffer[size - 1] = '\0'; + } +} + + +uint16_t milter_api_port(struct sockaddr const* const endpoint) { + if(endpoint->sa_family == AF_INET) { + return ntohs(((struct sockaddr_in const*)endpoint)->sin_port); + } else if(endpoint->sa_family == AF_INET6) { + return ntohs(((struct sockaddr_in6 const*)endpoint)->sin6_port); + } else { + return 0; + } +} |