summaryrefslogtreecommitdiff
path: root/src/stdio/fgetpos.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/stdio/fgetpos.c')
-rw-r--r--src/stdio/fgetpos.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/stdio/fgetpos.c b/src/stdio/fgetpos.c
index 8e6d201e..2f105f6a 100644
--- a/src/stdio/fgetpos.c
+++ b/src/stdio/fgetpos.c
@@ -6,10 +6,21 @@
int fgetpos(FILE * restrict stream, fpos_t * restrict pos)
{
SIGNAL_SAFE(0);
+ ASSERT_STREAM(stream, 0, 0);
+ ASSERT_NONNULL(pos);
ASSERT_NOOVERLAP(stream, sizeof(*stream), pos, sizeof(*pos));
flockfile(stream);
- *pos = stream->pos;
+ if (!(pos->__impl >= stream->fpos && pos->__impl <= stream->fpos + stream->nfpos)) {
+ struct __fpos_t *tmp = realloc(stream->fpos, sizeof(*stream->fpos) * (stream->nfpos + 1));
+ if (tmp == NULL) {
+ abort();
+ }
+ stream->fpos = tmp;
+ pos->__impl = &(stream->fpos[stream->nfpos++]);
+ }
+
+ pos->__impl->pos = ftell(stream);
funlockfile(stream);
return 0;
}