60 lines
1.8 KiB
C
Executable File
60 lines
1.8 KiB
C
Executable File
#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);
|
|
}
|