home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
pub
/
test
/
pdp11
/
krt80s.mac
next >
Wrap
Text File
|
2020-01-01
|
28KB
|
983 lines
.title KRT80S Server things unique to the exec we are using
.ident /V04.64/
; /E64/ 10-May-96 John Santos
;
; From K1180S.MAC
; Remove unused systat stuff
.include /SY:[1,2]COMMON.MAC/
.if ndf, KRTINC
.ift
.include /IN:KRTMAC.MAC/
.endc
.iif ndf, xrb , .error ; INCULDE for [1,2]COMMON.MAC failed
.iif ndf, krtinc, .error ; INCLUDE for IN:KRTMAC.MAC failed
.title KRT80S
.psect $code
.enabl lc
.enabl gbl
.macro clrfqb
call $clrfq
.endm clrfqb
.macro clrxrb
call $clrxr
.endm clrxrb
; do a SYSTAT (also host commands)
;
; 01-Feb-84 11:11:34 Brian Nelson
;
; We have several options for doing the remote WHO command.
; First of all, we could spawn a job on a PK (or VT for M+)
; and get the output sent to a disk file and then send the
; disk file over to the reqesting Kermit. This would have
; the advantage of keeping the command consistant with the
; system managers desires.
; The other option, of course, is to do it ourself via the
; appropiate monitor directives to get that information.
; That option is really only available for RSTS since RSX
; does not have the directives needed to get that info from
; the exec. For now, I will use the second option. To be
; used, Kermit must run with temporary privileges (RSTS).
; To patch out, add (at task build time) the following to
; the tkb command file.
;
; GBLPAT=KRTWHO:SYSTAT+0:240
;
; It would, of course, be fairly straight forward to do the
; SYSTAT on a PK as I already have the code to log output
; to disk.
;
;
; input: @r5 value of channel to do i/o on, zero --> terminal
; output: r0 rsts error code if any.
;
;
; 12-Sep-86 10:31:20 BDN Convert to I/D space
; .macro dosys jobnum ,type
; mov type ,-(sp)
; mov jobnum ,-(sp)
; call .dosys
; cmp (sp)+ ,(sp)+
; .endm dosys
.sbttl the real work of systat
; /E64/
;systat::br 5$ ; skip the error exit
; mov #10. ,r0 ; return protection violation
; return ; bye
;
;5$: save <r1,r2,r3,r4,r5> ; save all registers please
; sub #120 ,sp ; allocate a text buffer
; call getprv ; we need temp privs
; mov #512. ,xrb+0 ; try a peek to see if we have
; .peek ; priv's to run with
; movb firqb ,r0 ; well ?
; bne 100$ ; none, so exit please
;
; clr r4 ; index # of job to do
;
;
;10$: mov sp ,r3 ; point to our local buffer now
; inc r4 ; jobnumber := jobnumber+1
; dosys r4 ,#0 ; do the uu.sys part 0 please
; tstb r0 ; did it work ?
; beq 20$ ; yes
; cmpb r0 ,#10. ; no job of such number present?
; beq 80$ ; yes, just do the next job then
; br 100$ ; no, exit then as we are all done
;20$: tstb firqb+5 ; is the job we found attached ?
; bmi 80$ ; yes, skip it then
; deccvt r4,r3,#3 ; convert job number to ascii
; add #3 ,r3 ; and point to end of the string
; movb #40 ,(r3)+ ; stuff a space in
; movb #40 ,(r3)+ ; stuff a space in
; call cvtppn ; convert the ppn next
; movb #40 ,(r3)+ ; again a space please
; call cvtkb ; get the kb number next
; mov #firqb+22,r1 ; get the program name next
; call rad ; convert to ascii and fix pointer
; dosys r4 ,#1 ; get the current size now
; movb firqb+16,r0 ; where it returned the size
; deccvt r0,r3,#5 ; convert with at least 3 spaces
; add #5 ,r3 ; move the pointer right along
; movb #'K ,(r3)+ ; the size please
; movb #40 ,(r3)+ ; spaces again
; movb #40 ,(r3)+ ; spaces again
; movb #40 ,(r3)+ ; spaces again
; dosys r4 ,#0 ; get the info part zero back
; mov #firqb+34,r1 ; and the current RTS name now
; call rad ; convert to ascii and fix pointer
; clrb @r3 ; all done at last
; mov sp ,r3 ; point back to the buffer
; call doio ; do the i/o at last
;80$: br 10$ ; next please
;
;
;100$: cmpb r0 ,#18. ; end of the table ?
; bne 110$ ; no
; clr r0 ; yes
;110$: add #120 ,sp ; pop the local buffer
; unsave <r5,r4,r3,r2,r1> ; pop temps and exit
; call drpprv ; please do this
; return
;
.sbttl utilities and the actual i/o
; /E64/
; .enabl lsb
;
;doio: tst @r5 ; channel zero today ?
; bne 10$ ; no, assume disk then
; print r3
; print #200$
; br 100$
;10$: strlen r3 ; try to a disk file now
; calls putrec ,<r3,r0,@r5> ; write to the passed LUN
;100$: return
;
; .save
; .psect $pdata ,d
;200$: .byte cr,lf,0
; .even
; .restore
; .dsabl lsb
;rad: calls rdtoa ,<r3,(r1)+> ; common code to to rad50 cvt
; add #3 ,r3 ; pointer := pointer + 3
; calls rdtoa ,<r3,(r1)+> ; common code to to rad50 cvt
; add #3 ,r3 ; pointer := pointer + 3
; return
.sbttl misc utilities
; .enabl lsb
;
;cvtppn: save <r0,r1> ; save temps please
; sub #20 ,sp ; convert ppn to ascii next
; mov sp ,r0 ; a pointer to the ppn
; clr r1 ; get the project number now
; bisb firqb+27,r1 ; ok
; bne 10$ ; if <> 0 then a real account
; mov #200$ ,r1 ; if eq 0 then not logged it yet
; br 20$ ; copy over *,*
;10$: deccvt r1,r0,#3 ; convert it to decimal
; add #3 ,r0
; movb #', ,(r0)+ ; stuff a comma in please
; clr r1 ; get the programmer number now
; bisb firqb+26,r1 ; ok
; deccvt r1,r0,#3 ; convert it to decimal
; mov sp ,r1 ; point to the buffer now
;20$: movb #40 ,(r3)+ ; stuff a space into our result
; mov #7 ,r0 ; seven characters to copy
;30$: movb (r1)+ ,(r3)+ ; and copy the rest of it
; sob r0 ,30$ ; simple
; movb #40 ,(r3)+ ; stuff a space into our result
; movb #40 ,(r3)+ ; stuff a space into our result
; movb #40 ,(r3)+ ; stuff a space into our result
; add #20 ,sp ; pop the local buffer
; unsave <r1,r0>
; return
;
; .save
; .psect $pdata ,d
;200$: .asciz / *, */
; .even
; .restore
; .dsabl lsb
;
;cvtkb: save <r0,r1> ; convert kb number to ascii
; sub #10 ,sp ; allocate a local buffer
; mov sp ,r1 ; point to it
; movb firqb+5 ,r0 ; KB number to convert
; movb #'K ,(r3)+ ; insert a header
; movb #'B ,(r3)+ ; simple
; deccvt r0,r1,#3 ; can't ever be more than 127
; mov r3 ,-(sp) ; saev the output pointer now
; mov #3 ,r0 ; three at most to copy over
;10$: cmpb @r1 ,#40 ; a space present ?
; beq 20$ ; yes, please ignore it
; movb @r1 ,(r3)+ ; copy it over at last
;20$: inc r1 ; next ch please
; sob r0 ,10$ ; simple
; movb #40 ,(r3)+ ; insert some spaces now
; movb #40 ,(r3)+ ; insert some spaces now
; movb #40 ,(r3)+ ; insert some spaces now
; movb #40 ,(r3)+ ; insert some spaces now
; mov (sp)+ ,r3 ; restore the old pointer
; add #5 ,r3 ; say we copied 5+2 characters over
; add #10 ,sp ; pop the local buffer and exit
; unsave <r1,r0> ; pop registers
; return
$clrxr: save <r0>
mov #xrb ,r0
10$: clr (r0)+
cmp r0 ,#xrb+14
blos 10$
unsave <r0>
return
$clrfq: save <r0>
mov #firqb ,r0
10$: clr (r0)+
cmp r0 ,#firqb+36
blos 10$
unsave <r0>
return
;.dosys: clrfqb ; clear the firqb out first
; movb #uu.sys ,firqb+fqfun ; do a systat call to RSTS
; movb 2(sp) ,firqb+4 ; job number to do it for
; movb 4(sp) ,firqb+5 ; which type (0 or 1)
; .uuo ; simple
; movb firqb ,r0 ; return with error code in r0
; return ; bye
.sbttl do the server C command for RSTS/E version 8
; 13-Apr-84 13:15:50 Brian Nelson
;
; input: @r5 address of command string
; 2(r5) LUN to send the output to, zero implies TT:
; output: r0 error code (rms or RSTS/E)
;
; Note: This is a very SIMPLE version of the code I wrote
; several years ago to do complete PK handling. In
; this version, we NEVER try to read anything from
; the users keyboard, nor do we EVER write anything
; to it since it is assumed that we are supporting
; the server host command packet stuff. Any attempt
; by the invoked CCL/DCL command to read input will
; cause the program (and job) to be aborted.
.iif ndf, corcom, corcom = 460
.psect pkbuff ,rw,lcl,rel,con,d
pkbuff: .blkb 200
pkbufp: .word 0
pkbufs: .word 0
jobnum: .word 0
.even
pkbsiz = 200
.sbttl the real work of sercmd
.psect $code
sercmd::clr pkbufs ; insure no data is left in buffer
mov #jfsys ,xrb+0 ; get temp privs back
.set ; simple to do
call openpk ; find an available PK
tst r0 ; perhaps we could not get one
bne 100$ ; r0 will have RSTS/E error code
call logv8 ; get logged in on the PK
tst r0 ; if it fails, it's the error code
bne 100$ ; oops
mov r1 ,jobnum ; save the jobnumber please
movb #'c&37 ,-(sp) ; no, force a control C
call putpk ; simple
mov #2 ,xrb+0 ; wait a moment
.sleep ; simple. any i/o will wake us up
5$: call getpk ; eat the result of the control C
tst r0 ; loop until eofeof error (11)
beq 5$ ; go back for more
mov #10 ,r1 ; wait for kmon
10$: mov jobnum ,-(sp) ; simple
call jobsts ; waiting for KB input now ?
tst r0 ; well?
bmi 15$ ; ok
mov #1 ,xrb+0 ; wait a moment
.sleep ; simple. any i/o will wake us up
sob r1 ,10$ ;
15$: mov @r5 ,-(sp) ; do it
call sendcmd ; ok
mov #10 ,xrb+0 ; wait a little while before checking
.sleep ; job status. any i/o will reset this
20$: call getpk ; now get the result of the command
tst r0 ; did it work ?
bne 30$ ; no, find out why then
call output ; dump the ch read to somewhere
br 40$
30$: mov jobnum ,-(sp) ; the job number
call jobsts ; find out what's happening here
tst r0 ; if ge, then it's just running
bmi 90$ ; it's waiting for input or all done
mov #1 ,xrb+0 ; if ok, take a one second nap
.sleep ; simple
40$: br 20$ ; try to get some more data now
90$: mov #377 ,r0 ; a fake error to return
100$: mov #jfsys ,xrb+0
.clear
call killpk
return
.sbttl where to put the output
output: tst 2(r5) ; the LUN to use
bne 10$ ; a disk
movb r1 ,-(sp) ; the terminal
mov sp ,r1 ; a pointer
print r1 ,#1 ; dump it
tst (sp)+ ; pop the buffer and exit
br 100$ ; bye
10$: movb r1 ,r0 ; rms output today
mov 2(r5) ,r1 ; the channel
call putcr0 ; simple to do
100$: return ; bye
pk.lun = 12.
openpk: mov r1 ,-(sp) ; save this one today
clr r1 ; start at PK0:
10$: clrfqb ; insure no defaults
movb #opnfq ,firqb+fqfun ; open the thing up now
movb #pk.lun*2,firqb+fqfil ; channel number times 2
movb r1 ,firqb+fqdevn ; device unit number please
movb #377 ,firqb+fqdevn+1 ; unit is for real here
mov #"PK ,firqb+fqdev ; device name also
calfip ; try to open it up
movb firqb ,r0 ; get the rsts error code if any
beq 100$ ; all is well
cmpb r0 ,#6 ; invalid device ?
beq 100$ ; yes exit with this error
inc r1 ; else try again
br 10$ ; next please
100$: mov (sp)+ ,r1 ; pop r1 and exit
return
.sbttl create a logged in job for the PK (version 8 only)
; Creates a job under the current account for the PK that's
; open on PK.LUN.
;
; returns: r0 rsts error code
; r1 created job number
logv8: movb #uu.sys ,firqb+fqfun ; get the user's default RTS please
clr firqb+4 ; current job, systat part 0
.uuo ; simple, can't fail either
mov firqb+26,-(sp) ; save the user's account number
mov firqb+32,-(sp) ; save the user's defkbm
mov firqb+30,-(sp) ; save the user's defkbm
clrfqb ; now get the kb number for the PK
movb #uu.fcb ,firqb+fqfun ; get the DDB returned for it
movb #pk.lun ,firqb+fqfun+1 ; channel number that we want
.uuo ; default to GET DDB info
movb firqb+14,-(sp) ; save it
asrb (sp) ; not times two please
clrfqb ; version 8, enter a run time system
mov #firqb+fqfun,r0 ; at the p.new entry point
movb #uu.job ,(r0)+ ; create a job function for fip
movb #20!100!200,(r0)+ ; create logged in @ defkbm always
movb (sp)+ ,(r0)+ ; kb number to attach to job
clr (r0)+ ; unused field
mov (sp)+ ,(r0)+ ; user's default run time system
mov (sp)+ ,(r0)+ ; both rad50 words please
clr (r0)+ ; unused field
mov (sp)+ ,@r0 ; account number also
bisb #40 ,firqb+4 ; set flag for account to login to
movb corcom ,-(sp) ; save this please
clrb corcom ; core common is also passed
.uuo ; try to create the job now
movb (sp)+ ,corcom ; restore first byte of core common
movb firqb+4 ,r1 ; created job number please
asr r1 ; but not times two
movb firqb ,r0 ; did it work?
bne 110$ ; no
tstb firqb ; huh
clc ; yes, flag success and exit
return ; bye
110$: sec ; job creation failed, exit
return ; set a flag and return
.sbttl pkread/write i/o for the pk
getpk: clrxrb ; clear xrb
tst pkbufs ; any buffered data left to get?
bne 10$ ; no
call 200$ ; reload the buffer please
tst r0 ; get anything ?
bne 100$ ; no, exit
10$: mov pkbufp ,r0 ; yes, get a pointer to the buffer
clr r1 ; avoid sign extension
bisb pkbuff(r0),r1 ; get the ch now
inc pkbufp ; advance the pointer for next time
dec pkbufs ; one less character left to get
clr r0 ; say it worked
100$: return ; bye
200$: clr pkbufp ; no data, clear buffer pointer
clrxrb ; no defaults
mov #pkbsiz ,xrb+xrlen ; as many as we can grab
mov #pkbuff ,xrb+xrloc ; buffer location
movb #pk.lun*2,xrb+xrci ; channel #
inc xrb+xrtime ; wait at most one second
.read ; read from pk
movb firqb ,r0 ; get any error codes
bne 210$ ; no
mov xrb+xrbc,pkbufs ; it worked, init the bytes left
210$: return ; back to work...
putpk: clrxrb ; no odd things please
inc xrb+xrlen ; one ch to do
mov sp ,xrb+xrloc ; buffer location
add #2 ,xrb+xrloc ; off by one
mov #1 ,xrb+xrbc ; byte count
movb #pk.lun*2,xrb+xrci ; channel #
mov #9. ,xrb+xrmod ; record 9%
.write ; write to pk
movb firqb ,r0 ; result
mov (sp)+ ,(sp) ; pop ch that we wrote
return ; back to work...
.sbttl pk utilities
sendcmd:mov r1 ,-(sp)
mov 4(sp) ,r1 ; command address to send to PK
10$: tstb @r1 ; done yet ?
beq 100$ ; yes, exit
movb (r1)+ ,-(sp) ; loop until a null is found
call putpk ; simple
br 10$ ; next please
100$: mov (sp)+ ,r1 ; pop register we used
mov (sp)+ ,(sp) ; pop address of string and exit
mov #cr ,-(sp) ; finish with a carriage return
call putpk ; simple
return
waitpk: clrxrb ; no odd things please
mov sp ,xrb+xrloc ; buffer location
movb #pk.lun*2,xrb+xrci ; channel #
mov #6. ,xrb+xrmod ; record 2+4
.write ; write to pk
tstb firqb ; result
beq 100$ ; it's ready for a command
cmpb firqb ,#28. ; need a control C?
beq 100$
sec ; it's not ready
return
100$: clc
return ; back to work...
killpk: clrxrb ; no odd things please
mov sp ,xrb+xrloc ; buffer location
movb #pk.lun*2,xrb+xrci ; channel #
mov #20 ,xrb+xrmod ; record 2+4
.write ; write to pk
clrfqb ; now close it up
movb #clsfq ,firqb+fqfun ; simple
movb #pk.lun*2,firqb+fqfil ; channel to do
calfip ; do it
return ; back to work...
.sbttl jobsts return status of the controlled job
; input: 2(sp) job number
; output: r0 < 0 then kb stall, 0 waiting for tt output, > 0 running
;
; This will be called to determine when the spawned job should
; be aborted.
;
; r0 = -2 the job is logged out, waiting for input or
; in a kmon wait
; r0 = -1 timeout
; r0 = 0 job is waiting for output to the PK
; r0 > 0 job is in a run state
.jbstat = 12
.jbwait = 14
.iif ndf, j2con ,j2con = 4
.iif ndf, j2nopr,j2nopr = 10000
.iif ndf, js.kb ,js.kb = 2
.iif ndf, js.tel,js.tel = 4000
jobsts: mov r1 ,-(sp) ; we may access these here
mov r2 ,-(sp) ; save these also
movb #uu.sys ,firqb+fqfun ; for looking up a job
movb 6(sp) ,firqb+fqfun+1 ; job number to do
movb #1 ,firqb+fqfun+2 ; part two to do please
.uuo ; do it
tstb firqb ; did it work ?
bne 90$ ; no, return abort please
bit #jfnopr ,firqb+6 ; logged in ?
bne 90$ ; no, return abort then
mov firqb+.jbstat,r1 ; get the current jbstat word
mov firqb+.jbwait,r2 ; get the current jbwait word
com r1 ; and get the and of the two
bic r1 ,r2 ; if result <> 0 then job is
bne 10$ ; running ok
bit #js.kb ,firqb+.jbwait ; not running, stalled for kb input?
bne 90$ ; yes, abort the job then
bit #js.tel ,firqb+.jbwait ; waiting for tt output
bne 80$ ; yes
10$: mov firqb+34,xrb+0 ; no, check the elapsed time please
add #j2con ,xrb+0 ; simple
.peek ; do it
tstb firqb ; did that work ?
bne 90$ ; no, die
cmp xrb+0 ,#300 ; allow three minutes at most
bhis 95$ ; no, die
mov #1 ,r0 ; all is well, exit
br 100$
80$: clr r0 ; job is waiting on tt output
br 100$ ; bye
90$: mov #-2 ,r0 ; waiting on KB or logged out
br 100$ ; bye
95$: mov #-1 ,r0 ; timeout
br 100$ ; exit
100$: mov (sp)+ ,r2 ; exit
mov (sp)+ ,r1
mov (sp)+ ,(sp) ; pop parameter and exit
return
.iif ndf , UU.CHK, UU.CHK = 40
.iif ndf , UU.PRV, UU.PRV = 34
.iif ndf , NOSUCH, NOSUCH = 5
.iif ndf , NOTAVL, NOTAVL = 10
.iif ndf , PRVIOL, PRVIOL = 12
.iif ndf , QUOTA , QUOTA = 105
.sbttl LOGIN Login from a remote server command
; LOGIN 24-Sep-85 10:01:33 Brian Nelson (V9.x and later only)
; Added on Edit 2.36
;
;
; Passed: 0(r5) Address (asciz) of PPN to log into
; 2(r5) Address (asciz) of password
; 4(r5) Address of where to return informative messages
; Return: R0 Zero for success, else the error code.
.enabl lsb
login:: save <r1,r2> ; save work regs
call dolin ; try to switch
tst r0 ; successful ?
beq 100$ ; yes
clr r1 ; no, Reply with a reasonable error
10$: tstb 200$(r1) ; end of the list
beq 20$ ; yes, use a catchall error
cmpb 200$(r1),r0 ; find the error yet ?
beq 20$ ; yes
inc r1 ; no
br 10$ ; next please
20$: asl r1 ; times two for word addressing
mov r0 ,-(sp) ; save the error code
strcpy 4(r5),210$(r1) ; simple
mov (sp)+ ,r0 ; restore the error code
100$: unsave <r2,r1> ; exit
return ; and exit
.save
.psect $PDATA ,D
200$: .byte NOSUCH,NOTAVL,PRVIOL,QUOTA,0
.even
210$: .word 220$ ,230$ ,240$ ,250$ ,220$
220$: .asciz /Invalid password or account, or system password needed/
230$: .asciz /Expired, non-interactive or non-dialup account/
240$: .asciz /WACNT privilege needed for REMOTE LOGIN/
250$: .asciz /Some quota is exceeded/
.even
.restore
.dsabl lsb
.sbttl really do the login now
; DOLIN:
;
; Passed: 0(r5) Address of the PPN (.asciz) to log into
; 2(r5) Address of the password (.asciz) to log into
;
; Return: r0 = 0 for success
; r0 <> 0 with RSTS/E error code
dolin: sub #10 ,sp ; allocate a buffer for use here
mov #WACNT ,-(sp) ; check to see if we have WACNT priv
call chkprv ; do it
tst r0 ; do we have WACNT privilege ?
beq 90$ ; no
clrxrb ; yes, continue on by clearing the
clrfqb ; XRB and FIRQB
movb #UU.SWP ,FIRQB+FQFUN ; To find out the physical name of
movb #2 ,FIRQB+FQFIL ; the system disk we will call the
movb #377 ,FIRQB+5 ; exec to find out the name of swap
.UUO ; file 2, which is always on _SY0:
mov FIRQB+FQDEV,(sp) ; Also, no privilege is needed.
mov FIRQB+FQDEVN,2(sp) ; copy the device name and unit flags
clrfqb ; clear things out again to do a .FSS
mov @r5 ,r0 ; on the passed PPN to convert it to
10$: tstb (r0)+ ; the proper format.
bne 10$ ; Find the length of the string
sub @r5 ,r0 ; end of it, subtract starting address
dec r0 ; and correct for autoincrement
mov r0 ,XRB+0 ; stuff the string length
mov r0 ,XRB+2 ; again
mov @r5 ,XRB+4 ; and the buffer address
.FSS ; call the exec
movb FIRQB ,r0 ; Did this work
bne 100$ ; If not, must be a invalid PPN format
mov FIRQB+FQPPN,4(sp) ; Save the parsed PPN please
movb #UU.LIN ,FIRQB+3 ; Finally, do a password check on the
movb #1+<2*1>,FIRQB+5 ; desired account to log into.
mov #FIRQB+FQNAM1,r1 ; This presumes version 9.x, using
mov 2(r5) ,r0 ; ascii passwords.
20$: movb (r0)+ ,(r1)+ ; copy the password over to the FIRQB
bne 20$ ; not yet done
mov (sp) ,FIRQB+FQDEV ; Lastly, restore the system disk name
mov 2(sp) ,FIRQB+FQDEVN ; unit number and units flags.
.UUO ; Finally call the exec to check it.
movb FIRQB ,r0 ; But did the passwords match ?
bne 100$ ; No, exit on error then
clrfqb ; Next, we must log out to be able to
incb FIRQB+4 ; Must NOT close i/o channels up.
movb #UU.BYE ,FIRQB+FQFUN ; log back in again (Remember, we need
.UUO ; WACNT to avoid self kill by the exec)
movb FIRQB ,r0 ; Did this work ?
bne 100$ ; no, exit please
cmp FIRQB+4 ,#-1 ; Did the logout succeed ?
beq 80$ ; no (quota exceeded)
clrfqb ; Clear the FIRQB one last time
movb #UU.LIN ,FIRQB+FQFUN ; Login function for .UUO
movb #10*1 ,FIRQB+5 ; We can skip the password check as we
mov 4(sp) ,FIRQB+FQPPN ; already checked and we needed WACNT
.UUO ; at LAST .....
movb FIRQB ,r0 ; save and exit
bne 100$ ; ....
call setprv ; set authorized privileges up
clr r0 ; it's ok
br 100$ ; exit
80$: mov #QUOTA ,r0 ; UU.BYE failed due to a quota
br 100$
90$: mov #PRVIOL ,r0 ; No WACNT--> protection violation
100$: add #10 ,sp ; pop buffer and exit
return
.save
.psect $PDATA ,D
wacnt: .asciz /WACNT/
exqta: .asciz /EXQTA/
.even
.restore
.sbttl detach the server
detach::clrfqb ; insure no defaults
movb #UU.SYS ,FIRQB+FQFUN ; do a systat and get the kb number
.UUO ; simple to do
movb FIRQB+5 ,r1 ; save the kb number
clrfqb ; insure no defaults
movb #clsfq ,FIRQB+FQFUN ; insure KB: is detached
movb #5*2 ,FIRQB+FQFUN+1 ; the lun for it
CALFIP ; do it, skip any error codes
clrfqb
movb #UU.DET ,FIRQB+FQFUN ; the uuo detach code
movb #200 ,FIRQB+FQFUN+1 ; close all luns for KB:
.UUO ; simple to do
movb FIRQB ,r0 ; return any errors
bne 100$ ; yep
mov #1 ,xrb+0
.sleep
clrfqb ; now spawn a job attached
mov #FIRQB+FQFUN,r0 ; to our old kb
movb #UU.JOB ,(r0)+ ; create a job exec call
movb #20!100!200,(r0)+ ; into def kbm, no logins is ok
movb r1 ,@r0 ; the kb number to attach to
bne 10$ ; not KB0:
movb #200 ,@r0 ; KB0:, must set flag for it
10$: .UUO ; simple to do, ignore errors
clr r0 ; return success
100$: return
.sbttl check for AUTHOURIZED priv
; This is again different from CHKPRV, which checks for
; CURRENT priv, and JOBPRV, which checks for JOB priv as in
; SET JOB/[NO]PRIV. This one goes out to disk and gets the
; AUTHORIZED priv mask and checks for the passed priv.
;
; Passed: 2(sp) Name of priv to check, upper case please
; Return: R0 1 for success or pre 9.x, zero for no priv
;
; Example:
;
; mov #HWCFG ,-(sp)
; call JOBPRV
; tst r0
; beq error
;
;
; hwcfg:.asciz /HWCFG/
; .even
authpr::mov r1 ,-(sp) ; /41/ Save a register
mov r2 ,-(sp) ; /41/ ... save another one
sub #10 ,sp ; /41/ temp save area
mov #1 ,r2 ; /41/ Assume success
tst ver9.x ; /41/ version nine or later?
beq 100$ ; /41/ no, return( success )
clrfqb ; /41/ Clear firqb out
mov #FIRQB+FQFUN,r1 ; /41/ Read authorized priv mask
movb #UU.ATR ,(r1)+ ; /41/ Function to perform
movb #377 ,(r1)+ ; /41/ Read function
movb #2 ,(r1)+ ; /41/ Read AUTHORIZED priv mask
.UUO ; /41/ Go to it
mov #FIRQB+12,r0 ; /41/ Where the priv mask is
mov sp ,r1 ; /41/ Where to save it
mov (r0)+ ,(r1)+ ; /41/ Save it please
mov (r0)+ ,(r1)+ ; /41/ .Save it please
mov (r0)+ ,(r1)+ ; /41/ ..Save it please
mov (r0)+ ,(r1)+ ; /41/ ...Save it please
clrfqb ; /41/ clear firqb out
mov #FIRQB+FQFUN,r0 ; /41
movb #UU.CHK ,(r0)+ ; /41/ Convert priv name to bitmask
inc (r0)+ ; /41/ Subfunbction code = 1
tst (r0)+ ; /41/ skip this field
mov 2+14(sp),r1 ; /41/ copy the priv over
10$: movb (r1)+ ,(r0)+ ; /41/ copy the asciz name over
bne 10$ ; /41/ simple
.UUO ; /41/ convert NAME to MASK
mov sp ,r1 ; /41/ point back to save area
mov #FIRQB+FQNAM1,r0 ; /41/ Where the bit pattern is
mov #4 ,r2 ; /41/ Four words to check
20$: bit (r0)+ ,(r1)+ ; /41/ Any bit(s) set here ?
bne 30$ ; /41/ Yes, we have it
sob r2 ,20$ ; /41/ No, keep looking
br 90$ ; /41/ Failure
30$: mov #1 ,r2 ; /41/ Flag we have it
br 100$ ; /41/ exit
90$: clr r2 ; /41/ failure
100$: mov r2 ,r0 ; /41/ Return the status now
add #10 ,sp ; /41/ Pop buffer
mov (sp)+ ,r2 ; /41/ ...Pop a register
mov (sp)+ ,r1 ; /41/ Pop a register
mov (sp)+ ,(sp) ; /41/ Pop over the parameter
return ; /41/ At last
.sbttl Logout
; LOGOUT
;
; Logout from the RSTS/E host from the server
;
; Rewritten 3.45 11-Feb-86 15:25:17 BDN for version 9.x
;
; Check quotas, if ok, drop the line and logout
logout::save <r0,r1,r2> ; /45/ Save registers
clr r2 ; /45/ Preset EXQTA priv flag
tst ver9.x ; /45/ Version nine or later
beq 50$ ; /45/ No, skip the quota check
mov #exqta ,-(sp) ; /45/ V9, see if we have EXQTA
call chkprv ; /45/ ...
mov r0 ,r2 ; /45/ Save the flag
bne 10$ ; /45/ EXQTA, skip quota checks
;
clrfqb ; /45/ Ensure FIRQB is cleared out
movb #UU.ATR ,FIRQB+FQFUN ; /45/ Do some quota checks
decb FIRQB+4 ; /45/ Read account attributes
incb FIRQB+5 ; /45/ We want quota data
.UUO ; /45/ Get the data
tstb FIRQB ; /45/ Did this work ?
bne 50$ ; /45/ No, just log out then
cmpb FIRQB+21,FIRQB+17 ; /45/ Is MSB of quota OK ?
bhi 100$ ; /45/ No, exit
cmp FIRQB+24,FIRQB+12 ; /45/ Is current usage < outquota?
bhi 100$ ; /45/ No
;
10$: clrfqb ; /45/ Yes, get keyboard number
movb #UU.SYS ,FIRQB+FQFUN ; /45/ UU.SYS part 0
.UUO ; /45/ We have it now
movb FIRQB+5 ,r1 ; /45/ Save it
bitb #200 ,r1 ; /45/ Detached?
bne 50$ ; /45/ Yes, skip hangup
clrfqb ; /45/ Get set to disconnect line
movb #UU.HNG ,FIRQB+FQFUN ; /45/ At last....
movb r1 ,FIRQB+4 ; /45/ Line to do it to
incb FIRQB+5 ; /45/ Do it quickly (1 second)
.UUO ; /45/ Drop the line, now log out
;
50$: clrfqb ; /45/ Clear FIRQB out
movb #UU.BYE ,FIRQB+FQFUN ; /45/ Log out now
tst r2 ; /45/ Version 9 and EXQTA ?
beq 60$ ; /45/ No
movb #2 ,FIRQB+4 ; /45/ Yes, bypass quota checks
60$: .UUO ; /45/ Call the EXEC
cmp FIRQB+4 ,#-1 ; /45/ Are we logged out ?
beq 100$ ; /45/ No
call exit ; /45/ Yes, exit please (never happen)
100$: unsave <r2,r1,r0> ; /45/ Pop registers
return ; /45/ Quota must be exceeded
.sbttl Check current quotas to see if UU.BYE will succeed
quochk::tst ver9.x ; /45/ Version nine or later
beq 30$ ; /45/ No, skip the quota check
mov #exqta ,-(sp) ; /45/ V9, see if we have EXQTA
call chkprv ; /45/ ...
tst r0 ; /45/ Save the flag
beq 10$ ; /45/ No EXQTA, do quota checks
clr r0 ; /45/ EXQTA, return(success)
br 100$ ; /45/ Exit
;
10$: clr r0 ; /45/ Assume SUCCESS
clrfqb ; /45/ Ensure FIRQB is cleared out
movb #UU.ATR ,FIRQB+FQFUN ; /45/ Do some quota checks
decb FIRQB+4 ; /45/ Read account attributes
incb FIRQB+5 ; /45/ We want quota data
.UUO ; /45/ Get the data
tstb FIRQB ; /45/ Did this work ?
bne 100$ ; /45/ No, just return(success)
cmpb FIRQB+21,FIRQB+17 ; /45/ Is MSB of quota OK ?
bhi 20$ ; /45/ No, exit
cmp FIRQB+24,FIRQB+12 ; /45/ Is current usage < outquota?
blos 100$ ; /45/ Yes
20$: mov sp ,r0 ; /45/ No, return(nonzero)
br 100$ ; /45/ Exit
30$: clrfqb ; /45/ Pre version 9 code
movb #UU.RAD ,FIRQB+FQFUN ; /45/ rad accounting data please
.UUO ; /45/ simple
clr r0 ; /45/ assume success
tstb FIRQB ; /45/ did it work ?
bne 100$ ; /45/ no
tst FIRQB+34 ; /45/ unlimited quota here ?
beq 100$ ; /45/ yes
cmp FIRQB+6,FIRQB+34 ; /45/ is used > allowed ?
blos 100$ ; /45/ quota is ok
mov sp ,r0 ; /45/ quota is not ok, flag it
100$: return ; /45/ Return to caller
.sbttl Return disk space usage
; D S K U S E
;
; input: @r5 address of string to return the usage
.enabl lsb
dskuse::save <r0,r1>
clrfqb ; clear FIRQB out
movb #UU.RAD ,FIRQB+FQFUN ; uuo function, read accounting data
.UUO ; do it
mov @r5 ,r1 ; point to the output string
copyz #120$ ,r1 ; copy a header over please
strlen r1 ; get the current length
add r0 ,r1 ; point to the end of the string
deccvt <FIRQB+6>,r1,#6 ; and convert used to string
add #6 ,r1 ; point to the end again
copyz #130$ ,r1 ; copy some more stuff
strlen r1 ; get the count of chars we copied
add r0 ,r1 ; point to the end of the string
mov FIRQB+34,r0 ; get the quota
bne 10$ ; not unlimited
copyz #140$ ,r1 ; unlimited, say so
br 20$
10$: sub FIRQB+6 ,r0 ; and get the free space
deccvt r0 ,r1 ; copy the free space over now
clrb 6(r1) ; make the string .asciz
20$: unsave <r1,r0>
return ; bye
.save
.psect $PDATA ,D
120$: .asciz /SY: Space used /
130$: .asciz / Space free /
140$: .asciz / Unlimited/
.even
.restore
.dsabl lsb
.end