1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-19 23:22:16 +03:00

emulation on host: fix UDP seek&peek (#8827)

This commit is contained in:
david gauchard 2023-01-24 13:44:50 +01:00 committed by GitHub
parent cf24024292
commit a9675ca837
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 30 deletions

View File

@ -166,14 +166,14 @@ size_t mockUDPFillInBuf(int sock, char* ccinbuf, size_t& ccinbufsize, uint8_t& a
return ccinbufsize += ret; return ccinbufsize += ret;
} }
size_t mockUDPPeekBytes(int sock, char* dst, size_t usersize, int timeout_ms, char* ccinbuf, size_t mockUDPPeekBytes(int sock, char* dst, size_t offset, size_t usersize, int timeout_ms,
size_t& ccinbufsize) char* ccinbuf, size_t& ccinbufsize)
{ {
(void)sock; (void)sock;
(void)timeout_ms; (void)timeout_ms;
if (usersize > CCBUFSIZE) if (offset + usersize > CCBUFSIZE)
fprintf(stderr, MOCK "CCBUFSIZE(%d) should be increased by %zd bytes (-> %zd)\n", CCBUFSIZE, fprintf(stderr, MOCK "CCBUFSIZE(%d) should be increased by %zd bytes (-> %zd)\n", CCBUFSIZE,
usersize - CCBUFSIZE, usersize); offset + usersize - CCBUFSIZE, offset + usersize);
size_t retsize = 0; size_t retsize = 0;
if (ccinbufsize) if (ccinbufsize)
@ -183,25 +183,10 @@ size_t mockUDPPeekBytes(int sock, char* dst, size_t usersize, int timeout_ms, ch
if (retsize > ccinbufsize) if (retsize > ccinbufsize)
retsize = ccinbufsize; retsize = ccinbufsize;
} }
memcpy(dst, ccinbuf, retsize); memcpy(dst, ccinbuf + offset, retsize);
return retsize; return retsize;
} }
void mockUDPSwallow(size_t copied, char* ccinbuf, size_t& ccinbufsize)
{
// poor man buffer
memmove(ccinbuf, ccinbuf + copied, ccinbufsize - copied);
ccinbufsize -= copied;
}
size_t mockUDPRead(int sock, char* dst, size_t size, int timeout_ms, char* ccinbuf,
size_t& ccinbufsize)
{
size_t copied = mockUDPPeekBytes(sock, dst, size, timeout_ms, ccinbuf, ccinbufsize);
mockUDPSwallow(copied, ccinbuf, ccinbufsize);
return copied;
}
size_t mockUDPWrite(int sock, const uint8_t* data, size_t size, int timeout_ms, uint32_t ipv4, size_t mockUDPWrite(int sock, const uint8_t* data, size_t size, int timeout_ms, uint32_t ipv4,
uint16_t port) uint16_t port)
{ {

View File

@ -117,12 +117,12 @@ public:
size_t getSize() size_t getSize()
{ {
return _inbufsize; return _inbufsize - _inoffset;
} }
size_t tell() const size_t tell() const
{ {
return 0; return _inoffset;
} }
void seek(const size_t pos) void seek(const size_t pos)
@ -132,7 +132,7 @@ public:
mockverbose("UDPContext::seek too far (%zd >= %zd)\n", pos, _inbufsize); mockverbose("UDPContext::seek too far (%zd >= %zd)\n", pos, _inbufsize);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
mockUDPSwallow(pos, _inbuf, _inbufsize); _inoffset = pos;
} }
bool isValidOffset(const size_t pos) const bool isValidOffset(const size_t pos) const
@ -165,6 +165,7 @@ public:
bool next() bool next()
{ {
_inbufsize = 0; _inbufsize = 0;
_inoffset = 0;
mockUDPFillInBuf(_sock, _inbuf, _inbufsize, addrsize, addr, _dstport); mockUDPFillInBuf(_sock, _inbuf, _inbufsize, addrsize, addr, _dstport);
if (_inbufsize > 0) if (_inbufsize > 0)
{ {
@ -182,13 +183,16 @@ public:
size_t read(char* dst, size_t size) size_t read(char* dst, size_t size)
{ {
return mockUDPRead(_sock, dst, size, _timeout_ms, _inbuf, _inbufsize); //return mockUDPRead(_sock, dst, size, _timeout_ms, _inbuf, _inbufsize);
auto ret = mockUDPPeekBytes(_sock, dst, _inoffset, size, _timeout_ms, _inbuf, _inbufsize);
_inoffset += ret;
return ret;
} }
int peek() int peek()
{ {
char c; char c;
return mockUDPPeekBytes(_sock, &c, 1, _timeout_ms, _inbuf, _inbufsize) ?: -1; return mockUDPPeekBytes(_sock, &c, _inoffset, 1, _timeout_ms, _inbuf, _inbufsize) ?: -1;
} }
void flush() void flush()
@ -280,6 +284,7 @@ private:
char _inbuf[CCBUFSIZE]; char _inbuf[CCBUFSIZE];
size_t _inbufsize = 0; size_t _inbufsize = 0;
size_t _inoffset = 0;
char _outbuf[CCBUFSIZE]; char _outbuf[CCBUFSIZE];
size_t _outbufsize = 0; size_t _outbufsize = 0;

View File

@ -160,13 +160,10 @@ int mockUDPSocket();
bool mockUDPListen(int sock, uint32_t dstaddr, uint16_t port, uint32_t mcast = 0); bool mockUDPListen(int sock, uint32_t dstaddr, uint16_t port, uint32_t mcast = 0);
size_t mockUDPFillInBuf(int sock, char* ccinbuf, size_t& ccinbufsize, uint8_t& addrsize, size_t mockUDPFillInBuf(int sock, char* ccinbuf, size_t& ccinbufsize, uint8_t& addrsize,
uint8_t addr[16], uint16_t& port); uint8_t addr[16], uint16_t& port);
size_t mockUDPPeekBytes(int sock, char* dst, size_t usersize, int timeout_ms, char* ccinbuf, size_t mockUDPPeekBytes(int sock, char* dst, size_t offset, size_t usersize, int timeout_ms,
size_t& ccinbufsize); char* ccinbuf, size_t& ccinbufsize);
size_t mockUDPRead(int sock, char* dst, size_t size, int timeout_ms, char* ccinbuf,
size_t& ccinbufsize);
size_t mockUDPWrite(int sock, const uint8_t* data, size_t size, int timeout_ms, uint32_t ipv4, size_t mockUDPWrite(int sock, const uint8_t* data, size_t size, int timeout_ms, uint32_t ipv4,
uint16_t port); uint16_t port);
void mockUDPSwallow(size_t copied, char* ccinbuf, size_t& ccinbufsize);
class UdpContext; class UdpContext;
void register_udp(int sock, UdpContext* udp = nullptr); void register_udp(int sock, UdpContext* udp = nullptr);