diff options
-rw-r--r-- | Makefile | 9 | ||||
-rw-r--r-- | include/nsutils/time.h | 2 | ||||
-rw-r--r-- | include/nsutils/unistd.h | 55 | ||||
-rw-r--r-- | src/Makefile | 2 | ||||
-rw-r--r-- | src/unistd.c | 67 |
5 files changed, 132 insertions, 3 deletions
@@ -1,6 +1,12 @@ +#!/bin/make +# +# Makefile for libnsutils +# +# Copyright 2014-1015 Vincent Sanders <vince@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@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@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 + +} |