#include "pcpp.h" int FUN_00459d00(amtime_t* t1, amtime_t* t2) { if (t1 == NULL || t2 == NULL) return -1; return ((t2->seconds - t1->seconds) * 1000000 - t1->microseconds) + t2->microseconds; // Swapped } // TODO: Invert these conditions to be clearer int pcpp_isValidChar(char chr) { if (!isalnum(chr) && chr != '.' && chr != '_' && chr != '-' && chr != ':' && chr != '@' && chr != '%' && chr != '/' && chr != '\\' && chr != '#' && chr != '{' && chr != '}') { return 0; } return 1; } e_pcpp_t _pcppGetErrorFromPcpt(int err) { switch (err) { case e_pcpt_ok: return e_pcpp_ok; case e_pcpt_to: return e_pcpp_to; case e_pcpt_closed: return e_pcpp_closed; case e_pcpt_no_client: return e_pcpp_no_client; case e_pcpt_wsa_noinit: return e_pcpp_wsa_noinit; case e_pcpt_recv_unset: return e_pcpp_recv_unset; case e_pcpt_NO_IDEA_WHAT_THIS_IS: return (e_pcpp_t)-7; case e_pcpt_inval_addr: return e_pcpp_inval_addr; case -11: case e_pcpt_wsa2_generic: case e_pcpt_nobufs: case e_pcpt_cannot_open: return e_pcpp_cannot_open; case -7: case e_pcpt_pointer_unset: case e_pcpt_already_connected: return e_pcpp_param_invalid; case -6: case e_pcpt_not_open: return e_pcpp_not_open; case -5: case e_pcpt_already_open: return e_pcpp_already_open; default: return e_pcpp_unknown; } } bool pcppCheckPrompt(pcpp_t* stream) { if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return false; } uint max = stream->read_bytes_num; bool found = false; for (uint cursor = 0; cursor < max; cursor++) { unsigned char* pos = stream->read_bytes_buf + cursor; if (stream->read_bytes_buf[cursor] == '>') { if (cursor < stream->read_bytes_num) { do { *pos = pos[1]; pos++; } while (pos + (-204 - (int)stream) < (unsigned char*)stream->read_bytes_num); } stream->read_bytes_num--; stream->read_bytes_size++; found = true; } } return found; } e_pcpt_t pcppCheckRecvMsg(unsigned char* recv_data, size_t buf_len, int param_3) { bool bVar1 = true; int local_8 = 0; if (recv_data == NULL) { PCP_LOG("pointer error\n"); return e_pcpp_param_invalid; } while (1) { local_8 = buf_len - local_8; uint recv_err = pcppRecvCheck(recv_data, &local_8); if (recv_err == 1) return e_pcpp_param_invalid; if (recv_err == 8) { if (!bVar1) return e_pcpp_param_invalid; if (param_3 != 0) return e_pcpp_param_invalid; } else { if (recv_err == 7 && !bVar1) return e_pcpp_param_invalid; } recv_data += local_8; local_8++; bVar1 = false; if (recv_err == 0 || recv_err == 6 || recv_err == 7 || recv_err == 8) { return e_pcpp_ok; } } } uint pcppCheckStr(unsigned char* recv_data, uint* found_at, int* find_failed) { bool end = false; bool bVar2 = false; uint idx = 0; if (recv_data == NULL || find_failed == NULL || found_at == NULL) { PCP_LOG("pointer error\n"); return 0; } *find_failed = 0; if (*found_at == 0) return 0; do { char chr = recv_data[idx]; if (PCP_WHITESPACE(chr)) { if (bVar2) end = true; } else { if (!pcpp_isValidChar(chr)) { if (recv_data[idx] != PCP_CHAR_UNKNOWN) { *found_at = idx + 1; switch (recv_data[idx]) { case PCP_CHAR_SEP: return 5; case PCP_CHAR_CR: if (recv_data[idx + 1] != '\n') return 3; *found_at = idx + 2; return 4; case PCP_CHAR_LF: return 2; case PCP_CHAR_EQU: return 1; default: return 0; } } if (bVar2 || end) { *found_at = idx + 1; return 0; } *find_failed = 1; } else { if (end || *find_failed != 0) { *found_at = idx + 1; return 0; } bVar2 = true; } } idx++; if (*found_at <= idx) return 0; } while (true); } void pcppClose(pcpp_t* stream) { if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return; } pcptClose(&stream->sock); pcptClose(&stream->data_sock); stream->field_0xb8 = 0; stream->last_active = 0; stream->state = 0; stream->err = e_pcpp_unknown; stream->recv_data_buffer = NULL; memset(stream->read_bytes_buf, 0, sizeof stream->read_bytes_buf); stream->read_bytes_size = sizeof stream->read_bytes_buf; stream->read_bytes_num = 0; stream->resp_buffer = NULL; stream->resp_buffer_len = 0; ZERO(stream->send_buf); stream->send_buf_len = PCP_SEND_BUF_MAX; stream->field_0x1e8 = 0; stream->send_binary_buf = NULL; stream->field_0x1f0 = 0; stream->recv_binary_buf = NULL; stream->field_0x1f8 = 0; stream->recv_binary_buf_len = 0; stream->field_0x1fc = 0; stream->open = 0; stream->field_0x214 = 0; } void pcppCloseBinary(pcpp_t* stream) { if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return; } pcptCloseDataSock(&stream->data_sock); stream->read_bytes_size = sizeof stream->read_bytes_buf; stream->read_bytes_num = 0; memset(stream->read_bytes_buf, 0, sizeof stream->read_bytes_buf); stream->resp_buffer = NULL; stream->resp_buffer_len = 0; amtime_t time; amiTimerGet(&time); stream->last_active = _amTimeMs(time); stream->state = 0; } e_pcpp_t pcppGetBlockingTime(uint param_1, timeout_t timeout, pcpp_t* stream, int param_4, uint* blocking_time) { byte bVar1; uint uVar2; uint uVar3; amtime_t local_8; if (stream == NULL || blocking_time == NULL) { PCP_LOG("pointer error\n"); return 0; } amiTimerGet(&local_8); uVar2 = (local_8.seconds * 1000 - stream->last_active) + local_8.microseconds / 1000; // swapped if (param_1 <= uVar2) { *blocking_time = 0; return 1; } if ((timeout == TIMEOUT_NONE) || (param_1 - uVar2 < (uint)timeout)) { bVar1 = 1; uVar2 = param_1 - uVar2; } else { bVar1 = 0; uVar2 = timeout; } uVar3 = (local_8.seconds * 1000 - param_4) + local_8.microseconds / 1000; // Swapped if (timeout != TIMEOUT_NONE) { if ((uint)timeout <= uVar3) { *blocking_time = 0; return 0; } uVar3 = timeout - uVar3; if (uVar3 < uVar2) { *blocking_time = uVar3; return 0; } } *blocking_time = uVar2; return (uint)bVar1; } char* pcppGetCommand(pcp_parse_data_t* recv_data, char* command) { if (recv_data == NULL || command == NULL) { PCP_LOG("error Recv Data isn\'t set\n"); return NULL; } for (uint cmd = 0; cmd < recv_data->cmd_count; cmd++) { if (!strcmp(recv_data->strings + recv_data->keywords[cmd], command)) { if (recv_data->values[cmd] == 0) return NULL; return recv_data->strings + recv_data->values[cmd]; } } return NULL; } char* pcppGetKeyword(pcp_parse_data_t* recvData, uint keywordNum) { if (recvData == NULL) { PCP_LOG("error Recv Data isn\'t set\n"); return NULL; } if ((keywordNum >= PCP_CMDS_MAX) && (keywordNum > recvData->cmd_count)) { PCP_LOG("error keywordNum over\n"); return NULL; } return recvData->strings + recvData->keywords[keywordNum]; } SOCKET pcppGetServerSocket(pcpp_t* stream, int which) { if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return SOCKET_INVAL; } switch (which) { case 0: return (stream->sock).server_sock; case 1: return (stream->data_sock).server_sock; default: return SOCKET_INVAL; } } e_pcpp_t pcppInitStream(pcpp_t* stream) { if (stream == NULL) { PCP_LOG("error don\'t set stream\n"); return e_pcpp_param_invalid; } e_pcpt_t err = pcptInitStream(&stream->sock); if (err != e_pcpt_ok) return _errT2P(err); err = pcptInitStream(&stream->data_sock); if (err != e_pcpt_ok) return _errT2P(err); pcptSetConfig(&stream->data_sock, PCPT_TCP_NODELAY, 1); stream->field_0xb8 = 0; stream->last_active = 0; stream->state = 0; stream->err = e_pcpp_unknown; stream->recv_data_buffer = NULL; ZERO(stream->read_bytes_buf); // memset(stream->read_bytes_buf, 0, sizeof stream->read_bytes_buf); stream->read_bytes_size = sizeof stream->read_bytes_buf; stream->read_bytes_num = 0; stream->resp_buffer = NULL; stream->resp_buffer_len = 0; ZERO(stream->send_buf); stream->field_0x1e8 = 0; stream->send_binary_buf = NULL; stream->field_0x1f0 = 0; stream->recv_binary_buf = NULL; stream->field_0x1f8 = 0; stream->recv_binary_buf_len = 0; stream->field_0x1fc = 0; stream->open = 0; stream->field_0x214 = 0; stream->field_0x20c = 10000; stream->field_0x208 = 10000; stream->send_buf_len = PCP_SEND_BUF_MAX; stream->field_0x204 = 1000; stream->field_0x210 = 60000; return e_pcpp_ok; } e_pcpp_t pcppOpenBinaryServer(pcpp_t* stream, int open_mode, ushort port) { if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return e_pcpp_param_invalid; } amtime_t time; amiTimerGet(&time); stream->last_active = _amTimeMs(time); stream->state = 0; if (open_mode != 0 && open_mode != 1) { PCP_LOG("error Open Mode isn\'t set\n"); stream->state = 0; return stream->err = e_pcpp_param_invalid; } e_pcpp_t err = _errT2P(pcptOpenServer(&stream->data_sock, open_mode, port)); stream->err = err; if (err != e_pcpp_ok) { PCP_LOG("error pcptOpenBinaryServer\n"); return err; } amiTimerGet(&time); stream->last_active = _amTimeMs(time); return e_pcpp_ok; } e_pcpp_t pcppOpenServer(pcpp_t* stream, int open_mode, u_short port, undefined4 param_4) { if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return e_pcpp_param_invalid; } stream->field_0xb8 = param_4; if (open_mode != 0 && open_mode != 1) { PCP_LOG("error Open Mode isn\'t set\n"); stream->err = e_pcpp_param_invalid; stream->state = 0; return e_pcpp_param_invalid; } e_pcpp_t err = _errT2P(pcptOpenServer(&stream->sock, open_mode, port)); stream->err = err; if (err != e_pcpp_ok) { PCP_LOG("error pcppOpenServer error = %d\n", err); return err; } stream->open = 1; amtime_t time; amiTimerGet(&time); stream->last_active = _amTimeMs(time); return e_pcpp_ok; } pcp_send_data_t* pcppSetSendPacket(pcp_send_data_t* send_data, char* keyword, char* value) { if (send_data == NULL || keyword == NULL) { PCP_LOG("error Send Data isn\'t set\n"); return NULL; } memset(send_data->data, 0, sizeof *send_data->data); send_data->length = 0; size_t kwLen = strlen(keyword); if (value == NULL) { if (kwLen + 2 < PCP_BUF_MAX) { sprintf_s((char*)send_data->data, PCP_BUF_MAX, "%s\r\n", keyword); send_data->length = kwLen & 0xff; return send_data; } } else { size_t valLen = strlen(value); if (kwLen + 3 + valLen < PCP_BUF_MAX) { sprintf_s((char*)send_data->data, PCP_BUF_MAX, "%s=%s\r\n", keyword, value); send_data->length = kwLen + 1 + valLen; return send_data; } } return NULL; } uint pcppRecvCheck(unsigned char* buf, int* found_at) { uint uVar1; uint uVar3; int find_failed; uint found_at_; int local_4; uVar3 = 0; find_failed = 0; if (buf == NULL || found_at == NULL) { PCP_LOG("pointer error\n"); return 1; } local_4 = *found_at; *found_at = 0; for (int uVar2 = 0; uVar2 < 2; uVar2++) { found_at_ = local_4 - uVar3; uVar1 = pcppCheckStr(&buf[uVar3], &found_at_, &find_failed); *found_at = *found_at + found_at_; switch (uVar1) { case 0: return 1; case 1: if (uVar2) return 1; uVar3 = found_at_; if (find_failed) return 1; break; case 2: case 3: case 4: if (uVar2) return find_failed ? 7 : 0; return find_failed ? 8 : 6; case 5: if (uVar2) return find_failed ? 4 : 2; return find_failed ? 5 : 3; } } return 1; } e_pcpp_t pcppSendResponseTable(pcpp_t* stream, pcp_send_data_t* data, timeout_t timeout_ms) { if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return e_pcpp_param_invalid; } if (data == NULL) { PCP_LOG("error Response buffer isn\'t set\n"); return e_pcpp_param_invalid; } return pcppSendResponse(stream, data, data->length + 2, timeout_ms); } e_pcpp_t pcppSendResponse(pcpp_t* stream, pcp_send_data_t* resp_buffer, size_t buf_len, timeout_t timeout_ms) { e_pcpp_t err; amtime_t time; if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return e_pcpp_param_invalid; } if (resp_buffer == NULL) { PCP_LOG("error Response buffer isn\'t set\n"); return e_pcpp_param_invalid; } if (buf_len > PCP_BUF_MAX - 1) { return stream->err = e_pcpp_param_invalid; } amiTimerGet(&time); stream->err = err = pcppCheckRecvMsg(resp_buffer->data, buf_len, 0); if (err != e_pcpp_ok) { stream->state = 0; pcppResetRead(stream); PCP_LOG("error Send message format error\n"); return stream->err; } stream->resp_buffer = resp_buffer; stream->resp_buffer_len = buf_len; stream->state = 6; err = pcpp_something(&time, timeout_ms, stream, &stream->sock, resp_buffer->data, &stream->resp_buffer_len, stream->field_0x204, stream->field_0x210, -6); stream->err = err; if (err != e_pcpp_to) { stream->state = 0; if (err != e_pcpp_ok) { pcptCloseDataSock(&stream->sock); pcppResetRead(stream); } } amiTimerGet(&time); stream->last_active = _amTimeMs(time); return stream->err; } void pcppResetRead(pcpp_t* stream) { stream->read_bytes_size = PCP_BUF_MAX; stream->read_bytes_num = 0; ZERO_BUF(stream->read_bytes_buf); stream->resp_buffer = NULL; stream->resp_buffer_len = 0; } e_pcpp_t pcppRecvRequest(pcpp_t* stream, pcp_parse_data_t* recv_data, timeout_t timeout) { e_pcpp_t err; uint timeout_ms = timeout; undefined4 uVar1; amtime_t now; amtime_t start; amtime_t now2; if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return e_pcpp_param_invalid; } if (recv_data == NULL) { PCP_LOG("error Request buffer isn\'t set\n"); return stream->err = e_pcpp_param_invalid; } if ((stream->sock).open == PCPT_LISTENING) { uVar1 = stream->field_0x210; } else { uVar1 = stream->field_0xb8; } stream->recv_data_buffer = recv_data; amiTimerGet(&start); stream->state = 2; err = pcppSendPrompt(stream, uVar1, timeout_ms); stream->err = err; if (err != e_pcpp_to) { stream->state = 0; } if (err == e_pcpp_ok) { stream->open = 0; amiTimerGet(&now); stream->last_active = _amTimeMs(now); stream->state = 5; if (timeout_ms != TIMEOUT_NONE) { uint elapsed = _amTimeDelta(now, start); if (elapsed < timeout_ms) { timeout_ms = timeout_ms - elapsed; } else { timeout_ms = 0; } } bool bReRecv; err = pcppRecvRequestMain(stream, &bReRecv, timeout_ms); stream->err = err; if (err == e_pcpp_to) { if (bReRecv) { stream->state = 14; return e_pcpp_to; } } else { stream->state = 0; if (err == e_pcpp_ok) { amiTimerGet(&now2); stream->last_active = _amTimeMs(now2); } } err = stream->err; } return err; } e_pcpp_t pcppRecvRequestMain(pcpp_t* stream, bool* bReRecv, undefined4 param_3) { unsigned char* recv_data; if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return e_pcpp_param_invalid; } stream->field_0x214 = 0; e_pcpp_t err = pcppRecvAllMsg(param_3, stream, bReRecv); if (err != e_pcpp_ok) return err; recv_data = stream->read_bytes_buf; if (pcppCheckRecvMsg(recv_data, stream->read_bytes_num, 1) != e_pcpp_ok) { pcppResetRead(stream); return -9; } uint local_4 = 0; pcppChangeRequest(stream, &local_4); if (local_4 < stream->read_bytes_num) memcpy(recv_data + local_4, recv_data, stream->read_bytes_num); stream->read_bytes_num -= local_4; stream->read_bytes_size += local_4; stream->read_bytes_buf[stream->read_bytes_num] = '\0'; return e_pcpp_ok; } e_pcpp_t pcppSendPrompt(pcpp_t* stream, uint param_2, timeout_t timeout_ms) { amtime_t now; bool has_timeout = false; if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return e_pcpp_param_invalid; } amiTimerGet(&now); uint since_open = _amTimeMs(now) - stream->last_active; if (since_open > param_2) { timeout_ms = 0; } else { if ((timeout_ms != -1) && ((uint)timeout_ms <= param_2 - since_open)) goto LAB_00456133; timeout_ms = param_2 - since_open; } has_timeout = true; LAB_00456133: size_t* send_len = &stream->send_buf_len; stream->send_buf[0] = '>'; *send_len = 1; if ((stream->sock).open == PCPT_LISTENING) stream->open = 1; e_pcpp_t err = _errT2P(pcptSend(&stream->sock, stream->send_buf, send_len, stream->field_0x204, timeout_ms)); if (has_timeout && err == e_pcpp_to) { err = stream->open ? -12 : -6; pcptCloseDataSock(&stream->sock); pcppResetRead(stream); if (stream->open == 0) PCP_LOG("Error : Time out error\n"); } amiTimerGet(&now); stream->last_active = _amTimeMs(now); return err; } e_pcpp_t pcppRecvAllMsg(uint param_1, pcpp_t* stream, bool* bReRecv) { uint* recv_buf_len; int iVar1; e_pcpt_t err; e_pcpp_t eVar2; undefined4 uVar3; uint local_14; amtime_t local_10; amtime_t local_8; local_14 = param_1; if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return e_pcpp_param_invalid; } if (bReRecv == NULL) { PCP_LOG("error bReRecv isn\'t set\n"); return e_pcpp_param_invalid; } *bReRecv = false; amiTimerGet(&local_10); if (stream->read_bytes_num != 0) { for (size_t i = 0; i < stream->read_bytes_num; i++) { if (stream->read_bytes_buf[i] == '\r' || stream->read_bytes_buf[i] == '\n') { stream->field_0x214 = 0; return e_pcpp_ok; } } } uVar3 = stream->field_0x214 == 0 ? stream->field_0xb8 : stream->field_0x204; iVar1 = pcppGetBlockingTime(uVar3, param_1, stream, _amTimeMs(local_10), &local_14); recv_buf_len = &stream->read_bytes_size; *recv_buf_len = PCP_BUF_MAX - stream->read_bytes_num; err = pcptRecv(&stream->sock, (stream->read_bytes_buf + stream->read_bytes_num), recv_buf_len, local_14); eVar2 = _errT2P(err); if (eVar2 == e_pcpp_to) { if (iVar1 == 0) { return e_pcpp_to; } eVar2 = e_pcpp_timeout_closed - (uint)(stream->field_0x214 != 0); pcptCloseDataSock(&stream->sock); *recv_buf_len = PCP_BUF_MAX; stream->read_bytes_num = 0; ZERO_BUF(stream->read_bytes_buf); stream->resp_buffer = NULL; stream->resp_buffer_len = 0; } if (eVar2 != e_pcpp_ok) { return eVar2; } stream->read_bytes_num = stream->read_bytes_num + *recv_buf_len; *recv_buf_len = PCP_BUF_MAX - stream->read_bytes_num; amiTimerGet(&local_8); stream->last_active = _amTimeMs(local_8); stream->field_0x214 = 1; *bReRecv = true; if (stream->read_bytes_num != 0) { for (size_t i = 0; i < stream->read_bytes_num; i++) { if (stream->read_bytes_buf[i] == '\r' || stream->read_bytes_buf[i] == '\n') { *bReRecv = false; stream->field_0x214 = 0; return e_pcpp_ok; } } } return e_pcpp_to; } pcp_parse_data_t* pcppChangeRequest(pcpp_t* stream, uint* lenout) { byte bVar5 = 0; byte bVar6 = 0; if (stream == NULL || lenout == NULL) { PCP_LOG("pointer error\n"); return NULL; } if (stream->recv_data_buffer == NULL) { PCP_LOG("don\'t set recvData buffer\n"); return NULL; } if (stream->read_bytes_num > PCP_BUF_MAX) { PCP_LOG("Buffer size error\n"); return NULL; } ZERO_BUF(stream->recv_data_buffer->strings); ZERO_BUF(stream->recv_data_buffer->keywords); ZERO_BUF(stream->recv_data_buffer->values); stream->recv_data_buffer->keywords[0] = 0; stream->recv_data_buffer->cmd_count = 1; if (stream->read_bytes_num == 0) { *lenout = 1; return stream->recv_data_buffer; } bool comment = false; size_t i; for (i = 0; i < stream->read_bytes_num; i++) { char chr = stream->read_bytes_buf[i]; if (chr == PCP_CHAR_CR || chr == PCP_CHAR_LF) { stream->recv_data_buffer->strings[++bVar6] = PCP_CHAR_EOF; if (i + 1 < stream->read_bytes_num && stream->read_bytes_buf[i] == PCP_CHAR_CR && stream->read_bytes_buf[i + 1] == PCP_CHAR_LF) i++; *lenout = i + 1; return stream->recv_data_buffer; } if (comment) { if (chr == PCP_CHAR_HASH) comment = false; continue; } switch (chr) { case PCP_CHAR_UNKNOWN: stream->recv_data_buffer->strings[bVar6++] = PCP_CHAR_UNKNOWN; break; case PCP_CHAR_SEP: if (stream->recv_data_buffer->cmd_count > PCP_CMDS_MAX) { PCP_LOG("Buffer size error\n"); return NULL; } stream->recv_data_buffer->strings[++bVar6] = PCP_CHAR_EOF; stream->recv_data_buffer->keywords[stream->recv_data_buffer->cmd_count] = bVar6++; stream->recv_data_buffer->cmd_count++; bVar5 = bVar6; break; case PCP_CHAR_EQU: if (stream->recv_data_buffer->cmd_count > PCP_CMDS_MAX) { PCP_LOG("Buffer size error\n"); return NULL; } stream->recv_data_buffer->strings[++bVar6] = PCP_CHAR_EOF; stream->recv_data_buffer->keywords[stream->recv_data_buffer->cmd_count + PCP_CMDS_MAX - 1] = bVar6++; bVar5 = bVar6; break; case PCP_CHAR_HASH: comment = true; break; default: bVar6 = bVar5; if (pcpp_isValidChar(chr)) { stream->recv_data_buffer->strings[bVar5++] = stream->read_bytes_buf[i]; } } } *lenout = i + 1; return stream->recv_data_buffer; } int pcppRecvPrompt(pcpp_t* stream, undefined4 param_2, int param_3) { uint* recv_buf_len; int iVar1; uint local_c = param_3; if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return e_pcpp_param_invalid; } e_pcpp_t err; amtime_t start; amiTimerGet(&start); while (true) { if (pcppCheckPrompt(stream)) { amiTimerGet(&start); stream->last_active = _amTimeMs(start); return e_pcpp_ok; } iVar1 = pcppGetBlockingTime(param_2, param_3, stream, _amTimeMs(start), &local_c); recv_buf_len = &stream->read_bytes_size; err = _errT2P(pcptRecv(&stream->sock, stream->read_bytes_buf + stream->read_bytes_num, recv_buf_len, local_c)); if (err == e_pcpp_to) break; if (err != e_pcpp_ok) { return err; } stream->read_bytes_num = stream->read_bytes_num + *recv_buf_len; uint uVar3 = PCP_BUF_MAX - stream->read_bytes_num; *recv_buf_len = uVar3; if (uVar3 != 0) { stream->read_bytes_buf[stream->read_bytes_num] = '\0'; } } if (iVar1 != 0) { err = stream->open ? e_pcpp_timeout_open : e_pcpp_timeout_closed; pcptCloseDataSock(&stream->sock); pcppResetRead(stream); return err; } return err; } e_pcpp_t pcppSendRequestMain(pcpp_t* stream, undefined4 param_2, timeout_t timeout_ms) { if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return e_pcpp_param_invalid; } if (stream->resp_buffer == NULL) { PCP_LOG("error Request buffer isn\'t set\n"); return e_pcpp_param_invalid; } amtime_t now; amiTimerGet(&now); e_pcpp_t eVar1 = pcpp_something(&now, timeout_ms, stream, (pcpt_t*)stream, stream->resp_buffer->data, &stream->resp_buffer_len, stream->field_0x204, param_2, stream->open ? e_pcpp_timeout_open : e_pcpp_timeout_closed); if (eVar1 != e_pcpp_to && eVar1 != e_pcpp_ok) { pcptCloseDataSock(&stream->sock); pcppResetRead(stream); } amiTimerGet(&now); stream->last_active = _amTimeMs(now); return eVar1; } // TODO: MINIMAL CLEANUP DONE HERE e_pcpp_t pcppRecvBinary(pcpp_t* stream, unsigned char* recv_buf, size_t buf_len, uint param_4) { size_t* psVar1; unsigned char** send_buf; int iVar2; e_pcpt_t eVar3; e_pcpp_t eVar4; undefined4 uVar5; bool bVar6; uint recvb_local; amtime_t now; amtime_t local_10; amtime_t local_8; recvb_local = param_4; if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return e_pcpp_param_invalid; } if (recv_buf == NULL) { PCP_LOG("error Recv Bninary Buffer isn\'t set\n"); return e_pcpp_param_invalid; } stream->field_0x214 = 0; amiTimerGet(&now); psVar1 = &stream->field_0x1f8; stream->recv_binary_buf = recv_buf; *psVar1 = buf_len; stream->recv_binary_buf_len = buf_len; stream->field_0x1fc = 0; stream->state = 11; memset(recv_buf, 0, buf_len); do { bVar6 = (stream->data_sock).open != PCPT_LISTENING; if (bVar6) { uVar5 = stream->field_0x208; } else { amiTimerGet(&local_8); uVar5 = stream->field_0x210; stream->last_active = _amTimeMs(local_8); ; } iVar2 = pcppGetBlockingTime(uVar5, param_4, stream, _amTimeMs(now), &recvb_local); stream->field_0x214 = 1; eVar3 = pcptRecv(&stream->data_sock, stream->recv_binary_buf + stream->field_0x1fc, psVar1, recvb_local); eVar4 = _errT2P(eVar3); stream->err = eVar4; if ((eVar4 == e_pcpp_to) && (iVar2 != 0)) { stream->err = bVar6 ? -13 : -11; pcptCloseDataSock(&stream->sock); stream->read_bytes_size = PCP_BUF_MAX; stream->read_bytes_num = 0; memset(stream->read_bytes_buf, 0, PCP_BUF_MAX); stream->resp_buffer = NULL; stream->resp_buffer_len = 0; } eVar4 = stream->err; if (eVar4 == e_pcpp_to) { LAB_00455e91: if (eVar4 != e_pcpp_ok) { return eVar4; } } else { if (eVar4 != e_pcpp_ok) { stream->state = 0; goto LAB_00455e91; } } stream->field_0x1fc = stream->field_0x1fc + *psVar1; *psVar1 = stream->recv_binary_buf_len - stream->field_0x1fc; stream->field_0x214 = 0; amiTimerGet(&local_10); stream->last_active = _amTimeMs(local_10); if (stream->recv_binary_buf_len < stream->field_0x1fc || stream->recv_binary_buf_len == stream->field_0x1fc) { send_buf = (unsigned char**)&stream->send_buf; psVar1 = &stream->send_buf_len; stream->state = 12; *send_buf[0] = PCP_CHAR_BINACK; *psVar1 = 1; iVar2 = pcppGetBlockingTime(stream->field_0x20c, param_4, stream, _amTimeMs(now), &recvb_local); eVar3 = pcptSend(&stream->sock, *send_buf, psVar1, stream->field_0x208, recvb_local); eVar4 = _errT2P(eVar3); stream->err = eVar4; if ((eVar4 == e_pcpp_to) && (iVar2 != 0)) { stream->err = -14; pcptCloseDataSock(&stream->sock); pcppResetRead(stream); } eVar4 = stream->err; if (eVar4 != e_pcpp_to) { stream->state = 0; } if (eVar4 == e_pcpp_ok) { amiTimerGet(&local_10); stream->last_active = _amTimeMs(local_10); stream->state = 13; iVar2 = pcppGetBlockingTime(stream->field_0x208, param_4, stream, _amTimeMs(now), &recvb_local); *psVar1 = PCP_SEND_BUF_MAX; ZERO(stream->send_buf); eVar3 = pcptRecv(&stream->data_sock, *send_buf, psVar1, recvb_local); eVar4 = _errT2P(eVar3); stream->err = eVar4; if ((iVar2 != 0) && (eVar4 == e_pcpp_to)) { stream->err = -13; } if (stream->err != e_pcpp_to) { stream->state = 0; } if (stream->err == e_pcpp_closed) { stream->err = e_pcpp_ok; } eVar4 = stream->err; } return eVar4; } } while (true); } e_pcpp_t pcppSendBinary(pcpp_t* stream, unsigned char* send_binary_buffer, size_t param_3, uint param_4) { size_t* psVar1; uint pVar2; e_pcpp_t eVar3; int iVar4; e_pcpt_t eVar5; uint uVar6; uint local_14; amtime_t local_10; amtime_t local_8; local_14 = param_4; if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return e_pcpp_param_invalid; } if (send_binary_buffer == NULL) { PCP_LOG("error Send Bninary Buffer isn\'t set\n"); return stream->err = e_pcpp_param_invalid; } amiTimerGet(&local_8); pVar2 = (stream->data_sock).open; psVar1 = &stream->field_0x1f0; stream->state = 9; *psVar1 = param_3; stream->send_binary_buf = send_binary_buffer; if (pVar2 == PCPT_LISTENING) { amiTimerGet(&local_10); stream->last_active = _amTimeMs(local_10); eVar3 = pcpp_something(&local_8, param_4, stream, &stream->data_sock, stream->send_binary_buf, psVar1, stream->field_0x208, stream->field_0x210, -11); stream->err = eVar3; } else { eVar5 = pcptSend(&stream->data_sock, send_binary_buffer, psVar1, stream->field_0x208, param_4); eVar3 = _errT2P(eVar5); iVar4 = (stream->data_sock).field_0x54; stream->err = eVar3; if (iVar4 != 0) { amiTimerGet(&local_10); stream->last_active = _amTimeMs(local_10); } } eVar3 = stream->err; if (eVar3 != e_pcpp_to) { stream->state = 0; } if (eVar3 == e_pcpp_ok) { amiTimerGet(&local_10); stream->last_active = _amTimeMs(local_10); stream->state = 10; psVar1 = &stream->send_buf_len; *psVar1 = 8; ZERO(stream->send_buf); stream->field_0x1e8 = 0; iVar4 = pcppGetBlockingTime(stream->field_0x20c, param_4, stream, _amTimeMs(local_8), &local_14); eVar5 = pcptRecv(&stream->sock, stream->send_buf, psVar1, local_14); eVar3 = _errT2P(eVar5); stream->err = eVar3; if ((iVar4 != 0) && (eVar3 == e_pcpp_to)) { stream->err = -14; pcptCloseDataSock(&stream->sock); pcppResetRead(stream); } eVar3 = stream->err; if (eVar3 != e_pcpp_to) { stream->state = 0; } if (eVar3 == e_pcpp_ok) { stream->field_0x1e8 = stream->field_0x1e8 + *psVar1; uVar6 = 0; *psVar1 = 8 - stream->field_0x1e8; stream->state = 0; stream->err = -9; if (stream->field_0x1e8 != 0) { while (*(char*)((int)&stream->send_buf + uVar6) != PCP_CHAR_BINACK) { uVar6 = uVar6 + 1; if (stream->field_0x1e8 <= uVar6) { return stream->err; } } stream->err = e_pcpp_ok; } eVar3 = stream->err; } } return eVar3; } e_pcpp_t pcppIsBusy(pcpp_t* stream, timeout_t timeout) { size_t* psVar1; unsigned char** send_buf; undefined4 uVar2; int iVar3; e_pcpt_t eVar4; int iVar5; uint uVar6; e_pcpp_t eVar7; unsigned char* pcVar8; unsigned char* pcVar9; uint uVar10; uint uVar11; bool bVar12; bool local_24; int local_20; int local_1c; amtime_t local_18; amtime_t local_10; amtime_t local_8; pcpt_t* sock; uVar11 = timeout; bVar12 = false; local_20 = 0; local_1c = 0; local_24 = 0; if (stream == NULL) { PCP_LOG("error PCPP stream isn\'t set\n"); return e_pcpp_param_invalid; } amiTimerGet(&local_18); switch (stream->state) { case 0: stream->err = e_pcpp_no_client; break; case 1: case 8: if (stream->state == 1) { if (stream->open == 0) { uVar2 = stream->field_0x210; } else { uVar2 = stream->field_0xb8; } iVar3 = _amTimeMs(local_18); } else { iVar3 = _amTimeMs(local_18); uVar2 = stream->field_0x210; } iVar3 = pcppGetBlockingTime(uVar2, uVar11, stream, iVar3, &timeout); sock = &stream->sock; if (stream->state != 1) { sock = &stream->data_sock; } eVar4 = pcptIsBusy(sock, timeout); eVar7 = _errT2P(eVar4); stream->err = eVar7; if (eVar7 != e_pcpp_to) { if (eVar7 == e_pcpp_ok) { amiTimerGet(&local_10); stream->last_active = _amTimeMs(local_10); if (stream->state != 8) { if (stream->open != 0) { stream->read_bytes_num = stream->read_bytes_num + stream->read_bytes_size; stream->read_bytes_size = PCP_BUF_MAX - stream->read_bytes_num; iVar3 = pcppCheckPrompt(stream); if (iVar3 != 0) goto LAB_00457676; stream->err = ~e_pcpp_no_client; goto LAB_00457660; } stream->state = 3; if (uVar11 != TIMEOUT_NONE) { amiTimerGet(&local_8); uVar6 = (local_8.microseconds - local_18.microseconds) / 1000 + (local_8.seconds - local_18.seconds) * 1000; if (uVar6 < uVar11) { uVar11 = uVar11 - uVar6; } else { uVar11 = 0; } } stream->open = 1; eVar7 = pcppRecvPrompt(stream, stream->field_0xb8, uVar11); stream->err = eVar7; if (eVar7 != e_pcpp_to) { amiTimerGet(&local_10); stream->state = 0; stream->last_active = _amTimeMs(local_10); return stream->err; } } break; } goto LAB_004577b4; } if (iVar3 == 0) break; if (stream->state == 1) { stream->err = 0xfffffff5 - (uint)(stream->open != 0); } else { stream->err = -11; } goto LAB_00457392; case 2: case 4: case 6: uVar6 = uVar11; if ((stream->sock).field_0x54 != 0) { bVar12 = (stream->sock).open != PCPT_LISTENING; if (bVar12) { uVar2 = stream->field_0xb8; } else { uVar2 = stream->field_0x210; } bVar12 = !bVar12; local_20 = pcppGetBlockingTime(uVar2, uVar11, stream, _amTimeMs(local_18), &timeout); uVar6 = timeout; } eVar4 = pcptIsBusy(&stream->sock, uVar6); eVar7 = _errT2P(eVar4); stream->err = eVar7; if (eVar7 != e_pcpp_to) { if (eVar7 == e_pcpp_ok) { amiTimerGet(&local_10); stream->last_active = _amTimeMs(local_10); if (stream->state != 2) goto LAB_004577b4; stream->open = 0; amiTimerGet(&local_8); stream->state = 5; iVar3 = pcppGetBlockingTime(stream->field_0xb8, uVar11, stream, _amTimeMs(local_18), &timeout); eVar7 = pcppRecvRequestMain(stream, &local_24, timeout); stream->err = eVar7; if ((eVar7 == e_pcpp_to) && (iVar3 != 0)) { stream->err = e_pcpp_timeout_closed; pcptCloseDataSock(&stream->sock); pcppResetRead(stream); } if (stream->err == e_pcpp_to) { if (local_24 != 0) { stream->state = 14; } } else { stream->state = 0; } if (stream->err == e_pcpp_ok) goto LAB_004574b8; break; } goto LAB_004577af; } if (local_20 == 0) break; stream->err = (-(uint)bVar12 & 0xfffffffb) - 6; goto LAB_00457392; case 3: case 5: case 7: if (stream->field_0x214 == 0) { uVar2 = stream->field_0xb8; } else { uVar2 = stream->field_0x204; } iVar3 = pcppGetBlockingTime(uVar2, uVar11, stream, _amTimeMs(local_18), &timeout); uVar6 = timeout; eVar4 = pcptIsBusy(&stream->sock, timeout); eVar7 = _errT2P(eVar4); stream->err = eVar7; if (eVar7 != e_pcpp_to) { if (eVar7 != e_pcpp_ok) { LAB_00457660: stream->state = 0; return stream->err; } stream->read_bytes_num = stream->read_bytes_num + stream->read_bytes_size; stream->field_0x214 = 0; stream->read_bytes_size = PCP_BUF_MAX - stream->read_bytes_num; if (stream->state == 3) { uVar6 = uVar11; if (uVar11 != TIMEOUT_NONE) { amiTimerGet(&local_8); uVar6 = -(uint)((uint)((local_8.microseconds - local_18.microseconds) / 1000 + (local_8.seconds - local_18.seconds) * 1000) < uVar11) & uVar11; } eVar7 = pcppRecvPrompt(stream, stream->field_0xb8, uVar6); stream->err = eVar7; if (eVar7 != e_pcpp_to) { if (eVar7 != e_pcpp_ok) goto LAB_00457660; if (stream->open == 0) { if (uVar11 != TIMEOUT_NONE) { amiTimerGet(&local_8); uVar11 = -(uint)((uint)((local_8.microseconds - local_18.microseconds) / 1000 + (local_8.seconds - local_18.seconds) * 1000) < uVar11) & uVar11; } stream->state = 4; eVar7 = pcppSendRequestMain(stream, stream->field_0xb8, uVar11); stream->err = eVar7; if ((eVar7 != e_pcpp_to) && (eVar7 != e_pcpp_ok)) { stream->state = 0; return eVar7; } } } break; } if (stream->read_bytes_num == 0) { LAB_0045848d: amiTimerGet(&local_8); stream->last_active = _amTimeMs(local_8); uVar10 = _amTimeDelta(local_8, local_18); stream->field_0x214 = 1; if (uVar11 != TIMEOUT_NONE) { if (uVar11 <= uVar10) { stream->state = stream->state == 5 ? 14 : 15; return stream->err = e_pcpp_to; } uVar6 = uVar11 - uVar10; } eVar7 = pcppRecvAllMsg(uVar6, stream, &local_24); stream->err = eVar7; if (eVar7 != e_pcpp_ok) { if (eVar7 == e_pcpp_to) { if (local_24 != 0) { stream->state = stream->state == 5 ? 14 : 15; return e_pcpp_to; } break; } goto LAB_0045739d; } } else { uVar10 = stream->read_bytes_num; pcVar8 = stream->read_bytes_buf; iVar3 = local_1c; do { if ((*pcVar8 == '\r') || (*pcVar8 == '\n')) { iVar3 = 1; } pcVar8 = pcVar8 + 1; uVar10 = uVar10 - 1; } while (uVar10 != 0); if (iVar3 == 0) goto LAB_0045848d; } pcVar8 = stream->read_bytes_buf; eVar7 = pcppCheckRecvMsg(pcVar8, stream->read_bytes_num, (uint)(stream->state == 5)); stream->err = eVar7; if (eVar7 == e_pcpp_ok) { pcppChangeRequest(stream, &timeout); uVar11 = timeout; pcVar9 = pcVar8; if (timeout < stream->read_bytes_num) { do { *pcVar9 = pcVar8[uVar11]; uVar11 = uVar11 + 1; pcVar9 = pcVar9 + 1; } while (uVar11 < stream->read_bytes_num); } LAB_00458226: stream->read_bytes_num = stream->read_bytes_num - timeout; stream->read_bytes_size = stream->read_bytes_size + timeout; stream->state = 0; amiTimerGet(&local_18); stream->last_active = _amTimeMs(local_18); return stream->err; } stream->state = 0; pcppResetRead(stream); PCP_LOG("error Response format error\n"); return stream->err; } if (iVar3 == 0) break; if (stream->field_0x214 == 0) { stream->err = (-(uint)(stream->open != 0) & 0xfffffffa) - 6; } else { stream->err = -7; } LAB_00457392: pcptCloseDataSock(&stream->sock); pcppResetRead(stream); LAB_0045739d: stream->state = 0; return stream->err; case 9: bVar12 = (stream->data_sock).open != PCPT_LISTENING; if (bVar12) { uVar2 = stream->field_0x208; } else { uVar2 = stream->field_0x210; } iVar5 = pcppGetBlockingTime(uVar2, uVar11, stream, _amTimeMs(local_18), &timeout); eVar4 = pcptIsBusy(&stream->data_sock, timeout); eVar7 = _errT2P(eVar4); iVar3 = (stream->data_sock).field_0x54; stream->err = eVar7; if (iVar3 == 0) { if ((iVar5 != 0) && (eVar7 == e_pcpp_to)) { stream->err = (uint)!bVar12 * 2 + -13; pcptCloseDataSock(&stream->sock); pcppResetRead(stream); } } else { amiTimerGet(&local_10); stream->last_active = _amTimeMs(local_10); } if (stream->err != e_pcpp_to) { stream->state = 0; } if (stream->err == e_pcpp_ok) { amiTimerGet(&local_10); stream->last_active = _amTimeMs(local_10); stream->state = 10; psVar1 = &stream->send_buf_len; *psVar1 = PCP_SEND_BUF_MAX; ZERO(stream->send_buf); stream->field_0x1e8 = 0; iVar3 = pcppGetBlockingTime(stream->field_0x20c, uVar11, stream, _amTimeMs(local_18), &timeout); eVar4 = pcptRecv(&stream->sock, stream->send_buf, psVar1, timeout); eVar7 = _errT2P(eVar4); stream->err = eVar7; if ((iVar3 != 0) && (eVar7 == e_pcpp_to)) { stream->err = -14; pcptCloseDataSock(&stream->sock); pcppResetRead(stream); } if (stream->err != e_pcpp_to) { stream->state = 0; } if (stream->err == e_pcpp_ok) { stream->field_0x1e8 = stream->field_0x1e8 + *psVar1; uVar11 = 0; *psVar1 = PCP_SEND_BUF_MAX - stream->field_0x1e8; stream->state = 0; stream->err = -9; if (stream->field_0x1e8 != 0) { do { if (*(char*)((int)&stream->send_buf + uVar11) == PCP_CHAR_BINACK) { stream->err = e_pcpp_ok; break; } uVar11 = uVar11 + 1; } while (uVar11 < stream->field_0x1e8); } amiTimerGet(&local_10); stream->last_active = _amTimeMs(local_10); return stream->err; } } break; case 10: iVar3 = pcppGetBlockingTime(stream->field_0x20c, uVar11, stream, _amTimeMs(local_18), &timeout); eVar4 = pcptIsBusy(&stream->sock, timeout); eVar7 = _errT2P(eVar4); stream->err = eVar7; if ((iVar3 != 0) && (eVar7 == e_pcpp_to)) { stream->err = -14; pcptCloseDataSock(&stream->sock); pcppResetRead(stream); } if (stream->err != e_pcpp_to) { stream->state = 0; } if (stream->err == e_pcpp_ok) { amiTimerGet(&local_10); stream->field_0x1e8 = stream->field_0x1e8 + stream->send_buf_len; stream->last_active = _amTimeMs(local_10); ; uVar11 = 0; stream->send_buf_len = PCP_SEND_BUF_MAX - stream->field_0x1e8; stream->err = -9; if (stream->field_0x1e8 != 0) { while (*(char*)((int)&stream->send_buf + uVar11) != PCP_CHAR_BINACK) { uVar11 = uVar11 + 1; if (stream->field_0x1e8 <= uVar11) { return stream->err; } } LAB_00457676: stream->err = e_pcpp_ok; return e_pcpp_ok; } } break; case 11: if (stream->field_0x214 != 0) { bVar12 = (stream->data_sock).open != PCPT_LISTENING; if (bVar12) { uVar2 = stream->field_0x208; } else { uVar2 = stream->field_0x210; } iVar3 = pcppGetBlockingTime(uVar2, uVar11, stream, _amTimeMs(local_18), &timeout); eVar4 = pcptIsBusy(&stream->data_sock, timeout); eVar7 = _errT2P(eVar4); stream->err = eVar7; if ((eVar7 == e_pcpp_to) && (iVar3 != 0)) { stream->err = (uint)!bVar12 * 2 + -13; pcptCloseDataSock(&stream->sock); pcppResetRead(stream); } eVar7 = stream->err; if (eVar7 == e_pcpp_to) { LAB_00457b2e: if (eVar7 != e_pcpp_ok) { return eVar7; } } else { if (eVar7 != e_pcpp_ok) { stream->field_0x214 = 0; stream->state = 0; goto LAB_00457b2e; } } stream->field_0x1fc = stream->field_0x1fc + stream->field_0x1f8; stream->field_0x214 = 0; stream->field_0x1f8 = stream->recv_binary_buf_len - stream->field_0x1fc; amiTimerGet(&local_10); stream->last_active = _amTimeMs(local_10); } if (stream->field_0x1fc <= stream->recv_binary_buf_len && stream->recv_binary_buf_len != stream->field_0x1fc) { psVar1 = &stream->field_0x1f8; do { iVar3 = pcppGetBlockingTime(stream->field_0x208, uVar11, stream, _amTimeMs(local_18), &timeout); stream->field_0x214 = 1; eVar4 = pcptRecv(&stream->data_sock, stream->recv_binary_buf + stream->field_0x1fc, psVar1, timeout); eVar7 = _errT2P(eVar4); stream->err = eVar7; if ((eVar7 == e_pcpp_to) && (iVar3 != 0)) { stream->err = -13; pcptCloseDataSock(&stream->sock); pcppResetRead(stream); } eVar7 = stream->err; if (eVar7 == e_pcpp_to) { LAB_00457c47: if (eVar7 != e_pcpp_ok) goto switchD_004572ff_caseD_10; } else { if (eVar7 != e_pcpp_ok) { stream->state = 0; goto LAB_00457c47; } } stream->field_0x1fc = stream->field_0x1fc + *psVar1; stream->field_0x214 = 0; *psVar1 = stream->recv_binary_buf_len - stream->field_0x1fc; amiTimerGet(&local_10); stream->last_active = _amTimeMs(local_10); } while (stream->field_0x1fc <= stream->recv_binary_buf_len && stream->recv_binary_buf_len != stream->field_0x1fc); } send_buf = (unsigned char**)&stream->send_buf; psVar1 = &stream->send_buf_len; stream->state = 12; *send_buf[0] = PCP_CHAR_BINACK; *psVar1 = 1; local_20 = pcppGetBlockingTime(stream->field_0x20c, uVar11, stream, _amTimeMs(local_18), &timeout); eVar4 = pcptSend(&stream->sock, *send_buf, psVar1, stream->field_0x204, timeout); eVar7 = _errT2P(eVar4); stream->err = eVar7; if ((eVar7 == e_pcpp_to) && (local_20 != 0)) { stream->err = -14; pcptCloseDataSock(&stream->sock); pcppResetRead(stream); } if (stream->err != e_pcpp_to) { stream->state = 0; } if (stream->err == e_pcpp_ok) { amiTimerGet(&local_10); stream->last_active = _amTimeMs(local_10); stream->state = 13; iVar3 = pcppGetBlockingTime(stream->field_0x208, uVar11, stream, _amTimeMs(local_18), &timeout); *psVar1 = PCP_SEND_BUF_MAX; ZERO(stream->send_buf); eVar4 = pcptRecv(&stream->data_sock, *send_buf, psVar1, timeout); eVar7 = _errT2P(eVar4); stream->err = eVar7; if ((iVar3 != 0) && (eVar7 == e_pcpp_to)) { stream->err = -13; } if (stream->err != e_pcpp_to) { stream->state = 0; } if (stream->err == e_pcpp_closed) { stream->err = e_pcpp_ok; LAB_004574b8: amiTimerGet(&local_10); stream->last_active = _amTimeMs(local_10); return stream->err; } } break; case 12: iVar3 = pcppGetBlockingTime(stream->field_0x20c, uVar11, stream, _amTimeMs(local_18), &timeout); eVar4 = pcptIsBusy(&stream->sock, timeout); eVar7 = _errT2P(eVar4); stream->err = eVar7; if ((iVar3 != 0) && (eVar7 == e_pcpp_to)) { stream->err = -14; pcptCloseDataSock(&stream->sock); pcppResetRead(stream); } if (stream->err != e_pcpp_to) { stream->state = 0; } if (stream->err != e_pcpp_ok) break; stream->state = 13; amiTimerGet(&local_10); stream->last_active = _amTimeMs(local_10); iVar3 = pcppGetBlockingTime(stream->field_0x208, uVar11, stream, _amTimeMs(local_18), &timeout); stream->send_buf_len = PCP_SEND_BUF_MAX; ZERO(stream->send_buf); eVar4 = pcptRecv(&stream->data_sock, stream->send_buf, &stream->send_buf_len, timeout); eVar7 = _errT2P(eVar4); stream->err = eVar7; if ((iVar3 != 0) && (eVar7 == e_pcpp_to)) { stream->err = -13; pcptCloseDataSock(&stream->sock); pcppResetRead(stream); } if (stream->err != e_pcpp_to) stream->state = 0; if (stream->err != e_pcpp_closed) break; stream->err = e_pcpp_ok; goto LAB_004574b8; case 13: iVar3 = pcppGetBlockingTime(stream->field_0x208, uVar11, stream, _amTimeMs(local_18), &timeout); eVar4 = pcptIsBusy(&stream->data_sock, timeout); eVar7 = _errT2P(eVar4); stream->err = eVar7; if ((iVar3 == 0) || (eVar7 != e_pcpp_to)) { if (eVar7 == e_pcpp_closed) { stream->err = e_pcpp_ok; amiTimerGet(&local_10); stream->last_active = _amTimeMs(local_10); return stream->err; } break; } stream->err = -13; pcptCloseDataSock(&stream->sock); LAB_004577af: pcppResetRead(stream); LAB_004577b4: stream->state = 0; return stream->err; case 14: case 15: amiTimerGet(&local_8); uVar6 = _amTimeDelta(local_8, local_18); stream->field_0x214 = 1; if (uVar11 != TIMEOUT_NONE) { if (uVar6 < uVar11) { uVar11 = uVar11 - uVar6; } else { uVar11 = 0; } } eVar7 = pcppRecvAllMsg(uVar11, stream, &local_24); stream->err = eVar7; if (eVar7 == e_pcpp_ok) { pcVar8 = stream->read_bytes_buf; eVar7 = pcppCheckRecvMsg(pcVar8, stream->read_bytes_num, (uint)(stream->state == 14)); stream->err = eVar7; if (eVar7 != e_pcpp_ok) { stream->state = 0; pcppResetRead(stream); PCP_LOG("error Response format error\n"); return stream->err; } pcppChangeRequest(stream, &timeout); uVar11 = timeout; pcVar9 = pcVar8; if (timeout < stream->read_bytes_num) { do { *pcVar9 = pcVar8[uVar11]; uVar11 = uVar11 + 1; pcVar9 = pcVar9 + 1; } while (uVar11 < stream->read_bytes_num); } goto LAB_00458226; } if (eVar7 == e_pcpp_to) { if (local_24 == 0) { stream->state = stream->state == 14 ? 5 : 7; return stream->err; } break; } goto LAB_0045739d; } switchD_004572ff_caseD_10: return stream->err; } int pcpp_something(amtime_t* time, timeout_t timeout, pcpp_t* stream, pcpt_t* sock, unsigned char* send_buf, size_t* send_len, undefined4 param_7, undefined4 param_8, int fallback_err) { uint iVar1; uint blocking_time; amtime_t now; e_pcpp_t err; iVar1 = pcppGetBlockingTime(param_8, timeout, stream, _amTimeMs(*time), &blocking_time); err = _errT2P(pcptSend(sock, send_buf, send_len, param_7, blocking_time)); if (err != e_pcpp_to) return err; if (sock->field_0x54 != 0) { if (timeout == TIMEOUT_NONE) return _errT2P(pcptIsBusy(sock, TIMEOUT_NONE)); amiTimerGet(&now); iVar1 = FUN_00459d00(time, &now); if ((iVar1 / 1000) < timeout) { return _errT2P(pcptIsBusy(sock, timeout - iVar1 / 1000)); } return _errT2P(pcptIsBusy(sock, 0)); } if (iVar1 != 0) { return fallback_err; } return err; } pcp_send_data_t* pcppAddSendPacket(pcp_send_data_t* send_data, char* keyword, char* value) { if (send_data == NULL || keyword == NULL) { PCP_LOG("error Send Data isn\'t set\n"); return NULL; } size_t existing_length = send_data->length; if (existing_length == 0) return pcppSetSendPacket(send_data, keyword, value); size_t kwLen = strlen(keyword); if (value == NULL) { if (existing_length + kwLen + 3 < PCP_BUF_MAX) { sprintf_s((char*)&send_data->data[existing_length], PCP_BUF_MAX - existing_length, "&%s\r\n", keyword); send_data->length += kwLen + 1; return send_data; } } else { size_t valLen = strlen(value); if (existing_length + kwLen + valLen + 4 < PCP_BUF_MAX) { sprintf_s((char*)&send_data->data[existing_length], PCP_BUF_MAX - existing_length, "&%s=%s\r\n", keyword, value); send_data->length += valLen + kwLen + 2; return send_data; } } return NULL; }