From:	CSBVAX::MRGATE!@SRI.Com,@eureka.clemson.edu:WARNOCK@prism.clemson.edu@SMTP  6-AUG-1987 05:32
To:	EVERHART
Subj:	ID_HOLDER.COM (part 1 of 1)

Received: from RELAY.CS.NET by KL.SRI.COM with TCP; Wed 5 Aug 87 12:32:13-PDT
Received: from eureka.clemson.edu by RELAY.CS.NET id aa22076; 5 Aug 87 14:51 EDT
Date: Wed, 5 Aug 87 14:44 EST
From: Todd Warnock <WARNOCK@prism.clemson.edu>
Subject: ID_HOLDER.COM (part 1 of 1)
To: info-vax%sri-kl.ARPA@RELAY.CS.NET
X-VMS-To: IN%"info-vax@sri-kl.arpa",WARNOCK     

I received many requests for my ID_HOLDER program.  Here it is !
Good luck - Any improvements, suggestions for improvements, 
will be much appreciated !


Todd Warnock
VAX Systems
Clemson University
Clemson, South Carolina 29634-2803

ARPA:	Warnock@Prism.Clemson.EDU
BITnet:	Warnock@Clemson
CSnet:	Warnock@Clemson.CSnet
.......................... Cut between dotted lines and save ....................
$!..............................................................................
$!
$! VAX/VMS archive file created by VMS_SHAR Version:'09-Jun-1987'
$! Copyright (c) 1987, by Michael Bednarek
$! To unpack, simply execute (@) the file.
$! This archive was created by WARNOCK
$!      on Wednesday 5-AUG-1987 14:40:01.33
$! It contains the following file(s):
$! BUILD.COM CHECK_ID.FOR ID_HOLDER.CLD ID_HOLDER.DOC ID_HOLDER.FOR
$! ID_HOLDER.HLP UAIDEF.MAR
$!==============================================================================
$ Set Symbol/Scope=(NoLocal,NoGlobal)
$ CR[0,8]=13
$ Pass_or_Failed="failed!,passed."
$ Goto Start
$Convert_File:
$ Read/Time_Out=0/Error=No_Error1/Prompt="creating ''File_is'" SYS$Command ddd
$No_Error1:Open/Write Out 'File_is
$ Open/Read In VMS_SHAR_DUMMY.DUMMY
$Next_Record: Read/End_Of_File=EOF In Record
$ Write Out F$Extract(1,255,Record)
$ Goto Next_Record
$EOF: Close Out
$ Close In
$ Delete VMS_SHAR_DUMMY.DUMMY;*
$ Checksum 'File_is
$ Success=F$Element(Check_Sum_is.eq.CHECKSUM$CHECKSUM,",",Pass_or_Failed)+CR
$ Read/Time_Out=0/Error=No_Error2/Prompt=" CHECKSUM ''Success'" SYS$Command ddd
$No_Error2:Return
$Start:
$ File_is="BUILD.COM"
$ Check_Sum_is=1785278623
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X$ set noon
X$ fortran id_holder
X$ fortran check_id
X$ macro uaidef
X$ link id_holder,check_id,uaidef
X$ set command id_holder
$ GoSub Convert_File
$ File_is="CHECK_ID.FOR"
$ Check_Sum_is=980227321
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X	subroutine CHECK_ID(username,identifier,return_status)
X!+
X! Version:	1-001
X!
X! Facility:	System Management Library
X!
X! Abstract:	This module determines whether or not a username holds
X!		a given identifier.
X!
X! Environment:	User Mode, privileged (requires access to SYSUAF/RIGHTSLIST)
X!
X! Author:	Todd Warnock
X!		VAX Systems
X!		Clemson University
X!		Clemson, South Carolina 29634-2803
X!
X!		ARPA:	Warnock@Prism.Clemson.EDU
X!		BITnet:	Warnock@Clemson
X!		CSnet:	Warnock@Clemson.CSnet
X! Modified By:
X! 1-0001	- Original.  01-Jun-1987
X!
X!-
Xc
X	implicit integer*4	(a-z)
Xc
X	include '($rmsdef)'		
X	include '($jpidef)'
Xc
X       	external uai$_uic
X	external ss$_nosuchid
Xc
X	integer*4	status
X	integer*4	return_status
X	character*23	identifier 
X	integer*4	identifier_len
X	integer*4	id_num
X	character*23	id_name
X	integer*4	id_len
X	character*12	username
X	integer*4	uic
X	integer*4	uic_len
X	integer*4	holder(2)
X	integer*4	context /0/
X	logical		have /.false./
Xc
Xc SETUP the $GETUAI item list
Xc
X	structure/getuai_item/
X	union
X		map
X			integer*2	buffer_len
X			integer*2	item_code
X			integer*4	buffer_addr
X			integer*4	ret_len_addr
X		end map
X		map
X			integer*4	end_list/0/
X		end map
X	end union
X	end structure
X
X	record /getuai_item/ item_list(2)
Xc
Xc Define the item(s) (terminator is defined above)
Xc
X	item_list(1).item_code = %loc(uai$_uic)
X	item_list(1).buffer_len = 4
X	item_list(1).buffer_addr = %loc(uic)
X	item_list(1).ret_len_addr = %loc(uic_len)
Xc
Xc Trim the identifier
Xc
X	status = str$trim(identifier,identifier,identifier_len)
Xc
Xc Call $GETUAI
Xc	
X	status = sys$getuai(,,%descr(username),
X     +		%ref(item_list),,,)
X	if (status .eq. rms$_rnf) goto 888
X	if (.not.status) goto 888
Xc
X	holder(1) = uic
X	holder(2) = 0
Xc
X10	status=sys$find_held(%ref(holder),%ref(id_num),,%ref(context))
X	if (.not.status) then
X	   goto 888
X	else
X	   status=sys$idtoasc(%val(id_num),id_len,id_name,,,)	
X	   if (.not.status) goto 888
X	   if (id_name(1:id_len).eq.identifier(1:identifier_len))goto 888
X	endif
X	goto 10
Xc
X888	return_status = status
X	status = sys$finish_rdb(%ref(context))
X	return
X	end
$ GoSub Convert_File
$ File_is="ID_HOLDER.CLD"
$ Check_Sum_is=1951482661
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X!
X!	ID_HOLDER 
X!
Xdefine verb ID_HOLDER
X	image ID_HOLDER
X	parameter P1,label=USERNAME,prompt="Username",
X		value(required)
X	qualifier IDENTIFIER,default,nonnegatable,
X		value(required)
X	qualifier SYMBOL,default,nonnegatable,
X		value(required)
$ GoSub Convert_File
$ File_is="ID_HOLDER.DOC"
$ Check_Sum_is=845089757
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
XID_HOLDER - Returns TRUE or FALSE in a symbols depending on whether or not a 
X		user holds a given identifier.
X
XThe following programs (images) are part of ID_HOLDER:
X
X	ID_HOLDER.FOR		source to ID_HOLDER
X	UAIDEF.MAR		$GETUAI definitions
X	CHECK_ID.FOR		source to check if user holds an identifier
X	ID_HOLDER.HLP		ID_HOLDER help file
X	ID_HOLDER.DOC		this file
X	ID_HOLDER.CLD		the ID_HOLDER command definition
X
XTo build ID_HOLDER:
X
X	$ for ID_HOLDER
X	$ for CHECK_ID
X	$ macro UAIDEF
X	$ link ID_HOLDER,CHECK_ID,UAIDEF
X	$ set command ID_HOLDER
X
XThe following steps are used to install ID_HOLDER in the SYS$COMMON:[SYSEXE]
Xdirectory (to make it accessible from all cluster nodes.)
XID_HOLDER must be installed with SYSPRV privilege to provide information on
Xother users.
X
X	$backup/log id_holder.exe;0 sys$common:[sysexe]id_holder.exe;0
X	$set prot=(w:e) sys$common:[sysexe]id_holder.exe
X	$install
X	add/open/head/share/priv=sysprv sys$common:[sysexe]id_holder
X	exit
X
XThe image must be INSTALLed each time the system boots, so it should be
Xplaced in the system startup file for each cluster node.  Also, the command 
Xmust be added to the DCL tables (or used on a process basis).
X
X	$ set def sys$library
X	$ set command id_holder /tables=dcltables/output=dcltables
X
XNote:  If the image ID_HOLDER is put anywhere OTHER than SYS$SYSTEM, the
Xfile ID_HOLDER.CLD will have to be modified to reflect the location of the
Ximage.  (DEFINE IMAGE where$it$lives:ID_HOLDER)
$ GoSub Convert_File
$ File_is="ID_HOLDER.FOR"
$ Check_Sum_is=1816073725
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X	program ID_HOLDER
X!+
X! Version:	1-001
X!
X! Facility:	System Management Library
X!
X! Abstract:	This module is called to return information as to whether
X!		or not a user has a given identifier.
X!		If yes, a value of "TRUE" is returned in the symbol
X!		specified on the DCL line, else the value "FALSE" is returned.
X!
X! Environment:	User Mode.
X!
X! Author:	Todd Warnock
X!		VAX Systems
X!		Clemson University
X!		Clemson, South Carolina 29634-2803
X!
X!		ARPA:	Warnock@Prism.Clemson.EDU
X!		BITnet:	Warnock@Clemson
X!		CSnet:	Warnock@Clemson.CSnet
X! Modified By:
X! 1-0001	- Original.  Jun-29-1887
X!
X!-
X        implicit integer*4 (A-Z)
Xc
Xc Include the necessary definitions
Xc
X        include 	'($jpidef)'
X	external	ss$_nosuchid
Xc
Xc  Define the variables
Xc
X	character*12	username
X	character*55	symbol
X	character*55	identifier
X	integer*4	id_len
Xc
Xc  Get the symbol name from the CLI 
Xc
X	status = cli$get_value('SYMBOL',symbol)
X	if (.not. status) call lib$stop (%val(status))
Xc
Xc  Get the username from the CLI 
Xc
X	status = cli$get_value('USERNAME',username)
X	if (.not. status) call lib$stop (%val(status))
Xc
Xc  Get the identifier from the CLI 
Xc
X	status = cli$get_value('IDENTIFIER',identifier,id_len)
X	if (.not. status) call lib$stop (%val(status))
Xc
Xc Check and see if you have the identifier identifier
Xc
X	call check_id(username,identifier(1:id_len),status)
X	if (.not.status) then
X           status=lib$set_symbol(symbol,'FALSE',)
X	else
X           status=lib$set_symbol(symbol,'TRUE',)
X	endif
X        if (.not. status) call lib$stop (%val(status))
X  	end
$ GoSub Convert_File
$ File_is="ID_HOLDER.HLP"
$ Check_Sum_is=1866152346
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X1 ID_HOLDER
XID_HOLDER is a utility available on the VAX/VMS systems that allows
Xusers to determine if a given user holds a given identifier.  If the
Xuser holds the identifier, a value of "TRUE" is returned in the
Xspecified symbol.  If the user does not hold the identifier, a value of
X"FALSE" is returned in the specified symbol.
X
XFormat:
X
X	ID_HOLDER username [qualifiers]
X2 Parameters
Xusername
X 
XThe username that you are inquiring about.
X
X2 Command_Qualifiers
X
X/IDENTIFIER
X /IDENTIFIER=identifier
X
XSpecifies the identifier that you wish to know if the user holds.
XIf the user does not hold the identifier, or if the identifier
Xdoesn't exist, a value of "FALSE" is returned in the symbol.
X
X/SYMBOL
X /SYMBOL=symbol
XSpecifies the symbols in which to return TRUE or FALSE, depending on
Xwhether or not the indentifier exists.
X
X2 Examples   
X
X	$ ID_HOLDER/IDENTIFIER=IBM_SYSTEMS/SYMBOL=USER_IDENT JOEUSER
X	$ SH SYM USER_IDENT
X	  X = "TRUE"
X
X	
X In this example, userid JOEUSER holds the identifier IBM_SYSTEMS.
$ GoSub Convert_File
$ File_is="UAIDEF.MAR"
$ Check_Sum_is=102303317
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X	$UAIDEF	GLOBAL
X	.END
$ GoSub Convert_File
