From 61749966b936c78636f320b58e21a2fda74f3c9f Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Thu, 3 Apr 2008 05:05:48 +0000 Subject: [PATCH] Fixed PHYSFS_openAppend() on Unix. Apparently O_APPEND doesn't behave like I thought it did...all these years. :/ --- CHANGELOG.txt | 1 + platform/posix.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index d4c28ce3..64f133ea 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -2,6 +2,7 @@ * CHANGELOG. */ +04032008 - Fixed PHYSFS_openAppend() to work as documented on Unix. 03122008 - Fixed aliasing bug in Windows platform layer (thanks, Dennis!). 03102008 - Changed some text files from ISO-8859-1 to UTF-8. Replaced all the translations with UTF-8 encoded equivalents. diff --git a/platform/posix.c b/platform/posix.c index 00512556..2a933280 100644 --- a/platform/posix.c +++ b/platform/posix.c @@ -236,13 +236,26 @@ int __PHYSFS_platformMkDir(const char *path) static void *doOpen(const char *filename, int mode) { + const int appending = (mode & O_APPEND); int fd; int *retval; errno = 0; + /* O_APPEND doesn't actually behave as we'd like. */ + mode &= ~O_APPEND; + fd = open(filename, mode, S_IRUSR | S_IWUSR); BAIL_IF_MACRO(fd < 0, strerror(errno), NULL); + if (appending) + { + if (lseek(fd, 0, SEEK_END) < 0) + { + close(fd); + BAIL_MACRO(strerror(errno), NULL); + } /* if */ + } /* if */ + retval = (int *) allocator.Malloc(sizeof (int)); if (retval == NULL) {