aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2014-03-11 10:32:12 +0100
committerHarald Welte <laforge@gnumonks.org>2014-03-11 11:14:38 +0100
commit4a8eb8d13e4cbeaaa72312159b65d2a51876ec32 (patch)
treeae157f969a85cfaa73d13ce256b16dad127f7c32
parenta60d47f84b8ecf37c99af0c7c7ac942e05e3ee04 (diff)
vty/buffer.c: Work on systems that don't implement writev()
.. such as Nuttx.
-rw-r--r--src/vty/buffer.c31
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);
}