.title get_priv ;+ ; integer function get_priv(which_priv, pid, prcnam, buf) ; ; return(OK/ERR) ; ; fetches the which_priv mask with a getjpi and formats the ; privelege names in buf as name@ename@ename@e...@e@n ; the user must make sure that the buffer is large enough ; the name of the process is returned as a 0-byte terminated string ; ; valid values for which_priv are authpriv, curpriv, imagpriv, procpriv ;- $jpidef $prvdef which_priv=4 pid=8 prcnam=12 buf=16 ok=0 err=-3 max_priv=prv$v_bypass ; as of version 2.x .psect st_getpriv_data rel,con,gbl,noexe,wrt,rd,pic,noshr,usr,novec,long jpi_list: .word 8 ; size of buffer cmd: .word jpi$_curpriv ; fetch current priveleges .address priv_buf ; address of buffer .long 0 ; no length desired .word 16 ; buffer size for process name .word jpi$_prcnam ; fetch process name prc_buf:.long 0 ; buffer address placed here .address length ; address to receive length .long 0 ; end of list length: .blkw 1 ; word for length of process name priv_buf: .blkq 1 ; quadword for privelege mask names: .address name0 .address name1 .address name2 .address name3 .address name4 .address name5 .address name6 .address name7 .address name8 .address name9 .address name10 .address name11 .address name12 .address name13 .address name14 .address name15 .address name16 .address name17 .address name18 .address name19 .address name20 .address name21 .address name22 .address name23 .address name24 .address name25 .address name26 .address name27 .address name28 .address name29 .address name30 .address name31 .address name32 .address name33 .address name34 .address name35 .address name36 .address name37 .address name38 .address name39 .address name40 .address name41 .address name42 .address name43 .address name44 .address name45 .address name46 .address name47 .address name48 .address name49 .address name50 .address name51 .address name52 .address name53 .address name54 .address name55 .address name56 .address name57 .address name58 .address name59 .address name60 .address name61 .address name62 .address name63 name0: .asciz "cmkrnl" name1: .asciz "cmexec" name2: .asciz "sysnam" name3: .asciz "grpnam" name4: .asciz "allspool" name5: .asciz "detach" name6: .asciz "diagnose" name7: .asciz "log_io" name8: .asciz "group" name9: .asciz "noacnt" name10: .asciz "prmceb" name11: .asciz "prmmbx" name12: .asciz "pswapm" name13: .asciz "altpri" name14: .asciz "setprv" name15: .asciz "tmpmbx" name16: .asciz "world" name17: .asciz "mount" name18: .asciz "oper" name19: .asciz "exquota" name20: .asciz "netmbx" name21: .asciz "volpro" name22: .asciz "phy_io" name23: .asciz "bugchk" name24: .asciz "prmgbl" name25: .asciz "sysgbl" name26: .asciz "pfnmap" name27: .asciz "shmem" name28: .asciz "sysprv" name29: .asciz "bypass" name30: .asciz "syslck" name31: .asciz "Priv_1F" name32: .asciz "Priv_20" name33: .asciz "Priv_21" name34: .asciz "Priv_22" name35: .asciz "Priv_23" name36: .asciz "Priv_24" name37: .asciz "Priv_25" name38: .asciz "Priv_26" name39: .asciz "Priv_27" name40: .asciz "Priv_28" name41: .asciz "Priv_29" name42: .asciz "Priv_2A" name43: .asciz "Priv_2B" name44: .asciz "Priv_2C" name45: .asciz "Priv_2D" name46: .asciz "Priv_2E" name47: .asciz "Priv_2F" name48: .asciz "Priv_30" name49: .asciz "Priv_31" name50: .asciz "Priv_32" name51: .asciz "Priv_33" name52: .asciz "Priv_34" name53: .asciz "Priv_35" name54: .asciz "Priv_36" name55: .asciz "Priv_37" name56: .asciz "Priv_38" name57: .asciz "Priv_39" name58: .asciz "Priv_3A" name59: .asciz "Priv_3B" name60: .asciz "Priv_3C" name61: .asciz "Priv_3D" name62: .asciz "Priv_3E" name63: .asciz "Priv_3F" .psect st_pure_code rel,con,lcl,exe,nowrt,rd,pic,shr,usr,novec,long .entry get_priv ^m movw @which_priv(ap),cmd ; which privilege mask to get movl prcnam(ap),prc_buf ; store address for proc name $getjpi_s efn=#0,pidadr=@pid(ap),itmlst=jpi_list blbc r0,10$ ; error $waitfr_s efn=#0 ; wait for completion movzwl length,r0 ; length of proc name addl2 prcnam(ap),r0 ; address of EOS clrb (r0) ; terminate it movl buf(ap),r0 ; output buffer address clrl r2 ; start at bit 0 moval names,r3 ; start of pointers 5$: bbc r2,priv_buf,7$ ; if bit clear, try next movl (r3)[r2],r1 ; address of string 6$: movb (r1)+,(r0)+ ; copy character bneq 6$ ; go again 7$: aobleq #max_priv,r2,5$ ; try next privelege bit movb #10,(r0) ; terminate with newline movl #ok,r0 ; return(OK) ret 10$: movl #err,r0 ; return(ERR) ret .end