int main(int argc, const char *argv[]) { fd_set allreads; fd_set readmask; int socket = 0; int rc = 0; RingBuffer *in_rb = RingBuffer_create(1024 * 10); RingBuffer *sock_rb = RingBuffer_create(1024 * 10); check(argc == 3, "USAGE: netclient HOST PORT"); socket = client_connect(argv[1], argv[2]); check(socket >= 0, "Connect to %s:%s failed.", argv[1], argv[2]); FD_ZERO(&allreads); FD_SET(socket, &allreads); FD_SET(0, &allreads); while(1) { readmask = allreads; rc = select(socket + 1, &readmask, NULL, NULL, NULL); check(rc >= 0, "Select failed"); if(FD_ISSET(0, &readmask)) { rc = read_some(in_rb, 0, 0); check_debug(rc != -1, "failed to read from stdin."); } if(FD_ISSET(socket, &readmask)) { rc = read_some(sock_rb, socket, 0); check_debug(rc != -1, "failed to read from socket."); } while(!RingBuffer_empty(sock_rb)) { rc = write_some(sock_rb, 1, 0); check_debug(rc != -1, "failed to write to stdout."); } while(!RingBuffer_empty(in_rb)) { rc = write_some(in_rb, socket, 1); check_debug(rc != -1, "failed to write to socket."); } } RingBuffer_destroy(in_rb); RingBuffer_destroy(sock_rb); return 0; error: return -1; }
char *test_read_write() { mu_assert(RingBuffer_empty(buffer), "Should be empty when nothing in it."); bstring string = bfromcstr("test string1"); RingBuffer_puts(buffer, string); mu_assert(!RingBuffer_empty(buffer), "Should have stored string."); bstring result = RingBuffer_gets(buffer, sizeof(bdata(string))); mu_assert(bstrcmp(string, result), "Strings should be the same."); return NULL; }
char *test_create() { rbuf = RingBuffer_create(64); mu_assert(rbuf != NULL, "Failed to create RingBuffer"); mu_assert(RingBuffer_empty(rbuf) == 1, "RingBuffer not empty"); mu_assert(rbuf->start == 0, "RingBuffer start is not 0"); mu_assert(rbuf->end == 0, "RingBuffer end is not 0"); mu_assert(RingBuffer_available_space(rbuf) == 64, "RingBuffer space not correct"); return NULL; }
char *test_read_write() { RingBuffer_puts(rbuf, &test_data_0); mu_assert(rbuf->end == 6, "ends at not reset correctly"); mu_assert(RingBuffer_empty(rbuf) == 0, "not actually empty"); RingBuffer_puts(rbuf, &test_data_1); mu_assert(rbuf->end == 34, "ends at not reset correctly"); char *data_1 = malloc(sizeof(char) * 6); RingBuffer_read(rbuf, data_1, 6); mu_assert(bstrcmp(bfromcstr(data_1), &test_data_0) == 0, "read did not return proper string" ); mu_assert(rbuf->start == 6, "did not reset start correctly"); char *data_2 = malloc(sizeof(char) * 28); RingBuffer_read(rbuf, data_2, 28); mu_assert(bstrcmp(bfromcstr(data_2), &test_data_1) == 0, "read did not return proper string" ); mu_assert(rbuf->start == 0, "did not reset start correctly"); mu_assert(rbuf->end == 0, "did not reset end correctly"); RingBuffer_puts(rbuf, &test_data_2); RingBuffer_puts(rbuf, &test_data_3); mu_assert(rbuf->start == 0, "start not maintained"); mu_assert(rbuf->end == 64, "end not set correctly"); mu_assert(RingBuffer_full(rbuf) == 1, "RingBuffer actually full"); mu_assert(RingBuffer_available_space(rbuf) == 0, "RingBuffer has no space"); mu_assert(RingBuffer_available_data(rbuf) == 64, "RingBuffer has wrong available data"); bstring data_3 = RingBuffer_get_all(rbuf); bstring expected = bformat("%s%s", bdata(&test_data_2), bdata(&test_data_3)); mu_assert(bstrcmp(data_3, expected) == 0, "data not returned correctly"); mu_assert(RingBuffer_empty(rbuf) == 1, "RingBuffer should be empty"); return NULL; }
/** * @brief Gets a byte from ring buffer * @return the oldest byte * Does not block. Ring buffer shold not be empty. */ uint8_t RingBuffer_get(struct RingBuffer *self) { assert(!RingBuffer_empty(self)); uint8_t tmp; tmp = self->buff[self->end++]; self->end %= BUFF_SIZE; if (self->start == self->end) self->empty = true; return tmp; }