aboutsummaryrefslogtreecommitdiff
path: root/sys/ki/ktznot.x
diff options
context:
space:
mode:
Diffstat (limited to 'sys/ki/ktznot.x')
-rw-r--r--sys/ki/ktznot.x74
1 files changed, 74 insertions, 0 deletions
diff --git a/sys/ki/ktznot.x b/sys/ki/ktznot.x
new file mode 100644
index 00000000..8185b734
--- /dev/null
+++ b/sys/ki/ktznot.x
@@ -0,0 +1,74 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <mach.h>
+include <config.h>
+include "ki.h"
+
+# KT_ZNOT -- Note the file position of a text device. We are called only if
+# the device does not reside on the local node.
+
+procedure kt_znot (device, chan, loffset)
+
+int device # device driver code
+int chan # channel assigned device
+long loffset # receives the file offset
+
+pointer bd, rp
+int server, status
+int ki_sendrcv()
+long ki_decode()
+include "kichan.com"
+include "kii.com"
+define physnote_ 91
+
+begin
+ bd = k_bufp[chan]
+
+ # The buffering of text file input and output complicates the seek and
+ # note functions. Our solution is [1] for an output file, flush the
+ # output and then call the kernel server to note the file position, and
+ # [2] for an input file, have the kernel server note the offset of each
+ # input line of text in the header area of each input record.
+
+ if (B_ITOP(bd) >= B_BUFPTR(bd)) {
+ # Input file.
+
+ rp = B_RP(bd)
+
+ # Check for end of input buffer.
+ if (rp >= B_ITOP(bd))
+ goto physnote_
+
+ # If already part way into line, return offset of the next line.
+ if (B_CI(bd) > 0) {
+ rp = rp + ki_decode (R_RECLEN(rp), NCHARS_INT)
+ if (rp >= B_ITOP(bd))
+ goto physnote_
+ }
+
+ # Decode seek offset from record header of next line to be
+ # read. The seek offset is encoded as a char sequence.
+
+ loffset = ki_decode (R_SEKOFF(rp), NCHARS_LONG)
+ return
+
+ } else {
+ # Output file.
+
+ call ki_flushtx (device, chan, status)
+ if (status == ERR)
+ return
+ }
+
+physnote_
+
+ # Physically call the kernel server to note the file offset.
+
+ server = k_node[chan]
+ p_arg[1] = k_oschan[chan]
+
+ if (ki_sendrcv (server, device, TX_NOT) == ERR)
+ loffset = ERR
+ else
+ loffset = ki_decode (p_sbuf, NCHARS_LONG)
+end