about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/internal/stdio_impl.h1
-rw-r--r--src/stdio/__fdopen.c1
-rw-r--r--src/stdio/ftell.c4
3 files changed, 5 insertions, 1 deletions
diff --git a/src/internal/stdio_impl.h b/src/internal/stdio_impl.h
index 2083b2fe..79be9fdb 100644
--- a/src/internal/stdio_impl.h
+++ b/src/internal/stdio_impl.h
@@ -17,6 +17,7 @@
 #define F_EOF 16
 #define F_ERR 32
 #define F_SVB 64
+#define F_APP 128
 
 struct _IO_FILE {
 	unsigned flags;
diff --git a/src/stdio/__fdopen.c b/src/stdio/__fdopen.c
index 59690f6d..a2ca62b1 100644
--- a/src/stdio/__fdopen.c
+++ b/src/stdio/__fdopen.c
@@ -33,6 +33,7 @@ FILE *__fdopen(int fd, const char *mode)
 	if (*mode == 'a') {
 		int flags = __syscall(SYS_fcntl, fd, F_GETFL);
 		__syscall(SYS_fcntl, fd, F_SETFL, flags | O_APPEND);
+		f->flags |= F_APP;
 	}
 
 	f->fd = fd;
diff --git a/src/stdio/ftell.c b/src/stdio/ftell.c
index 82371e37..bb62897a 100644
--- a/src/stdio/ftell.c
+++ b/src/stdio/ftell.c
@@ -4,7 +4,9 @@
 
 off_t __ftello_unlocked(FILE *f)
 {
-	off_t pos = f->seek(f, 0, SEEK_CUR);
+	off_t pos = f->seek(f, 0,
+		(f->flags & F_APP) && f->wpos > f->wbase
+		? SEEK_END : SEEK_CUR);
 	if (pos < 0) return pos;
 
 	/* Adjust for data in buffer. */