MULTICS TECHNICAL BULLETIN MTB764 To: MTB Distribution From: Gary C. Dixon Date: May 21, 1987 Subject: Changes to the sys_log_ Subroutine ----------------------------------- This MTB documents the sys_log_ subroutine, which the Initializer uses to report and log errors. It documents the current interfaces (as input for the Privileged Subroutines manual). And it proposes a new, more general interface to this subroutine. ----------------------------------- Please send comments by Multics mail to: GDixon -at pco _________________________________________________________________ Multics project internal documentation; not to be reproduced or distributed outside the Multics project without permission of the Director of MDC. MTB764 sys_log_ Changes CONTENTS Page 1: Introduction to the Problem . . . . . . . . . . . . . . 1 1.1: The Solution . . . . . . . . . . . . . . . . . . . . 1 Appendix A: Documentation for sys_log_ . . . . . . . . . . 1 sys_log_ . . . . . . . . . . . . . . . . . . . . . . . . 2 sys_log_$error_log . . . . . . . . . . . . . . . . . 3 sys_log_$sys_log_ . . . . . . . . . . . . . . . . . . 4 sys_log_$binary . . . . . . . . . . . . . . . . . . . 5 sys_log_$command . . . . . . . . . . . . . . . . . . 6 sys_log_$command_error . . . . . . . . . . . . . . . 6 sys_log_$general . . . . . . . . . . . . . . . . . . 7 Appendix B: Documentation for sys_log_constants.incl.pl1 . 15 sys_log_ Changes MTB764 111::: IIINNNTTTRRROOODDDUUUCCCTTTIIIOOONNN TTTOOO TTTHHHEEE PPPRRROOOBBBLLLEEEMMM The sys_log_ subroutine currently provides 5 entrypoints for printing and logging Initializer error and progress messages. It is used to maintain security auditing trails, to document operator actions, to record system activity and to report unexpected errors and events. These entrypoints are documented in Appendix A. While the current interfaces do perform their intended function, they are cumbersome to use. Each time a message is to be printed or logged, a complex call statement must be inserted into the program, followed by some kind of goto or exiting action if the error is fatal. This often-repeated complexity makes writing Initializer programs a harder job, and makes understanding of such program more difficult than necessary. 111...111::: TTThhheee SSSooollluuutttiiiooonnn Since many new Initializer programs are being written for the DSA project, a new sys_log_ interface has been designed. It allows the complexity of the error message interface to be centralized within sys_log_ itself and within an internal error-reporting procedure of the calling program. The calls in the body of the calling program are reduced to the minimum of information needed to produce the message. This makes the programs must simpler to write and to understand. The new interface, called sys_log_$general, is documented at the end of Appendix A. This documentation includes an example of the calling program and its internal error reporting procedure. Appendix B shows the complete text of the sys_log_constants.incl.pl1 file, which has been greatly extended in support of sys_log_$general. Please review and comment upon the these appendices. AAAPPPPPPEEENNNDDDIIIXXX AAA::: DDDOOOCCCUUUMMMEEENNNTTTAAATTTIIIOOONNN FFFOOORRR SSSYYYSSS_LLLOOOGGG_ ________ ________ sys_log_ sys_log_ ________ ________ NNNaaammmeee::: sssyyysss_llloooggg_ The sys_log_ subroutine provides an error message handling facility to programs that run in the Initializer process. The subroutine has two modes of operation. Command mode is used by operator commands to report errors to the operator in a manner similar to com_err_. The error messages are printed on the operator terminal that issued the command. They are also written into the admin log, which can be printed via "print_sys_log -admin". Answer Service (AS) mode is used by noncommand programs running in the Initializer to report errors in a manner similar to the hardcore syserr_ mechanism. The error messages are printed on one of three Answering Service I/O switches (severity1, severity2 or severity3). They are also written into the Answering Service log, which can be printed via "print_sys_log -as". ________ ________ sys_log_ sys_log_ ________ ________ ARGUMENTS: The following argument is used by all sys_log_ entrypoints. severity defines the severity of the error. Allowed values are defined by named constants in sys_log_constants.incl.pl1. SL_LOG_SILENT (= 0) Only log the message, do not print it. SL_LOG (= 1) Log the message and print it. When called in AS mode, print the message on the severity1 I/O switch. When called in command mode, print the message on the operator's console. SL_LOG_BEEP (= 2) Log the message and print it preceeded by a line of asterisks and followed by a BELL character which turns on the audible alarm. When called in AS mode, print the message on the severity2 I/O switch. When called in command mode, print the message on the operator's console. SL_LOG_CRASH (= 3) Log the message, print it preceeded by a line of asterisks and followed by a BELL character, and crash the system. When called in AS mode, print the message on the severity3 I/O switch. When called in command mode, print the message on the operator's console. EEEnnntttrrryyy::: sssyyysss_llloooggg_$$$eeerrrrrrooorrr_llloooggg This entrypoint logs/prints an error table code and message in AS mode. The message format is: caller: error_code_text ioa_message USAGE declare sys_log_$error_log entry options(variable); call sys_log_$error_log (severity, code, caller, ioa_ctl, args); ________ ________ sys_log_ sys_log_ ________ ________ ARGUMENTS severity is a fixed bin(17) argument which defines the severity, as described above. (Input) code is a fixed bin(35) error table code whose expanded text is placed in the message. If code is zero, then no error message text is placed in the message. (Input) caller is a char(*) name of the calling program. This is placed in the message to identify where the message is coming from. (Input) ioa_ctl is a char(*) or char(*) varying ioa_ control string describing the message format. (Input) args are arguments to be substituted into the ioa_ control string. (Input) EEEnnntttrrryyy::: sssyyysss_llloooggg_ This entrypoint logs/prints a message in AS mode. The ioa_ctl string should include the caller's name to identify where the message is coming from. USAGE declare sys_log_ entry options(variable); call sys_log_ (severity, ioa_ctl, args); ARGUMENTS severity is a fixed bin(17) argument which defines the severity, as described above. (Input) ioa_ctl is a char(*) or char(*) varying ioa_ control string describing the message format. (Input) ________ ________ sys_log_ sys_log_ ________ ________ args are arguments to be substituted into the ioa_ control string. (Input) EEEnnntttrrryyy::: sssyyysss_llloooggg_$$$bbbiiinnnaaarrryyy This entrypoint logs/prints a message in AS mode. The logged message includes binary data which further describes the circumstances of the error. USAGE declare sys_log_$binary entry options(variable); call sys_log_$binary (severity, data_ptr, data_lth, data_class, ioa_ctl, args); ARGUMENTS severity is a fixed bin(17) argument which defines the severity, as described above. (Input) data_ptr is an aligned pointer to the binary data. (Input) data_lth is a fixed bin(17) length of the binary data, in words. (Input) data_class is a char(10) varying parameter defining the class of binary data. This is used by print_sys_log to find a routine to expand and print the binary data. For example, if the data_class were CLASS, then print_sys_log would use a routine called expand_CLASS_msg_ to expand and print the binary data. (Input) ioa_ctl is a char(*) or char(*) varying ioa_ control string describing the message format. (Input) args are arguments to be substituted into the ioa_ control string. (Input) ________ ________ sys_log_ sys_log_ ________ ________ EEEnnntttrrryyy::: sssyyysss_llloooggg_$$$cccooommmmmmaaannnddd This entrypoint logs/prints a message in command mode. The ioa_ctl string should include the caller's name to identify where the message is coming from. USAGE declare sys_log_$command entry options(variable); call sys_log_$command (severity, ioa_ctl, args); ARGUMENTS severity is a fixed bin(17) argument which defines the severity, as described above. (Input) ioa_ctl is a char(*) or char(*) varying ioa_ control string describing the message format. (Input) args are arguments to be substituted into the ioa_ control string. (Input) EEEnnntttrrryyy::: sssyyysss_llloooggg_$$$cccooommmmmmaaannnddd_eeerrrrrrooorrr This entrypoint logs/prints an error table code and message in command mode. The message format is: caller: error_code_text ioa_message USAGE declare sys_log_$command_error entry options(variable); call sys_log_$command_error (severity, code, caller, ioa_ctl, args); ________ ________ sys_log_ sys_log_ ________ ________ ARGUMENTS severity is a fixed bin(17) argument which defines the severity, as described above. (Input) code is a fixed bin(35) error table code whose expanded text is placed in the message. If code is zero, then no error message text is placed in the message. (Input) caller is a char(*) name of the calling program. This is placed in the message to identify where the message is coming from. (Input) ioa_ctl is a char(*) or char(*) varying ioa_ control string describing the message format. (Input) args are arguments to be substituted into the ioa_ control string. (Input) EEEnnntttrrryyy::: sssyyysss_llloooggg_$$$gggeeennneeerrraaalll This entrypoint logs/print an error message in either AS or command modes. It allows the caller to specify which items are placed in the message, and whether these items are to come from the input structure or from an associated argument list. This entrypoint should be used in preference to those above, because calling programs can be written in a more readable fashion. Refer to the Notes below for an example. USAGE declare sys_log_$general (pointer); call sys_log_$general (sl_info_ptr); ARGUMENTS sl_info_ptr points to the sl_info structure described below. (Input) ________ ________ sys_log_ sys_log_ ________ ________ INFO STRUCTURE The sys_log_$general entrypoint uses information provided by the following structure to determine which items to place in the message, and where to obtain those items. This structure is declared in sys_log_constants.incl.pl1. dcl 1 sl_info aligned automatic, 2 version char(8), 2 arg_list_ptr ptr, 2 loc, 3 (mode, severity, code, caller, data, class, ioa_msg) fixed bin, 2 flags, 3 ioa_msg_is_error_code bit(1) unal, 3 flags_pad bit(35) unal, 2 mode fixed bin, 2 severity fixed bin, 2 code fixed bin(35), 2 caller char(65) varying, 2 data, 3 data_ptr ptr, 3 data_lth fixed bin(21), 2 class char(10) varying, 2 ioa_msg char(500) varying; Structure Elements version is the version number of this structure. It should be set to the named constant SL_INFO_version_1. (Input) arg_list_ptr is a pointer to an argument list. Various error message items can be extracted from this argument list, under control of sl_info.loc. (Input) loc is the location of information needed to process the error message. The information can be given in the sl_info structure, can come from the argument list, or certain items can be omitted completely. (Input) All sl_info.loc elements can have one of the following values: ________ ________ sys_log_ sys_log_ ________ ________ SL_INFO_arg_given_in_structure (= -1) the information is located in the correspondingly named, level 2 structure element. SL_INFO_arg_not_given (= 0) the information is not given. +N a positive integer giving the argument number in the argument list which contains the information. loc.mode is the location of the mode. loc.severity is the location of the severity. loc.code is the location of the error code. loc.caller is the location of the caller name. loc.data is the location of the binary data pointer and length. If a positive integer N is given, then the pointer is the Nth argument in the argument list, and the argument length is argument N+1. loc.class is the location of the binary data class. loc.ioa_msg is the location of the ioa_ control string. If a positive integer N is given, then then ioa_ control string is the Nth argument in the argument list, and remaining arguments are substituted into the control string. If SL_INFO_arg_given_in_structure is given, then ioa_msg is treated as a character string message text rather than an ioa_ control string; no argument substitution is performed. flags.ioa_msg_is_error_code is "1"b if loc.ioa_msg is a positive integer N, and the Nth argument in the argument list is an error code whose expanded text is the ioa_ control structure. If this flag is "0"b and loc.ioa_msg is positive, then the Nth argument in the argument list is a char(*) or char(*) varying ioa_ control string. If loc.ioa_msg is nonpositive, this flag is ignored. (Input) ________ ________ sys_log_ sys_log_ ________ ________ mode is a fixed bin(17) operating mode for sys_log_. If the mode is located in the argument list or not given as input, then the value actually used is returned in sl_info.mode. (Input/Output) It can be one of the following values: SL_INFO_as_mode (= 1) operate in AS mode. This is the default if loc.mode is SL_INFO_arg_not_given. SL_INFO_command_mode (= 2) operate in command mode. severity is a fixed bin(17) argument which defines the severity, as described above. If the severity is located in the argument list or not given as input, then the value actually used is returned in sl_info.severity. (Input/Output) If loc.severity is SL_INFO_arg_not_given, then SL_LOG is the default value for mode. code is a fixed bin(35) error table code whose expanded text is placed in the message. If code is -1 or loc.code is SL_INFO_arg_not_given, then no error table text is placed in the message. If a zero code is given, it means that no error really occurred; therefore printing/logging of the sys_log_ message is aborted. Otherwise, code is treated as a standard error table code whose text is obtained by calling convert_status_code_ and placed in the message. If code is located in the argument list, then the value is returned in sl_info.code. (Input/Output) caller is a char(*) name of the program reporting the error. A caller name should always be given. If the caller is located in the argument list, then the name is returned in sl_info.caller. (Input/Output) data is a pointer to and fixed bin(17) length of the binary data to be associated with the logged message. If the data_ptr and data_lth are located in the argument list, then these values are returned in sl_info.data_ptr and sl_info.data_lth. (Input/Output) ________ ________ sys_log_ sys_log_ ________ ________ class is a char(*) binary data class name. It is required if binary data is given. If the class is located in the argument list, then the data class is returned in sl_info.class. (Input/Output) ioa_msg is a char(*) or char(*) varying ioa_ control string, or an error table code whose text is the ioa_ control string (see sl_info.ioa_msg_is_error_code above). The text expansion after argument substitution is returned. (Input/Output) Notes The calling program should use an error diagnostic internal procedure to report its errors. This internal procedure fills in the sl_info structure and calls sys_log_$general, passing its argument list as the location for various message items. The sys_log_constants.incl.pl1 file declares several constant versions of the sl_info structure to simplify structure assignment. These are summarized below. Refer to the include file for details. sl_info_sev_code_msg sl_info settings for an SL_INFO_as_mode operation to be used with an Error internal procedure whose calling sequence is: call Error (severity, code, ioa_ctl, args); The Error internal procedure must set sl_info.arg_list_ptr and sl_info.caller. It may optionally set sl_info.data and sl_info.class. sl_info_sev_msg an SL_INFO_as_mode operation with Error calling sequence: call Error (severity, ioa_ctl, args); sl_info_sev_coded_msg an SL_INFO_as_mode operation with Error calling sequence: call Error (severity, ioa_ctl_as_error_code, args); ________ ________ sys_log_ sys_log_ ________ ________ sl_info_sev_code_label_msg an SL_INFO_as_mode operation with Error calling sequence: call Error (severity, code, return_label, ioa_ctl, args); sl_info_code_msg an SL_INFO_as_mode operation with Error calling sequence: call Error (code, ioa_ctl, args); sl_info_msg an SL_INFO_as_mode operation with Error calling sequence: call Error (ioa_ctl, args); These structure templates can be used in conjunction with an internal procedure to report errors, as shown in the example below. ________ ________ sys_log_ sys_log_ ________ ________ as_proc_: procedure (P_code); dcl P_code fixed bin(35) parameter; . . dcl MY_NAME char(8) initial ("as_proc_") internal static options(constant); . . call xxx_ (path, modes, code); if code ^= 0 then call Error (SL_LOG_BEEP, code, ABORT_LABEL, "Calling xxx_ subroutine for ^a.", path); . . ABORT_LABEL: P_code = code; return; . . Error: procedure options(variable); dcl return_label label based(return_label_ptr), return_label_ptr pointer; sl_info = sl_info_sev_code_label_msg; sl_info.arg_list_ptr = cu_$arg_list_ptr(); sl_info.caller = MY_NAME; call sys_log_$general (addr(sl_info)); if sl_info.code ^= 0 then do; call cu_$arg_ptr (3, return_label_ptr, 0, 0); go to return_label; end; else return; end Error; end as_proc_; If sys_log_$general is called with an invalid sl_info structure, then it reports this error by signalling the sys_log_error_ condition, passing the following condition information structure which is declared in sys_log_error_info.incl.pl1: dcl 1 sys_log_error_info aligned automatic, 2 header like condition_info_header, 2 sl_info_ptr ptr; ________ ________ sys_log_ sys_log_ ________ ________ Structure Elements header.version is the version number of this structure. It is set to the named constant SYS_LOG_ERROR_INFO_version_1. header.action_flags.cant_restart is "1"b, indicating that restarting with an invalid sl_info structure is impossible. header.status_code is an error table code indicating how the sl_info structure is invalid. sl_info_ptr is a pointer to the invalid sl_info structure. sys_log_ Changes MTB764 AAAPPPPPPEEENNNDDDIIIXXX BBB::: DDDOOOCCCUUUMMMEEENNNTTTAAATTTIIIOOONNN FFFOOORRR SSSYYYSSS_LLLOOOGGG_CCCOOONNNSSSTTTAAANNNTTTSSS...IIINNNCCCLLL...PPPLLL111 /* BEGIN INCLUDE FILE sys_log_constants.incl.pl1 */ /****^ HISTORY COMMENTS: 1) change(87-04-22,GDixon): Added sl_info structure and associated named constants for use in calling sys_log_$general. END HISTORY COMMENTS */ /* format: style4 */ dcl ( SL_TYPE_CRASH init (-3), /* type message with banner & kill system */ SL_TYPE_BEEP init (-2), /* type message with banner */ SL_TYPE init (-1), /* type message */ SL_LOG_SILENT init (0), /* log message */ SL_LOG init (1), /* log & type message */ SL_LOG_BEEP init (2), /* log & type message with banner */ SL_LOG_CRASH init (3) /* log & type message with banner & kill system */ ) fixed bin internal static options (constant); MTB764 sys_log_ Changes dcl 1 sl_info aligned automatic, 2 version char(8), /* structure version */ 2 arg_list_ptr ptr, /* arg_list with values */ 2 loc, 3 (mode, severity, code, caller, data, class, ioa_msg) fixed bin, /* These flags control where the corresponding data item is found.*/ /* -1: data appears in the corresponding structure element below */ /* 0: data is not present anywhere */ /* +N: data is Nth item in argument list pointed to by */ /* sl_info.arg_list_ptr. Upon return, data copied into */ /* corresponding structure element. */ /* if data = +N: */ /* argN is data_ptr, argN+1 is data_len */ /* if ioa_msg = +N: */ /* argN+1, ... argLAST are arguments substituted into the */ /* ioa_msg control string. The formatted msg is returned. */ 2 flags, 3 ioa_msg_is_error_code bit(1) unal, /* ioa_ctl is error code. */ 3 flags_pad bit(35) unal, 2 mode fixed bin, /* as-mode, command-mode */ 2 severity fixed bin, /* error severity */ 2 code fixed bin(35), /* error table code */ 2 caller char(65) varying, /* caller refname$entryname*/ 2 data, /* binary data ptr/length */ 3 data_ptr ptr, 3 data_lth fixed bin(21), 2 class char(10) varying, /* binary data class */ 2 ioa_msg char(500) varying; /* formatted message text */ /* * * * * * * * * * * * * * * * * * * */ /* */ /* If data values (eg, sl_info.caller) are passed in the */ /* argument list,their data types should be as shown in */ /* the structure above, except that character strings */ /* should be char(*) nonvarying. */ /* */ /* * * * * * * * * * * * * * * * * * * */ /* value for sl_info.version */ dcl SL_INFO_version_1 char (8) int static options(constant) init("sl_info1"); sys_log_ Changes MTB764 /* values for sl_info.mode */ dcl (SL_INFO_as_mode init(1), SL_INFO_command_mode init(2)) fixed bin int static options(constant); /* values for sl_info.loc.(severity, code, caller, data, class, ioa_ctl, arg) */ dcl (SL_INFO_arg_given_in_structure init(-1), SL_INFO_arg_not_given init(0)) fixed bin int static options(constant); /* * * * * * * * * * * * * * * * * * * */ /* */ /* The following static structures are commonly used in */ /* the LS user control software. */ /* */ /* * * * * * * * * * * * * * * * * * * */ /* Syntax: call Abort (severity, code, ioa_ctl, args); */ dcl 1 sl_info_sev_code_msg aligned int static options(constant), 2 version char(8) init ("sl_info1"), 2 arg_list_ptr ptr init (null), 2 loc, 3 (mode init (-1), severity init ( 1), code init ( 2), caller init (-1), data init ( 0), class init ( 0), ioa_msg init ( 3)) fixed bin, 2 flags, 3 ioa_msg_is_error_code bit(1) unal init ("0"b), 3 flags_pad bit(35) unal init ("0"b), 2 mode fixed bin init ( 1), 2 severity fixed bin init ( 0), 2 code fixed bin(35) init ( 0), 2 caller char(65) varying init (""), 2 data, 3 data_ptr ptr init (null), 3 data_lth fixed bin(21) init ( 0), 2 class char(10) varying init (""), 2 ioa_msg char(500) varying init (""); MTB764 sys_log_ Changes /* Syntax: call Abort (severity, ioa_ctl, args); */ dcl 1 sl_info_sev_msg aligned int static options(constant), 2 version char(8) init ("sl_info1"), 2 arg_list_ptr ptr init (null), 2 loc, 3 (mode init (-1), severity init ( 1), code init ( 0), caller init (-1), data init ( 0), class init ( 0), ioa_msg init ( 2)) fixed bin, 2 flags, 3 ioa_msg_is_error_code bit(1) unal init ("0"b), 3 flags_pad bit(35) unal init ("0"b), 2 mode fixed bin init ( 1), 2 severity fixed bin init ( 0), 2 code fixed bin(35) init ( 0), 2 caller char(65) varying init (""), 2 data, 3 data_ptr ptr init (null), 3 data_lth fixed bin(21) init ( 0), 2 class char(10) varying init (""), 2 ioa_msg char(500) varying init (""); sys_log_ Changes MTB764 /* Syntax: call Abort (severity, ioa_ctl_as_error_code, args); */ dcl 1 sl_info_sev_coded_msg aligned int static options(constant), 2 version char(8) init ("sl_info1"), 2 arg_list_ptr ptr init (null), 2 loc, 3 (mode init (-1), severity init ( 1), code init ( 0), caller init (-1), data init ( 0), class init ( 0), ioa_msg init ( 2)) fixed bin, 2 flags, 3 ioa_msg_is_error_code bit(1) unal init ("1"b), 3 flags_pad bit(35) unal init ("0"b), 2 mode fixed bin init ( 1), 2 severity fixed bin init ( 0), 2 code fixed bin(35) init ( 0), 2 caller char(65) varying init (""), 2 data, 3 data_ptr ptr init (null), 3 data_lth fixed bin(21) init ( 0), 2 class char(10) varying init (""), 2 ioa_msg char(500) varying init (""); MTB764 sys_log_ Changes /* Syntax: call Abort (severity, code, error_return_label, ioa_ctl, args); */ dcl 1 sl_info_sev_code_label_msg aligned int static options(constant), 2 version char(8) init ("sl_info1"), 2 arg_list_ptr ptr init (null), 2 loc, 3 (mode init (-1), severity init ( 1), code init ( 2), caller init (-1), data init ( 0), class init ( 0), ioa_msg init ( 4)) fixed bin, 2 flags, 3 ioa_msg_is_error_code bit(1) unal init ("0"b), 3 flags_pad bit(35) unal init ("0"b), 2 mode fixed bin init ( 1), 2 severity fixed bin init ( 0), 2 code fixed bin(35) init ( 0), 2 caller char(65) varying init (""), 2 data, 3 data_ptr ptr init (null), 3 data_lth fixed bin(21) init ( 0), 2 class char(10) varying init (""), 2 ioa_msg char(500) varying init (""); sys_log_ Changes MTB764 /* Syntax: call Log_error (code, ioa_ctl, args); */ dcl 1 sl_info_code_msg aligned int static options(constant), 2 version char(8) init ("sl_info1"), 2 arg_list_ptr ptr init (null), 2 loc, 3 (mode init (-1), severity init (-1), code init ( 1), caller init (-1), data init ( 0), class init ( 0), ioa_msg init ( 2)) fixed bin, 2 flags, 3 ioa_msg_is_error_code bit(1) unal init ("0"b), 3 flags_pad bit(35) unal init ("0"b), 2 mode fixed bin init ( 1), 2 severity fixed bin init ( 0), 2 code fixed bin(35) init ( 0), 2 caller char(65) varying init (""), 2 data, 3 data_ptr ptr init (null), 3 data_lth fixed bin(21) init ( 0), 2 class char(10) varying init (""), 2 ioa_msg char(500) varying init (""); MTB764 sys_log_ Changes /* Syntax: call Trace (ioa_ctl, args); */ dcl 1 sl_info_msg aligned int static options(constant), 2 version char(8) init ("sl_info1"), 2 arg_list_ptr ptr init (null), 2 loc, 3 (mode init (-1), severity init (-1), code init ( 0), caller init (-1), data init ( 0), class init ( 0), ioa_msg init ( 1)) fixed bin, 2 flags, 3 ioa_msg_is_error_code bit(1) unal init ("0"b), 3 flags_pad bit(35) unal init ("0"b), 2 mode fixed bin init ( 1), 2 severity fixed bin init ( 0), 2 code fixed bin(35) init ( 0), 2 caller char(65) varying init (""), 2 data, 3 data_ptr ptr init (null), 3 data_lth fixed bin(21) init ( 0), 2 class char(10) varying init (""), 2 ioa_msg char(500) varying init (""); /* END INCLUDE FILE sys_log_constants.incl.pl1 */