Imported Upstream version 1.3.11
[debian/mtx] / vms / scsi.c
index 6cd76854c4c08e9d86b47f67a179d7e0f0c6dc33..5b3257225e7d4032b844c163b914f6d4a475b1d0 100644 (file)
 
 typedef struct scsi$desc
 {
-  unsigned int SCSI$L_OPCODE;      /* SCSI Operation Code */
-  unsigned int SCSI$L_FLAGS;       /* SCSI Flags Bit Map */
-  unsigned char *SCSI$A_CMD_ADDR;   /* ->SCSI Command Buffer */
-  unsigned int SCSI$L_CMD_LEN;     /* SCSI Command Length (bytes) */
-  unsigned char *SCSI$A_DATA_ADDR;  /* ->SCSI Data Buffer */
-  unsigned int SCSI$L_DATA_LEN;            /* SCSI Data Length (bytes) */
-  unsigned int SCSI$L_PAD_LEN;     /* SCSI Pad Length (bytes) */
-  unsigned int SCSI$L_PH_CH_TMOUT;  /* SCSI Phase Change Timeout (seconds) */
-  unsigned int SCSI$L_DISCON_TMOUT; /* SCSI Disconnect Timeout (seconds) */
-  unsigned int SCSI$L_RES_1;       /* Reserved */
-  unsigned int SCSI$L_RES_2;       /* Reserved */
-  unsigned int SCSI$L_RES_3;       /* Reserved */
-  unsigned int SCSI$L_RES_4;       /* Reserved */
-  unsigned int SCSI$L_RES_5;       /* Reserved */
-  unsigned int SCSI$L_RES_6;       /* Reserved */
+       unsigned int SCSI$L_OPCODE;         /* SCSI Operation Code */
+       unsigned int SCSI$L_FLAGS;          /* SCSI Flags Bit Map */
+       unsigned char *SCSI$A_CMD_ADDR;   /* ->SCSI Command Buffer */
+       unsigned int SCSI$L_CMD_LEN;        /* SCSI Command Length (bytes) */
+       unsigned char *SCSI$A_DATA_ADDR;  /* ->SCSI Data Buffer */
+       unsigned int SCSI$L_DATA_LEN;       /* SCSI Data Length (bytes) */
+       unsigned int SCSI$L_PAD_LEN;        /* SCSI Pad Length (bytes) */
+       unsigned int SCSI$L_PH_CH_TMOUT;  /* SCSI Phase Change Timeout (seconds) */
+       unsigned int SCSI$L_DISCON_TMOUT; /* SCSI Disconnect Timeout (seconds) */
+       unsigned int SCSI$L_RES_1;          /* Reserved */
+       unsigned int SCSI$L_RES_2;          /* Reserved */
+       unsigned int SCSI$L_RES_3;          /* Reserved */
+       unsigned int SCSI$L_RES_4;          /* Reserved */
+       unsigned int SCSI$L_RES_5;          /* Reserved */
+       unsigned int SCSI$L_RES_6;          /* Reserved */
 }
 SCSI$DESC;
 
@@ -95,10 +95,10 @@ SCSI$DESC;
 
 typedef struct scsi$iosb
 {
-  unsigned short SCSI$W_VMS_STAT;   /* VMS Status Code */
-  unsigned long SCSI$L_IOSB_TFR_CNT; /* Actual Byte Count Transferred */
-  unsigned char SCSI$B_IOSB_FILL_1; /* Unused */
-  unsigned char SCSI$B_IOSB_STS;    /* SCSI Device Status */
+       unsigned short SCSI$W_VMS_STAT;         /* VMS Status Code */
+       unsigned long SCSI$L_IOSB_TFR_CNT;      /* Actual Byte Count Transferred */
+       unsigned char SCSI$B_IOSB_FILL_1;       /* Unused */
+       unsigned char SCSI$B_IOSB_STS;          /* SCSI Device Status */
 }
 SCSI$IOSB;
 
@@ -133,240 +133,268 @@ SCSI$IOSB;
 
 static struct dsc$descriptor_s *descr(char *String)
 {
-  static struct dsc$descriptor_s d_descrtbl[DESCR_CNT];
-  static unsigned short descridx = 0;
-  struct dsc$descriptor_s *d_ret = &d_descrtbl[descridx];
-  descridx = (descridx + 1) & (DESCR_CNT - 1);
-  d_ret->dsc$w_length = strlen((const char *) String);
-  d_ret->dsc$a_pointer = String;
-  d_ret->dsc$b_class = 0;
-  d_ret->dsc$b_dtype = 0;
-  return d_ret;
+       static struct dsc$descriptor_s d_descrtbl[DESCR_CNT];
+       static unsigned short descridx = 0;
+       struct dsc$descriptor_s *d_ret = &d_descrtbl[descridx];
+       descridx = (descridx + 1) & (DESCR_CNT - 1);
+       d_ret->dsc$w_length = strlen((const char *) String);
+       d_ret->dsc$a_pointer = String;
+       d_ret->dsc$b_class = 0;
+       d_ret->dsc$b_dtype = 0;
+
+       return d_ret;
 }
 
 
 static int SCSI_OpenDevice(char *DeviceName)
 {
-  unsigned long d_dev[2], iosb[2], Status;
-  union prvdef setprivs, newprivs;
-  unsigned long ismnt = 0;
-  unsigned long dvcls = 0;
-  unsigned long dchr2 = 0;
-  int DeviceFD = 0;
-  struct itmlst_3 {
-    unsigned short ilen;
-    unsigned short code;
-    unsigned long *returnP;
-    unsigned long ignored;
-  } dvi_itmlst[] = { { 4, DVI$_MNT, 0 /*&ismnt*/, 0 },
-                    { 4, DVI$_DEVCLASS, 0 /*&dvcls*/, 0 },
-                    { 4, DVI$_DEVCHAR2, 0 /*&dchr2*/, 0 },
-                    { 0, 0, 0, 0 } };
-  dvi_itmlst[0].returnP = &ismnt;
-  dvi_itmlst[1].returnP = &dvcls;
-  dvi_itmlst[2].returnP = &dchr2;
-  Status = sys$alloc(descr(DeviceName), 0, 0, 0, 0);
-  if (FailureStatusP(Status))
-    {
-      VMS_ExitCode = Status;
-      FatalError("cannot allocate device '%s' - %X\n", DeviceName, Status);
-    }
-  Status = sys$assign(descr(DeviceName), &DeviceFD, 0, 0);
-  if (FailureStatusP(Status))
-    {
-      VMS_ExitCode = Status;
-      FatalError("cannot open device '%s' - %X\n", DeviceName, Status);
-    }
-  Status = sys$getdviw(0, DeviceFD, 0, &dvi_itmlst, &iosb, 0, 0, 0);
-  if (FailureStatusP(Status))
-    {
-      VMS_ExitCode = Status;
-      FatalError("cannot $getdvi(1) on device '%s' - %X\n", DeviceName, Status);
-    }
-  if (FailureStatusP(Status = iosb[0]))
-    {
-      VMS_ExitCode = Status;
-      FatalError("cannot $getdvi(2) on device '%s' - %X\n", DeviceName, Status);
-    }
-  if (dvcls != DC$_TAPE)
-    {
-      VMS_ExitCode = SS$_IVDEVNAM;
-      FatalError("specified device is NOT a magtape: operation denied\n");
-    }
+       unsigned long d_dev[2], iosb[2], Status;
+       union prvdef setprivs, newprivs;
+       unsigned long ismnt = 0;
+       unsigned long dvcls = 0;
+       unsigned long dchr2 = 0;
+       int DeviceFD = 0;
+       struct itmlst_3
+       {
+               unsigned short ilen;
+               unsigned short code;
+               unsigned long *returnP;
+               unsigned long ignored;
+       }
+       dvi_itmlst[] = {
+               { 4, DVI$_MNT, 0 /*&ismnt*/, 0 },
+               { 4, DVI$_DEVCLASS, 0 /*&dvcls*/, 0 },
+               { 4, DVI$_DEVCHAR2, 0 /*&dchr2*/, 0 },
+               { 0, 0, 0, 0 }
+       };
+
+       dvi_itmlst[0].returnP = &ismnt;
+       dvi_itmlst[1].returnP = &dvcls;
+       dvi_itmlst[2].returnP = &dchr2;
+
+       Status = sys$alloc(descr(DeviceName), 0, 0, 0, 0);
+
+       if (FailureStatusP(Status))
+       {
+               VMS_ExitCode = Status;
+               FatalError("cannot allocate device '%s' - %X\n", DeviceName, Status);
+       }
+
+       Status = sys$assign(descr(DeviceName), &DeviceFD, 0, 0);
+       if (FailureStatusP(Status))
+       {
+               VMS_ExitCode = Status;
+               FatalError("cannot open device '%s' - %X\n", DeviceName, Status);
+       }
+
+       Status = sys$getdviw(0, DeviceFD, 0, &dvi_itmlst, &iosb, 0, 0, 0);
+       if (FailureStatusP(Status))
+       {
+               VMS_ExitCode = Status;
+               FatalError("cannot $getdvi(1) on device '%s' - %X\n", DeviceName, Status);
+       }
+
+       if (FailureStatusP(Status = iosb[0]))
+       {
+               VMS_ExitCode = Status;
+               FatalError("cannot $getdvi(2) on device '%s' - %X\n", DeviceName, Status);
+       }
+
+       if (dvcls != DC$_TAPE)
+       {
+               VMS_ExitCode = SS$_IVDEVNAM;
+               FatalError("specified device is NOT a magtape: operation denied\n");
+       }
 #ifndef __DECC
 #ifndef DEV$M_SCSI
 #define DEV$M_SCSI 0x1000000
 #endif
 #endif
-  if (~dchr2 & DEV$M_SCSI)
-    {
-      VMS_ExitCode = SS$_IVDEVNAM;
-      FatalError("specified magtape is NOT a SCSI device: operation denied\n");
-    }
+       if (~dchr2 & DEV$M_SCSI)
+       {
+               VMS_ExitCode = SS$_IVDEVNAM;
+               FatalError("specified magtape is NOT a SCSI device: operation denied\n");
+       }
 #if USING_DEC_DRIVE | USING_LDRSET
 #ifndef __DECC
 #ifndef DEV$M_LDR
 #define DEV$M_LDR 0x100000
 #endif
 #endif
-  if (~dchr2 & DEV$M_LDR)
-    {
-      VMS_ExitCode = SS$_IVDEVNAM;
-      FatalError(
-       "specified SCSI magtape does not have a loader: operation denied\n");
-    }
+       if (~dchr2 & DEV$M_LDR)
+       {
+               VMS_ExitCode = SS$_IVDEVNAM;
+               FatalError("specified SCSI magtape does not have a loader: operation denied\n");
+       }
 #endif
-  if (ismnt)
-    {
-      VMS_ExitCode = SS$_DEVMOUNT;
-      FatalError("specified device is mounted: operation denied\n");
-    }
-  ots$move5(0, 0, 0, sizeof(newprivs), &newprivs);
-  newprivs.prv$v_diagnose = 1;
-  newprivs.prv$v_log_io = 1;
-  newprivs.prv$v_phy_io = 1;
-  Status = sys$setprv(1, &newprivs, 0, 0);
-  if (FailureStatusP(Status))
-    {
-      VMS_ExitCode = Status;
-      FatalError(
-       "error enabling privs (diagnose,log_io,phy_io): operation denied\n");
-    }
-  Status = sys$setprv(1, 0, 0, &setprivs);
-  if (FailureStatusP(Status))
-    {
-      VMS_ExitCode = Status;
-      FatalError("error retrieving current privs: operation denied\n");
-    }
-  if (!setprivs.prv$v_diagnose)
-    {
-      VMS_ExitCode = SS$_NODIAGNOSE;
-      FatalError("DIAGNOSE privilege is required: operation denied\n");
-    }
-  if (!setprivs.prv$v_phy_io && !setprivs.prv$v_log_io)
-    {
-      VMS_ExitCode = SS$_NOPHY_IO;
-      FatalError("PHY_IO or LOG_IO privilege is required: operation denied\n");
-    }
-  return DeviceFD;
+       if (ismnt)
+       {
+               VMS_ExitCode = SS$_DEVMOUNT;
+               FatalError("specified device is mounted: operation denied\n");
+       }
+
+       ots$move5(0, 0, 0, sizeof(newprivs), &newprivs);
+       newprivs.prv$v_diagnose = 1;
+       newprivs.prv$v_log_io = 1;
+       newprivs.prv$v_phy_io = 1;
+       Status = sys$setprv(1, &newprivs, 0, 0);
+
+       if (FailureStatusP(Status))
+       {
+               VMS_ExitCode = Status;
+               FatalError("error enabling privs (diagnose,log_io,phy_io): operation denied\n");
+       }
+
+       Status = sys$setprv(1, 0, 0, &setprivs);
+       if (FailureStatusP(Status))
+       {
+               VMS_ExitCode = Status;
+               FatalError("error retrieving current privs: operation denied\n");
+       }
+
+       if (!setprivs.prv$v_diagnose)
+       {
+               VMS_ExitCode = SS$_NODIAGNOSE;
+               FatalError("DIAGNOSE privilege is required: operation denied\n");
+       }
+
+       if (!setprivs.prv$v_phy_io && !setprivs.prv$v_log_io)
+       {
+               VMS_ExitCode = SS$_NOPHY_IO;
+               FatalError("PHY_IO or LOG_IO privilege is required: operation denied\n");
+       }
+
+       return DeviceFD;
 }
 
 
-static void SCSI_CloseDevice(char *DeviceName,
-                            int DeviceFD)
+static void SCSI_CloseDevice(char *DeviceName, int DeviceFD)
 {
-  unsigned long Status;
-  Status = sys$dassgn(DeviceFD);
-  if (FailureStatusP(Status))
-    FatalError("cannot close SCSI device '%s' - %X\n", DeviceName, Status);
+       unsigned long Status;
+
+       Status = sys$dassgn(DeviceFD);
+       if (FailureStatusP(Status))
+               FatalError("cannot close SCSI device '%s' - %X\n", DeviceName, Status);
 }
 
 
-static int SCSI_ExecuteCommand(int DeviceFD,
-                              Direction_T Direction,
-                              CDB_T *CDB,
-                              int CDB_Length,
-                              void *DataBuffer,
-                              int DataBufferLength,
-                              RequestSense_T *RequestSense)
+static int SCSI_ExecuteCommand(        int DeviceFD,
+                                                               Direction_T Direction,
+                                                               CDB_T *CDB,
+                                                               int CDB_Length,
+                                                               void *DataBuffer,
+                                                               int DataBufferLength,
+                                                               RequestSense_T *RequestSense)
 {
-  SCSI$DESC cmd_desc;
-  SCSI$IOSB cmd_iosb;
-  unsigned long Status;
-  int Result;
-  memset(RequestSense, 0, sizeof(RequestSense_T));
-  /* Issue the QIO to send the SCSI Command. */
-  ots$move5(0, 0, 0, sizeof(cmd_desc), &cmd_desc);
-  cmd_desc.SCSI$L_OPCODE = 1; /* Only defined SCSI opcode... a VMS thing */
-  cmd_desc.SCSI$A_CMD_ADDR = CDB;
-  cmd_desc.SCSI$L_CMD_LEN = CDB_Length;
-  cmd_desc.SCSI$A_DATA_ADDR = DataBuffer;
-  cmd_desc.SCSI$L_DATA_LEN = DataBufferLength;
-  cmd_desc.SCSI$L_PAD_LEN = 0;
-  cmd_desc.SCSI$L_PH_CH_TMOUT = 180; /* SCSI Phase Change Timeout (seconds) */
-  cmd_desc.SCSI$L_DISCON_TMOUT = 180; /* SCSI Disconnect Timeout (seconds) */
-  switch (Direction)
-    {
-      /*
-       NOTE: Do NOT include flag SCSI$K_FL_ENAB_SYNC.
-             It does NOT work for this case.
-      */
-    case Input:
-      cmd_desc.SCSI$L_FLAGS = SCSI$K_READ | SCSI$K_FL_ENAB_DIS;
-      break;
-    case Output:
-      cmd_desc.SCSI$L_FLAGS = SCSI$K_WRITE | SCSI$K_FL_ENAB_DIS;
-      break;
-    }
-  /* Issue the SCSI Command. */
-  Status = sys$qiow(MK_EFN, DeviceFD, IO$_DIAGNOSE, &cmd_iosb, 0, 0,
-                    &cmd_desc, sizeof(cmd_desc), 0, 0, 0, 0);
-  Result = SCSI$K_GOOD;
-  if (Status & 1)
-    Status = cmd_iosb.SCSI$W_VMS_STAT;
-  if (Status & 1)
-    Result = cmd_iosb.SCSI$B_IOSB_STS;
-  if (Result != SCSI$K_GOOD)
-    {
-      unsigned char RequestSenseCDB[6] =
-       { 0x03 /* REQUEST_SENSE */, 0, 0, 0, sizeof(RequestSense_T), 0 };
-      printf("SCSI command error: %d - requesting sense data\n", Result);
-      /* Execute Request Sense to determine the failure reason. */
-      ots$move5(0, 0, 0, sizeof(cmd_desc), &cmd_desc);
-      cmd_desc.SCSI$L_OPCODE = 1; /* Only defined SCSI opcode... a VMS thing */
-      cmd_desc.SCSI$L_FLAGS = SCSI$K_READ | SCSI$K_FL_ENAB_DIS;
-      cmd_desc.SCSI$A_CMD_ADDR = RequestSenseCDB;
-      cmd_desc.SCSI$L_CMD_LEN = 6;
-      cmd_desc.SCSI$A_DATA_ADDR = RequestSense;
-      cmd_desc.SCSI$L_DATA_LEN = sizeof(RequestSense_T);
-      cmd_desc.SCSI$L_PH_CH_TMOUT = 180;
-      cmd_desc.SCSI$L_DISCON_TMOUT = 180;
-      /* Issue the QIO to send the Request Sense Command. */
-      Status = sys$qiow(MK_EFN, DeviceFD, IO$_DIAGNOSE, &cmd_iosb, 0, 0,
-                       &cmd_desc, sizeof(cmd_desc), 0, 0, 0, 0);
-      if (FailureStatusP(Status))
+       SCSI$DESC cmd_desc;
+       SCSI$IOSB cmd_iosb;
+       unsigned long Status;
+       int Result;
+       memset(RequestSense, 0, sizeof(RequestSense_T));
+       /* Issue the QIO to send the SCSI Command. */
+       ots$move5(0, 0, 0, sizeof(cmd_desc), &cmd_desc);
+       cmd_desc.SCSI$L_OPCODE = 1; /* Only defined SCSI opcode... a VMS thing */
+       cmd_desc.SCSI$A_CMD_ADDR = CDB;
+       cmd_desc.SCSI$L_CMD_LEN = CDB_Length;
+       cmd_desc.SCSI$A_DATA_ADDR = DataBuffer;
+       cmd_desc.SCSI$L_DATA_LEN = DataBufferLength;
+       cmd_desc.SCSI$L_PAD_LEN = 0;
+       cmd_desc.SCSI$L_PH_CH_TMOUT = 180; /* SCSI Phase Change Timeout (seconds) */
+       cmd_desc.SCSI$L_DISCON_TMOUT = 180; /* SCSI Disconnect Timeout (seconds) */
+
+       switch (Direction)
        {
-         printf("?Error returned from REQUEST_SENSE(1): %%X%08lX\n", Status);
-         sys$exit(Status);
+       /*
+       NOTE: Do NOT include flag SCSI$K_FL_ENAB_SYNC.
+       It does NOT work for this case.
+       */
+       case Input:
+               cmd_desc.SCSI$L_FLAGS = SCSI$K_READ | SCSI$K_FL_ENAB_DIS;
+               break;
+
+       case Output:
+               cmd_desc.SCSI$L_FLAGS = SCSI$K_WRITE | SCSI$K_FL_ENAB_DIS;
+               break;
        }
-      /* Check the VMS Status from QIO. */
-      Status = cmd_iosb.SCSI$W_VMS_STAT;
-      if (FailureStatusP(Status))
+
+       /* Issue the SCSI Command. */
+       Status = sys$qiow(MK_EFN, DeviceFD, IO$_DIAGNOSE, &cmd_iosb, 0, 0,
+       &cmd_desc, sizeof(cmd_desc), 0, 0, 0, 0);
+       Result = SCSI$K_GOOD;
+
+       if (Status & 1)
+               Status = cmd_iosb.SCSI$W_VMS_STAT;
+
+       if (Status & 1)
+               Result = cmd_iosb.SCSI$B_IOSB_STS;
+
+       if (Result != SCSI$K_GOOD)
        {
-         printf("?Error returned from REQUEST_SENSE(2): %%X%08lX\n", Status);
-         sys$exit(Status);
+               unsigned char RequestSenseCDB[6] =
+                       { 0x03 /* REQUEST_SENSE */, 0, 0, 0, sizeof(RequestSense_T), 0 };
+
+               printf("SCSI command error: %d - requesting sense data\n", Result);
+
+               /* Execute Request Sense to determine the failure reason. */
+               ots$move5(0, 0, 0, sizeof(cmd_desc), &cmd_desc);
+               cmd_desc.SCSI$L_OPCODE = 1; /* Only defined SCSI opcode... a VMS thing */
+               cmd_desc.SCSI$L_FLAGS = SCSI$K_READ | SCSI$K_FL_ENAB_DIS;
+               cmd_desc.SCSI$A_CMD_ADDR = RequestSenseCDB;
+               cmd_desc.SCSI$L_CMD_LEN = 6;
+               cmd_desc.SCSI$A_DATA_ADDR = RequestSense;
+               cmd_desc.SCSI$L_DATA_LEN = sizeof(RequestSense_T);
+               cmd_desc.SCSI$L_PH_CH_TMOUT = 180;
+               cmd_desc.SCSI$L_DISCON_TMOUT = 180;
+
+               /* Issue the QIO to send the Request Sense Command. */
+               Status = sys$qiow(MK_EFN, DeviceFD, IO$_DIAGNOSE, &cmd_iosb, 0, 0,
+                       &cmd_desc, sizeof(cmd_desc), 0, 0, 0, 0);
+               if (FailureStatusP(Status))
+               {
+                       printf("?Error returned from REQUEST_SENSE(1): %%X%08lX\n", Status);
+                       sys$exit(Status);
+               }
+
+               /* Check the VMS Status from QIO. */
+               Status = cmd_iosb.SCSI$W_VMS_STAT;
+               if (FailureStatusP(Status))
+               {
+                       printf("?Error returned from REQUEST_SENSE(2): %%X%08lX\n", Status);
+                       sys$exit(Status);
+               }
        }
-    }
-  return Result;
+       return Result;
 }
 
 
 static void VMS_DefineStatusSymbols(void)
 {
-  char SymbolName[32], SymbolValue[32];
-  int StorageElementNumber;
-  if (DataTransferElementFull)
-    {
-      /* Define MTX_DTE Symbol (environment variable) as 'FULL:n'. */
-      sprintf(SymbolValue, "FULL:%d",
-             DataTransferElementSourceStorageElementNumber);
-      lib$set_symbol(descr("MTX_DTE"), descr(SymbolValue), &2);
-    }
-  else
-    {
-      /* Define MTX_DTE Symbol (environment variable) as 'EMPTY'. */
-      lib$set_symbol(descr("MTX_DTE"), descr("EMPTY"), &2);
-    }
-  /* Define MTX_MSZ Symbol (environment variable) "Magazine SiZe" as 'n'. */
-  sprintf(SymbolValue, "%d", StorageElementCount);
-  lib$set_symbol(descr("MTX_MSZ"), descr(SymbolValue), &2);
-  for (StorageElementNumber = 1;
-       StorageElementNumber <= StorageElementCount;
-       StorageElementNumber++)
-    {
-      sprintf(SymbolName, "MTX_STE%02d", StorageElementNumber);
-      strcpy(SymbolValue,
-            (StorageElementFull[StorageElementNumber] ? "FULL" : "EMPTY"));
-      lib$set_symbol(descr(SymbolName), descr(SymbolValue), &2);
-    }
+       char SymbolName[32], SymbolValue[32];
+       int StorageElementNumber;
+
+       if (DataTransferElementFull)
+       {
+               /* Define MTX_DTE Symbol (environment variable) as 'FULL:n'. */
+               sprintf(SymbolValue, "FULL:%d",
+               DataTransferElementSourceStorageElementNumber);
+               lib$set_symbol(descr("MTX_DTE"), descr(SymbolValue), &2);
+       }
+       else
+       {
+               /* Define MTX_DTE Symbol (environment variable) as 'EMPTY'. */
+               lib$set_symbol(descr("MTX_DTE"), descr("EMPTY"), &2);
+       }
+
+       /* Define MTX_MSZ Symbol (environment variable) "Magazine SiZe" as 'n'. */
+       sprintf(SymbolValue, "%d", StorageElementCount);
+       lib$set_symbol(descr("MTX_MSZ"), descr(SymbolValue), &2);
+       for (StorageElementNumber = 1;
+                StorageElementNumber <= StorageElementCount;
+                StorageElementNumber++)
+       {
+               sprintf(SymbolName, "MTX_STE%02d", StorageElementNumber);
+               strcpy(SymbolValue,
+                       (StorageElementFull[StorageElementNumber] ? "FULL" : "EMPTY"));
+               lib$set_symbol(descr(SymbolName), descr(SymbolValue), &2);
+       }
 }