1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-15 12:26:27 +00:00

Added inquir; inqexm and inqrep. Created links for ts inqchk and

ts inqpat.  Resolves #1260.
This commit is contained in:
Eric Swenson
2018-10-06 13:29:23 -07:00
parent a92bc9d8da
commit 1f2856de63
3 changed files with 1649 additions and 0 deletions

1113
src/inquir/inqexm.101 Executable file

File diff suppressed because it is too large Load Diff

529
src/inquir/inqrep.32 Executable file
View File

@@ -0,0 +1,529 @@
;-*- Mode:MIDAS -*-
title Reap the INQUIR data base.
;;; This program is used to reap the Inquire data base.
;;; Each group has its own grace period. --- 12/9/81 by CStacy.
;; Default groups:
;; TOURISTS: T,S,K
;; GUESTS: N,$,E
;; Regular users not included above: A,C,D,L,H,M,P,U,X,Z,+,@,O
;To use INQREP, run it and type G (for Generate) at it.
;It will write a preliminary list as INQUIR;REAP GEN.
;Then run INQREP again and type F (for Filter) at it.
;This will filter out some names and write INQUIR;REAP FILTRD.
;Copy that file to INQUIR;REAP GEN on some other machine.
;Run INQREP there and type F at it.
;This will filter out more names and write INQUIR;REAP FILTRD on that machine.
;Keep copying REAP FILTRD to REAP GEN on another machine and doing INQREP F
;there until a filter has been done on each machine.
;Then read in INQUIR;REAP FILTRD, examine the names, remove any that really
;ought to be preserved (setting their authorizations to other than * so that
;they will not be offered for reaping again.
;Then write it out as INQUIR;REAP DELETE, run INQREP and type D (for Delete) at it
;to delete all the names remaining on the list.
subttl Basic Definitions
x=0
a=1
b=2
c=3
d=4
e=5
g=6
h=7
i=10
j=11
bp=12
t=13
tt=14
p=17
lsrch==1 ;Inquire mapping channel.
dski==2 ;Disk input channel.
dsko==3 ;Disk output channel.
ttyi==5 ;TTY typein channel.
ttyo==6 ;TTY typeout channel.
lpdl==100
define syscal op,args
.call [setz ? sixbit/op/ ? args ((setz))]
termin
argi==1000
val==2000
errret==3000
cnt==4000
cnti==5000
call=pushj p,
ret=popj p,
save==push p,
rest==pop p,
define type ch,&string
movei t,<.length string>
move tt,[440700,,[ascii string]]
syscal siot,[argi,,ch ? tt ? t]
.lose %lsfil
termin
define terpri ch
.iot ch,[^M]
.iot ch,[^J]
termin
define upasc chr
cail chr,140
subi chr,40
termin
datime"$$in==1 ;Routine to turn ascii date-time into standard form.
datime"$$abs==1 ;Routines to convert disk format dates to absolute days.
datime"$$out==1
.insrt syseng;datime
lsrtns"$$ovly==0 ;Map entire LSR file into core at once.
lsrtns"$$ulnm==0 ;Don't assemble some things we don't need.
lsrtns"$$ulnp==0
lsrtns"$$unam==0
.insrt syseng;lsrtns
go: move p,[-lpdl,,pdl] ;Init the stack.
syscal open,[cnti,,.uao+%tjdis ;Dpy TTY output.
argi,,ttyo ? [sixbit /TTY/]]
.lose %lsfil
syscal open,[cnti,,.uai ;TTY input.
argi,,ttyi ? [sixbit /TTY/]]
.lose %lsfil
type ttyo,/A(G)enerate, (F)ilter, or (D)elete ?/
.iot ttyi,d ;Ask what she wants.
upasc d
cain d,"G ;Gonna do a Generate?
jrst gen
cain d,"F ;Gonna do a Filter?
jrst filter
cain d,"D ;Gonna do a Delete?
jrst delete
type ttyo,/AI dont know how to do that to an Inquire database!/
.logout 1, ;maybe discourage total losers.
subttl Generate
;; The Generate operation writes a list of all users who we should consider
;; for reaping into INQUIR;REAP GEN. This is the file to be Filtered.
gen: type ttyo,/AShall I reap tourists?/
.iot ttyi,d
upasc d
cain d,"Y
setom reaptf
type ttyo,/AShall I reap people in group {N,E,$}?/
.iot ttyi,d
upasc d
cain d,"Y
setom reapnf
type ttyo,/AShall I reap lab people also?/
.iot ttyi,d
upasc d
cain d,"Y
setom reaplf
syscal open,[cnti,,.uao ? argi,,dsko
[sixbit /DSK/] ;Open the output file.
[sixbit /REAP/]
[sixbit /GEN/]
[sixbit /INQUIR/]]
.lose %lsfil
movei a,lsrch ;Try to map in LSR1 on this channel.
move b,[-lsrpgs,,lsrpag] ;Place to put data.
call lsrtns"lsrmap
.value [asciz /:FOO! Unable to map in Inquire database./]
movei b,lsrpag*2000
add b,lsrtns"hdrdta+lsrpag*2000
;; See if we are are going to even consider reaping the next Inquire entry.
genlup: movei a,lsrtns"i$grp ;Item number of <group> into A.
call lsrtns"lsritm ;Try to get this entry's group.
jrst randm ;No group = tourist.
ildb g,a ;Group letter into G.
jrst randm
reapT: move a,reaptf
skipe a, ;If we are reaping tourists
jrst [ move bp,[440700,,grpa] ;use group A.
call tryg
jumpn cnsidr,randm
jrst reapN ]
reapN: move a,reapnf
skipe a, ;If we are reaping other guests
jrst [ move bp,[440700,,grpb] ;use group B.
call tryg
jumpn cnsidr,randm
jrst reapL ]
reapL: move a,reaplf
skipe a, ;If we are reaping lab people
jrst randm1 ;consider any remaining group.
randm: movei a,lsrtns"i$auth
call lsrtns"lsritm ;Get the Auth for this entry.
jrst randm1 ;Consider null authorizations, (if they exist!)
ildb a,a
cnsaut: caie a,"* ;If Auth is not "*", dont consider.
jrst gennxt
randm1: movei a,lsrtns"i$uname ;Ok, consider him. Output his uname to the file.
aos kcnsid ;Keep count just for laughs.
call lsrtns"lsritm
jrst gennxt
call itmsix ;Get it as sixbit in A. G still has group.
call wrlin
gennxt: hlrz a,(b) ;Advance to next LSR entry.
add b,a
hlrz a,(b)
jumpn a,genlup ;next entry is zero-length => we've reached the end.
done: .close dsko,
skipe debug ;Dont :KILL if we are not debugging.
jrst [ type ttyo,/AAll Done./
.logout 1,]
.value [asciz /:Done./]
;See if an entry is part of the set under consideration.
tryg: setzm cnsidr ;Flag saying we should consider this entry.
ildb c,bp ;Get a letter from the group-set.
jumpe c,cpopj ;If no more letters, return.
came g,c ;Maybe this entry should be considered.
jrst tryg ;On the other hand, maybe not.
setom cnsidr ;Then again,...
ret
;Read the asciz string off the b.p. in A and return as sixbit in A.
itmsix: setz h,
move d,[440600,,h]
itmsi1: ildb c,a ;Get the uname of this entry as sixbit in A.
jumpe c,itmsi2
cail c,140
subi c,40
tlnn d,770000 ;Don't gobble more than six characters.
jrst itmsi1
subi c,40
idpb c,d
jrst itmsi1
itmsi2: move a,h
ret
subttl Filter
;; The Filter operation reads in INQUIR;REAP GEN and writes INQUIR;REAP FILTRD.
;; Each name in the input file is written in the output file unless
;; that name has logged in on this machine within the grace period specified
;; for his group, or has a directory on this machine.
filter: call timmap
syscal rqdate,[val,,now]
.lose %lssys
syscal open,[cnti,,.uai ? argi,,dski
[sixbit /DSK/]
[sixbit /REAP/]
[sixbit /GEN/]
[sixbit /INQUIR/]]
.lose %lsfil
syscal open,[cnti,,.uao ? argi,,dsko
[sixbit /DSK/]
[sixbit /REAP/]
[sixbit /FILTRD/]
[sixbit /INQUIR/]]
.lose %lsfil
fillup: call rdlin ;Read in the next uname in A and group in G.
jrst done
syscal open,[cnti,,.bii ? argi,,lsrch
[sixbit /DSK/] ? [sixbit /.FILE./] ? [sixbit /(DIR)/] ? a]
caia
jrst fillup ;Filter out anyone who has a directory.
push p,a
call timsrc ;Look up his last logout time.
jrst filwrt ;No logout time remembered => certainly flush him.
move b,a
move a,now ;Found it => how many days ago was it?
call datime"timsub ;Subtract last logout time from current time.
idivi a,24.*60.*60. ;Convert seconds to days.
call getgra ;Get the correct grace period.
camg a,grace ;If it is recent enough, don't flush him.
jrst filnx1
filwrt: pop p,a ;If he is old enough, write him into the output file
call wrlin ;Just the same way he was read from it.
jrst fillup
filnx1: pop p,a
jrst fillup
;; Set GRACE to the value appropriate for this person, based on
;; on his Inquire group (in G).
getgra: move bp,[440700,,grpa] ;See if this group letter is in group A.
getgr1: ildb c,bp
jumpe c,getgr2
came g,c ;Match?
jrst getgr1
move t,grac.a
jrst gotgra
getgr2: move bp,[440700,,grpb] ;See if this group letter is in group B.
getgr3: ildb c,bp
skipn c,
jrst [ move t,grac.0 ;If not in A or B, use default value.
jrst gotgra]
came g,c ;Match?
jrst getgr1
move t,grac.a
gotgra: movem t,grace
ret
subttl Delete
;; The Delete operation reads INQUIR;REAP DELETE and deletes everyone on it.
delete: syscal open,[argi,,dski
[sixbit /DSK/]
[sixbit /REAP/]
[sixbit /DELETE/]
[sixbit /INQUIR/]]
.lose %lsfil
syscal open,[cnti,,.uao ? argi,,dsko
[sixbit /DSK/]
[sixbit /_INQREP/]
[sixbit /OUTPUT/]
[sixbit/.MAIL./]]
.lose %lsfil
call rdlin
jrst done
push p,a
type dsko,/From-Job:INQREP
From:RX"INQREP
To:(UPDATE-INQUIR ML)
To:(UPDATE-INQUIR DM)
To:(UPDATE-INQUIR MC)
Text;-1
/
jrst dellu1
dellup: call rdlin ;Read next user name into A.
jrst deldon
push p,a
dellu1: type dsko,/BEGIN:
SUNAME: /
pop p,a
call sixout
type dsko,/
UNAME:
ALTER: INQREP /
.rdate a,
call sixout
.iot dsko,["-]
.rtime a,
call sixout
type dsko,/
END:
/
jrst dellup
deldon: syscal renmwo,[argi,,dsko ? [sixbit/MAIL/] ? [sixbit />/]]
.lose %lsfil
.close dsko,
jrst done
;Read a line from dski in the form uname<tab>(group), and return the
;uname in sixbit in A and the group as a character in G.
rdlin: setz h,
move g,[440600,,h]
rdlin1: .iot dski,c
andi c,-1
cain c,^C
ret
cain c,^I
jrst rdlin2
cail c,140
subi c,40
tlnn g,770000 ;Don't gobble more than six characters.
jrst rdlin1
subi c,40
idpb c,g
jrst rdlin1
rdlin2: move a,h
.iot dski,g ;Skip the paren.
.iot dski,g ;Return the group char in g,
cain g,") ;but if we got a closeparen it means the group is null.
tdza g,g
.iot dski,c ;Otherwise, skip the closeparen.
.iot dski,c ;In any case, skip the CRLF.
.iot dski,c
aos (p)
ret
;wrlin writes the uname in A and the group in G to the output file.
wrlin: push p,b
call sixout
.iot dsko,[^I] ;After his name, put his group in parentheses.
.iot dsko,["(]
skipe g
.iot dsko,g
.iot dsko,[")]
.iot dsko,[^M] ;and then a CRLF, and go hack the next user.
.iot dsko,[^J]
pop p,b
ret
;Output the sixbit word in A. Clobbers B.
sixout: setz b,
rotc a,6
addi b,40
.iot dsko,b
jumpn a,sixout
cpopj: ret
;Output the asciz string which A points at. Clobbers B.
ascout: hrli a,440700
ascou1: ildb b,a
jumpe b,cpopj
.iot dsko,b
jrst ascou1
;Type the asciz string which A points at. Clobbers B.
asctyp: hrli a,440700
ascty1: ildb b,a
jumpe b,cpopj
.iot ttyo,b
jrst ascty1
;Map the LOGOUT TIMES file into core.
timmap: syscal open,[[.bai,,lsrch] ? ['DSK,,] ? ['LOGOUT] ? [sixbit/TIMES/] ? ['CHANNA]]
.lose %lsfil
syscal fillen,[%climm,,lsrch ? %clout,,a]
.lose %lsfil
cail a,timmax
.value [asciz /:LOGOUT TIMES file too long to fit!
:kill /]
movem a,timlen
addi a,1777
lsh a,-10.
movns a
hrlzs a
hrri a,timpag
syscal corblk,[%climm,,%cbred ? %climm,,%jself ? a ? %climm,,lsrch]
.lose %lssys
.close lsrch,
movei a,timdat
movem a,lstltm ;The first time we search logout times, start at beginning.
ret
;Given a uname in A in sixbit, return in A the last logout time of that uname.
;Skips if the last logout time is known.
timsrc: move c,[440700,,d]
move d,[ascii / /]
move e,[ascii/ /]
timsr1: setz b, ;First, convert uname to ascii in D and E.
rotc a,6
addi b,40
idpb b,c
jumpn a,timsr1
move a,lstltm
move b,timlen ;Now search through the logout times file
addi b,timdat ;for that uname.
timsr2: camn a,b ;Return non-skipping if we have exhausted the file.
ret
move c,1(a)
and c,[.byte 7 ? 177]
camn d,(a)
came e,c
jrst timsr3 ;This entry in file doesn't match => step.
movem a,lstltm
move d,[350700,,1] ;We found this uname => decode ascii date-time.
add d,a
aos (p)
jrst datime"asctwd
timsr3: move i,(a) ;Mismatch. Have we found a logout times entry
tlc i,400000 ;greater (in ascii order) than what we are looking for.
move j,d
tlc j,400000
camle j,i
jrst timsr4 ;No, 1st word searched for is less than 1st word found.
came j,i
jrst timsr5 ;Yes, 1st word searched for is greater
move i,c
move j,e ;1st words equal, so compare 2nd words.
tlc i,400000
tlc j,400000
camg j,i
jrst timsr5
timsr4: addi a,5 ;We haven't reached the desired entry yet => keep looking.
jrst timsr2
timsr5: movem a,lstltm ;Found an entry for a greater uname => we know there is none
ret ;for the one we are seardskig for.
subttl Data
kcnsid: 0 ;When Generating, number of entries found.
cnsidr: 0 ;Consider-reaping-this-entry-flag.
grace: 200. ;Flush someone after this many days of non-use.
grpa: asciz /TSK/ ;Tourists, Students, and Kollaborators
grac.a: 200. ;get reaped after seven months.
grpb: asciz /NE$/ ;Nonconsortium, EE, and Network people
grac.b: 728. ;get reaped after two years.
grac.0: 728. ;Lab people get reaped after two years.
reaptf: 0 ;reaping grp.a people flag
reapnf: 0 ;reaping grp.b people flag
reaplf: 0 ;reapding lab people flag
timlen: 0 ;length of LOGOUT TIMES file, in words.
now: 0 ;Current time and date in disk format.
lstltm: 0 ;Where to start seardskig the logout times file.
;We use the fact that both it and the LSR file are sorted.
timbfr: block 8
debug: -1
pdl: block lpdl
patch: pat:
block 40
patche: -1
variables
constants
.=<.+1777>/2000*2000
timdat: timpag==./2000 ;LOGOUT TIMES file mapped in here.
timmax==40.*2000
block timmax ;should be enough space.
lsrpag==./2000 ;INQUIR data base mapped in here.
lsrpgs==200.
ifg lsrpag+lsrpgs-400,.err address space overflow!
end go