%title 'MXERR - Error message handler macros' !++ ! Facility: DECMAIL/MS - Message EXchange ! ! Abstract: ! This set of macros is used to manipulate error strings used ! by MX. ! ! Environment: Bliss 36, ! ! Author: Richard B. Waddington, Creation Date: October 8, 1984 ! !-- MACRO error$data = ( MP$MKF, 'MP$MKF-Missing key field', MP$SYN, 'MP$SYN-Syntax error in line #%D of %A', MP$TEL, 'MP$TEL-Extraneous text at end of line - "%A"', MP$UHF, 'MP$UHF-Unsupported host format requested (Internal Error)', MQ$MHE, 'MQ$MHE-Message has expired', SP$UIE, 'SP$UIE-Unexpected internal error', UF$ACF, 'UF$ACF-Abort close failed', UF$FCF, 'UF$FCF-File close failed for %A', UF$FRF, 'UF$FRF-File read failed for %A', UF$FWF, 'UF$FWF-File write failed for %A', UF$FOF, 'UF$FOF-File open failed for %A', UF$CGP, 'UF$CGP-Cannot get page', UF$IFA, 'UF$IFA-Invalid file access attempted', UF$IFS, 'UF$IFS-Invalid file specification', UF$NSR, 'UF$NSR-Non-sequential read attempted', UF$NSW, 'UF$NSW-Non-sequential write attempted', UF$TLF, 'UF$TLF-Table lookup failed', ER$MLE, 'ER$MLE-Message level error occured in SERVER or SPOOLER', MX$NOM, 'MX$NOM-Insufficient memory', MX$NOQ, 'MX$NOQ-Insufficient quota in %A', MG$NSU, 'MG$NSU-%A: No such user %A', MG$LTL, 'MG$LTL-SMTP: Line too long', MG$UEC, 'MG$UEC-SMTP: Unexpected command', MG$UIC, 'MG$UIC-SMTP: Unimplemented command', MG$UNC, 'MG$UNC-SMTP: Unknown command', MG$ARG, 'MG$ARG-SMTP: Bad Argument', MG$NNK, 'MG$NNK-%A: Node %A is not known here', MG$MFC, 'MG$MFC-SMTP: Mail File corrupted - Mail lost', MG$IPS, 'MG$IPS-Insufficient privilege for sending mail to SYSTEM', MG$GPE, 'MG$GPE-%A: %I', !Gen. Purpose Error SL$NSU, 'SL$NSU-No such user %A', SL$NNK, 'SL$NNK-Node %A is not known here', LS$DMF, 'LS$DMF-Duplicate message files %A, %A', LS$NMF, 'LS$NMF-Message file %A does not exist', LS$ICP, 'LS$ICP-Invalid continuation packet', LS$ISP, 'LS$ISP-Invalid sender pid', LS$ISU, 'LS$ISU-Invalid sender uid', LS$INN, 'LS$INN-MX does not service node %A', LS$IDS, 'LS$IDS-Invalid destination string %A', NW$ERR, 'NW$ERR-Network error at node %A - %A', S2$ERR, 'S2$ERR-%A', LS$UOQ, 'LS$UOQ-User %A was over quota', DN$INP, 'DN$INP-Invalid DECNET mail protocol', LS$IHT, 'LS$IHT-Invalid Scan_packet Header Type', LS$IRT, 'LS$IRT-Invalid Scan_packet Record Type', UF$NQE, 'UF$NQE-ENQ Error: %O', UF$CGL, 'UF$CGL-Could not get lock', UF$DQE, 'UF$DQE-DEQ Error: %O', UF$CFL, 'UF$CFL-Could not free lock', UF$FPE, 'UF$FPE-FILOP Error: %O', UF$FPF, 'UF$FPF-FILOP failed', UF$FNF, 'UF$FNF-File not found', UF$CNP, 'UF$CNP-Could not parse', UF$LOK, 'UF$LOK-file is locked', UF$LEN, 'UF$LEN-Could not get length of %A', UFD$CR, 'UFD$CR-Could not create searchlist for %A', LS$CCP, 'LS$CCP-Could not create PID %A', MX$MZB, 'MX$MZB-Message file %A contained zero bytes', MX$CTP, 'MX$CTP-Could not translate POBOX:', MP$PLD, 'MP$PLD-Path loop detected at node %A' ) %; MACRO $GLITERAL = ! Initialize for constant creation %ASSIGN( $xpo$distinct, 0 ) !NOTE GLOBAL LITERAL cannot occur GLOBAL LITERAL %; !in LIBRARY file. MACRO $ERROR_TABLE = UNDECLARE mxerrs; UNDECLARE $ebuf; UNDECLARE ext_lines(%remove(error$data)); $gliteral lit_lines(%REMOVE(error$data)); GLOBAL mxerrs: VECTOR [max_error] INITIAL (0, STR_LINES(%remove(error$data)) ); GLOBAL $ebuf: VECTOR[CH$ALLOCATION(256)] %; macro EXT_LINES (CODE,TEXT)[] = CODE %if not %null(%remaining) %then ,EXT_LINES(%remaining) %else ; %if %declared(max_error) %then UNDECLARE max_error; %fi LITERAL max_error = %count + 2 %fi %; macro LIT_LINES (CODE,TEXT)[] = CODE = $distinct %if not %null(%remaining) %then ,LIT_LINES(%remaining) %fi %; macro STR_LINES (CODE,TEXT)[] = ch$ptr(uplit(%string(%asciz TEXT))) %if not %null(%remaining) %then ,STR_LINES(%remaining) %fi %; EXTERNAL ext_lines(%remove(error$data)); EXTERNAL mxerrs: vector[max_error]; EXTERNAL $ebuf: vector[CH$ALLOCATION(256)]; MACRO $$cnt(_A_) = %LENGTH %; MACRO $$oplen(_arg) = %IF %CTCE(_arg) %THEN %IF (_arg NEQ 0) AND (_arg NEQ $error_code) %THEN 1 %ELSE 0 %FI %ELSE 1 %FI %; MACRO $$assign_args(_n, _arg)[] = %IF NOT %NULL(_arg) %THEN _argblck[_n] = _arg; $$assign_args(_n+1, %REMAINING) %FI %; KEYWORDMACRO $error(severity, code, facility, id=0, message_data=, optional_message=0, optional_data=) = BEGIN %IF facility EQL $message %THEN %IF %CTCE(id) %THEN %ERROR('Missing Message ID in $ERROR call') %FI %FI STACKLOCAL _argblck: VECTOR[5 + $$cnt(%remove(message_data)) + $$cnt(%remove(optional_data)) + $$oplen(optional_message)] INITIAL(4 + $$cnt(%remove(message_data)) + $$cnt(%remove(optional_data)) + $$oplen(optional_message), sts$value(SEV=severity,COD=code,FAC=facility), 0, 0, 5 + $$cnt(%remove(message_data)) + $$oplen(optional_message) ); _argblck[2] = id; _argblck[3] = optional_message; $$assign_args(5, %REMOVE(message_data)) %IF $$oplen(optional_message) %THEN _argblck[5+$$cnt(%REMOVE(message_data))] = optional_message; %FI $$assign_args(5+$$cnt(%REMOVE(message_data))+$$oplen(optional_message), %REMOVE(optional_data)) mx$error_processor(_argblck); $false END %; KEYWORDMACRO $signal_error(severity, code, facility, id=0, message_data=, optional_message=0, optional_data=) = SIGNAL( sts$value(SEV=severity, COD=code, FAC=facility), id, optional_message, 5 + $$cnt(%REMOVE(message_data)) %IF NOT %NULL(message_data) %THEN ,%REMOVE(message_data) %FI %IF $$oplen(optional_message) %THEN ,optional_message %FI %IF NOT %NULL(optional_data) %THEN ,%REMOVE(optional_data) %FI ) %; MACRO $e_display(b) = %IF %SWITCHES(TOPS20) %THEN BEGIN DECLARE_JSYS(psout); $$psout(b); END %ELSE task_info(CH$PTR(b)) %FI %; %if $TOPS20 %then macro $LAST_ERROR = (declare_jsys(geter); local error; $$geter($fhslf;error); .error<0,18> ) %; %fi ! ! Severity codes: ! LITERAL $warning = 0, $success = 1, $err = 2, $info = 3, $severe = 4; ! ! Facility codes: ! $LITERAL $protocol = $DISTINCT, $message = $DISTINCT, $internal = $DISTINCT; LITERAL min_facility = $protocol, max_facility = $internal; ! ! Other symbols ! LITERAL $error_code = -1; MACRO abort_mx = %IF %SWITCHES(TOPS20) %THEN BEGIN DECLARE_JSYS(psout,haltf); $$psout(crlf_pointer); ![314]New MONSYM change $$psout(UPLIT(%ASCIZ %STRING('?MX crashed'))); $$haltf(); END %ELSE ! %WARN('ABORT_MX not implemented for this OS') BEGIN BUILTIN UUO; UUO(0,EXIT(1)); END %FI %;