[comp.os.vms] Example code to use GETUAI

CRAA055%UK.AC.KCL.CC.VAXB@AC.UK.UUCP (06/20/87)

Dear All,

Several people have asked for examples of how to use the GETUAI service. What
follows is a DCL archive containing a complete (and useful i hope) FORTRAN
program that illustrates how to do it.  It also contains a little routine
which isolates the calls to the GETUAI service.

This code was produced from a previous example code sent over the net and I
hope the original sender does not mind this re-posting!

Andy Harper
Kings College Uk

A.Harper @ VAXB.CC.KCL.AC.UK        [ EARN/BITNET/NETNORTH ]
A.Harper%KCL.CC.VAXB @ AC.UK
A.Harper%KCL.CC.VAXB @ ucl-cs.arpa    [ ARPA ]

$! XXXXXXXXXXXXXXXXXXXXXX   CUT HERE   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
$! -------------------------------------------------------------------------
$! This file is a DCL archive and contains one or more files to be unpacked.
$! To unpack the files, copy this file into a scratch directory and then
$! run it as a DCL command procedure. Each file will then be unpacked into
$! a separate file with its original name.
$! -------------------------------------------------------------------------
$ fail_list = ""                    ! Checksum failures
$ say = "write sys$output"                ! Shorten code below
$ say "Extracting File WHO.DOC    [ Checksum=1582070590]"
$ create WHO.DOC
$ deck/dollars=19:49:46.15
        WHO: User information program


Introduction

WHO is a program that may be used by unprivileged users to display selected
information about a given username, such as the owner and account fields.




Usage

WHO is designed to work as a foreign command and is used thus:

    WHO username



Installation

The program is written in FORTRAN and needs to be compiled and link thus:

    FORTRAN WHO
    LINK/NOTRACE WHO


The program needs to be installed with SYSPRV in order to have access to the
SYSUAF file:

    INSTALL = "$INSTALL/COMMAND_MODE"
    INSTALL CREAT dir:WHO /PRIV=SYSPRV


A global symbol should be set up at LOGIN time which reflects the location of
the program:

    WHO == "$dir:WHO"

After this, WHO is ready to run.

Andy Harper
Kings College London                        15-JUN-1987
19:49:46.15
$ checksum WHO.DOC
$ ck=checksum$checksum
$ if ck .nes. "1582070590" then $-
     fail_list=fail_list+" WHO.DOC"
$ if ck .nes. "1582070590" then $-
     say "[CHECKSUM FAILED! Got ",ck," expected 1582070590]"
$ say "Extracting File WHO.FOR    [ Checksum=525737890]"
$ create WHO.FOR
$ deck/dollars=19:49:46.15
C ------------------------------------------------------------------
C   WHO
C     Produce information about a given username
C
C
C     2.0 Complete rewrite of original to use $GETUAI service
C
C  Author:  Andy Harper            Site: Kings College London
C  System:  VMS 4.4 and above
C
C -----------------------------------------------------------------------

        implicit integer(a-z)
    character username*12, owner*32, account*12
        include'($uaidef)'
*
* WHAT USERNAME DO WE WANT INFO ABOUT ??
        istat = lib$get_foreign(username,'Username: ',l_u)
    if (.not. istat) call sys$exit(%val(istat))
*
* GO GET THE INFORMATION
    istat = getuai(username(1:l_u),UAI$_OWNER, owner, 32)
    istat = getuai(username(1:l_u),UAI$_LGICMD, lgicmd, 64)
    istat = getuai(username(1:l_u),UAI$_ACCOUNT, account, 12)
    if (.not. istat) call lib$stop(%val(istat))
*
* DEAL WITH POSSIBLY NULL FIELDS AND MAKE THEM SPACES
        len_own = ichar(owner(1:1))
        if (len_own.lt.1) then
           owner = ' '
           len_own = 1
        else
          owner = owner(2:len_own+1)
        endif
*
* PRINT THE ANSWERS
    print *, username, '     ', Owner, '    ', account
        end


C
C  GETUAI:  Picks up a single item from the UAF and places it into the
C           user supplied buffer.
C
    integer function getuai(username,item,buffer,length)
    implicit integer (a-z)
    character username*(*), buffer*(*)

C --- Here is the SYS$GETUAI structure definition
        structure /itmlist_struct/
         union
          map
           integer*2 buff_len              ! length of equiv name
           integer*2 item_code             ! code saying type of Eqiv name
           integer*4 buffaddr              ! address of equiv name
           integer*4 ret_lenadr            ! return addr for actual length
          end map
          map
           integer*4 end_list              ! code to end list
          end map
         end union
        end structure
C --- End of the SYS$GETUAI structure definition
*
        record /itmlist_struct/ uaflist(2)
        integer dummy
*
*
        uaflist(1).buff_len = length
        uaflist(1).item_code = item
        uaflist(1).buffaddr = %loc(buffer)
        uaflist(1).ret_lenadr = %loc(dummy)
*
    uaflist(2).end_list = 0
*
        getuai = sys$getuai(,,username,uaflist(1),,,)
    return
    end
19:49:46.15
$ checksum WHO.FOR
$ ck=checksum$checksum
$ if ck .nes. "525737890" then $-
     fail_list=fail_list+" WHO.FOR"
$ if ck .nes. "525737890" then $-
     say "[CHECKSUM FAILED! Got ",ck," expected 525737890]"
$ say "Extracting File WHO.HLP    [ Checksum=1735875634]"
$ create WHO.HLP
$ deck/dollars=19:49:46.15
 1 WHO
  Displays the owner and account of a registered username on SYS$OUTPUT.

  Format:

     $WHO username
 2 Parameter
  Username is the username as it might be found in the $SHOW USERS
  command or in the From: field of a MAIL message header.  Lists or
  wildcards are not allowed.
19:49:46.15
$ checksum WHO.HLP
$ ck=checksum$checksum
$ if ck .nes. "1735875634" then $-
     fail_list=fail_list+" WHO.HLP"
$ if ck .nes. "1735875634" then $-
     say "[CHECKSUM FAILED! Got ",ck," expected 1735875634]"
$ if fail_list .eqs. "" then $ goto unpack_complete
$ say "--------------------------------------------------"
$ say "    The unpack failed with one or more checksum"
$ say "    errors in the following file(s):"
$ say ""
$ say "    ",fail_list
$ say ""
$ say "--------------------------------------------------"
$unpack_complete:
$ say "Unpack is complete"