From fa749472159fb68a6d330bd09ccc5129e09df2e3 Mon Sep 17 00:00:00 2001 From: Phil Budne Date: Mon, 28 Mar 2016 01:02:54 -0400 Subject: [PATCH 1/3] sys: comments for seek & tell --- src/sys/s2.s | 46 +++++++++++++++++++++++----------------------- src/sys/s5.s | 23 ++++++++++++----------- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/sys/s2.s b/src/sys/s2.s index c23efca..4195e78 100644 --- a/src/sys/s2.s +++ b/src/sys/s2.s @@ -65,36 +65,36 @@ jmp sysexit .seek: - jms seektell - tad u.base + jms seektell " fetch offset & whence (return seek base) + tad u.base " add offset "** 01-s1.pdf page 8 - spa - jms error - lmq - lac f.flags - and d1 - sna - jms 1f - lacq - jms betwen; d0; i.size - jms dacisize + spa " positive? + jms error " no: error + lmq " save position in MQ + lac f.flags " get file flags + and d1 " get write bit + sna " open for write? + jmp 1f " no + lacq " yes: get position + jms betwen; d0; i.size " between zero and size? + jms dacisize " no: store new size jmp 2f 1: - lacq - jms betwen; d0; i.size - lac i.size + lacq " reading: get position + jms betwen; d0; i.size " between zero and size? + lac i.size " no: get current size 2: - dac f.badd - dac u.ac - jms fput - jmp sysexit + dac f.badd " save as offset + dac u.ac " return in AC + jms fput " copy fnode back to user area + jmp sysexit " return to user .tell: - jms seektell + jms seektell " fetch offset & whence (return seek base) cma - tad d1 - tad u.base - dac u.ac + tad d1 " negate base + tad u.base " add to user offset + dac u.ac " return in user AC jmp sysexit .link: diff --git a/src/sys/s5.s b/src/sys/s5.s index a0a7b4b..af6ed77 100644 --- a/src/sys/s5.s +++ b/src/sys/s5.s @@ -278,20 +278,21 @@ argname: 0 jms error " failed: return error directly to user jmp argname i + " common code for seek/tell system calls seektell: 0 - jms arg - dac u.base + jms arg " fetch 1st arg after sys + dac u.base " save in u.base "** 01-s1.pdf page 32 - jms arg - dac u.limit - jms finac - lac u.limit - sna - jmp seektell i - sad d1 - jmp .+3 - lac i.size + jms arg " fetch 2nd arg (whence??) + dac u.limit " save in u.limit + jms finac " fetch fnode & inode for fd in AC + lac u.limit " get whence arg back + sna " zero? + jmp seektell i " yes, return zero (relative to start) + sad d1 " one? + jmp .+3 " yes: return pos (relative to current) + lac i.size " no: return file size (relative to end) jmp seektell i lac f.badd jmp seektell i From 5cab912d88e9d5e3b907219565bc54ae420a3719 Mon Sep 17 00:00:00 2001 From: Phil Budne Date: Mon, 28 Mar 2016 01:03:40 -0400 Subject: [PATCH 2/3] s2.s: fix a typo --- scans/s2.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scans/s2.s b/scans/s2.s index 9d7af58..b651947 100644 --- a/scans/s2.s +++ b/scans/s2.s @@ -68,7 +68,7 @@ lac f.flags and d1 sna - jms 1f + jmp 1f lacq jms betwen; d0; i.size jms dacisize From d3ccf536c44f3f4171822825ca99b3bb06dad677 Mon Sep 17 00:00:00 2001 From: Phil Budne Date: Mon, 28 Mar 2016 02:07:21 -0400 Subject: [PATCH 3/3] pbsh.s: detect if stdin is a regular file using seek seek doesn't fail on special devices, but it always returns zero --- src/other/pbsh.s | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/other/pbsh.s b/src/other/pbsh.s index ad54941..2301945 100644 --- a/src/other/pbsh.s +++ b/src/other/pbsh.s @@ -36,7 +36,17 @@ maxargs=10 lac d1 sys intrp " make shell uninterruptable - sys getuid + +" see if reading from a special file + cla; sys seek; 1; 0 " try seeking stdin forward + sna " new offset non-zero? + jmp 1f " no: input is a special file (ttyin,keyboard) + dzm prompt " yes: regular file, kill prompt + cla; sys seek; 0; 0 " seek file back to start + jmp newline + +" stdin is a special file, see if superuser +1: sys getuid sma " <0? jmp newline " no lac hash " yes: superuser