Gitweb links:
...log
http://git.netsurf-browser.org/libnsutils.git/shortlog/2d6282f46bf44ea82e...
...commit
http://git.netsurf-browser.org/libnsutils.git/commit/2d6282f46bf44ea82ea9...
...tree
http://git.netsurf-browser.org/libnsutils.git/tree/2d6282f46bf44ea82ea9cc...
The branch, master has been updated
via 2d6282f46bf44ea82ea9cc562f62af4456714052 (commit)
from ee700511bdd5af06304382abf0d6ff4cc9bd43f0 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff
http://git.netsurf-browser.org/libnsutils.git/commit/?id=2d6282f46bf44ea8...
commit 2d6282f46bf44ea82ea9cc562f62af4456714052
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Added pread and pwrite wrappers.
This adds wrappers for the pread and pwrite standard calls with fixed
semantics across all supported platforms.
The main variation (so far) is some platforms not having the calls at
all and AmigaOS not allowing seeks beyond existing extents.
diff --git a/Makefile b/Makefile
index fa44370..10b2120 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,12 @@
+#!/bin/make
+#
+# Makefile for libnsutils
+#
+# Copyright 2014-1015 Vincent Sanders <vince(a)netsurf-browser.org>
+
# Component settings
COMPONENT := nsutils
-COMPONENT_VERSION := 0.0.1
+COMPONENT_VERSION := 0.0.2
# Default to a static library
COMPONENT_TYPE ?= lib-static
@@ -16,6 +22,7 @@ TESTRUNNER = test/runtest.sh $(BUILDDIR) $(EXEEXT)
WARNFLAGS := -Wall -W -Wundef -Wpointer-arith -Wcast-align \
-Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes \
-Wmissing-declarations -Wnested-externs
+
CFLAGS := -I$(CURDIR)/include/ -I$(CURDIR)/src $(WARNFLAGS) $(CFLAGS)
ifneq ($(GCCVER),2)
CFLAGS := $(CFLAGS) -std=c99
diff --git a/include/nsutils/time.h b/include/nsutils/time.h
index 715d3e4..db60914 100644
--- a/include/nsutils/time.h
+++ b/include/nsutils/time.h
@@ -9,7 +9,7 @@
/**
* \file
- * Base64 encoding and decoding interface.
+ * Time related operations.
*/
#ifndef NSUTILS_TIME_H_
diff --git a/include/nsutils/unistd.h b/include/nsutils/unistd.h
new file mode 100644
index 0000000..be11382
--- /dev/null
+++ b/include/nsutils/unistd.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2015 Vincent Sanders <vince(a)netsurf-browser.org>
+ *
+ * This file is part of libnsutils.
+ *
+ * Licensed under the MIT License,
+ *
http://www.opensource.org/licenses/mit-license.php
+ */
+
+/**
+ * \file
+ * Time related operations.
+ */
+
+#ifndef NSUTILS_UNISTD_H_
+#define NSUTILS_UNISTD_H_
+
+/**
+ * Perform a write operation at a specific offset
+ *
+ * This writes the data into the file specifid by teh file handle at teh given
+ * offset. The offset may be beyond the existing file extent.
+ *
+ * This provides a uniform interface to the pwrite operation without system
+ * specific implementation details.
+ *
+ * \note The write pointer on the fd may be moved by this operation which
+ * differs from the posix version.
+ *
+ * \param fd The file descriptor.
+ * \param buf The data to write.
+ * \param count The length of data in \a buf to write.
+ * \param offset The offset into the file to write the data.
+ * \return the number of bytes written or -1 on error and errno set.
+ */
+ssize_t nsu_pwrite(int fd, const void *buf, size_t count, off_t offset);
+
+/**
+ * Perform a read from a specific offset.
+ *
+ * This provides a uniform interface to the POSIX pread operation without
+ * system specific implementation details.
+ *
+ * \note The read pointer on the fd may be moved by this operation which
+ * differs from the POSIX version.
+ *
+ * \param fd The file descriptor.
+ * \param buf The buffer to place the data into.
+ * \param count The length of data to read.
+ * \param offset The offset into the file to read the data from.
+ * \return the number of bytes read or -1 on error and errno set.
+ */
+ssize_t nsu_pread(int fd, void *buf, size_t count, off_t offset);
+
+#endif
diff --git a/src/Makefile b/src/Makefile
index 28bfc5f..b4fd96a 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,3 +1,3 @@
-DIR_SOURCES := base64.c time.c
+DIR_SOURCES := base64.c time.c unistd.c
include $(NSBUILD)/Makefile.subdir
diff --git a/src/unistd.c b/src/unistd.c
new file mode 100644
index 0000000..219e9ec
--- /dev/null
+++ b/src/unistd.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2015 Vincent Sanders <vince(a)netsurf-browser.org>
+ *
+ * This file is part of libnsutils.
+ *
+ * Licensed under the MIT License,
+ *
http://www.opensource.org/licenses/mit-license.php
+ */
+
+/**
+ * \file
+ * unistd style operations.
+ */
+
+#include <unistd.h>
+#include <errno.h>
+
+#include "nsutils/unistd.h"
+
+/* exported interface documented in nsutils/unistd.h */
+ssize_t nsu_pwrite(int fd, const void *buf, size_t count, off_t offset)
+{
+#if defined(__riscos) || defined(__amiga)
+ off_t sk;
+
+ sk = lseek(fd, offset, SEEK_SET);
+ if (sk == (off_t)-1) {
+#if defined(__amiga)
+ /* amigaos cannot seek past the end of the existing file so use
+ * ftruncate to make the file long enough and retry the seek.
+ */
+ int ret;
+ if (errno == ESPIPE) {
+ ret = ftruncate(fd, offset);
+ if (ret == -1) {
+ return -1;
+ }
+ sk = lseek(fd, offset, SEEK_SET);
+ if (sk == (off_t)-1) {
+ return -1;
+ }
+ } else
+#endif
+ return -1;
+ }
+ return write(fd, buf, count);
+#else
+ return pwrite(fd, buf, count, offset);
+#endif
+}
+
+/* exported interface documented in nsutils/unistd.h */
+ssize_t nsu_pread(int fd, void *buf, size_t count, off_t offset)
+{
+#if defined(__riscos)
+ off_t sk;
+
+ sk = lseek(fd, offset, SEEK_SET);
+ if (sk == -1) {
+ return (off_t)-1;
+ }
+ return read(fd, buf, count);
+#else
+ return pread(fd, buf, count, offset);
+#endif
+
+}
-----------------------------------------------------------------------
Summary of changes:
Makefile | 9 ++++++-
include/nsutils/time.h | 2 +-
include/nsutils/unistd.h | 55 +++++++++++++++++++++++++++++++++++++
src/Makefile | 2 +-
src/unistd.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 132 insertions(+), 3 deletions(-)
create mode 100644 include/nsutils/unistd.h
create mode 100644 src/unistd.c
diff --git a/Makefile b/Makefile
index fa44370..10b2120 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,12 @@
+#!/bin/make
+#
+# Makefile for libnsutils
+#
+# Copyright 2014-1015 Vincent Sanders <vince(a)netsurf-browser.org>
+
# Component settings
COMPONENT := nsutils
-COMPONENT_VERSION := 0.0.1
+COMPONENT_VERSION := 0.0.2
# Default to a static library
COMPONENT_TYPE ?= lib-static
@@ -16,6 +22,7 @@ TESTRUNNER = test/runtest.sh $(BUILDDIR) $(EXEEXT)
WARNFLAGS := -Wall -W -Wundef -Wpointer-arith -Wcast-align \
-Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes \
-Wmissing-declarations -Wnested-externs
+
CFLAGS := -I$(CURDIR)/include/ -I$(CURDIR)/src $(WARNFLAGS) $(CFLAGS)
ifneq ($(GCCVER),2)
CFLAGS := $(CFLAGS) -std=c99
diff --git a/include/nsutils/time.h b/include/nsutils/time.h
index 715d3e4..db60914 100644
--- a/include/nsutils/time.h
+++ b/include/nsutils/time.h
@@ -9,7 +9,7 @@
/**
* \file
- * Base64 encoding and decoding interface.
+ * Time related operations.
*/
#ifndef NSUTILS_TIME_H_
diff --git a/include/nsutils/unistd.h b/include/nsutils/unistd.h
new file mode 100644
index 0000000..be11382
--- /dev/null
+++ b/include/nsutils/unistd.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2015 Vincent Sanders <vince(a)netsurf-browser.org>
+ *
+ * This file is part of libnsutils.
+ *
+ * Licensed under the MIT License,
+ *
http://www.opensource.org/licenses/mit-license.php
+ */
+
+/**
+ * \file
+ * Time related operations.
+ */
+
+#ifndef NSUTILS_UNISTD_H_
+#define NSUTILS_UNISTD_H_
+
+/**
+ * Perform a write operation at a specific offset
+ *
+ * This writes the data into the file specifid by teh file handle at teh given
+ * offset. The offset may be beyond the existing file extent.
+ *
+ * This provides a uniform interface to the pwrite operation without system
+ * specific implementation details.
+ *
+ * \note The write pointer on the fd may be moved by this operation which
+ * differs from the posix version.
+ *
+ * \param fd The file descriptor.
+ * \param buf The data to write.
+ * \param count The length of data in \a buf to write.
+ * \param offset The offset into the file to write the data.
+ * \return the number of bytes written or -1 on error and errno set.
+ */
+ssize_t nsu_pwrite(int fd, const void *buf, size_t count, off_t offset);
+
+/**
+ * Perform a read from a specific offset.
+ *
+ * This provides a uniform interface to the POSIX pread operation without
+ * system specific implementation details.
+ *
+ * \note The read pointer on the fd may be moved by this operation which
+ * differs from the POSIX version.
+ *
+ * \param fd The file descriptor.
+ * \param buf The buffer to place the data into.
+ * \param count The length of data to read.
+ * \param offset The offset into the file to read the data from.
+ * \return the number of bytes read or -1 on error and errno set.
+ */
+ssize_t nsu_pread(int fd, void *buf, size_t count, off_t offset);
+
+#endif
diff --git a/src/Makefile b/src/Makefile
index 28bfc5f..b4fd96a 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,3 +1,3 @@
-DIR_SOURCES := base64.c time.c
+DIR_SOURCES := base64.c time.c unistd.c
include $(NSBUILD)/Makefile.subdir
diff --git a/src/unistd.c b/src/unistd.c
new file mode 100644
index 0000000..219e9ec
--- /dev/null
+++ b/src/unistd.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2015 Vincent Sanders <vince(a)netsurf-browser.org>
+ *
+ * This file is part of libnsutils.
+ *
+ * Licensed under the MIT License,
+ *
http://www.opensource.org/licenses/mit-license.php
+ */
+
+/**
+ * \file
+ * unistd style operations.
+ */
+
+#include <unistd.h>
+#include <errno.h>
+
+#include "nsutils/unistd.h"
+
+/* exported interface documented in nsutils/unistd.h */
+ssize_t nsu_pwrite(int fd, const void *buf, size_t count, off_t offset)
+{
+#if defined(__riscos) || defined(__amiga)
+ off_t sk;
+
+ sk = lseek(fd, offset, SEEK_SET);
+ if (sk == (off_t)-1) {
+#if defined(__amiga)
+ /* amigaos cannot seek past the end of the existing file so use
+ * ftruncate to make the file long enough and retry the seek.
+ */
+ int ret;
+ if (errno == ESPIPE) {
+ ret = ftruncate(fd, offset);
+ if (ret == -1) {
+ return -1;
+ }
+ sk = lseek(fd, offset, SEEK_SET);
+ if (sk == (off_t)-1) {
+ return -1;
+ }
+ } else
+#endif
+ return -1;
+ }
+ return write(fd, buf, count);
+#else
+ return pwrite(fd, buf, count, offset);
+#endif
+}
+
+/* exported interface documented in nsutils/unistd.h */
+ssize_t nsu_pread(int fd, void *buf, size_t count, off_t offset)
+{
+#if defined(__riscos)
+ off_t sk;
+
+ sk = lseek(fd, offset, SEEK_SET);
+ if (sk == -1) {
+ return (off_t)-1;
+ }
+ return read(fd, buf, count);
+#else
+ return pread(fd, buf, count, offset);
+#endif
+
+}
--
NetSurf generalised utility library