/** * Write bytes from file into ring buffer * * @param rb the ring buffer * @param fd file descriptor * @param n max bytes to write * @return bytes written into the ring buffer, or -1 if error */ ssize_t rb_write_from_file(CwtRingBuffer* rb, int fd, size_t n) { BYTE ibuf[256]; size_t total_br = 0; CwtUnistdNS *ns = cwt_unistd_ns(); if( fd < 0 ) { print_error(_Tr("invalid file descriptor")); return 0; } while( total_br < n ) { /* TODO fix unsigned int cast */ ssize_t br = ns->read(fd, ibuf, (UINT)(n - total_br)); if( br == 0 ) /* end of file */ break; if( br < 0 ) { printf_error(_Tr("read file error: %s"), strerror(errno)); return (ssize_t)-1; } total_br += br; if( !rb_push_back(rb, ibuf, br) ) { return (ssize_t)-1; } } return (ssize_t)total_br; }
bool sp_read(struct ring_buf_data* p_pd) { for(;;) { uint8_t val = 0; const ssize_t bytesRead = read(s_fd, &val, 1); if(bytesRead < 0) { // error log_err("serial read error"); return(false); } if(0 == bytesRead) { // no data available break; } rb_push_back(p_pd, val); if(S_OK == mb_validate(p_pd)) { // have a message return(true); } } return(false); }
static ssize_t rb_write(CwtRingBuffer *rb, const BYTE* bytes, size_t n) { CWT_ASSERT(rb); if( !n ) return (ssize_t)0; if( !rb_push_back(rb, bytes, (size_t)n) ) { return (ssize_t)-1; } return (ssize_t)n; }