Path: utzoo!utgpu!water!watmath!clyde!att!osu-cis!tut.cis.ohio-state.edu!mailrus!uwmcsd1!ig!agate!ucbvax!ISUMVS.BITNET!GG.SPY
From: GG.SPY@ISUMVS.BITNET ("John Hascall")
Newsgroups: comp.os.vms
Subject: Re: How to find the next available UIC
Message-ID: <8807040702.AA15775@ucbvax.Berkeley.EDU>
Date: 30 Jun 88 16:50:12 GMT
Sender: daemon@ucbvax.BERKELEY.EDU
Organization: The Internet
Lines: 93

> Date:         Fri, 29 Apr 88 14:17:00 N
> Sender:       INFO-VAX Discussion 
> From:         ARJAN%HROEUR51.BITNET@CUNYVM.CUNY.EDU
> Subject:      How to find the next available UIC
> To:           John Hascall 
>
> Whenever we want to add new users to sysuaf.dat, we try to find
> the next uic available for this new user. (For accounting reasons
> we do NOT use any uic that has been used before). The only way I
> could think of was to scan sysuaf.dat completely, using $IDTOASC
> in a wildcard operation, translate the usernames back to individual
> UIC's with $ASCTOID, then examining the group and member value, thus
> finding the highest member value of the specified group.
> But this takes about THIRTY times as much cpu time as does AUTHORIZE
> with a SHOW [XXXX,*]/BRIEF
>
> Does anybody know which calls authorize might be using ?
>
> ARJAN@HROEUR51.BITNET
> -------

   I do a very similar thing (except that I will re-use UICs).  What I
do is scan RIGHTSLIST by opening it for keyed access and repeatedly call
SYS$GET with successively larger key-values (I can stop as soon as I get
RMS$_RNF--you will need to look at all 64K possible members I guess).

   Here are some fragments, hope they are some help:

        .psect  CODE,RD,NOWRT,EXE
;
;     stat = open_right(context)
;
           :
           :
        $FAB_STORE FAB=FFU_$S_FAB(R11) -
                   DNA=@RIGHTSFDEF+4,-
                   DNS=RIGHTSFDEF,-
                   FAC=,-
                   FNA=@RIGHTSFNAM+4,-
                   FNS=RIGHTSFNAM,-
                   ORG=,-
                   SHR=,-
                   XAB=FFU_$S_KEY0(R11)
               :
        $RAB_STORE RAB=FFU_$S_RAB(R11),-
                   FAB=FFU_$S_FAB(R11),-
                   RAC=,-
                   UBF=FFU_$S_RECORD(R11),-
                   USZ=#64
               :
;
;    member = find_free_uic(context,min_group,max_group,flags)
;
        .entry  FIND_FREE_UIC,M
        SUBL2   #4,SP
        MOVL    SP,R10
        MOVL    4(AP),R11
        $RAB_STORE RAB=FFU_$S_RAB(R11),-
                   KBF=(R10),-
                   KSZ=#4,-
                   KRF=#0,-
                   ROP=
        MOVZWL  8(AP),R2             ; R2 is (current) group
        CLRLR   3                    ; R3 is (attempted) member
        MOVL    12(AP),R4            ; R4 is max member
        MOVL    16(AP),R5            ; R5 is flags
        BBC     #3,R5,5$             ; do not start at member 0?
        INCL    R3                   ;   then start at member 1
5$:     MOVL    R3,(R10)
        INSV    R2,#16,#14,(R10)
        PUSHAL  FFU_$S_RAB(R11)
        CALLS   #1,gSYS$GET
        BLBC    R0,10$
        BBS     #0,R5,7$             ; always start a new group?
        INCL    R3
        CMPL    R3,#65535
        BLEQ    5$
7$:     INCL    R2
        CMPL    R2,R4
        BLEQ    5$
        MNEGL   #2,R0                ; ran out of allowable uic's
        RET

10$:    CMPL    R0,#RMS$_RNF
        BNEQ    99$
        MOVL    (R10),R0             ; first member not found
        RET
    
99$:    MNEGL   #1,R0                ; error
        RET
------
John Hascall
ISU Comp Center