STEINBERGER@SRI-KL.ARPA.UUCP (02/14/87)
I have been trying to use SYS$CRELNM to create a supervisor mode logical
name in the user's process table. The default in this call is to use
user mode, unless you specify supervisor, exec, or kernel AND have SYSNAM
privelege. Thus ordinary users with TMPMBX and NETMBX who attempt this
will end up creating a USER mode logical name in their process table;
and this is a highly temporary state of affairs (as documented). I now
know that the routine LIB$SET_LOGICAL will do exactly what I had in mind,
but since I never was able to get SYS$CRELNM to work as I described and
would like to know why I submit this question.
This was my startegy, that alas has not yet worked. I wrote a subroutine
that was installed as a known image and given SYSNAM priv. In the subroutine,
I use SYS$SETPRV to get SYSNAM privelege. Next I make the call to SYS$CRELNM.
Finally, for debugging, I make a last call to SYS$SETPRV to remove SYSNAM
priv and see what priveleges were in effect prior to the call. When I
run from an account that has all privs authorized, the prog works fine,
and a supervisor mode logical name is created. When run from an unpriveleged
account this doe not happen. In both cases, the final call to SYS$SETPRV
showed a mask of 1080004 (HEX), indicating SYSNAM, TMPMBX and NETMBX were
in effect. I don't know why it didn't do what I wanted.
Should/Can Installed images be used to do the kind of thing I want (i.e.
temporarily grant priveleges)? Did I install the image properly?
Were the programs linked with the correct options? When it runs there
are no error messages. Thanks to any and all who reply.
This is the way I linked the subroutine:
$ LINK/SHARE/NOTRACE set_logical,sys$input/opt
UNIVERSAL=SET_LOGICAL !so calling routines can LINK to it (find start adr)
$
Here is how I installed it:
INSTALL> ADD/SHARE $DISK2:[RIC]SET_LOGICAL /PRIV=SYSNAM
The following is necessary so the run-time image can find the installed image.
$ DEFINE SET_LOGICAL $DISK2:[RIC]SET_LOGICAL !because it's not in SYS$SHARE
This is how I linked it to the main routine:
$LINK TEST_SET_LOGICAL,sys$input/opt
set_logical/shareable
$
Here are the 2 programs (subroutine first): (Tabs may get distorted.)
______________________________________________________________________________
options /extend_source
subroutine set_logical(logical_name,equivalence_name)
C*******Set a SUPERVISOR mode logical name in the user's PROCESS table.
C This must be an installed image and given SYSNAM priv.
implicit integer (a-z)
include '($LNMDEF)'
include '($SSDEF)'
include '($PSLDEF)'
include '($STRDEF)'
structure /itmlst/
union
map
integer*2 buflen
integer*2 code
integer*4 bufadr
integer*4 retlenadr
end map
map
integer*4 end_list /0/
end map
end union
end structure
byte access_mode, enbflg
character*80 logical_name,equivalence_name, text, text2
integer*4 status, priv_mask(2) /2*0/
integer*4 prvprv(2)
record /itmlst/ lnmlist(2)
status = str$trim(text,logical_name,tlen)
if (.not. status)call lib$signal(%val(status))
status = str$upcase(text,text)
status = str$trim(text2,equivalence_name,tlen2)
if (.not. status)call lib$signal(%val(status))
status = str$upcase(text2,text2)
lnmlist(1).buflen = tlen2
lnmlist(1).code = LNM$_STRING
lnmlist(1).bufadr = %loc(text2)
lnmlist(1).retlenadr = 0 !must pass placeholder
C*****The actual ACCESS mode used in creating the logical name is
C USER if the program is run without SYSNAM priv.
C See SYSTEM SERVICES, p 6-5.
priv_mask(1) = '0004'X !the mask for SYSNAM
enbflg = 1 !enable the privelege
status = sys$setprv(%val(enbflg),priv_mask,,)
if (.not. status)call lib$signal(%val(status))
access_mode = PSL$C_SUPER
status = sys$crelnm(,'LNM$PROCESS',text(1:tlen),
+ access_mode,lnmlist)
if (.not. status)call lib$signal(%val(status))
priv_mask(1) = '0004'X !the mask for SYSNAM
enbflg = 0 !disable the privelege
status = sys$setprv(%val(enbflg),priv_mask,,prvprv)
write(6,100)prvprv(2),prvprv(1)
100 format(' Privelege mask was (HEX): ',z8,5x,z8)
return
1000 end
______________________________________________________________________________
options /extend_source
program test_set_logical
implicit integer (a-z)
character*80 logical_name, equivalence_name
integer retlen
80 write(6,'($,a)')' Enter logical name (^Z to exit): '
read(5,fmt='(a)',end=1000)logical_name
write(6,'($,a)')' Enter equivalence name (^Z to exit): '
read(5,fmt='(a)',end=1000)equivalence_name
call set_logical(logical_name,equivalence_name)
goto 80
1000 end
-------