added flags to socket_recv
This commit is contained in:
@@ -12,7 +12,7 @@ Result(void) EncryptedSocket_send(EncryptedSocket* ptr,
|
||||
Array(u8) decrypted_buf, Array(u8) encrypted_buf)
|
||||
{
|
||||
Deferral(4);
|
||||
EncryptorAES_encrypt(&ptr->enc, decrypted_buf, encrypted_buf);
|
||||
try_void(EncryptorAES_encrypt(&ptr->enc, decrypted_buf, encrypted_buf));
|
||||
try_void(socket_send(ptr->sock, encrypted_buf));
|
||||
Return RESULT_VOID;
|
||||
}
|
||||
@@ -22,28 +22,29 @@ Result(void) EncryptedSocket_sendto(EncryptedSocket* ptr,
|
||||
EndpointIPv4 remote_end)
|
||||
{
|
||||
Deferral(4);
|
||||
EncryptorAES_encrypt(&ptr->enc, decrypted_buf, encrypted_buf);
|
||||
try_void(EncryptorAES_encrypt(&ptr->enc, decrypted_buf, encrypted_buf));
|
||||
try_void(socket_sendto(ptr->sock, encrypted_buf, remote_end));
|
||||
Return RESULT_VOID;
|
||||
}
|
||||
|
||||
Result(i32) EncryptedSocket_recv(EncryptedSocket* ptr,
|
||||
Array(u8) encrypted_buf, Array(u8) decrypted_buf)
|
||||
Array(u8) encrypted_buf, Array(u8) decrypted_buf,
|
||||
SocketRecvFlag flags)
|
||||
{
|
||||
Deferral(4);
|
||||
try(i32 r, i, socket_recv(ptr->sock, encrypted_buf));
|
||||
try(i32 r, i, socket_recv(ptr->sock, encrypted_buf, flags));
|
||||
encrypted_buf.size = r;
|
||||
DecryptorAES_decrypt(&ptr->dec, encrypted_buf, decrypted_buf, (u32*)&r);
|
||||
try_void(DecryptorAES_decrypt(&ptr->dec, encrypted_buf, decrypted_buf, (u32*)&r));
|
||||
Return RESULT_VALUE(i, r);
|
||||
}
|
||||
|
||||
Result(i32) EncryptedSocket_recvfrom(EncryptedSocket* ptr,
|
||||
Array(u8) encrypted_buf, Array(u8) decrypted_buf,
|
||||
NULLABLE(EndpointIPv4*) remote_end)
|
||||
SocketRecvFlag flags, NULLABLE(EndpointIPv4*) remote_end)
|
||||
{
|
||||
Deferral(4);
|
||||
try(i32 r, i, socket_recvfrom(ptr->sock, encrypted_buf, remote_end));
|
||||
try(i32 r, i, socket_recvfrom(ptr->sock, encrypted_buf, flags, remote_end));
|
||||
encrypted_buf.size = r;
|
||||
DecryptorAES_decrypt(&ptr->dec, encrypted_buf, decrypted_buf, (u32*)&r);
|
||||
try_void(DecryptorAES_decrypt(&ptr->dec, encrypted_buf, decrypted_buf, (u32*)&r));
|
||||
Return RESULT_VALUE(i, r);
|
||||
}
|
||||
|
||||
@@ -18,8 +18,10 @@ Result(void) EncryptedSocket_sendto(EncryptedSocket* ptr,
|
||||
EndpointIPv4 remote_end);
|
||||
|
||||
Result(i32) EncryptedSocket_recv(EncryptedSocket* ptr,
|
||||
Array(u8) encrypted_buf, Array(u8) decrypted_buf);
|
||||
Array(u8) encrypted_buf, Array(u8) decrypted_buf,
|
||||
SocketRecvFlag flags);
|
||||
|
||||
Result(i32) EncryptedSocket_recvfrom(EncryptedSocket* ptr,
|
||||
Array(u8) encrypted_buf, Array(u8) decrypted_buf,
|
||||
SocketRecvFlag flags,
|
||||
NULLABLE(EndpointIPv4*) remote_end);
|
||||
|
||||
@@ -74,17 +74,26 @@ Result(void) socket_sendto(Socket s, Array(u8) buffer, EndpointIPv4 dst){
|
||||
return RESULT_VOID;
|
||||
}
|
||||
|
||||
Result(i32) socket_recv(Socket s, Array(u8) buffer){
|
||||
i32 r = recv(s, buffer.data, buffer.size, 0);
|
||||
static inline int SocketRecvFlags_toStd(SocketRecvFlag flags){
|
||||
int f = 0;
|
||||
if (flags & SocketRecvFlag_Peek)
|
||||
f |= MSG_PEEK;
|
||||
if (flags & SocketRecvFlag_WaitAll)
|
||||
f |= MSG_WAITALL;
|
||||
return f;
|
||||
}
|
||||
|
||||
Result(i32) socket_recv(Socket s, Array(u8) buffer, SocketRecvFlag flags){
|
||||
i32 r = recv(s, buffer.data, buffer.size, SocketRecvFlags_toStd(flags));
|
||||
if(r < 0)
|
||||
return RESULT_ERROR_SOCKET();
|
||||
return RESULT_VALUE(i, r);
|
||||
}
|
||||
|
||||
Result(i32) socket_recvfrom(Socket s, Array(u8) buffer, NULLABLE(EndpointIPv4*) remote_end){
|
||||
Result(i32) socket_recvfrom(Socket s, Array(u8) buffer, SocketRecvFlag flags, NULLABLE(EndpointIPv4*) remote_end){
|
||||
struct sockaddr_in remote_addr = {0};
|
||||
i32 sockaddr_size = sizeof(remote_addr);
|
||||
i32 r = recvfrom(s, buffer.data, buffer.size, 0,
|
||||
i32 r = recvfrom(s, buffer.data, buffer.size, SocketRecvFlags_toStd(flags),
|
||||
(struct sockaddr*)&remote_addr, (void*)&sockaddr_size);
|
||||
if(r < 0)
|
||||
return RESULT_ERROR_SOCKET();
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "endpoint.h"
|
||||
#include "tlibc/errors.h"
|
||||
#include "tlibc/collections/Array.h"
|
||||
#include "tlibc/time.h"
|
||||
|
||||
typedef enum SocketShutdownType {
|
||||
SocketShutdownType_Receive = 0,
|
||||
@@ -9,6 +10,12 @@ typedef enum SocketShutdownType {
|
||||
SocketShutdownType_Both = 2,
|
||||
} SocketShutdownType;
|
||||
|
||||
typedef enum SocketRecvFlag {
|
||||
SocketRecvFlag_None = 0,
|
||||
SocketRecvFlag_Peek = 0b1 /* next recv call will read the same data */,
|
||||
SocketRecvFlag_WaitAll = 0b10 /* waits until buffer is full */,
|
||||
} SocketRecvFlag;
|
||||
|
||||
typedef i64 Socket;
|
||||
|
||||
Result(Socket) socket_open_TCP();
|
||||
@@ -20,5 +27,5 @@ Result(Socket) socket_accept(Socket s, NULLABLE(EndpointIPv4*) remote_end);
|
||||
Result(void) socket_connect(Socket s, EndpointIPv4 remote_end);
|
||||
Result(void) socket_send(Socket s, Array(u8) buffer);
|
||||
Result(void) socket_sendto(Socket s, Array(u8) buffer, EndpointIPv4 dst);
|
||||
Result(i32) socket_recv(Socket s, Array(u8) buffer);
|
||||
Result(i32) socket_recvfrom(Socket s, Array(u8) buffer, NULLABLE(EndpointIPv4*) remote_end);
|
||||
Result(i32) socket_recv(Socket s, Array(u8) buffer, SocketRecvFlag flags);
|
||||
Result(i32) socket_recvfrom(Socket s, Array(u8) buffer, SocketRecvFlag flags, NULLABLE(EndpointIPv4*) remote_end);
|
||||
|
||||
Reference in New Issue
Block a user