VMS -- List of FAQ's (Frequently Asked Questions)

This document is neither a manual nor a tutorial for VMS, more a summary on local usage, problems and peculiarities. See also

Table of contents


File transfer from Windows to VMS
Some Windows programs tend to produce text output files with a mixture of line separators. Under Windows a CR-LF combination should be used, but in some cases only a LF is generated (like under UNIX or VMS). The PostScript output of MS PowerPoint is an example, the PS header has only LF's, while the %%BeginResource: section has CR-LF's, and so on.
When such a file is transfered with a FTP put to a VMS system one is likely to get a VMS record length error like
   -> netout:Software caused connection abort
   550-RMS WRITE RTB record too large.
   550 !UL byte record too large for user's buffer

Workaround:

Background: Windows FTP in text mode simply transfers the contents of a file `as is'. This is even correct since the Windows line separator (CR-LF) is the same as the IP network representation and thus no conversion is needed. If the files have however mixed line separators can get artificially long records which VMS can't handle. The VMS FTP Daemon is also to blame, because it should be tolerant to large records when Steam_LF files are generated, but it isn't !
Unfortunately, even setting UCX$FTP_STREAMLF to "True" doesn't help, which is clearly a design fault.


Handling of EPS files generated on Windows
The Add EPS Preview command of the Windows version of GhostView adds a binary header to the EPS file and appends a bitmap. The resulting file is not longer a legal EPS file and causes problems on non-Windows systems.
In case such a Windows generated EPS file is to be used on a VMS (or UNIX) system one has to The bitmap stripping can be done with the ps_stripbitmap.pl Perl program.

Why are lines in VMSmail apparently truncated ?
Sometime one sees emails which have apparently truncated lines, e.g. indicated by incomplete sentences. This problem is seen mainly with emails coming from PC's (e.g. from Microsoft Mail), and has been send in QUOTED-PRINTABLE encoding.
The Message Exchange Agent (MX), which does the SMTP to VMSmail conversion, performs an automatic decoding on those emails, indicated by the header line
   X-MX-Comment: QUOTED-PRINTABLE message automatically decoded
This can lead to lines longer than some (unfortunate) limits imposed by VMSmail (255 characters in the DECwindows interface and about 500 characters in the mail storage). The long lines are truncated and the contents is lost, even when the email is extracted to a file.
One might wonder why there are such long lines in the first place. The reason is simply that typical word processoers these days associate a paragraph break with a . So all text in one paragraph is internally treated as one line. Some mailers now follow this logic and thus produce `long lines'.

Test: Simply execute

  $ perl -e "for ($i = 0; $i <90; $i++) { printf ""word %3.4d "",$i; }" -
         -e "print ""and finaly the end of a long line\n"";"  >x.xxx
  $ mail x.xxx 'f$getjpi("","username")' /nosig/sub="long line test"
and you see the effect.

Workaround: None.


Differences between DECC and VAXC C compilers
The VAXC, and VAX DECC and AXP DECC compilers react quite differently, especially when used with /STANDARD=PORT. For example
  main() {
    int   *i;
    int   **ii;   /* bad comment
    int   ***iii; /* good comment */

    i = ii;
  }
has a bad comment and a type mixup ( in i = ii ). Compiling this results into
  VAX:  cc/vaxc test
        cc/vaxc test /standard=port
           %CC-I-NESTEDCOMMENT, Nested comment encountered.
           %CC-I-NONPORTCVT, Conversions between pointers to different types..
        cc/decc test /standard=port
           %CC-W-PTRMISMATCH, In this statement, the referenced type of the..

  AXP:  cc test
           %CC-W-PTRMISMATCH, In this statement, the referenced type of the..
        cc test/standard=vaxc
        cc test/standard=port
Conclusion:

Is there a practical limit for the size of a directory ?
Yes. VMS caches only directories with less than 128 blocks. This makes operations on directories with 128 or more blocks rather slow. A simple delete operation in a 1400 block directory was seen to take several seconds ! So keep in mind:

BACKUP performance. Meaning and usage of /NOCRC and /GROUP
The default behaviour of BACKUP is to add to a saveset a substantial amount of redundant information which can be used to recover from a read error during a restore operation. This consumes CPU time and increases the size of a saveset by about 10%. If the saveset is stored on a `save medium' or if the environemnt doesn't permit the access of a partially corrupted file one can save both the CPU time and the file space overhead by using the /NOCRC and /GROUP=0 qualifier.
Example: The creation of a saveset with 8 files totaling 12967 blocks.
    Qualifiers     Saveset size    CPU time (on an AXP 3000-400)
    default            14553           2.31
    /NOCRC             14553           1.31
    /GROUP=0           13230           1.75
    /GROUP=0/NOCRC     13230           0.68
Using /NOCRC and /GROUP=0 reduces the CPU time by 70% and deceases the saveset size by 10%.

A PostScript printjob aborts with "%DCPS-W-CFGERROR"
Printing of a document generated for US Letter size paper can fail on a printer loaded with A4 paper. An error message like
   %DCPS-W-CFGERROR, configurationerror: 
       [PageSize [612 792]] - offending command is setpagedevice
   -DCPS-I-JOB_ID, for job job name (queue P12GND, entry ???) on P12
will be given and the print job is aborted. The problem is that the PostScript code requested a particular page size (here [612 792], units are 72tel inch).

Those documents can be printed when they are rescaled to the A4 sheet size using the page_size and sheet_size options of the /parameter= qualifier of the print command.

To print a document generated for US Letter size use:

    pop -queue file -o /para=(sheet_size=a4,page_size=letter)
Note, that double sided printing does not work, neither by specifying a print queue setup for double sided not by including the sides=two option in /para=(...)

Note also, that ghostview tends to produce .ps files with this problem, while xpdf does not exhibit this behaviour.


Tape file open fails with "bad attribute control list" (BADATTRIB)
A file open on a tape can fail if the file attributes are incompatible with a tape file or inconsistent with the tape volume attributes. The later often happens if variable length record files are written onto a tape and the maximum record size is shorter than the tape block size. In this case one gets an
    -SYSTEM-F-BADATTRIB, bad attribute control list
error. In this case check the disk file attributes with dir/full and check the Record format: line, like
    Record format:      Variable length, maximum 9990 bytes
Than mount the tape with a blocksize larger than the maximal record size, for example:
    mount mkd0: test /media=comp /block=49152
Note: Using a large /block usually gives better performance.

How handles FORTRAN expressions like "a/b/c"
The FORTRAN 77 language standart states that operators with equal priority are evaluated from left to right. The rule is:
   When operators with equal precedence appear, they can be evaluated
   in any order as long as the order is algebraically equivalent to a
   left-to-right order of evaluation. Exponentiation, however,is eval-
   uated from right to left.
Or in other words, operators are treated as left associative with the exception of exponentiation, which is right associative. This means
	a/b/c           is evaluated as    (a/b)/c
	a**b**c         is evaluated as    a**(b**c)

To verify this try the following program:

        program test
        call test1(1.,1.,2.,r1,r2,r3)
        write(6,*) r1,r2,r3
        stop
        end
        subroutine test1(a,b,c,r1,r2,r3)
        r1 = (a/b)/c
        r2 = a/(b/c)
        r3 = a/b/c
        return
        end
It should produce
	0.5000000       2.000000      0.5000000
Note: To avoid any confusion never use expressions like "a/b/c". Use parenthesis like "(a/b)/c" or "a/(b/c)" to clearly state your intentions !

Exceptions, traceback and line sequence numbers on AXP
If you get a floating exception (e.g. zero divide) on an AXP you get usually imprecise traceback information. The traceback points to the instruction where the exception was recognized, not to the instruction which caused the exception. Because of optimization techniques like function inlining, loop unrolling and instruction reordering one gets a `wrong' line sequence number and in some cases even a misleading module/routine name.

To get a traceback with line sequence numbers correctly refering to the offending statements one should compile the Fortran source with /nooptimize and /synchronize_exceptions. The former disables all optimization, the later forces all floating point exceptions to be delivered synchronously. The /synchronize_exceptions qualifier is not described in the online help on Fortran, so take the following extract from the release notes:

  o /SYNCHRONIZE_EXCEPTIONS tells DFAV to generate TRAPB instructions
    after every floating point instruction.  This is a very expensive
    but effective way to synchronize the instruction stream containing
    floating point exceptions so the failing instruction can be accurately
    located by the debugger or a handler.

How to configure the characteristics of a language ?
LSEDIT language characteristics determine things like
  1. tab increment (granularity of \t replacements)
  2. command used for compilation (including qualifiers...)

To setup a customized environment for those language characteristics simply

Now use "ED filename" to start an LSEDIT session.

How to recover an LSEDIT session after a crash ?
In case you had a long edit session and the system crashed not all is lost. LSEDIT keeps a log of all keystrokes and the whole edit session can be rerun. One usually looses only the last 15-30 seconds before the crash. To recover an LSEDIT session for a given file:

How to use the compile command with LATeX ?
The newest LATeX version supports diagnostic files file all other VMS compilers and thus the LSEDIT commands compile and review. To set this up use the following language definition:
define language latex /file_type=(.tex) /comp="@inc_asoft:latex_compile"
modify language latex /capabilities=diagnostics
The DCL procedure latex_compile sets up the TeX/LATeX environment and issues the proper LATeX command.

How to find out what an error message really means
Often VMS programs abort with an error message one has never seen before and which doesn't really give a hint on what to change to make it work. The best source in this case is the VMS manual
    System Messages and Recovery Procedures Reference
Assume you got the error message
    %RMS-F-DME, dynamic memory exhausted
The fastest way to find a full explanation of the error code DME is to start the bookreader and select
        Shelf: OpenVMS VAX Operating System
           Shelf: OpenVMS User Documents
              Book: System Messages and Recovery Procedures Reference
              now the book index pops up. The index is sloppy...
              select arrow in front of Part II Message Descriptions
              select arrow in front of AAA ... ABORT
              now the real index shows up...
                 select the error code you look for
                    a full description will pop up.
The error code description has an Explanation and a User Action section.
Note: Use the Bookreader on VAX systems. The CD-ROM set for the AXP systems doesn't contain most manuals, including "System Messages and Recovery Procedures Reference".

Login fails with "logical name table is full" (EXLNMQUOTA)
A Login procedure can fail if too many joblogical names are defined. In this case one gets the error
    %SYSTEM-F-EXLNMQUOTA, logical name table is full  
when a define DCL command is executed.

The process quota JTQUOTA should be increased. Contact the system manager.


Login fails with "insufficient dynamic memory" (INSFMEM)
A Login procedure can fail if too many process logical names are defined. In this case one usually gets the error
    %SYSTEM-F-INSFMEM, insufficient dynamic memory
when a define DCL command is executed. In some cases one gets an error when executing an image like
    %DCL-W-ACTIMAGE, error activating image SHOW
    -CLI-E-IMGNAME, image file $9$DKA0:[SYS9.SYSCOMMON.][SYSEXE]SHOW.EXE
    -SYSTEM-F-VA_IN_USE, virtual address already in use  

This problem is caused by insufficient virtual memory available to DCL. The `special' SYSGEN parameter CTLPAGES is too low and should be increased. Also see SHO PROC /MEM. Contact the system manager.


DCL OPEN fails with "dynamic memory exhausted" (DME)
A DCL OPEN statement, especially an OPEN to a DECnet TASK object like
    $ OPEN/READ NWDCL_INPUT AXP612::"TASK=N02504881"
can fail with the error code
    %RMS-F-DME, dynamic memory exhausted
Note: The remote TASK object is started in this case but will see an error on the first I/O to SYS$NET.

A fix is to reduce the RMS multiblock (set rms /blo=..) and network multiblock counts (set rms/net=..).


Executing an image fails with "process quota exceeded" (EXQUOTA)
A DCL RUN command can fail with a message like
    %DCL-W-ACTIMAGE, error activating image REF_S117:PAW_S117_XL
    -CLI-E-IMGNAME, image file $12$DKC0:[ALADINSOFT.S117.REF]PAW_S117_XL.EXE;11
    -SYSTEM-F-EXQUOTA, process quota exceeded
This indicates that one quota is overdrawn when activating the image. In many cases this is caused by the `Paging file quota'. Contact the system manager and negociate an increase of the Paging file quota or reduce the usage of subprocesses (since this is a pooled quota affecting a whole job and not just a single process).

Note, that one can also get errors like

    %LIB-F-INSVIRMEM, insufficient virtual memory
    %RMS-F-DME, dynamic memory exhausted
when the image manages to start but fails later on due to memory allocation problems.

Back to KP3 Computing home page
Last updated: November 13th, 1997
Walter F.J. Müller

Imprint ---- Data privacy protection ---- Haftungsausschluss