#include #include #include #include #include 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; } }