The following document will provide a DCL program to traverse all the message files in SYS$MESSAGE to help translate error code status values to the actual error messages themselves.
The reason for doing this is because neither the $ EXIT %x###### nor the $ WRITE SYS$OUTPUT F$MESSAGE(%x######) techniques actually examine all the message files.
$ sv = 'f$verify(0)' $ ! This is a command file to translate a hex message number $ ! to the appropriate message text for any number defined in $ ! any of the message files in SYS$MESSAGE: directory. The $ ! command file requires one parameter. That parameter is $ ! the message number. For example: $ ! $ ! $ @MESSAGE 1077808A $ ! message found in SYS$COMMON:[SYSMSG]CLIUTLMSG.EXE;1 $ ! %SET-E-NOTSET, error modifying !AS $ ! $ ! The command file returns the message file in which the $ ! message was found and the associated text. The text $ ! string is standard VMS FAO format as described in the $ ! system service manual on the $FAO system service. $ ! $ ! Written by Paul Williams 11-NOV-1987 $ ! and modified a few (several) times since $ ! $ if p1 .eqs. "" then inquire p1 "Message number (in HEX)" $ if p1 .eqs. "" then exit 1 + f$verify('sv') $! $! The most likely error to be encountered is with the SET MESSAGE command. $! Those errors can be caused by invalid message files or insufficient $! access to them. It is best to ignore that and keep trying other message $! files. $ set noon ! continue on all errors $ oldprv = f$setprv("sysprv") ! get SYSPRV if possible $ fl = f$search ("sys$message:sysmgtmsg.exe;") ! do this file first since it $ set message 'fl' ! is most common for admin $ msg = f$message (%x'p1') ! get message text $! $! The existance of "-NOMSG" in the message text means the message wasn't found $ if f$locate ("-NOMSG,", msg) .eq. f$length (msg) then goto found $! $! Keep looking through all message files $again: ! try next file $ fl = f$search ("sys$message:*.exe;") ! use all files availible $ if fl .eqs. "" then goto nomsg ! no more files? $ set message 'fl' ! set message file $ if $status then goto cont ! check for error on msg file $ write sys$output "file with problem is ''fl'" ! tell user which file $ write sys$output "" ! blank line $ goto again ! continue looking $! $cont: $ msg = f$message (%x'p1') ! get message text $ if f$locate ("-NOMSG,", msg) .ne. f$length (msg) then goto again $found: ! message was found $ write sys$output "message found in ''fl'" ! tell user where $ write sys$output msg ! and what $done: $ set proc/priv='oldprv' ! restore privileges $ exit 1 + f$verify('sv') ! all done $nomsg: ! message not found $ write sys$output "message not found, probably a user or 3d party defined message" $ goto done ! do normal clean up
Here is a sample execution of the procedure with the passing of the error code status as P1:
$ @MESSAGE 00D380FC message found in SYS$COMMON:[SYSMSG]SYSMGTMSG.EXE;1 %LOGIN-F-INVPWD, invalid password
Also if you do not provide a P1 value:
$ @MESSAGE Message number (in HEX): 00D380FC message found in SYS$COMMON:[SYSMSG]SYSMGTMSG.EXE;1 %LOGIN-F-INVPWD, invalid password