Rationale: it's easy to implement the callback wrong. Doing so introduces io errors when unknown fields are present in the input. If code is not tested with unknown fields, these bugs can remain hidden for long time. Added a special case for the memory buffer stream, where it gives a small speed benefit. Added testcase for skipping fields with test_decode2 implementation. Update issue 37 Status: FixedInGit
41 lines
921 B
C
41 lines
921 B
C
/* Simple binding of nanopb streams to TCP sockets.
|
|
*/
|
|
|
|
#include <sys/socket.h>
|
|
#include <sys/types.h>
|
|
#include <pb_encode.h>
|
|
#include <pb_decode.h>
|
|
|
|
#include "common.h"
|
|
|
|
static bool write_callback(pb_ostream_t *stream, const uint8_t *buf, size_t count)
|
|
{
|
|
int fd = (intptr_t)stream->state;
|
|
return send(fd, buf, count, 0) == count;
|
|
}
|
|
|
|
static bool read_callback(pb_istream_t *stream, uint8_t *buf, size_t count)
|
|
{
|
|
int fd = (intptr_t)stream->state;
|
|
int result;
|
|
|
|
result = recv(fd, buf, count, MSG_WAITALL);
|
|
|
|
if (result == 0)
|
|
stream->bytes_left = 0; /* EOF */
|
|
|
|
return result == count;
|
|
}
|
|
|
|
pb_ostream_t pb_ostream_from_socket(int fd)
|
|
{
|
|
pb_ostream_t stream = {&write_callback, (void*)(intptr_t)fd, SIZE_MAX, 0};
|
|
return stream;
|
|
}
|
|
|
|
pb_istream_t pb_istream_from_socket(int fd)
|
|
{
|
|
pb_istream_t stream = {&read_callback, (void*)(intptr_t)fd, SIZE_MAX};
|
|
return stream;
|
|
}
|