RGERBER@NYBVX1.BITNET.UUCP (02/23/87)
I have taken the routine that Todd Warnock posted earlier today and fixed the problem with LAT terminals. There seems to be a problem if the terminal is not logged in or was enabled during a previous log in session. I would appreciate any fixes to my modifications. Also I made it so the program will temporarily enable CMKRNL so it can run properly. Robert Gerber Comtex Systems ---------- CUT HERE ----------------------------------------------------------- .title show_operators See what operators are enabled. .sbttl documentation ;+++ ; This routine diplays the enabled operators. Sorry that it's ; not well documented or clean, it was a quick hack. R. Wells ; ; AUTHORS: ; ; R. WELLS ; ; CREATION DATE: 10-OCT-1985 ; ; ; C H A N G E L O G ; ; Date | Name | Description ;---------------+-------+----------------------------------------------------- ; 10-OCT-1985 | WELLS | ORIGINAL RELEASE ;---------------+-------+----------------------------------------------------- ; 23-Feb-1987 | Gerber| Have the program enable CMKRNL temporarily so the ; | | number of funny results are reduced. ; | | Also get the UNIT number from the UCB instead of a ; | | local counter as units do not have to be contiguos! ;---------------+-------+----------------------------------------------------- ; ; BUILD: ; MACRO SHOWENABLED+SYS$LIBRARY:LIB/LIB ; LINK SHOWENABLED,SYS$SYSTEM:SYS.STB/SEL ; ; INVOKE: ; RUN SHOWENABLED ; ;--- .sbttl data_declarations .psect data, noexe $dcdef ; device class info $ucbdef ; unit control block info $ddbdef ; device data block info $prvdef ; define priv bits $devdef ; define device characteristic bits priv_mask: .long prv$m_cmkrnl ;We need CMKRNL priv's to do this .long 0 ; No privs from the second longword are needed bufsiz = 80 buffer: .blkw bufsiz bufdsc: .long bufsiz ; fao output buffer .address buffer faomsg1: .ascid /!%D Operator enabled on terminal !AC!ZW./ faomsg2: .ascid /!%D No operator terminals enabled./ maxops = 500 ; maximum number of ops ttname: .blkl maxops ; array of saved names ttunit: .blkb maxops ; array of saved units ttcnt: .long 0 ;++ ; ; ;-- .sbttl executable .psect code, exe,nowrt .entry main,^m<> $setprv_s #1,priv_mask ; We want to enable (for duration of process) ;the priv's specified by the mask (CMKRNL) cmpl R0,#SS$_Normal ;Did we do ok? beql priv_ok ; Yes, continue movl #SS$_NOPRIV,r0 ; No, Indicate so ret ; and return to VMS priv_ok: $cmkrnl_s routin=kernal1 movl ttcnt,r5 tstl r5 beql no_operators moval ttname,r3 moval ttunit,r2 write: $fao_s outbuf=bufdsc, ctrstr=faomsg1,- p1=#0, p2=R3, p3=(R2) pushal bufdsc calls #1,g^lib$put_output addl #2,r2 addl #4,r3 sobgtr r5,write $exit_s r0 no_operators: $fao_s outbuf=bufdsc, ctrstr=faomsg2,- p1=#0 pushal bufdsc calls #1,g^lib$put_output $exit_s r0 ; ; ; .entry kernal1,^m<r7,r8,r9> moval nocrash,(fp) ;Establish a kernal mode ; excpetion handler. movl ioc$gl_devlist,r9 ;Get first ddb clrl r6 ;Count of operators 5$: clrl r7 ;Clear unit counter movl ddb$l_ucb(r9),r8 ;Get first ucb on this ddb cmpb ucb$b_devclass(r8),#dc$_term ;Is this a terminal ddb/ucb? bneq 20$ ;if neq, no ; ; Check all ucbs on all ddbs, if op bit is set, then save name of terminal, ; for output when we're not in kmode. ; 10$: bbc #dev$v_opr,ucb$l_devchar(r8),15$ ;Operator enabled on this ucb? movl ddb$t_name(r9),ttname[r6] ;get device name movw ucb$w_unit(r8),ttunit[r6] ;get unit name incl r6 ;Bump op count movl r6,ttcnt ;Save it 15$: incl r7 movl ucb$l_link(r8),r8 ;Get next ucb tstl r8 ;More ucbs? bneq 10$ ;if neq, yes 20$: movl ddb$l_link(r9),r9 ;Get next ddb tstl r9 ;More ddbs? bneq 5$ ;if neq, yes movl #ss$_normal,r0 ret ;back to caller ; .sbttl KMODE_EXCEPTION_HANDLER ; ; Provides some reasonable safeguard against crashing your system. ; (From Bruce Elliot, thanks.) ; reason: .long 80 .address 10$ 10$: .blkb 80 control_reason: .ascid /Access violation at VA = !XL & PC = !XL/ .entry nocrash,^m<r2> movl 4(ap),r2 ;Get address of signal array cmpl 4(r2),#ss$_accvio ;if it's an access violation, ; display and get out. bneq not_access_violation $fao_s outbuf=reason,outlen=reason,ctrstr=control_reason,- p1=12(r2),p2=16(r2) pushal reason calls #1,g^lib$put_output ;Display the reason for the crash. $exit_s ;kill the process not_access_violation: movl #ss$_resignal,r0 ;Pass the buck ret .END MAIN ---------- END CUT ------------------------------------------------------------ ARPA: RGERBER%NYBVX1.BITNET@WISCVM.WISC.EDU BITNET: RGERBER@NYBVX1 CCNET: NYBVX1::RGERBER *** There are no opions here, just facts - so a disclaimer is no necessary! ***