aboutsummaryrefslogtreecommitdiff
path: root/sys/fio/seek.x
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /sys/fio/seek.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'sys/fio/seek.x')
-rw-r--r--sys/fio/seek.x69
1 files changed, 69 insertions, 0 deletions
diff --git a/sys/fio/seek.x b/sys/fio/seek.x
new file mode 100644
index 00000000..73440a3c
--- /dev/null
+++ b/sys/fio/seek.x
@@ -0,0 +1,69 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <config.h>
+include <syserr.h>
+include <fio.h>
+
+# SEEK -- Position the i/o pointer (file offset at which the next i/o transfer
+# will occur) for a file. Note that ITOP may have to be adjusted before
+# performing the seek, to make newly written data readable (as when writing at
+# EOF, seeking backward within the same buffer, and reading). A physical seek
+# is performed for text files. For binary files, a logical seek is performed,
+# adjusting the i/o pointer. Physical seeks on binary files are initiated
+# by FFAULT, when filling or flushing a file buffer.
+
+procedure seek (fd, offset)
+
+int fd # file
+long offset # offset == BOF,EOF, or char offset
+
+pointer bp
+long file_offset
+int status
+long ffilsz()
+errchk filerr, syserr, ffilsz
+include <fio.com>
+
+begin
+ fp = fiodes[fd]
+ if (fd <= 0 || fp == NULL)
+ call syserr (SYS_FILENOTOPEN)
+
+ call fcanpb (fd) # cancel any pushback
+ UPDATE_IOP(fd) # make newly written data readable
+
+ if (FTYPE(fp) == TEXT_FILE) {
+ # General seeks only permitted on text files opened for reading.
+ if (FMODE(fp) != READ_ONLY)
+ if (offset != BOF && offset != EOF)
+ call filerr (FNAME(fp), SYS_FSEEKNTXF)
+
+ bp = bufptr[fd]
+ if (BUF_MODIFIED(fd)) { # flush buffer?
+ call fputtx (fd, Memc[bp], otop[fd] - bp, status)
+ if (status != ERR)
+ call zcall2 (ZFLSTX(fp), FCHAN(fp), status)
+ if (status == ERR)
+ call filerr (FNAME(fp), SYS_FWRITE)
+ }
+
+ iop[fd] = bp
+ itop[fd] = bp
+ otop[fd] = bp
+
+ call zcall3 (ZSEKTX(fp), FCHAN(fp), offset, status)
+ if (status == ERR)
+ call filerr (FNAME(fp), SYS_FSEEK)
+
+ } else { # logical seek (binary files)
+ switch (offset) {
+ case BOF:
+ file_offset = 1
+ case EOF:
+ file_offset = ffilsz (fd) + 1
+ default:
+ file_offset = offset
+ }
+ iop[fd] = file_offset - boffset[fd] + bufptr[fd]
+ }
+end