diff --git a/libc/stdio/local.h b/libc/stdio/local.h
index a15bddf..7188c74 100644
--- a/libc/stdio/local.h
+++ b/libc/stdio/local.h
@@ -92,7 +92,6 @@
 
 	/* Unix stdio files get aligned to block boundaries on fseek() */
 	int	_blksize;	/* stat.st_blksize (may be != _bf._size) */
-	fpos_t	_offset;	/* current lseek offset */
 };
 
 /*
@@ -112,6 +111,10 @@
   bool _caller_handles_locking;
 };
 
+// TODO: remove remaining references to these obsolete flags.
+#define __SNPT 0
+#define __SOPT 0
+
 #if defined(__cplusplus)
 #define _EXT(fp) reinterpret_cast<__sfileext*>((fp)->_ext._base)
 #else
diff --git a/libc/stdio/stdio.cpp b/libc/stdio/stdio.cpp
index 1ea3ef5..1066d7f 100644
--- a/libc/stdio/stdio.cpp
+++ b/libc/stdio/stdio.cpp
@@ -35,6 +35,7 @@
 
 #include <errno.h>
 #include <fcntl.h>
+#include <limits.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/param.h>
@@ -51,7 +52,7 @@
 
 #define	std(flags, file) \
 	{0,0,0,flags,file,{0,0},0,__sF+file,__sclose,__sread,__sseek,__swrite, \
-	    {(unsigned char *)(__sFext+file), 0},NULL,0,{0},{0},{0,0},0,0}
+	    {(unsigned char *)(__sFext+file), 0},NULL,0,{0},{0},{0,0},0}
 
 _THREAD_PRIVATE_MUTEX(__sfp_mutex);
 
@@ -85,25 +86,38 @@
 struct glue __sglue = { NULL, 3, __sF };
 static struct glue* lastglue = &__sglue;
 
+class ScopedFileLock {
+ public:
+  ScopedFileLock(FILE* fp) : fp_(fp) {
+    FLOCKFILE(fp_);
+  }
+  ~ScopedFileLock() {
+    FUNLOCKFILE(fp_);
+  }
+
+ private:
+  FILE* fp_;
+};
+
 static glue* moreglue(int n) {
-    static FILE empty;
+  static FILE empty;
 
-    char* data = new char[sizeof(glue) + ALIGNBYTES + n * sizeof(FILE) + n * sizeof(__sfileext)];
-    if (data == nullptr) return nullptr;
+  char* data = new char[sizeof(glue) + ALIGNBYTES + n * sizeof(FILE) + n * sizeof(__sfileext)];
+  if (data == nullptr) return nullptr;
 
-    glue* g = reinterpret_cast<glue*>(data);
-    FILE* p = reinterpret_cast<FILE*>(ALIGN(data + sizeof(*g)));
-    __sfileext* pext = reinterpret_cast<__sfileext*>(ALIGN(data + sizeof(*g)) + n * sizeof(FILE));
-    g->next = NULL;
-    g->niobs = n;
-    g->iobs = p;
-    while (--n >= 0) {
-        *p = empty;
-        _FILEEXT_SETUP(p, pext);
-        p++;
-        pext++;
-    }
-    return g;
+  glue* g = reinterpret_cast<glue*>(data);
+  FILE* p = reinterpret_cast<FILE*>(ALIGN(data + sizeof(*g)));
+  __sfileext* pext = reinterpret_cast<__sfileext*>(ALIGN(data + sizeof(*g)) + n * sizeof(FILE));
+  g->next = NULL;
+  g->niobs = n;
+  g->iobs = p;
+  while (--n >= 0) {
+    *p = empty;
+    _FILEEXT_SETUP(p, pext);
+    p++;
+    pext++;
+  }
+  return g;
 }
 
 /*
@@ -147,81 +161,155 @@
 }
 
 extern "C" __LIBC_HIDDEN__ void __libc_stdio_cleanup(void) {
-	/* (void) _fwalk(fclose); */
-	(void) _fwalk(__sflush);		/* `cheating' */
+  // Equivalent to fflush(nullptr), but without all the locking since we're shutting down anyway.
+  _fwalk(__sflush);
 }
 
 int fclose(FILE* fp) {
-    if (fp->_flags == 0) {
-        // Already freed!
-        errno = EBADF;
-        return EOF;
-    }
+  if (fp->_flags == 0) {
+    // Already freed!
+    errno = EBADF;
+    return EOF;
+  }
 
-    FLOCKFILE(fp);
-    WCIO_FREE(fp);
-    int r = fp->_flags & __SWR ? __sflush(fp) : 0;
-    if (fp->_close != NULL && (*fp->_close)(fp->_cookie) < 0) {
-        r = EOF;
-    }
-    if (fp->_flags & __SMBF) free(fp->_bf._base);
-    if (HASUB(fp)) FREEUB(fp);
-    if (HASLB(fp)) FREELB(fp);
+  ScopedFileLock sfl(fp);
+  WCIO_FREE(fp);
+  int r = fp->_flags & __SWR ? __sflush(fp) : 0;
+  if (fp->_close != NULL && (*fp->_close)(fp->_cookie) < 0) {
+    r = EOF;
+  }
+  if (fp->_flags & __SMBF) free(fp->_bf._base);
+  if (HASUB(fp)) FREEUB(fp);
+  if (HASLB(fp)) FREELB(fp);
 
-    // Poison this FILE so accesses after fclose will be obvious.
-    fp->_file = -1;
-    fp->_r = fp->_w = 0;
+  // Poison this FILE so accesses after fclose will be obvious.
+  fp->_file = -1;
+  fp->_r = fp->_w = 0;
 
-    // Release this FILE for reuse.
-    fp->_flags = 0;
-    FUNLOCKFILE(fp);
-    return (r);
+  // Release this FILE for reuse.
+  fp->_flags = 0;
+  return r;
 }
 
 int fileno(FILE* fp) {
-    FLOCKFILE(fp);
-    int result = fileno_unlocked(fp);
-    FUNLOCKFILE(fp);
-    return result;
+  ScopedFileLock sfl(fp);
+  return fileno_unlocked(fp);
 }
 
-// Small standard I/O/seek/close functions.
-// These maintain the `known seek offset' for seek optimisation.
 int __sread(void* cookie, char* buf, int n) {
-    FILE* fp = reinterpret_cast<FILE*>(cookie);
-    int ret = TEMP_FAILURE_RETRY(read(fp->_file, buf, n));
-    // If the read succeeded, update the current offset.
-    if (ret >= 0) {
-        fp->_offset += ret;
-    } else {
-        fp->_flags &= ~__SOFF; // Paranoia.
-    }
-    return ret;
+  FILE* fp = reinterpret_cast<FILE*>(cookie);
+  return TEMP_FAILURE_RETRY(read(fp->_file, buf, n));
 }
 
 int __swrite(void* cookie, const char* buf, int n) {
-    FILE* fp = reinterpret_cast<FILE*>(cookie);
-    if (fp->_flags & __SAPP) {
-        (void) TEMP_FAILURE_RETRY(lseek(fp->_file, 0, SEEK_END));
-    }
-    fp->_flags &= ~__SOFF; // In case FAPPEND mode is set.
-    return TEMP_FAILURE_RETRY(write(fp->_file, buf, n));
+  FILE* fp = reinterpret_cast<FILE*>(cookie);
+  if (fp->_flags & __SAPP) {
+    // The FILE* is in append mode, but the underlying fd doesn't have O_APPEND set.
+    // We need to seek manually.
+    // TODO: can we use fcntl(2) to set O_APPEND in fdopen(3) instead?
+    TEMP_FAILURE_RETRY(lseek64(fp->_file, 0, SEEK_END));
+  }
+  return TEMP_FAILURE_RETRY(write(fp->_file, buf, n));
 }
 
 // TODO: _FILE_OFFSET_BITS=64.
 fpos_t __sseek(void* cookie, fpos_t offset, int whence) {
-    FILE* fp = reinterpret_cast<FILE*>(cookie);
-    off_t ret = TEMP_FAILURE_RETRY(lseek(fp->_file, offset, whence));
-    if (ret == -1) {
-        fp->_flags &= ~__SOFF;
-    } else {
-        fp->_flags |= __SOFF;
-        fp->_offset = ret;
-    }
-    return ret;
+  FILE* fp = reinterpret_cast<FILE*>(cookie);
+  return TEMP_FAILURE_RETRY(lseek(fp->_file, offset, whence));
 }
 
 int __sclose(void* cookie) {
-    FILE* fp = reinterpret_cast<FILE*>(cookie);
-    return close(fp->_file);
+  FILE* fp = reinterpret_cast<FILE*>(cookie);
+  return close(fp->_file);
+}
+
+static bool __file_is_seekable(FILE* fp) {
+  if (fp->_seek == nullptr) {
+    errno = ESPIPE;  // Historic practice.
+    return false;
+  }
+  return true;
+}
+
+// TODO: _FILE_OFFSET_BITS=64.
+static off_t __ftello_unlocked(FILE* fp) {
+  if (!__file_is_seekable(fp)) return -1;
+
+  // Find offset of underlying I/O object, then
+  // adjust for buffered bytes.
+  __sflush(fp);  // May adjust seek offset on append stream.
+  fpos_t result = (*fp->_seek)(fp->_cookie, 0, SEEK_CUR);
+  if (result == -1) {
+    return -1;
+  }
+
+  if (fp->_flags & __SRD) {
+    // Reading.  Any unread characters (including
+    // those from ungetc) cause the position to be
+    // smaller than that in the underlying object.
+    result -= fp->_r;
+    if (HASUB(fp)) result -= fp->_ur;
+  } else if (fp->_flags & __SWR && fp->_p != NULL) {
+    // Writing.  Any buffered characters cause the
+    // position to be greater than that in the
+    // underlying object.
+    result += fp->_p - fp->_bf._base;
+  }
+  return result;
+}
+
+int fseeko(FILE* fp, off_t offset, int whence) {
+  ScopedFileLock sfl(fp);
+
+  if (!__file_is_seekable(fp)) return -1;
+
+  // Change any SEEK_CUR to SEEK_SET, and check `whence' argument.
+  // After this, whence is either SEEK_SET or SEEK_END.
+  if (whence == SEEK_CUR) {
+    fpos_t current_offset = __ftello_unlocked(fp);
+    if (current_offset == -1) {
+      return EOF;
+    }
+    offset += current_offset;
+    whence = SEEK_SET;
+  } else if (whence != SEEK_SET && whence != SEEK_END) {
+    errno = EINVAL;
+    return EOF;
+  }
+
+  if (fp->_bf._base == NULL) __smakebuf(fp);
+
+  // Flush unwritten data and attempt the seek.
+  if (__sflush(fp) || (*fp->_seek)(fp->_cookie, offset, whence) == -1) {
+    return EOF;
+  }
+
+  // Success: clear EOF indicator and discard ungetc() data.
+  if (HASUB(fp)) FREEUB(fp);
+  fp->_p = fp->_bf._base;
+  fp->_r = 0;
+  /* fp->_w = 0; */	/* unnecessary (I think...) */
+  fp->_flags &= ~__SEOF;
+  return 0;
+}
+
+// TODO: _FILE_OFFSET_BITS=64.
+int fseek(FILE* fp, long offset, int whence) {
+  return fseeko(fp, offset, whence);
+}
+
+// TODO: _FILE_OFFSET_BITS=64.
+off_t ftello(FILE* fp) {
+  ScopedFileLock sfl(fp);
+  return __ftello_unlocked(fp);
+}
+
+// TODO: _FILE_OFFSET_BITS=64
+long ftell(FILE* fp) {
+  off_t offset = ftello(fp);
+  if (offset > LONG_MAX) {
+    errno = EOVERFLOW;
+    return -1;
+  }
+  return offset;
 }
