diff options
Diffstat (limited to 'src/unistd.c')
-rw-r--r-- | src/unistd.c | 67 |
1 files changed, 67 insertions, 0 deletions
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 + +} |