Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Example of a complete UTM application on BS2000 systems

This application example for a UTM application on a BS2000 system administers address data that has been placed in a file. The application provides the following functions which are called by entering the corresponding TAC in the field used for this purpose. The input and output is performed in one format.

On Unix, Linux and Windows systems, you can find an example for a UTM application in the sample application (Unix and Linux systems) and the QuickStartKit (Windows systems) which are provided with openUTM.

TAC

Function

Explanation

1

Read

outputs an address that is in the file. The search term used is the last name and the first two letters of the first name, both of which are to be specified in the appropriate fields.

2

Write

adds a new address to the file. There may not already be an address with the same search key (see above) in the file.

3

Update

modifies an address entry. The address must already exist in the file.

4

Delete

deletes an existing address from the file.

An error message appears in the lowest line of the format if used incorrectly.

The numbers listed above are the transaction codes (TACs) that control the application. Transaction code 1 calls the "TPREAD" program unit, and transaction codes 2, 3 and 4 call the "TPUPDATE" program unit. These program units then each branch to the "TPFILE" program unit. This program unit is utilized as the START and SHUT exits and contains the subroutines that perform the input/output operations on the address file.
The "BADTACS" program unit is automatically called by openUTM if an invalid TAC is specified.

The "ERRCHECK" function handles errors that arise in the program units.

After the connection to the application has been established and a successful KDCSIGN, the format is immediately output by openUTM (start format). The interaction with the user is then done in a strictly controlled dialog, i.e. the application reacts to the input of the TAC and of the key by outputting the format containing the address searched for or by outputting a success or error message in the bottom line.

This program is only meant to demonstrate how you program using openUTM. The file accesses are not secured by the UTM transaction concept.

The following structure diagram presents the structure of the program units:

Figure: Structure diagram of the TPREAD program unit

Figure: Structure diagram of the TPUPDATE program unit

Figure: Structure diagram of the TPFILE program unit.

For the sake of completeness the generation of this application is listed at the end of the C program. Please consult the openUTM manual “Generating Applications” for the exact meaning of the individual operands and statements.

The following diagram shows the FORM1 format used for this application:

Format FORM1
********************************************************************************
                  A d d r e s s   A d m i n i s t r a t i o n                    
********************************************************************************
                            Select function:                                     
--------------------------------------------------------------------------------
      Actual function:                                                           
      Name:                                  First Name:                         
      Street:                                No.:                                
      Postal Code:                           Residence:                          
      Phone:                                                                     
--------------------------------------------------------------------------------
                             Function selection                                
       1 = Show address                |   4 = Delete address                    
       2 = Enter address               |                                         
       3 = Update address              |       Finish with  ́kdcoff ́              
--------------------------------------------------------------------------------
 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


The data structure for the address assistant for this format is printed in the following.

The FUNCTION field is a protected output field with the "automatic input" attribute. Numerical data is allowed to be entered in the POSTAL_CODE field and MSGTEXT is a protected output field. You can print out the entire list of attributes. You will find more information on this subject in your formatting system manual.

Header file FORM1.h
/* FORMAT NAME      : FORM1    */                           
/* USER AREA LENGTH :   235    */                                             
   typedef struct {
           char NAME                             [  14 ] ;       
           char FIRST_NAME                       [  20 ] ;         
           char STREET                           [  26 ] ;         
           char NUMBER                           [  10 ] ;        
           char POSTAL_CODE                      [   5 ] ;          
           char RESIDENCE                        [  24 ] ;           
           char PHONE                            [  21 ] ;         
   } ADDRESS;
   typedef struct {                                                    
           char TAC                              [   8 ] ;                
           char FUNCTION                         [  27 ] ;               
           ADDRESS addr;
           char MSGTEXT                          [  80 ] ;                     
   } FORM1 ; 
Header file tp.h
#ifndef TP_H
#define TP_H
#include "FORM1.h"
  #define kcrc ca->ca_return.kcrccc
  #define pa spab->param
    struct ca_area
      { struct ca_hdr ca_head;
        struct ca_rti ca_return;
      };
    struct work
      { union kc_paa param;  
        FORM1 std_mask;                        /* addressing assistant area */
        char progname[8];
       };
  void BADTACS  ( struct ca_area * , struct work * );
  void errcheck ( struct ca_area * , struct work * );
  void TPFILE   ( struct ca_area * , struct work * );
  void TPREAD   ( struct ca_area * , struct work * );
  void TPUPDATE ( struct ca_area * , struct work * );
#endif
Program unit TPREAD
 #include <kcmac.h>
 #include "tp.h"
 void TPREAD (struct ca_area *ca , struct work *spab )
 {
 /* INIT-Operation                                                        */
    KDCS_SET (&spab->param, &ca->ca_head, &ca->ca_return);
    KDCS_INIT (0,sizeof(struct work));
    if (KCRCC != 0 )
        { memcpy (spab->progname, "TPREAD  ", 8);
          errcheck (ca, spab);
        }
     else
        memcpy (spab->std_mask.TAC, ca->ca_head.kcpr_tac, 8);
 /* MGET-Operation                                                        */
    KDCS_MGET ( spab->std_mask.FUNCTION
               ,sizeof( FORM1 )
               ,"*FORM1  "               );
    if (KCRCC != 0 )
        { memcpy (spab->progname, "TPREAD", 8);
          errcheck (ca, spab);
        }
 /* call function "tpfile" for reading address                            */
   TPFILE (ca, spab);
 /* MPUT-Operation                                                        */
    KDCS_MPUTNT (&spab->std_mask,sizeof(FORM1)
                 ,KDCS_SPACES,"*FORM1  ",KCNODF);
    if (KCRCC != 0 )
        { memcpy (spab->progname, "TPREAD", 8);
          errcheck (ca, spab);
        }
 /* PEND FI-Operation                                                     */
   KDCS_PENDFI();
}
Program unit TPUPDATE
 #include <kcmac.h>
 #include "tp.h"
 void TPUPDATE ( struct ca_area *ca , struct work *spab )
 {
 /* INIT-Operation                                                        */
    KDCS_SET (&spab->param, &ca->ca_head, &ca->ca_return);
    KDCS_INIT (0,sizeof(struct work));
    if (KCRCC != 0 )
        { memcpy (spab->progname, "TPUPDATE", 8);
          errcheck (ca, spab);
        }
     else
        memcpy (spab->std_mask.TAC, ca->ca_head.kcpr_tac, 8);
 /* MGET-Operation                                                        */
    KDCS_MGET ( spab->std_mask.FUNCTION
               ,sizeof( FORM1 )  
               ,"*FORM1  "               );
    if (KCRCC != 0 )
        { memcpy (spab->progname, "TPUPDATE", 8);
          errcheck (ca, spab);
        }
 /* call function "tpfile" for updating address                           */
   TPFILE (ca, spab);
 /* MPUT-Operation                                                        */
    KDCS_MPUTNT (&spab->std_mask,
                 sizeof(FORM1),KDCS_SPACES,"*FORM1  ",KCNODF);
    if (KCRCC != 0 )
        { memcpy (spab->progname, "TPUPDATE", 8);
          errcheck (ca, spab);
        }
 /* PEND FI-Operation                                                     */
   KDCS_PENDFI();
}
Program unit BADTACS
 #include <kcmac.h>
 #include "tp.h"
 #define ERRLINE "****** Wrong TAC - Please repeat \
 Input ******                                 "
 void BADTACS (struct ca_area *ca, struct work *spab )
 {
 /* INIT-Operation                                                        */
   KDCS_SET (&spab->param, &ca->ca_head, &ca->ca_return);
   memset (&spab->std_mask.TAC,  ́  ́, 8);
    KDCS_INIT (0,sizeof(struct work));
    if (KCRCC != 0 )
        { memcpy (spab->progname, "BADTACS", 8);
          errcheck (ca, spab);
        }
 /* MGET-Operation                                                        */
   KDCS_MGET ( spab->std_mask.FUNCTION
              ,sizeof( FORM1 )
              ,ca->ca_return.kcrfn        );
   if (KCRCC != 0 )
          { memcpy (spab->progname, "BADTACS", 8);
            errcheck (ca, spab);
          }
 /* MPUT-Operation: Replace the standard error message                     */
   memcpy (spab->std_mask.MSGTEXT, ERRLINE, 80);
   memset (spab->std_mask.TAC,  ́  ́, 8);
   KDCS_MPUTNT ( &spab->std_mask
                 ,sizeof( FORM1 )
                 ,KDCS_SPACES
                 ,"*FORM1  "
                 ,KCNODF          );
   if (KCRCC != 0 )
        { memcpy (spab->progname, "BADTACS", 8);
          errcheck (ca, spab);
         }
 /* PEND FI call                                                        */
   KDCS_PENDFI();
}
Function ERRCHECK
 #include <kcmac.h>
 #include "tp.h"
 void errcheck ( struct ca_area * ca , struct work * spab )
 {
   struct err_line
     { char ftext[35];
       char progname[8];
       char optext[10];
       char op_code[4];
       char cctext[8];
       char cc[3];
       char cdtext[8];
       char cd[4];
     } err_msg;
/*  -------  Making connections for the KDCS_... macros   --------  */
   KDCS_SET (&spab->param, &ca->ca_head, &ca->ca_return);
 /* making entries in the errorline                                       */
   memcpy (err_msg.ftext, "******  E R R O R  in program unit ",35);
   memcpy (err_msg.progname, spab->progname, 8);
   memcpy (err_msg.optext, " Op-Code: ",10);
   memcpy (err_msg.op_code, pa.kcop, 4);
   memcpy (err_msg.cctext, " kcrccc=", 8);
   memcpy (err_msg.cc, KDCS_ERR , 3);
   memcpy (err_msg.cdtext, " kcrcdc=", 8);
   memcpy (err_msg.cd, KDCS_RTI->kcrcdc, 4);
   memset (&spab->std_mask,  ́  ́, sizeof (FORM1));
   memcpy (spab->std_mask.MSGTEXT, &err_msg, 80);
 /* MPUT-Operation                                                        */
    KDCS_MPUTNE (&spab->std_mask,sizeof(FORM1),KDCS_SPACES,"*FORM1  ",KCNODF);
 /* PEND ER-Operation                                                     */
   KDCS_PENDER();
}
Program unit TPFILE with START/SHUT exits and file accesses
  #include <stdio.h>
  #include <string.h>
  #include <stdlib.h>
  #include <kcpa.h>
  #include <kcca.h>
  #include "tp.h"
  #define M spab->std_mask
  #define TAC ca->ca_head.kccv_tac
  #define JOB TAC[0]
  #define ADR_LENGTH ( (long) sizeof( ADDRESS ) )
  #define READ     ́1 ́
  #define WRITE    ́2 ́
  #define UPDATE   ́3 ́
  #define DELETE   ́4 ́
#ifdef __SNI_HOST_BS2000
  #define FILE_NAME "link=CAPPLI"
  #define FILE_MODE "r+b,type=record,forg=key"
  #define FILE_MODE_FIRST "w+b,type=record,forg=key"
#else
  #define FILE_NAME "cappli.address"
  #define FILE_MODE "r+b"
  #define FILE_MODE_FIRST "w+b"
#endif
  #define PREVIOUS_POSITION  -ADR_LENGTH
  #define SAG_NAME       "FUJITSU TECHNOLOGY SOLUTIONS"
  #define SAG_STREET     "Musterstrasse"
  #define SAG_NUMBER     "6"
  #define SAG_PCODE      "12345"
  #define SAG_RES        "Musterstadt"
  #define SAG_PHONE      "+12 34 567-89"
  typedef enum {
                 FOUND     = 1
                ,NOT_FOUND = 2
                } address_status;
  static address_status addr_fetch(struct work * );
  static ADDRESS   address;
  static FILE    * filepointer;
  static fpos_t    FilePosition;
  void TPFILE ( struct ca_area * ca , struct work *spab )
  {
    int pr_swtch;
#ifdef __SNI_HOST_BS2000
    char BS2Cmd[500];
#endif
    if (strncmp (TAC,"STARTUP ", 8) == 0)
       pr_swtch = 1;
    else

      { if (strncmp (TAC,"SHUTDOWN", 8) == 0)
            pr_swtch = 2;
        else
         { pr_swtch = 3;
           memset (M.MSGTEXT,  ́* ́, 80);
         }
      }
    switch (pr_swtch)
    { case 1:
#ifdef __SNI_HOST_BS2000
        sprintf(  BS2Cmd ,
                "SET-FILE-LINK LINK-NAME = CAPPLI ,FILE-NAME = CAPPLI.ADDRESS"\
                "             ,SUPPORT     = *DISK( SHARED-UPDATE = *YES)    ",
                ADR_LENGTH );
        system(  BS2Cmd );
#endif
        if ((filepointer = fopen (FILE_NAME, FILE_MODE)) == NULL) {  
            if((filepointer = fopen( FILE_NAME , FILE_MODE_FIRST )) == NULL ) {
              perror("fopen:");
              exit(-1);
              }
            memcpy( address.NAME  , SAG_NAME   , sizeof( SAG_NAME   )-1);
            memcpy( address.STREET, SAG_STREET , sizeof( SAG_STREET )-1);
            memcpy( address.NUMBER, SAG_NUMBER , sizeof( SAG_NUMBER )-1);
            memcpy( address.POSTAL_CODE , SAG_PCODE  , sizeof( SAG_PCODE  )-1);
            memcpy( address.RESIDENCE   , SAG_RES    , sizeof( SAG_RES    )-1);
            memcpy( address.PHONE , SAG_PHONE  , sizeof( SAG_PHONE  )-1);
            fwrite(&address, ADR_LENGTH, 1, filepointer);
            fclose( filepointer );
            if ((filepointer = fopen (FILE_NAME, FILE_MODE)) == NULL) {  
              perror("fopen:");
              exit(-1);
              }
            }
            break;
      case 2:
        fclose (filepointer);
        break;
      case 3:
         switch (JOB)
          { case READ:
              memcpy (M.FUNCTION, "Show address         ******", 26);
              if (addr_fetch( spab ) == NOT_FOUND)
                { memcpy (M.MSGTEXT, "Address not found      ", 22);
                  break;
                }
              else
                { memcpy (M.addr.NAME, address.NAME, ADR_LENGTH );
                  break;
                }
            case WRITE:
              memcpy (M.FUNCTION, "Enter address           ***", 26);
              if (addr_fetch( spab ) == FOUND)
                { memcpy (M.MSGTEXT, "Address already exists  ", 23);
                  break;
                }
              else
                { memcpy (address.NAME, M.addr.NAME, ADR_LENGTH );
                  fseek  (filepointer, 0, 2);
                  fwrite (&address, ADR_LENGTH, 1, filepointer);
                  memcpy (M.MSGTEXT, "Address entered          ", 24);
                  break;
                }
            case UPDATE:
              memcpy (M.FUNCTION, "Update address       ******", 26);
              if (addr_fetch( spab ) == NOT_FOUND)
                { memcpy (M.MSGTEXT, "Address not found      ", 22);
                  break;
                }
              else
                { memcpy (address.NAME, M.addr.NAME, ADR_LENGTH );
                  fsetpos(filepointer,&FilePosition );    
                  fwrite (&address, ADR_LENGTH, 1, filepointer);
                  memcpy (M.MSGTEXT, "Address changed ", 16);
                  break;
                }
            case DELETE:
              memcpy (M.FUNCTION, "Delete address        *****", 26);
              if (addr_fetch( spab ) == NOT_FOUND)
                { memcpy (M.MSGTEXT, "Address not found      ", 22);
                  break;
                }
              else
                 {
#ifndef __SNI_HOST_BS2000
                  memset (&address,  ́* ́, ADR_LENGTH);
                  fsetpos(filepointer,&FilePosition );    
                  fwrite (&address, ADR_LENGTH, 1, filepointer);
#else             
                  fdelrec(filepointer , NULL );
                  memcpy (M.MSGTEXT, "Address deleted        ", 22);
                  break;
#endif
                }
         }
     }
      return;
  }
 /*************************************************************************/
 /*                       Function addr_fetch                             */
 /*************************************************************************/
 static address_status addr_fetch( struct work *spab )
 {
   address_status filestatus = NOT_FOUND;
   memset (&address, 0X00, ADR_LENGTH);
   fseek (filepointer, 0, 0);
   while ( fgetpos( filepointer , &FilePosition ) ,
             (fread (&address, ADR_LENGTH, 1, filepointer)) != NULL)
     {
       if (address.NAME[0] !=  ́* ́)            /* Address not deleted      */
         {
           if (strncmp (address.NAME, M.addr.NAME, sizeof M.addr.NAME) == 0)
             if (strncmp (address.FIRST_NAME
                         , M.addr.FIRST_NAME
                         , sizeof M.addr.FIRST_NAME) == 0)
               { filestatus = FOUND;
                 break;
               }
         }
       memset (&address, 0X00, ADR_LENGTH);
     }
   return filestatus;
}
KDCDEF statements
REM *****************************************************************
REM ***               D E F  -  S T A T E M E N T S               ***
REM ***                                                           ***
REM ***                      KDCFILE = CAPPLI                     ***
REM *****************************************************************
*
OPTION GEN=ALL
*
ROOT CAPPLI
*
*+------------------------------------------------------------------+
*| MAX statements                                                   |
*+------------------------------------------------------------------+
*
MAX KDCFILE     = kdcfile
MAX APPLINAME   = CAPPLI
MAX APPLIMODE   = S
MAX TASKS       = 3
MAX ASYNTASKS   = 1
MAX PGPOOL      = (25)
MAX CACHESIZE   = (100,30)
MAX TRACEREC    = 10000
MAX RECBUF      = (5,4096)
MAX LPUTBUF     = 10    
MAX LPUTLTH     = 4096
MAX TERMWAIT    = 60
MAX KB          = 1024
MAX NB          = 2048
MAX SPAB        = 4096
MAX CLRCH       = X ́FF ́
*
*+------------------------------------------------------------------+
*| FORMSYS statement                                                |
*+------------------------------------------------------------------+
*
FORMSYS ...
*
*+------------------------------------------------------------------+
*| MESSAGE statement                                                |
*+------------------------------------------------------------------+
*
MESSAGE MODULE=MSGS
*
*+------------------------------------------------------------------+
*| PROGRAM statements                                               |
*+------------------------------------------------------------------+

*
*
*
OPTION DATA={ PROGRAM-STATIC | PROGRAM-SHARED-OBJ | PROGRAM-BLS | PROGRAM-OLD-DLL }
*
*
*
*+------------------------------------------------------------------+
*| EXIT statements                                                  |
*+------------------------------------------------------------------+
*
EXIT PROGRAM=TPFILE ,USAGE=START
EXIT PROGRAM=TPFILE ,USAGE=SHUT
*
*+------------------------------------------------------------------+
*| TAC statements                                                   |
*+------------------------------------------------------------------+
*
REM ***         ADMINISTRATION DIALOG           ***
TAC KDCTAC    ,PROGRAM=KDCADM , ADMIN=Y
TAC KDCLTERM  ,PROGRAM=KDCADM , ADMIN=Y
TAC KDCPTERM  ,PROGRAM=KDCADM , ADMIN=Y
TAC KDCSWTCH  ,PROGRAM=KDCADM , ADMIN=Y
TAC KDCSEND   ,PROGRAM=KDCADM , ADMIN=Y
TAC KDCAPPL   ,PROGRAM=KDCADM , ADMIN=Y
TAC KDCUSER   ,PROGRAM=KDCADM , ADMIN=Y
TAC KDCDIAG   ,PROGRAM=KDCADM , ADMIN=Y
TAC KDCLOG    ,PROGRAM=KDCADM , ADMIN=Y
TAC KDCINF    ,PROGRAM=KDCADM , ADMIN=READ
TAC KDCHELP   ,PROGRAM=KDCADM , ADMIN=READ
TAC KDCSHUT   ,PROGRAM=KDCADM , ADMIN=Y
TAC KDCTCL    ,PROGRAM=KDCADM , ADMIN=Y
*
REM ***       ADMINISTRATION  ASYNCHRON         ***
TAC KDCTACA   ,PROGRAM=KDCADM ,TYPE=A , ADMIN=Y
TAC KDCLTRMA  ,PROGRAM=KDCADM ,TYPE=A , ADMIN=Y
TAC KDCPTRMA  ,PROGRAM=KDCADM ,TYPE=A , ADMIN=Y
TAC KDCSWCHA  ,PROGRAM=KDCADM ,TYPE=A , ADMIN=Y
TAC KDCUSERA  ,PROGRAM=KDCADM ,TYPE=A , ADMIN=Y
TAC KDCSENDA  ,PROGRAM=KDCADM ,TYPE=A , ADMIN=Y
TAC KDCAPPLA  ,PROGRAM=KDCADM ,TYPE=A , ADMIN=Y
TAC KDCDIAGA  ,PROGRAM=KDCADM ,TYPE=A , ADMIN=Y
TAC KDCLOGA   ,PROGRAM=KDCADM ,TYPE=A , ADMIN=Y
TAC KDCINFA   ,PROGRAM=KDCADM ,TYPE=A , ADMIN=READ
TAC KDCHELPA  ,PROGRAM=KDCADM ,TYPE=A , ADMIN=READ
TAC KDCSHUTA  ,PROGRAM=KDCADM ,TYPE=A , ADMIN=Y
TAC KDCTCLA   ,PROGRAM=KDCADM ,TYPE=A , ADMIN=Y
*
REM ***    Application specific TACs            ***
*
TAC KDCMSGTC , PROGRAM=NOHACK
TAC KDCBADTC , PROGRAM=BADTACS
TAC 1        , PROGRAM=TPREAD                , LOCK = 1
TAC 2        , PROGRAM=TPUPDATE , TACCLASS=1 , LOCK = 2  
TAC 3        , PROGRAM=TPUPDATE , TACCLASS=1 , LOCK = 2
TAC 4        , PROGRAM=TPUPDATE , TACCLASS=1 , LOCK = 2
*
*+------------------------------------------------------------------+
*| TACCLASS statements                                              |
*+------------------------------------------------------------------+
*
TACCLASS 1,TASKS=1
*
*+------------------------------------------------------------------+
*| USER statements                                                  |
*+------------------------------------------------------------------+
*
USER NINA  ,PASS=C ́SOLO ́ ,FORMAT=*FORM1 ,KSET=BUNDLE1                   (1)
USER URSUS               ,FORMAT=*FORM1 ,KSET=BUNDLE2                   (1)
USER ADMIN ,PASS=C ́ADM ́                 ,KSET=MASTER,PERMIT=ADMIN
*
*+------------------------------------------------------------------+
*| TLS statements                                                   |
*+------------------------------------------------------------------+
*
TLS    TLSB
*
*+------------------------------------------------------------------+
*| TPOOL statements                                                 |
*+------------------------------------------------------------------+
*
TPOOL LTERM=...    , NUMBER=2 , PRONAM=*ANY, PTYPE=...  , KSET = MASTER
TPOOL LTERM=...    , NUMBER=2 , PRONAM=*ANY, PTYPE=...  , KSET = MASTER
*
*+------------------------------------------------------------------+
*| PTERM / LTERM statements                                        |
*+-----------------------------------------------------------------+
*
OPTION DATA=TERM  
*
*+------------------------------------------------------------------+
*| KSET  statements                                                 |
*+------------------------------------------------------------------+
*
KSET BUNDLE1 , KEYS=(1,2)
KSET BUNDLE2 , KEYS=(1)
KSET MASTER, KEYS=MASTER

(1) BS2000 format


Input files for the generation procedure

PROGRAM statements:

PROGRAM-STATIC (for static linking)
PROGRAM KDCADM   ,COMP=C
PROGRAM TPREAD   ,COMP=C
PROGRAM TPUPDATE ,COMP=C
PROGRAM TPFILE   ,COMP=C
PROGRAM NOHACK   ,COMP=C
PROGRAM BADTACS  ,COMP=C
PROGRAM-BLS (for dynamic loading with BLS)
* ------------------------------------------------------------------+
DEFAULT PROGRAM  COMP = C
PROGRAM KDCADM
* ------------------------------------------------------------------+
MPOOL LCPOOL , SIZE     = 10                                  -
             , SCOPE    = GROUP                               -
             , ACCESS   = READ
* ------------------------------------------------------------------+
LOAD-MODULE LLMTPS   , VERSION   = 001                        -
                     , LIB       = DYNAMIC-LOADED-LIB         -
                     , LOAD-MODE = (POOL,LCPOOL,STARTUP)
* ------------------------------------------------------------------+
DEFAULT PROGRAM COMP = C , LOAD-MODULE = LLMTPS
PROGRAM BADTACS
PROGRAM TPUPDATE 
PROGRAM TPREAD
PROGRAM TPFILE
PROGRAM NOHACK
PTERM/LTERM statement:
PTERM TERM05 ,PTYPE=T9750 ,LTERM=DST01 ,PRONAM=HOST0001 
LTERM DST01
PTERM TERM10 ,PTYPE=T9750 ,LTERM=DST02 ,PRONAM=HOST0001 
LTERM DST02
PTERM TERM11 ,PTYPE=T9763 ,LTERM=DST03 ,PRONAM=HOST0001 
LTERM DST03
PTERM TERM12 ,PTYPE=T9763 ,LTERM=DSTADMIN ,PRONAM=HOST0001 
LTERM DSTADMIN
PTERM D17   ,PTYPE=T9001 ,LTERM=PRINTER1 ,PRONAM=HOST0001 
LTERM PRINTER1 , USAGE = O