Subject: OpenVMS Frequently Asked Questions (FAQ), Part 2/3
Date: 30 Jul 1997 15:44:49 GMT
Summary: This posting contains answers to frequently asked questions
.about the OpenVMS operating system from Digital Equipment Corporation,
.and the computer systems on which it runs.
X-Newsreader: mxrn 6.18-32

Archive-name: dec-faq/vms/part2
Posting-Frequency: monthly
Last-modified: July 30, 1997

Overview
========
This is part 2/3 of the Frequently Asked Questions (FAQ) posting for the 
comp.os.vms and vmsnet.misc newsgroups.  (comp.os.vms is
bidirectionally-gatewayed to the INFO-VAX mailing list - see INTRO3 in part 1
for further details.)  It contains answers to frequently asked questions about
Digital's OpenVMS operating system and the computer systems on which it runs.

This FAQ is archived in the following locations:
    comp.answers and news.answers newsgroups
    ftp://ftp.digital.com/pub/Digital/dec-faq/vms
    ftp://rtfm.mit.edu/pub/usenet/news.answers/dec-faq/vms
    CompuServe VAXFORUM, Library 0, VMSFAQ.TXT

To make suggestions for changes or additions to this Frequently Asked
Questions list, send mail to the editor at lionel@quark.zko.dec.com.  
Answers are especially appreciated.


Table of Contents - Part 2/3
____________________________

System Management
========================================
MGMT1.  What is an installed image?
MGMT2.  Are there any known viruses for OpenVMS?
MGMT3.  How do I mount an ISO-9660 CD on OpenVMS?
MGMT4.  How do I extract the contents of a PCSI kit?
MGMT5.  I've forgotten the SYSTEM password - what can I do?
MGMT6.  How do I connect a PostScript printer via TCP/IP?
MGMT7.  Why can't I do a SET TIME command?
MGMT8.  What are the various OpenVMS upgrade paths?
MGMT9.  How do I change the node name of an OpenVMS System?

MAIL
========================================
MAIL1.  How do I send Internet mail?
MAIL2.  How do I get IN% or MX% added automatically to Internet addresses?
MAIL3.  How do I automatically append a signature file to my mail messages?
MAIL4.  Do I have to use VMS MAIL?  I like my Unix mailer better.
MAIL5.  How can I forward my mail?  Can I forward it to an Internet address?
MAIL6.  How can I forward my mail to a list of addresses?
MAIL7.  MAIL keeps saying I have new messages, but I don't.  What do I do?
MAIL8.  How do I extract all of my mail messages to a file?

Other Utilities
========================================
UTIL1.  How do I play an audio CD on my workstation?
UTIL2.  How do I access a MS-DOS floppy disk from OpenVMS?
UTIL3.  How do I play sound files on an AlphaStation?  DECsound doesn't work

DCL and command usage
========================================
DCL1.   How do I run a program with arguments?
DCL2.   How can I redefine control keys in DCL?
DCL3.   How can I clear the screen in DCL?
DCL4.   How do I do a REPLY/LOG in a batch stream?
DCL5.   How do I generate a random number in DCL?
DCL6.   What does the MCR command do?

File System and RMS
========================================
FILE1.  How can I undelete a file?
FILE2.  Why does SHOW QUOTA give a different answer than DIR/SIZE?
FILE3.  How do I make sure that my data is safely written to disk?
FILE4.  What are the limits on file specifications and directories?
FILE5.  What is the largest disk volume size OpenVMS can access?
FILE6.  What is the maximum file size, and the RMS record size limit?

Programming
========================================
PROG1.  How do I call <routine_name> from <language_name>?
PROG2.  How do I get the arguments from the command line?
PROG3.  How do I get a formatted error message in a variable?
PROG4.  How do I link against SYS$SYSTEM:SYS.STB on an Alpha system?
PROG5.  How do I do a SET DEFAULT from inside a program?
PROG6.  How do I create a shareable image transfer vector on an Alpha system?
PROG7.  How do I turn my Fortran COMMON into a shareable image on Alpha?
PROG8.  How do I convert between IEEE and VAX floating data?
PROG9.  How do I get the argument count in a Fortran routine?
PROG10. How do I get a unique system ID for licensing purposes?
PROG11. What is an executable, shareable, system or UWSS image?


------------------------------------------------------------
MGMT1.  What is an installed image?

The term "install" has two distinct meanings in OpenVMS.  The first relates to
"installing a product", which is done with either the SYS$UPDATE:VMSINSTAL.COM
command procedure or the POLYCENTER Software Installation (PCSI) utility 
(PRODUCT command).  The second meaning relates to the use of the INSTALL
utility, which is what concerns us here.

The INSTALL utility is used to identify to OpenVMS a specific copy of an
image, either executable or shareable, which is to be given some set of
enhanced properties.  For example, when you issue the SET PASSWORD command,
the image SYS$SYSTEM:SETP0.EXE is run.  That image needs to have elevated
privileges to perform its function.

The other important attribute is /SHARED.  This means that shareable parts
of the image (typically read-only code and data) are loaded into memory
only once and are shared among all users on a system.  Executable images
can be installed /SHARED as well as shareable library images.  (The term
"shareable" has dual meanings here, too.  See the OpenVMS Programming
Concepts Manual for further details.)

It's important to note that there is no such thing as "installing a shareable
image with privileges".  The INSTALL utility will let you do it, but the
privileges you specify will be ignored.  To have a callable routine run with
enhanced privileges that are not available to its caller, you must construct
your routines as "user-written system services" and install the shareable
image with the /PROTECT qualifier.  See the OpenVMS Programming Concepts
Manual for more information on user-written system services.  Note also
that in many cases the need to grant privileges to an image can be replaced
with the use of the "Protected Subsystems" feature that grants a rights
identifier to an image.  See the OpenVMS Guide to System Security for
information on Protected Subsystems.

------------------------------------------------------------
MGMT2.  Are there any known viruses for OpenVMS?

Viruses are very common on PCs because the PC operating systems such as MS-DOS
and MacOS do not implement any sort of scheme to protect the operating system
or the file system against hostile action by programs.  On these operating
systems, any running program can subvert the operating system and take over
the hardware, at which point it can do anything it wishes, including hiding
copies of itself in other programs or in the file system.

This is unlikely on VMS, Unix, MVS, and Windows NT, for two reasons.
First, the operating system runs in a privileged mode in memory that is
protected against modification by normal user programs.  Any old program
cannot take over the hardware as it can on PC operating systems.  Secondly,
VMS, Unix, MVS, and NT have file systems that can be set up so that
non-privileged programs cannot modify system programs and files on disk.  Both
of these protection schemes mean that traditional PC virus schemes don't work
on these OSes.

It is possible for VMS, etc., to be infected by viruses, but to do so, the
program containing the virus must be run from a user account that has
amplified privileges.  As long as the system administrator is careful that
only trusted applications are run from such accounts (and this is generally
the case), there is no danger from viruses.
.....[winalski@gemgrp.enet.dec.com]

To protect against viruses and other attempts at system interference or
misuse, follow the recommendations in the "OpenVMS Guide to System  Security". 
You may also want to consider optional software products which can monitor
your system for intrusion or infection attempts.  Digital offers the 
following products in this area:

  DECinspect Intrusion Detector
  POLYCENTER Security Reporting Facility
  POLYCENTER Security Compliance Manager

Rocksoft offers the Veracity data integrity tool (for info, send mail to
demo@rocksoft.com).

[Contributions to this list welcomed]

------------------------------------------------------------
MGMT3.  How do I mount an ISO-9660 CD on OpenVMS?

ISO-9660 support was added in the following releases:

    OpenVMS VAX V6.0
    OpenVMS AXP V1.5
    OpenVMS VAX V5.5, use F11CD kit from InfoServer CD, or
                      Consolidated Distribution CD under InfoServer, or
..      Digital Customer Support - CSCPAT #1071012

Here's how to do it:

    $ MOUNT/MEDIA_FORMAT=CDROM  device-name[:] [volume-label]

Please refer to the OpenVMS MOUNT Utility Manual, especially the section
regarding the MOUNT qualifier /UNDEFINED_FAT. 

From the OpenVMS release notes:

  Because ISO-9660 media can be mastered from platforms that do not support
  semantics of files containing predefined record formats, you may encounter
  ISO-9660 CD-ROMs with files that contain records for which no record format
  was specified.

An example which works for most CD-ROMs is:

    $ MOUNT/MEDIA_FORMAT=CDROM/UNDEFINED_FAT=STREAM:2048 DUA0: FREEWARE

This /UNDEFINED_FAT qualifier states, "For any file whose file attributes are
'undefined', return file attributes of 'stream', maximum record length 2048".
.....[dunham@star.enet.dec.com]

------------------------------------------------------------
MGMT4.  How do I extract the contents of a PCSI kit?

A growing number of OpenVMS products are being provided in PCSI
(POLYCENTER Software Installation) kits which are installed using the
PRODUCT INSTALL command.  These are alternatives to or replacement for
VMSINSTAL kits which were BACKUP savesets.  PCSI kits are not BACKUP
savesets and are structured differently from VMSINSTAL kits.

If you want to extract product files from a PCSI kit, create a directory
into which the kit should be expanded and use the following command:

    $ PRODUCT COPY prodname /SOURCE=[where-the-kit-is] -
      /DEST=[destination-directory] /FORMAT=REFERENCE

A PCSI kit file has a file specification of the following form:

    DEC-VAXVMS-FORTRAN-V0603-141-1.PCSI

In this example, "FORTRAN" is the "prodname".  PCSI will expand the kit
files into the directory you specify and subdirectories beneath such
as [SYSEXE], [SYSLIB], etc., reflecting the eventual destination of files
found there.  Most of the actual product files (images, etc.) will be in
the subdirectories.  In the top-level directory will be a file with the
file type PCSI$DESCRIPTION that specifies where various files should go.
For more details, see the POLYCENTER Software Installation Developer's 
Guide for OpenVMS, which can be found in the OpenVMS documentation on
the Consolidated Online Documentation CD-ROM.

------------------------------------------------------------
MGMT5.  I've forgotten the SYSTEM password - what can I do?

If you need to "break in" to an OpenVMS system because you've forgotten
the SYSTEM password, you need to have physical access to the system console
and must be able to reboot the system.  Here are the steps.

  1.  Halt the system (press halt button or ^P on console of some models)
  2.  Boot into the SYSBOOT prompt - the syntax for this varies by
      system - it typically involves a flag of 1, for example:
.B/1
.B/R5:1
.b -flags 0,1     (Recent Alpha systems)
      If your system has a hardware password (some VAXstations have
      this), you will need to know the password and enter it using the
      LOGIN command at the console.  If you get an "Inv cmd" error trying
      to boot with a flag of 1, and can't LOGIN using the hardware password,
      you're stuck - call for hardware service to reset the hardware password.
  3.  At the SYSBOOT> prompt type:
.SET/STARTUP OPA0:
.SET WRITESYSPARAMS 0
.C
  4.  Wait for the $ prompt.  The system will now be accepting startup
      commands form the console.  Type:
.SPAWN
        @SYS$SYSTEM:STARTUP

      This causes the system to complete the startup, but leaves you
      logged in.  The SPAWN is necessary as without it you'll be logged out
      when the startup finishes.
  5.  Type:
        SET DEFAULT SYS$SYSTEM:  ! or wherever SYSUAF.DAT resides
        RUN SYS$SYSTEM:AUTHORIZE
        MODIFY SYSTEM /PASSWORD=newpassword
.EXIT

      This changes the SYSTEM password to a new value.
  6.  Type:
.@SYS$SYSTEM:SHUTDOWN

      The system will now shut down.

   Reboot the system normally - the SYSTEM password should now be set as
   you specified in step 5.

   Some people will suggest a method using the UAFALTERNATE SYSGEN parameter.
   I don't recommend this as it is not reliable.   

.....[lionel@quark.enet.dec.com]
..Improvements by:.[thomasgd@boat.bt.com]
.....[newman@bklite.enet.dec.com]

------------------------------------------------------------
MGMT6.  How do I connect a PostScript printer via TCP/IP?

Recently a number of people (myself included) have asked about postscript 
printers and how to connect them to VMS systems via TCP/IP.  This, we were 
informed, is not yet possible but is hoped to be under the next release of 
DCPS (out about the turn of the year or first quarter '97).

.....[SRR3@le.ac.uk]

------------------------------------------------------------
MGMT7.  Why can't I do a SET TIME command?

Q: Trying to set the time with SET TIME on my system returns one of these 
messages:

%SET-E-NOTSET, error modifying time
-SYSTEM-F-IVSSRQ, invalid system service request

%SET-E-NOTSET, error modifying time
-SYSTEM-E-TIMENOTSET, time service enabled; enter a time service command to 
update the time

A: This occurs if the time on the local system is controlled by a time service 
software, for example the distributed time service software (DTSS) provided as 
part of the DECnet/OSI installation. The DTSS software communicates with one or 
more time servers to obtain the current time. It entirely controls the local 
system time (for DECnet/OSI, there is a process named DTSS$CLERK for this); 
therefore, the usage of the SET TIME command (and the underlying $SETTIM system 
service) is disabled.

The first message is displayed on systems running DECnet/OSI V6.1 and earlier.
On systems with newer DECnet/OSI (DECnet-Plus) software, the second (and more 
informative) message is given.

You shouldn't have to change the time manually - you should be doing this
through the time server - but if you insist...  you'll have to shutdown DTSS:

$ MCR NCL
NCL> DISABLE DTSS
NCL> DELETE DTSS

This will shutdown DTSS$CLERK. You may then change the system time as usual.
To restart the DTSS software, type

@SYS$STARTUP:DTSS$STARTUP

You'll need a lot of privs : (CMKRNL,SYSPRV,OPER,SYSNAM,PRMMBX,NETMBX,LOG_IO,
ALTPRI) and must be granted the NET$MANAGE identifer to shutdown and 
restart DTSS.
.....[bol@adv.magwien.gv.at]

------------------------------------------------------------
MGMT8.  What are the various OpenVMS upgrade paths?

OpenVMS Alpha release upgrade paths:

     From V1.0, one can upgrade to V1.5.
     From V1.5, or V1.5-1H1, one can upgrade to V6.1.
     From V6.1, one can upgrade to V6.2.
     From V6.2, one can upgrade to V6.2-1H1, V6.2-1H2, or V6.2-1H3.
     From V6.1, or V6.2, one can upgrade to V7.0.
     From V6.1, V6.2, V6.2-1H(1,2,3), or V7.0, one can upgrade to V7.1.

     Some typical OpenVMS Alpha upgrade paths are:
         V1.0 -> V1.5 -> V6.1 -> (V6.2, V7.0, or V7.1)
         V6.2 -> V6.2-1H3
         V1.5-1H1 -> V6.1 -> (V6.2, V7.0, or V7.1)
         V6.2-1H(1,2,3) -> V7.1

     Note that OpenVMS Alpha V7.0 does not include support for hardware
     and/or configurations first supported in OpenVMS Alpha V6.2-1H1,
     V6.2-1H2, or V6.2-1H3, one must upgrade to OpenVMS VAX V7.1.

OpenVMS VAX release upgrade paths:

     From V5.0 through V5.4-3 inclusive, one can upgrade to V5.5.
     From V5.5, V5.5-1, or V5.5-2HW, one can upgrade to V5.5-2.
     From V5.5, V5.5-1, or V5.5-2, one can upgrade to V6.0.
     From V5.5-2, V5.5-2H4, or V6.0, one can upgrade to V6.1.
     From V6.0, or V6.1, one can upgrade to V6.2.
     From V6.1, or V6.2, one can upgrade to V7.0.
     From V6.1, V6.2, or V7.0, one can upgrade to V7.1.

     Some typical OpenVMS VAX upgrade paths are:
         V5.x -> V5.5 -> V6.0 -> V6.2 -> (V7.0, or V7.1)
         V5.5-2, or V5.5-2H4 -> V6.1 -> (V6.2, V7.0, or V7.1)

     Note that OpenVMS VAX V6.0 does not include support for hardware
     and/or configurations first added in OpenVMS VAX V5.5-2H4, one
     must upgrade to OpenVMS VAX V6.1.

VMScluster rolling upgrades for both OpenVMS VAX and OpenVMS Alpha may/will have
different, or additional upgrade requirements, and have requirements around
which versions of OpenVMS can coexist in a VMScluster.  See the _OpenVMS
<platform> Version <Version> Upgrade and Installation Manual_, and the OpenVMS
Software Product Descriptions
(http://www.openvms.digital.com/openvms/spd/list.html) for further details on
the upgrade, and for support information. And OpenVMS VAX users should also see
the upgrade and installation supplement manual(s) for their particular VAX
platform(s).
.....[hoffman@xdelta.enet.dec.com]

------------------------------------------------------------
MGMT9.  How do I change the node name of an OpenVMS System?

  The first step is to get a BACKUP of the system disk before making
  any changes -- use the system disk backup procedures as documented
  in the OpenVMS System Management Manual, making sure to use the
  procedures and commands appropriate for the system disk.

  Changing the node name involves a number of steps -- the node name
  tends to be imbedded in a number of different data files around the
  system.

    Update the SCSNODE in MODPARAMS.DAT, and then run AUTOGEN as
      far as the SETPARAMS phase.  (Do not reboot yet.)
    Modify the DECnet node name.  (NETCONFIG is the DECnet Phase
      IV tool, and NET$CONFIGURE is the DECnet-Plus tool.)
    Modify the IP node name.  (The UCX tool is UCX$CONFIG.)
    Modify the host node name on the various queues in the queue
      database.  (each queue has a host name, and it defaults to
      the SCS node name of the queue's host system.  See the command
      INIT/QUEUE/ON=node for information.)
    Modify the node name saved in any application databases, or any
      local node-conditional operations present in the site-specific
      system startup, etc.  (SEARCH for the node name, specifying
      all types of files.)
    Rename the SYS$NODE_oldnodename rightslist identifier to match
      the new name.  (Do not change the binary value of this
      identifier.)
    Reset any license PAKs that are restricted to the old node name
      to the new node name.
    Reboot the node or -- if in a VMScluster -- reboot the whole
      VMScluster.  (This tends to catch any errors immediately.)

  There are likely a few other areas where the nodename will be stored.

  If the system is configured in a VMScluster and you change *either*
  the SCSNODE or the SCSSYSTEMID -- but *not* both values -- then you
  will have to reboot the entire VMScluster.  (The VMScluster remembers
  the mapping between these two values, and will assume that a
  configuration problem has occured if a mismatched pair appears, and
  will refuse to let a node with a mismatched pair join the VMScluster.)

  I expect I may have missed one or two configuration tools (or more!)
  that are needed at your site -- the node name tends to get stored all
  over the place, in layered products, and in local software...

.....[hoffman@xdelta.enet.dec.com]

------------------------------------------------------------
MAIL1.  How do I send Internet mail?

There is no one answer to this question.  Internet mail is built upon the
TCP/IP protocols, which are not directly supported by VMS.  A number of
implementations of TCP/IP for VMS are available, from Digital, from a number
of other vendors, and even in a free "support it yourself" form.  The MAIL
program that comes with VMS does not directly support the mail format used on
the Internet, but various programs have been written that use MAIL's "foreign
protocol" facility to provide such support.  To send mail through a foreign
protocol by using an address syntax like IN%"fred@fred-host.xxx.com".  You
*must* include the quotation marks  Between them is the address in the format
used by mail programs that support the Internet directly.  The IN% - short for
INternet - names the foreign protocol.  On some systems, you use MX% or SMTP%
instead. (MX is a widely used, free, mail handler; see question  SOFT1. SMTP%
is used by Digital's UCX TCP/IP product)  Other systems may use some other
name.  If none of these prefixes work, ask your system manager for assistance.
.....[leichter@lrw.com]

See also MAIL2.

------------------------------------------------------------
MAIL2.  How do I get IN% or MX% added automatically to Internet addresses?

Get the MAILSHR_PATCH package (there's one each for VAX and Alpha) from the 
WKU FILESERV server (see question SOFT1.)

As of OpenVMS V6.2, this is not necessary - if the address has an @
in it (not in a quoted string), MAIL will look to see if the logical name
MAIL$INTERNET_TRANSPORT is defined.  If it is, it will use the translation
as the transport protocol, otherwise it will use SMTP (as is used by
UCX).  For example, if you wanted IN% added, you'd define 
MAIL$INTERNET_TRANSPORT as "IN".

------------------------------------------------------------
MAIL3.  How do I automatically append a signature file to my mail messages?

OpenVMS 7.0 adds the ability to automatically append signature files - in
MAIL, use the SET SIGNATURE command to specify a signature file name.
For earlier versions, see the following paragraphs.

The basic MAIL utility which is shipped with VMS does not have an intrinsic
mechanism for adding signature files.  If you're using an enhanced mail
handling package (e.g PMDF), however, it may have provisions for adding
signature files to all messages it handles - check the documentation for
details.  In addition, it's common practice to use an editor to handle
addition of `quotation marks' (e.g. >) and signature files to mail messages
and news postings.  There are several implementations of this for different
editors available on the net; for one example, see the MAIL_EDIT package
available at 
  ftp://narnia.memst.edu/mail_edit_v1-4.zip
.....[bailey@genetics.upenn.edu]

Define the logical MAIL$EDIT to a COM-file, which looks something like
the following:

$ IF P1 .NES. ""
$ THEN
$    COPY 'P1',<signaturefile> 'P2'
$ ELSE
$    COPY <signaturefile> 'P2'
$ ENDIF
$ DEFINE/NOLOG SYS$INPUT SYS$COMMAND
$ <editorname> 'P2'
$ EXIT

Where <signaturefile> is the name of the signature-file (including directory
and disk) and <editorname> is EDIT/EDT or EDIT/TPU (or your favorite editor).
.....[ARNE@ko.hhs.dk]

------------------------------------------------------------
MAIL4.  Do I have to use VMS MAIL?  I like my Unix mailer better.

Several Unix mailers have been ported to VMS, some by the vendors of specific
TCP/IP packages, some by users who have made them freely available.  See the
documentation for your TCP/IP package, and refer to question SOFT1 for
information about the availability of the free ports.
.....[leichter@lrw.com]

------------------------------------------------------------
MAIL5.  How can I forward my mail?  Can I forward it to an Internet address?

You can use the SET FORWARD command within MAIL to specify where you want all
your mail forwarded to.  Use SHOW FORWARD to see your current forwarding.  To
cancel all forwarding, type SET NOFORWARD.

You can forward your mail to an Internet address, but you have to be careful
because of the way MAIL handles special characters, such as quotation marks.
First, determine the address you would use to send mail to the place you want
to forward to - say, IN%"fred@fred-host.xxx.com".  Take that string and
*double all the quotation marks*, producing IN%""fred@fred-host.xxx.com"".
Finally, wrap quotation marks around the outside and use the the result with
SET FORWARD:

.MAIL>SET FORWARD "IN%""fred@fred-host.xxx.com"""

If you do SHOW FORWARD, you should now see:

.Your mail is being forwarded to IN%"fred@fred-host.xxx.com".
.....[leichter@lrw.com]

Note that the MAIL$INTERNET_TRANSPORT feature doesn't yet work with
SET FORWARD in that you'll still have to use the syntax above with the
quotation marks.

------------------------------------------------------------
MAIL6.  How can I forward my mail to a list of addresses?

VMS MAIL does not support forwarding a message to more than one address.
(Older versions of MAIL allowed you to specify such forwarding, but it never
worked correctly.)

Many of the TCP/IP mail packages support forwarding to mailing lists, as does
the free MX mail handling system and the DELIVER mail "extender".  See the
documentation of your TCP/IP package and question SOFT1.
.....[leichter@lrw.com]

------------------------------------------------------------
MAIL7.  MAIL keeps saying I have new messages, but I don't.  What do I do?

The count of new mail messages is kept separately from your mail folder
in SYS$SYSTEM:VMSMAIL_PROFILE.DATA.  It sometimes happens that this count
differs from what's in your mail folder.  If this happens, go into MAIL
and repeat the READ/NEW command until you see no new mail messages.  Then
enter the command one more time.  This will resynchronize the counters.

------------------------------------------------------------
MAIL8.  How do I move all of my mail messages to another system?

If you are moving to another OpenVMS system, perhaps the best way is to select
each folder and do (in MAIL) a:

.EXTRACT/APPEND/ALL/MAIL mymail.mai

Move MYMAIL.MAI to the other system, then do this (in MAIL):

.SET FILE mymail.mai
.COPY/ALL foldername MAIL.MAI

This will place a copy of all of your messages in the given folder.  If
you wanted to maintain the separate folders, do separate EXTRACT commands
(above) specifying different .mai files, then repeat the SET FILE, COPY
for each one.

If you are moving to a non-OpenVMS system, the EXTRACT command above can
be used to create a file which you can then copy - how you import it into
your mailer is an exercise left to the reader.

------------------------------------------------------------
UTIL1.  How do I play an audio CD on my workstation?

If you've installed the DECwindows examples, you'll find
DECW$CDPLAYER.C, .DAT, .EXE, .UIL, and .UID.  Copy the .UID and .DAT
files to DECW$USER_DEFAULTS: (typically SYS$LOGIN:), define the logical name
DECW$CD_PLAYER to be the device name of your CD-ROM drive (eg. DKA400:),
give yourself PHY_IO and DIAGNOSE privileges, and run the .EXE.  You can
also install the image with these privileges.  See the source for
additional details - note that the comments regarding the need for
SYSGEN CONNECT are no longer applicable (at least as of VMS V5.5-2).

There's also SYS$EXAMPLES:CDROM_AUDIO.C and .EXE, a non-Motif program.

------------------------------------------------------------
UTIL2.  How do I access a MS-DOS floppy disk from OpenVMS?

The Digital Pathworks for OpenVMS product includes a utility called PCDISK
that can read and write MS-DOS format diskette.  A license for Pathworks
is as little as US$99 (QM-2CLAA-AA, File and Print Access license).

ProGIS in Germany sells a product called VMove which supports DOS files on
many different device types.  For more information, send mail to
info@progis.rmi.de.

Engineering Software has a product called VAKSAT which will
read/write/erase files on DOS diskettes. Available for both VAX and Alpha.
Contact ed@cityscape.co.uk for more information.

MadGoat PC Exchange (PCX) is a utility for copying files to and from
MS-DOS format diskettes under VMS, using an RX23 (3.5"), RX26 (3.5"),
or RX33 (5.25") diskette drive.  For 3.5" diskettes, high-density
disks can be read or written; double-density disks are read-only. Only
high-density disks are supported on the RX33.

  http://www.wku.edu/www/madgoat/madgoat.html
------------------------------------------------------------
UTIL3.  How do I play sound files on an AlphaStation?  DECsound doesn't work

The new AlphaStation systems use a different sound board (Microsoft Sound
System) than the earlier DEC 3000 AXP systems, and DECsound, as supplied by
DECwindows Motif, doesn't support this board.  Digital offers an optional
product, Multimedia Services for OpenVMS (SPD 64.24.00), which provides a
replacement DECsound for this card as well as many other features (an AVI and
MPEG player, video capture support, etc.)

------------------------------------------------------------
DCL1.   How do I run a program with arguments?

The RUN command does not accept arguments.  To pass arguments to a program,
you must use what is called a "foreign command".  For example:

.$ uudecode :== $disk:[dir]uudecode.exe
.$ uudecode filespec

The leading $ in the symbol definition is what makes it a foreign command. If
the device and directory is omitted, SYS$SYSTEM: is assumed.  

Under OpenVMS V6.2 and later, DCL supports automatic foreign command
definition via the logical name DCL$PATH:.  An example of a definition of this
logical name is:

    $ DEFINE DCL$PATH SYS$DISK:[],ddcu:[mytooldir],SYS$SYSTEM:

DCL will first look for a command in the DCL command table, and if no match is
found and if DCL$PATH is defined, it will then look for command procedures and
executable images with filenames matching the command specified, in the
directories specified via DCL$PATH.  The first match found is invoked, and
under OpenVMS, the DCL$PATH support will cause a command procedure to be
activated in preference to an executable image.

For more information on foreign commands or on automatic foreign command
support, see the OpenVMS User's Manual.

See also question PROG2.

If you want to create a detached process that takes arguments from a command
line, it must be run under the control of a command line interpreter (CLI)
(typically DCL).  This is done by placing the command line in a file,
specifying SYS$SYSTEM:LOGINOUT.EXE as the image to run and the command file as
the input.  For example:

.$ OPEN/WRITE CMD TEMP_INPUT.COM
.$ WRITE CMD "$ MYCOMMAND arguments"
.$ CLOSE CMD
.$ RUN/DETACHED SYS$SYSTEM:LOGINOUT /INPUT=TEMP_INPUT.COM

Various OpenVMS library calls (such as lib$spawn(), cli$dcl_parse(), and the C
library system() call) require access to a command line interpreter such as
DCL to perform requested actions, and will not operate if a CLI is not
available.

When a CLI is not available, these calls typically return the error status
SS$_NOCLI.  And as mentioned above, invoke the image LOGINOUT to cause a CLI
(such as DCL) to be mapped into and made available in the context of the
target process.
.....[hoffman@xdelta.enet.dec.com]

------------------------------------------------------------
DCL2.   How can I redefine control keys in DCL?

The DCL DEFINE/KEY command allows you to define function and keypad
keys, but not control keys.  Also, keys you define with DEFINE/KEY are
not recognized inside applications.  Many applications which use the
SMG$ routines for input have a similar DEFINE/KEY feature.

The terminal driver line-editing control keys, including the use of DEL
for delete, are not modifiable.

------------------------------------------------------------
DCL3.   How can I clear the screen in DCL?

The simplest way is TYPE/PAGE NL:

------------------------------------------------------------
DCL4.   How do I do a REPLY/LOG in a batch stream?

Your terminal must be enabled as an operator terminal before doing the
REPLY/LOG, but a batch stream doesn't have a terminal.  To make this
work, use the following sequence to enable the console as the operator
terminal; then the REPLY/LOG will be accepted:

  $ DEFINE SYS$COMMAND _OPA0:
  $ REPLY/ENABLE
  $ REPLY/LOG
......[ARNE@KO.HHS.DK]

------------------------------------------------------------
DCL5.   How do I generate a random number in DCL?

Here's my random number generator for inclusion into the OVMS FAQ;
just do a GOSUB RAND and the global symbol RANDOM will contain a
randomly generated number.  The user/programmer can feed the generator
a ceiling value (__CEIL) or a new seed (__SEED).

$! RAND - returns a positive random number ("RANDOM") between 0 and 
$!        __CEIL - 1.
$ RAND:
$
$ IF F$TYPE(__SEED) .EQS. ""
$ THEN
$     ! seed the random number generator, ...
$     __NOW = F$CVTIME()
$     __HOUR = 'F$EXTRACT(11,2,__NOW)'
$     __MINUTE = 'F$EXTRACT(14,2,__NOW)'
$     __SECOND = 'F$EXTRACT(17,2,__NOW)'
$     __TICK = 'F$EXTRACT(20,2,__NOW)'
$
$     __SEED == __TICK + (100 * __SECOND) + (6000 * __MINUTE) + -
         (360000 * __HOUR)
$     ! the generator tends to do better with a large, odd seed, ...
$     __SEED == (__SEED .OR. 1)
$     ! clean up, ...
$     DELETEX/SYMBOL __NOW
$     DELETEX/SYMBOL __HOUR
$     DELETEX/SYMBOL __MINUTE
$     DELETEX/SYMBOL __SECOND
$     DELETEX/SYMBOL __TICK
$ ENDIF
$
$ IF F$TYPE(__CEIL) .EQS. "" THEN __CEIL = %X3FFFFFFF
$
$ __SEED == __SEED * 69069 + 1
$
$ RANDOM == (__SEED.AND.%X3FFFFFFF)/(%X40000000/__CEIL)
$
$ RETURN
.....[sharris@sdsdmvax.fb3.noaa.gov]

------------------------------------------------------------
DCL6.   What does the MCR command do?

The MCR command runs the specified image, with a default filespec of
SYS$SYSTEM:.EXE, and passes any (optional) command line arguments in the
same manner as a foreign command.  In other words:

.$ MCR FOO BAR

is equivalent to:

.$ FOO :== $FOO
.$ FOO BAR

It derives from the RSX operating system from which VMS evolved and is
still often used as a shortcut for activating images.  The MCR command is
different from the MCR command line interpreter, which is provided as part
of the optional VAX-11 RSX product that provides RSX emulation under VMS.

------------------------------------------------------------
FILE1.  How can I undelete a file?

OpenVMS doesn't have an "undelete" function.  However, if you are quick
to write-protect the disk (or if you can guarantee that no new files get
created or existing files extended), your data is still on the disk
and it may be possible to retrieve it.  The FLORIAN tool available from
the WKU Fileserver claims to be able to do this (see question SOFT1.)

------------------------------------------------------------
FILE2.  Why does SHOW QUOTA give a different answer than DIR/SIZE?

DIR/SIZE doesn't take into account the size of file headers which are
charged to your quota.  Also, unless you use DIR/SIZE:ALL, you'll see only
the "used" size of the file, not the allocated size which is what gets
charged against your quota.  Also, you may have files in other directories.
.....[lionel@quark.enet.dec.com]

$ DIR/SIZ=ALL/GRAND [username...]

Grand total of D1 directories, F1 files, B1/B2 blocks.

$ DIR/SIZ=ALL/GRAND [-]username.DIR

Grand total of 1 directory, 1 file, B3/B4 blocks.

$ SHOW QUOTA
  User [username] has B5 blocks used, B6 available,
  of B7 authorized and permitted overdraft of B8 blocks on disk

If the user has no files in other directories and all file-headers are
only 1 block, then the following should apply:

  B5=B2+B4+F1+1

If the diskquota is out of synch, then the system-manager can make a rebuild.
.....[ARNE@ko.hhs.dk]

------------------------------------------------------------
FILE3.  How do I make sure that my data is safely written to disk?

If your application must absolutely guarantee that data is available,
no matter what, there's really no substitute for RMS Journalling.  However,
you can achieve a good degree of data integrity by issuing a SYS$FLUSH RMS
call at appropriate times (if you're using RMS, that is.)  If you're
using a high-level language's I/O system, check that language's documentation
to see if you can access the RMS control blocks for the open file.  In
C you can use fflush followed by fsync.  Note that fsync, which was
undocumented for VAX C but is documented for DEC C, takes a file descriptor
as an argument, not a *FILE.

------------------------------------------------------------
FILE4.  What are the limits on file specifications and directories?

A file specification has an aggregate maximum size of 255 characters at
present.  The node and device specification may be up to 255 characters each -
file name and file types may be up to 39 characters each.  File versions are
from 1 through 32767, though 0 (latest version), -0 (oldest version) and -n
(n'th previous version) can be used in most contexts.  A file specification
may not have more than 8 directories and subdirectories - while it is possible
to create subdirectories of greater depth, accessing them is problematic in
most cases and this should be avoided. 

Application developers should use OpenVMS-supplied routines for parsing
file specifications - this ensures that changes in what is allowable will
not tend to break your application.  Consider that various parts of the
file specification may contain quoted strings with embedded spaces and
other punctuation!  Some routines of interest are SYS$FILESCAN, SYS$PARSE
and LIB$TRIM_FILESPEC.  For further information, see the OpenVMS Guide to
File Applications.

------------------------------------------------------------
FILE5.  What is the largest disk volume size OpenVMS can access?

One Terabyte (2**31 blocks of 2**9 bytes).  Prior to the release of V6.0, the
OpenVMS file system was limited to disk volumes of 8.5 GB (2**24 blocks) or
less.

On some systems, there are restrictions in the console program that limit the
size of the OpenVMS system disk.  Note that data disks are not affected by
console program limits.  For example, all members of the VAXstation 3100
series are limited to a system disk to 1.073 GB or less due to the console,
though larger data disks are possible.
.....[hoffman@xdelta.enet.dec.com]

------------------------------------------------------------
FILE6.  What is the maximum file size, and the RMS record size limit?

RMS can store individual files of a size up to the maximum supported
volume size.  Under OpenVMS V6.0 and later, the volume size and the RMS
maximum file size limit is 2**31 * 512 bytes -- one terabyte (1 TB).

The RMS formats -- sequential, relative, and indexed -- are limited by
the one terabyte maximum volume size.  RMS relative files are further
limited to a number of records that will fit in 32 bits -- 4 billion
records.   Sequential and indexed formats do not have a record limit.
.....[hoffman@xdelta.enet.dec.com]

------------------------------------------------------------
PROG1.  How do I call <routine_name> from <language_name>?

Most OpenVMS system services and RTL routines pass string arguments by
descriptor.  Languages which support native string data types create
descriptors automatically; those which do not (eg., C) require that you set
them up explicitly.
.....[eric@tardis.HQ.ileaf.com]

There is a lot of information available on how to call system services
and Run-Time Library routines, including examples in numerous languages.
The best references are:

.Your language's User Manual
.OpenVMS Programming Environment Manual
.OpenVMS Programming Concepts Manual
.OpenVMS Programming Interfaces: Calling a System Routine
.OpenVMS Calling Standard

In addition, if you are a subscriber to the Digital Software Information
Network (available to those with a software support contract), the DSIN
database contains hundreds of worked examples of calling system services
and RTL routines, including the one that seems to trip up almost everyone,
SMG$CREATE_MENU.
.....[lionel@quark.enet.dec.com]

Arne Vajhj has put together a collection of OpenVMS example programs.
It can be found at:
  ftp://ftp.hhs.dk/
  http://www.hhs.dk/vms/vms_sw_arne.html
.....[arne@ko.hhs.dk]
------------------------------------------------------------
PROG2.  How do I get the arguments from the command line?

If you're writing a program and want to accept arguments from a foreign
command, you can use LIB$GET_FOREIGN to get the command line and parse
it yourself, or if you're programming in C, use the normal argc/argv
method.

To write an application which uses the normal DCL verb/qualifier/parameter
syntax for invocation, see the description of the CLI$ routines in the
OpenVMS Callable Utility Routines Reference Manual.

It is possible to write an application which can be used both ways; if a 
DCL verb isn't used to invoke the image, the application parses the command 
line itself.  One way to do this is to call CLI$GET_VALUE for a required
parameter.  If it is not present (or you get an error), call 
LIB$GET_FOREIGN to get the command line and do the manual parse.

See also question DCL1.

------------------------------------------------------------
PROG3.  How do I get a formatted error message in a variable?

Use the SYS$PUTMSG system service with an action routine that stores
the message line(s) in the variable of your choice.  Be sure the action
routine returns a "false" (low bit clear) function value so that SYS$PUTMSG
doesn't then try to display the message (unless you want it to.)  See the
description of $PUTMSG in the System Services Reference Manual for an
example of using an action routine.

------------------------------------------------------------
PROG4.  How do I link against SYS$SYSTEM:SYS.STB on an Alpha system?

LINK/SYSEXE is the OpenVMS Alpha equivalent of linking against SYS.STB.

------------------------------------------------------------
PROG5.  How do I do a SET DEFAULT from inside a program?

The problem is that SYS$SETDDIR only changes the default directory - NOT
the default disk. The default disk is determined by the logical SYS$DISK.
If you want to change the default disk within a program, then call
LIB$SET_LOGICAL to change the logical SYS$DISK. You will need to call both
LIB$SET_LOGICAL and SYS$SETDDIR to change both default disk and the default
directory!
.....[ARNE@ko.hhs.dk].

------------------------------------------------------------
PROG6.  How do I create a shareable image transfer vector on an Alpha system?

This is something that was greatly simplified for OpenVMS Alpha.  You don't
need to create a separate transfer vector module; just use the SYMBOL_VECTOR
statement in a linker options file.  For example, if your shareable image
has two routines named FOO and BAR, the linker options file should contain
the following line:

.SYMBOL_VECTOR=(FOO=PROCEDURE, BAR=PROCEDURE)

The Linker manual has more details on this.

------------------------------------------------------------
PROG7.  How do I turn my Fortran COMMON into a shareable image on Alpha?

You need to add SYMBOL_VECTOR=(<common-name>=PSECT) to your options file.  On
OpenVMS VAX all OVR/REL/GBL psects were automatically exported into the
shareable image's Global Symbol Table.  On OpenVMS Alpha you have to tell the
linker that you want this done by means of the PSECT keyword in the
SYMBOL_VECTOR options file statement.

This has several advantages over OpenVMS VAX.  First, you don't have to worry 
about the address of the psect when you try to create a new, upwardly 
compatible version of the shareable image. Second, you can control which
psects, if any, are made visible outside the shareable image.

By default, COMMON PSECTs in DEC Fortran for OpenVMS Alpha (as well as most
other OpenVMS Alpha compilers) are NOSHR.  On VAX, the default was SHR which
required you to change the attribute to NOSHR if you wanted your COMMON
to be in a shareable image but not write-shared by all processes on the
system.  If you do want write-sharing, use: 
.CDEC$ PSECT common-name=SHR
in the Fortran source code (the CDEC$ must be begin in column 1) or a linker 
options file PSECT_ATTR statement to set the COMMON PSECT attribute to SHR.

For further information, see the Linker manual.

------------------------------------------------------------
PROG8.  How do I convert between IEEE and VAX floating data?

In OpenVMS V6.1 there is a routine CVT$CONVERT_FLOAT, documented in the
LIB$ Run-Time Library Reference Manual, which can perform conversions
between any two of the following floating datatypes: VAX (F,D,G,H),
little-endian IEEE (single, double, quad), big-endian IEEE (single, double,
quad), CRAY and IBM System\370.

DEC Fortran (all platforms) has a feature which will perform automatic
conversion of unformatted data during input or output.  See the DEC Fortran
documentation for information on "non-native data in I/O" and the
CONVERT= OPEN statement keyword.

------------------------------------------------------------
PROG9.  How do I get the argument count in a Fortran routine?

On VAX, many programmers would use a MACRO routine which accessed the
AP register of the caller to get the address of the argument list and
hence the argument count.  This was not guaranteed to work on VAX, but
usually did.  However, it doesn't work at all on OpenVMS Alpha, as there
is no AP register.  On Alpha systems, you must use a language's built-in
function to retrieve the argument count, if any.  In Fortran this is
IARGCOUNT, which is also available in DEC Fortran on OpenVMS VAX.

Note that omitting arguments to Fortran routines is non-standard and is
unsupported.  It will work in many cases - read the DEC Fortran release
notes for additional information.

------------------------------------------------------------
PROG10. How do I get a unique system ID for licensing purposes?

Many software developers desire to use a unique hardware ID to "lock" a
given copy of their product to a specific system.  Most Digital VAX and
Alpha systems do not have a unique hardware-set "system ID" that can be
used for this purpose.  Digital does not use hardware IDs in its licensing
methods and many users consider a hardware-based licensing scheme to be
a negative attribute when considering software purchases.

Digital uses a software-based system called the License Management Facility
or LMF.  This provides for software keys (Product Authorization Keys or PAKS)
which support capacity and user-based license checking.  Digital sells
the DEC LMF PAK Generator for OpenVMS (SPD 31.68.03) for use by software
vendors.

However, if a hardware-based method is required, the most common method is
based on an Ethernet adaptor hardware address.  Sample source code for
implementing this is available at:

  http://www.partner.digital.com/www-swdev/files/OPENVMS/examples/ether/ether.c

------------------------------------------------------------
PROG11. What is an executable, shareable, system or UWSS image?

   Executable code in OpenVMS typically resides in an image -- an
   image is a file -- the file extension is typically .EXE -- that
   contains this code.  Common types of images include executable
   images, shareable images, system images, and protected (UWSS)
   images.

   Executable images are programs that can be directly executed.
      These images can grant enhanced privileges, with an INSTALL
      of the image with /PRIVILEGE, or can grant enhanced access
      with the specification of a subsystem identifier on the ACL
      associated with the image.

   Shareable images contain code executed indirectly, these images
       are referenced from executable images and/or from other
       shareable images.  These images can not grant enhanced
       privileges, even with the use of INSTALL with /PRIVILEGE
       or a subsystem identifier.  These shareable images can be
       dynamically activated (a LINK that occurs at run-time) via
       the LIB$FIND_IMAGE_SYMBOL run-time library (RTL) routine.
       (See `protected images' for information on `privileged
       shareable images'.)

   System images are intended to run directly on the VAX or Alpha
       hardware -- these are normally used for the kernel code
       that comprises an operating system. 

   Protected images -- also refered to as User-Written System Services
       (UWSS), or as privileged shareable images -- are similiar in
       some ways to a standard shareable images, but these images
       include a `change mode' handler, and execute in an `inner'
       processor mode (privileged mode; executive or kernel), and
       code executing in inner modes has implicit SETPRV privilege.
       Must be INSTALLed with /PROTECT.  Note that inner-mode code
       has restrictions around calling library routines, around
       calling various system services, and around calling code
       located in other protected or shareable images.

   Loadable images and device drivers are images that can be used
   to add code into the OpenVMS kernel.  Pseudo-device drivers
   are a particularly convenient way to add executable code, with
   associated driver-defined data structures, into the kernel.
   The pseudo-device driver includes the UCB and DDB data structures,
   and a calling interface with support for both privileged and
   unprivileged access to the driver code via sys$qio[w] calls.

   A cookbook approach to creating OpenVMS shareable images is
   available at the (admittedly overly long) URL:

     http://www.partner.digital.com/www-swdev/pages/Home
     /TECH/faqs/ovms/ovms-shexe-cook.html

.....[shoffman@star.enet.dec.com]
[End of Part 2/3]

-- 
Please send DIGITAL Visual Fortran support requests to dvf-support@digital.com

Steve Lionel                      mailto:lionel@mail.dec.com
Fortran Development               http://www.digital.com/info/slionel.html
Digital Equipment Corporation     
110 Spit Brook Road, ZKO2-3/N30    
Nashua, NH 03062-2698             "Free advice is worth every cent"

For information on DIGITAL Fortran, see http://www.digital.com/fortran
