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:
parent
cf24024292
commit
a9675ca837
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user