diff options
author | Harald Welte <laforge@gnumonks.org> | 2014-03-11 10:32:12 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2014-03-11 11:14:38 +0100 |
commit | 4a8eb8d13e4cbeaaa72312159b65d2a51876ec32 (patch) | |
tree | ae157f969a85cfaa73d13ce256b16dad127f7c32 | |
parent | a60d47f84b8ecf37c99af0c7c7ac942e05e3ee04 (diff) |
vty/buffer.c: Work on systems that don't implement writev()
.. such as Nuttx.
-rw-r--r-- | src/vty/buffer.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/src/vty/buffer.c b/src/vty/buffer.c index e0abe813..51140f96 100644 --- a/src/vty/buffer.c +++ b/src/vty/buffer.c @@ -26,12 +26,37 @@ #include <string.h> #include <errno.h> #include <stddef.h> -#include <sys/uio.h> #include <osmocom/core/talloc.h> #include <osmocom/vty/buffer.h> #include <osmocom/vty/vty.h> +#ifdef HAVE_SYS_UIO_H +#include <sys/uio.h> +#else +/* some platforms (e.g. Nuttx) don't have writev(), so we reimplement it + * here */ +struct iovec +{ + void *iov_base; + size_t iov_len; +}; +static ssize_t writev(int fd, const struct iovec *iovec, int count) +{ + int i, rc; + ssize_t written = 0; + + for (i = 0; i < count; i++) { + rc = write(fd, iovec[i].iov_base, iovec[i].iov_len); + if (rc <= 0) + return rc; + written += rc; + } + + return written; +} +#endif + /* Buffer master. */ struct buffer { /* Data list. */ @@ -76,7 +101,11 @@ struct buffer *buffer_new(void *ctx, size_t size) else { static size_t default_size; if (!default_size) { +#ifdef HAVE_SYSCONF long pgsz = sysconf(_SC_PAGESIZE); +#else + long pgsz = 4096; +#endif default_size = ((((BUFFER_SIZE_DEFAULT - 1) / pgsz) + 1) * pgsz); } |