tcp-chat/src/client/requests/ErrorMessage.c

44 lines
1.1 KiB
C

#include "requests.h"
Result(void) recvStr(EncryptedSocketTCP* sock, u32 size, str* out_s){
Deferral(4);
str s = str_construct(malloc(size + 1), size, true);
bool success = false;
Defer(if(!success) free(s.data));
// receive message content
try_void(
EncryptedSocketTCP_recv(
sock,
str_castTo_Array_u8(s),
SocketRecvFlag_WholeBuffer
)
);
s.data[s.len] = 0;
*out_s = s;
success = true;
Return RESULT_VOID;
}
Result(void) recvErrorMessage(EncryptedSocketTCP* sock, PacketHeader* res_header,
str* out_err_msg)
{
Deferral(4);
ErrorMessage res;
try_void(PacketHeader_validateContentSize(res_header, sizeof(res)));
try_void(EncryptedSocketTCP_recvStruct(sock, &res));
// limit msg_size to fit in single EncryptedSocketTCP_recv call
// TODO: receive ErrorMessage content in a loop
if(res.msg_size > sock->recv_buf.len)
res.msg_size = sock->recv_buf.len;
str err_msg;
try_void(recvStr(sock, res.msg_size, &err_msg));
*out_err_msg = err_msg;
Return RESULT_VOID;
}