#include "internal.h" #include "endpoint.h" struct sockaddr_in EndpointIPv4_toSockaddr(EndpointIPv4 end){ struct sockaddr_in saddr = {0}; saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = end.address.UintBigEndian; /* transforms port number to big endian (network order) */ saddr.sin_port = htons(end.port); return saddr; } EndpointIPv4 EndpointIPv4_fromSockaddr(struct sockaddr_in saddr){ EndpointIPv4 end; end.address = AddressIPv4_fromU32(saddr.sin_addr.s_addr); /* transforms port number to little endian (normal order) */ end.port = ntohs(saddr.sin_port); return end; } Result(void) AddressIPv4_parse(cstr s, AddressIPv4* addr){ *addr = AddressIPv4_INVALID; u32 a, b, c, d; if(sscanf(s, "%u.%u.%u.%u", &a, &b, &c, &d) != 4){ return RESULT_ERROR_FMT("can't parse as AddressIPv4: '%s'", s); } *addr = AddressIPv4_fromBytes(a, b, c, d); return RESULT_VOID; } Result(void) EndpointIPv4_parse(cstr s, EndpointIPv4* end){ *end = EndpointIPv4_INVALID; u32 a, b, c, d, p; if(sscanf(s, "%u.%u.%u.%u:%u", &a, &b, &c, &d, &p) != 5){ return RESULT_ERROR_FMT("can't parse as EndpointIPv4: '%s'", s); } *end = EndpointIPv4_create(AddressIPv4_fromBytes(a, b, c, d), p); return RESULT_VOID; } str AddressIPv4_toStr(AddressIPv4 addr){ char* data = malloc(16); memset(data, 0, 16); sprintf(data, "%u.%u.%u.%u", addr.bytes[0], addr.bytes[1], addr.bytes[2], addr.bytes[3]); return str_from_cstr(data); } str EndpointIPv4_toStr(EndpointIPv4 end){ char* data = malloc(24); memset(data, 0, 24); sprintf(data, "%u.%u.%u.%u:%u", end.address.bytes[0], end.address.bytes[1], end.address.bytes[2], end.address.bytes[3], end.port); return str_from_cstr(data); }