!*********************************************************************** !* !* User monitoring package !* !* Copyright (C) R.D. Eager University of Kent MCMLXXXIII !* !*********************************************************************** ! ! !*********************************************************************** !* !* Constants !* !*********************************************************************** ! constantinteger no = 0, yes = 1 constantinteger topaa = 999 constantintegerarray uar(0:3) = c x'06baadbc', x'bccecf07', x'b0afbaad', x'b3b0b8ff' ! ! !*********************************************************************** !* !* Record and array formats !* !*********************************************************************** ! recordformat hf(integer dataend,datastart,filesize,filetype,sum, datetime,format,records) recordformat idf((string (6) user,string (8) date,string (35) s) or c (byteinteger nl,string (5) dum1,byteinteger sp, string (7) dum2,byteinteger sp1,string (34) dum3)) recordformat rf(integer conad,filetype,datastart,dataend) recordformat uf(record (idf) id,(string (3) n or c byteinteger sp,sp1,sp2,sp3)) ! ownrecord (uf)arrayformat aaf(0:topaa) ! ! !*********************************************************************** !* !* Subsystem references !* !*********************************************************************** ! systemroutinespec connect(string (31) file,integer mode,hole, prot,record (rf)name r,integername flag) externalstringfunctionspec date systemroutinespec disconnect(string (31) file,integername flag) externalstringfunctionspec uinfs(integer entry) ! ! !*********************************************************************** !* !* Service routines !* !*********************************************************************** ! stringfunction unscramble(integer adr) integer len ! Encrypts or decrypts the string at 'adr'. record (string (11) s or integer a,b,c) r ! r = 0 r_s <- string(adr) len = length(r_s) r_a = r_a !! (-1) r_b = r_b !! (-1) r_c = r_c !! (-1) length(r_s) = len result = r_s end ; ! of unscramble ! !----------------------------------------------------------------------- ! integerfunction scomp(stringname s1,s2,integer len) ! Comparison from addr(s1)+1, addr(s2)+1 for 'len' bytes. ! 0 if equal ! 1 if not equal integer i,len1,len2 ! len1 = length(s1) len2 = length(s2) length(s1) = len length(s2) = len ! if s1 = s2 then i = 0 else i = 1 ! length(s1) = len1 length(s2) = len2 result = i end ; ! of scomp ! !----------------------------------------------------------------------- ! routine inc(stringname s) integer i,carry,ch ! i = 3 carry = 1 while i > 0 cycle ch = charno(s,i) ch = ch + carry if ch > '9' then start ch = '0' carry = 1 finish else carry = 0 charno(s,i) = ch i = i - 1 repeat end ; ! of inc ! ! !*********************************************************************** !* !* M O N !* !*********************************************************************** ! systemroutine mon(string (255) s) integer found,n,offset,max,size,idsize,flag string (6) user string (8) xdate string (11) file record (idf) id record (rf) rr record (uf) dum record (uf)arrayname aa record (hf)name h ! size = sizeof(dum) idsize = sizeof(id) user = unscramble(addr(uar(0))) file = unscramble(addr(uar(0))+7) ! connect(user.".".file,11,0,0,rr,flag); ! Write shared return if flag # 0 ! s = s." " while length(s) < 35 length(s) = 35 if length(s) > 35 id_user = uinfs(1) id_date = date id_s = s id_nl = nl id_sp = ' ' id_sp1 = ' ' ! h == record(rr_conad) aa == array(rr_conad+rr_datastart,aaf) offset = h_dataend - 1 max = (offset-h_datastart)//size - 1 ! n = max found = 0 xdate = date while n>=0 and scomp(aa(n)_id_date,xdate,8) = 0 cycle if scomp(id_user,aa(n)_id_user,idsize-1) = 0 then start found = yes inc(aa(n)_n) exit finish n = n - 1 repeat ! if found = no and h_filesize - h_dataend > size + 1 then start h_dataend = h_dataend + size byteinteger(rr_conad+h_dataend-1) = nl max = max + 1 aa(max)_id = id aa(max)_n = "001" aa(max)_sp = ' ' finish ! disconnect(user.".".file,flag) end ; ! of operlog endoffile