+/* Seek offset bytes through file, from whence, where whence is
+ FROM_START, FROM_CURRENT, or FROM_END */
+int seek_file(WFile *f, uint64 offset, int whence)
+{
+ off_t fileofft;
+ int lseek_whence;
+
+ fileofft = (((off_t) offset.hi << 16) << 16) + offset.lo;
+
+ switch (whence) {
+ case FROM_START:
+ lseek_whence = SEEK_SET;
+ break;
+ case FROM_CURRENT:
+ lseek_whence = SEEK_CUR;
+ break;
+ case FROM_END:
+ lseek_whence = SEEK_END;
+ break;
+ default:
+ return -1;
+ }
+
+ return lseek(f->fd, fileofft, lseek_whence) >= 0 ? 0 : -1;
+}
+
+uint64 get_file_posn(WFile *f)
+{
+ off_t fileofft;
+ uint64 ret;
+
+ fileofft = lseek(f->fd, (off_t) 0, SEEK_CUR);
+
+ ret = uint64_make((fileofft >> 16) >> 16, fileofft);
+
+ return ret;
+}
+