%include "RWho.Inc" %include "C_Strings.Inc" %include "U_DateTIme.Inc" %constinteger down threshold = 60 * 4 %constinteger buc = 5 %recordformat desc fm(%integer l, a) %recordformat addr lims fm(%integer start, finish) %systemintegerfnspec mgblsc(%record(addr lims fm)%name inadr, retadr, %integer acmode, flags, %record(desc fm)%name name, %integer ident, relpag) %constinteger SEC gbl = 16_00000001 !constinteger SEC crf = 16_00000002 %constinteger SEC dzro = 16_00000004 %constinteger SEC wrt = 16_00000008 !constinteger SEC perm = 16_00004000 %constinteger SEC sysgbl = 16_00008000 !constinteger SEC pfnmap = 16_00010000 %constinteger SEC expreg = 16_00020000 %constinteger SEC pagfil = 16_00080000 %systemroutinespec exit(%integer reason) %externalpredicatespec CLI present(%string(127) label) %owninteger by user = 0 %externalroutinespec dump(%bytename start, %integer bytes) %ownrecord(rwho tables fm)%name rwho tables == 0 %routine map section %record(addr lims fm) a = 0 %record(desc fm) d %integer status d_l = length(rwho tables name); d_a = addr(rwho tables name) + 1 status = mgblsc(a, a, 0, SEC sysgbl ! SEC expreg, d, 0, 0) exit(status) %if status & 1 = 0 !! printstring("Section at "); phex(a_start) !! printstring(" .. "); phex(a_finish); newline rwho tables == record(a_start) %end !! %routine display packet(%record(rwho fm)%name rwho) !! %record(rwho user fm)%name U !! %string(63) s !! %integer i !! printstring("Sent at ") !! printstring(UNIX datetime(rwho_send time)) !! printstring(" from "); printstring(s) !! printstring(", users "); write(rwho_n users, 0) !! printstring(", up since ") !! printstring(UNIX datetime(rwho_boot time)) !! newline !! %for i = 1, 1, rwho_n users %cycle !! U == rwho_u(i) !! C to Imp(U_username(1), s); length(s) = 8 %if length(s) > 8 !! printstring(s); spaces(11 - length(s)) !! printstring(" on ") !! C to Imp(U_terminal(1), s) !! printstring(s); spaces(11 - length(s)) !! printstring(" at "); printstring(UNIX datetime(u_logon time)) !! printstring(", idle "); phex(u_idle time) !! newline !! %repeat !! %end %recordformat node fm(%string(47) a, b, %record(node fm)%name l, r) %ownrecord(node fm)%name tree == 0 %integerfn compare(%string(*)%name a, b) %integer l, m, p, q, d, i l = length(a); m = length(b) i = 1 %while l > 0 %and m > 0 %cycle p = charno(a, i); q = charno(b, i) p = p - 'A' + 'a' %if 'A' <= p <= 'Z' q = q - 'A' + 'a' %if 'A' <= q <= 'Z' d = p - q %result = d %if d # 0 l = l - 1; m = m - 1 i = i + 1 %repeat %result = length(a) - length(b) %end %routine add one(%string(47) a, b) %record(node fm)%name n == nil, p %integer c !! printstring("Add "); printstring(a); spaces(11 - length(a)) !! printstring(b); newline n == new(n) n_a = a; n_b = b n_l == nil; n_r == nil %if tree == nil %start tree == n %return %finish p == tree %cycle c = compare(a, p_a) %if c < 0 %or (c = 0 %and compare(b, p_b) < 0) %start %if p_l == nil %start p_l == n %return %else p == p_l %finish %else %if p_r == nil %start p_r == n %return %else p == p_r %finish %finish %repeat %end %owninteger col = 0 %routine print tree(%record(node fm)%name n) %ownstring(15) last user = "", last host = "" %return %if n == nil print tree(n_l) %if by user = 0 %start ! By host %if n_a # last host %start newline %if col & 7 # 0 newline last host = n_a printstring(last host); print symbol(':') newline col = 0 %finish printstring(n_b) col = col + 1 %if col & 7 = 0 %then newline %else spaces(9 - length(n_b)) %else printstring(n_a); print symbol(':') printstring(n_b) col = col + 1 %if rem(col, buc) = 0 %then newline %c %else spaces(15 - length(n_a) - length(n_b)) %finish print tree(n_r) %end %owninteger dead = 0 %routine add users(%record(rwho fm)%name rwho) %record(rwho user fm)%name U %string(255) user, host %integer i %return %if dead = 0 %and local UNIX timestamp - rwho_receive time > down threshold C to Imp(rwho_hostname(1), host); length(host) = 32 %if length(host) > 32 %for i = 1, 1, rwho_n users %cycle U == rwho_u(i) C to Imp(U_username(1), user); length(user) = 8 %if length(user) > 8 %if by user = 0 %then add one(host, user) %c %else add one(user, host) %repeat %end %begin %record(rwho fm)%name r %integer i by user = 1 %unless CLI present("BY_HOST") dead = 1 %if CLI present("DEAD") map section %for i = 1, 1, rwho slots %cycle r == rwho tables_r(i) %exit %if r_hostname(1) = 0 !! display packet(r) add users(r) %repeat print tree(tree) newline %if col & 7 # 0 %end %of %program