17ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Simple binding of nanopb streams to TCP sockets. 27ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */ 37ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 47ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <sys/socket.h> 57ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <sys/types.h> 67ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <pb_encode.h> 77ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <pb_decode.h> 87ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 97ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include "common.h" 107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool write_callback(pb_ostream_t *stream, const uint8_t *buf, size_t count) 127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int fd = (intptr_t)stream->state; 147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return send(fd, buf, count, 0) == count; 157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic bool read_callback(pb_istream_t *stream, uint8_t *buf, size_t count) 187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int fd = (intptr_t)stream->state; 207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen int result; 217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen result = recv(fd, buf, count, MSG_WAITALL); 237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen if (result == 0) 257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen stream->bytes_left = 0; /* EOF */ 267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return result == count; 287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenpb_ostream_t pb_ostream_from_socket(int fd) 317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_ostream_t stream = {&write_callback, (void*)(intptr_t)fd, SIZE_MAX, 0}; 337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return stream; 347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen 367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenpb_istream_t pb_istream_from_socket(int fd) 377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{ 387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen pb_istream_t stream = {&read_callback, (void*)(intptr_t)fd, SIZE_MAX}; 397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen return stream; 407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen} 41