[comp.os.vms] setting username within an image

ABSTINE@CLVMS.CLARKSON.EDU (Art Stine - Network Engineer) (05/27/88)

i have code which will do this. if you do get an rsh done, i'd really
like a copy. it was on my list of things to add to the cmu tcp package
as soon as i finish with the lpr code.
     
here it is, along with another routine to set the uic:
     
--------------------------------------------------------------------------------
        .TITLE SYS_SET_USERNAME
;
        .IDENT /X01-001/
;
;       FACILITY:       SYS - General procedure library
;
;       ABSTRACT:       Rewrite current process's USERNAME
;
;       ENVIRONMENT:    User mode, calls kernel mode routine, requires
;                       user privelege CMKRNL
;
;
;       AUTHOR:         Geoff Fitch
;       CREATION DATE:  04-AUG-82
;
;--
;++
;
;  FUNCTIONAL DESCRIPTION:
;
;
;       This routine is passed the address of a string descriptor
;       pointing to the new username, it copies the string buffer
;       to a local buffer and calls a kernel mode routine to write
;       the new username in control space and the JIB.
;
;       Calling routines must be linked with SYS$SYSTEM:SYS.STB
;
;  CALLING SEQUENCE:   (from DCL)
;
;       ret_status.wlc.v = SYS_SET_USERNAME ( new_name.rt.dx )
;
;  FORMAL PARAMETERS:
;
;       NEW_NAME                String containing the new username
;
;  IMPLICIT INPUTS:
;
;       NONE
;
;  IMPLICIT OUTPUTS:
;
;       Process control space (CTL$T_USERNAME)
;       Jb Info Block  (JIB$T_USERNAME)
;
;  COMPLETION STATUS:
;
;       SS$_NORMAL              Success
;       SS$_NOPRIV              You don't have CMKRNL
;       <other>                 something returned from LIB$SCOPY_DXDX
;
;  SIDE EFFECTS:
;
;       Process Username is changed
;--
;
        .LIBRARY        /SYS$LIBRARY:LIB.MLB/
        $JIBDEF                                 ; JIB symbols
        $PCBDEF
     
        .PSECT  _SYS_CODE, PIC, USR, CON, REL, LCL, SHR, EXE, RD, NOWRT
     
        .ENTRY  SYS_SET_USERNAME, ^M<R3, R4, R5, R8>
        SUBL2   #12, SP                 ; allocate local string
        MOVAL   (SP), -(SP)             ; and create string descr
        PUSHL   #12
        PUSHAQ  (SP)
        PUSHAQ  @4(AP)                  ; copy username to local area
        CALLS   #2, G^LIB$SCOPY_DXDX
        BLBC    R0, 10$                 ; return if copy failed
        ADDL    #8, SP                  ; deallocate descriptor
        MOVAB   (SP), R8                ; save buffer address
        $CMKRNL_S  ROUTIN=WRITEUSER     ; call kernel routine
10$:    RET
     
        .ENTRY  WRITEUSER, 0
        MOVC3   #12, (R8), CTL$T_USERNAME       ; write username in P1 space
        MOVL    CTL$GL_PCB, R0                  ; load address of pcb
        MOVL    PCB$L_JIB(R0), R1               ; load address of jib
        MOVC3   #12, (R8), JIB$T_USERNAME(R1)   ; write username into jib
        MOVL    #1, R0                          ; return with success
        RET
     
     
        .END
     
     
     
--------------------------------------------------------------------------------
     
        .TITLE SYS_SET_UIC
;
        .IDENT /X01-01/
;
;       FACILITY:       SYS - General procedure Library
;
;       ABSTRACT:       Rewrite current process's UIC
;
;       ENVIRONMENT:    User mode, calls kernel mode routine, requires
;                       user privelege CMKRNL
;
;
;       AUTHOR:         DSA , ABS STINE
;       CREATION DATE:  09-SEP-83
;
;--
;++
;
;  FUNCTIONAL DESCRIPTION:
;
;     Sets process UIC to longword UIC passed from caller
;
;       Note: Calling procedure must be linked with SYS$SYSTEM:SYS.STB
;
;  CALLING SEQUENCE:   (from high - level language)
;
;       ret_status.wlc.v = SYS_SET_UIC ( new_uic.rl )
;
;  FORMAL PARAMETERS:
;
;       NEW_UIC         The longword containing the new UIC
;
;  IMPLICIT INPUTS:
;
;       NONE
;
;  IMPLICIT OUTPUTS:
;
;       Process Control Block  (PCB$L_UIC)
;
;  COMPLETION STATUS:
;
;       SS$_NORMAL              Success
;       SS$_NOPRIV              You don't have CMKRNL priv
;       <other>                 something returned from $CMKRNL
;
;  SIDE EFFECTS:
;
;       Process UIC is changed
;
;******************************************************************************
;
;  WARNING ******: DO NOT CHANGE THE FORMAT OF THE ADDRESSING IN THIS ROUTINE.
;  WARNING         ALMOST NO ERROR CHECKING IS, OR CAN BE DONE. THERE IS NO
;  WARNING         REAL WAY OF HANDLING AN EXCEPTION WHILE IN KERNEL MODE,
;                  AND HAVE IT COME BACK TO USER MODE.
;
;                  **** IN OTHER WORDS, YOU GOOF IT, YOU LOOSE IT. *****
;
;******************************************************************************
;
;               integer*4       newuic, SYS_SET_UIC, ERROR
;               DATA NEWUIC/ 65540 /     ! SAME UIC AS [ 1,4 ]
;
;               ERROR = SYS_SET_UIC( NEWUIC )
;
;
;--
;
        .LIBRARY        /SYS$LIBRARY:LIB.MLB/
;
        $SSDEF                                  ; system return definitions
        $PCBDEF
;
        .PSECT  CODE, PIC, USR, CON, REL, LCL, SHR, EXE, RD, NOWRT
;
        .ENTRY  SYS_SET_UIC,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11> ; save all reg
;
        MOVL    @4(AP),R2               ; GRAB THE UIC AND STUFF INTO R2
;
        $CMKRNL_S  ROUTIN=SETUIC        ; call kernel routine
10$:    RET
;
        .ENTRY  SETUIC,0
        MOVL    @#SCH$GL_CURPCB,R0      ; get current process PCB address
        MOVL    R2 , PCB$L_UIC(R0)      ; set user identification code
        MOVZWL  #SS$_NORMAL,R0          ; SET A ONE IN R0 FOR NORMAL RETURN
        RET
;
;
        .END