-- File: PupErrors.mesa, Last Edit: -- MAS April 17, 1980 8:43 PM -- HGM October 24, 1979 8:30 PM -- Copyright Xerox Corporation 1979, 1980 DIRECTORY StatsDefs: FROM "StatsDefs" USING [StatIncr], PupRouterDefs: FROM "PupRouterDefs" USING [SneakySendUnlocked], PupStream: FROM "PupStream" USING [CloseReason], PupDefs: FROM "PupDefs", DriverDefs: FROM "DriverDefs" USING [ Glitch, doStats, doDebug, Network, PutOnGlobalDoneQueue], BufferDefs: FROM "BufferDefs", -- SHARES PupTypes: FROM "PupTypes" USING [ allHosts, PupErrorCode, badChecksumPupErrorCode, noProcessPupErrorCode, resourceLimitsPupErrorCode], DriverTypes: FROM "DriverTypes" USING [bufferSeal]; PupErrors: PROGRAM IMPORTS StatsDefs, PupRouterDefs, DriverDefs, PupDefs EXPORTS PupRouterDefs, PupStream, PupDefs SHARES BufferDefs = BEGIN OPEN DriverDefs, PupDefs; Network: TYPE = DriverDefs.Network; -- PktStream/ByteStream SIGNALs live here so they are defined only once StreamClosing: PUBLIC ERROR [why: PupStream.CloseReason, text: STRING] = CODE; RejectThisRequest: PUBLIC ERROR [error: STRING] = CODE; suppressErrors: BOOLEAN _ FALSE; suppressBufferFull: BOOLEAN _ FALSE; BufferSealBroken: PUBLIC ERROR = CODE; BufferDidntArrive: PUBLIC ERROR = CODE; SetErrorSuppression: PUBLIC PROCEDURE [dontSendErrors: BOOLEAN] = BEGIN suppressErrors _ dontSendErrors; END; SetBufferFullSuppression: PUBLIC PROCEDURE [dontSend: BOOLEAN] = BEGIN suppressBufferFull _ dontSend; END; RejectPupWithBadChecksum: PUBLIC PROCEDURE [b: PupBuffer] = BEGIN Reject[b,PupTypes.badChecksumPupErrorCode]; END; Reject: PUBLIC PROCEDURE [b: PupBuffer, code: PupTypes.PupErrorCode] = BEGIN IF BuildErrorPup[b,code,NIL] THEN PupRouterDefs.SneakySendUnlocked[b]; END; SendErrorPup: PUBLIC PROCEDURE [b: PupBuffer, code: PupTypes.PupErrorCode, text: STRING] = BEGIN IF BuildErrorPup[b,code,text] THEN PupRouterSendThis[b]; END; BuildErrorPup: PUBLIC PROCEDURE [ b: PupBuffer, code: PupTypes.PupErrorCode, text: STRING] RETURNS [ok: BOOLEAN] = BEGIN OPEN PupTypes; i: CARDINAL; p: POINTER TO ARRAY [0..9] OF WORD = LOOPHOLE[@b.pupLength]; temp: PupSocketID; network: Network _ b.network; IF doDebug AND b.seal#DriverTypes.bufferSeal THEN Glitch[BufferSealBroken]; IF suppressErrors OR (suppressBufferFull AND code=resourceLimitsPupErrorCode) OR b.pupType=error OR b.dest.host=PupTypes.allHosts THEN BEGIN DriverDefs.PutOnGlobalDoneQueue[b]; RETURN[FALSE]; END; IF doDebug AND b.network=NIL THEN Glitch[BufferDidntArrive]; FOR i IN [0..9] DO b.errorHeader[i] _ p[i]; ENDLOOP; b.pupType _ error; b.errorCode _ code; b.errorOptions _ 0; temp _ b.dest.socket; b.dest _ b.source; b.source _ [[network.netNumber],[network.hostNumber],temp]; IF text=NIL THEN SELECT code FROM badChecksumPupErrorCode => text _ "Bad Software Checksum"L; noProcessPupErrorCode => text _ "No such Port"L; resourceLimitsPupErrorCode => text _ "Buffers full"L; ENDCASE => NULL; IF text#NIL THEN BEGIN FOR i_0,i+1 UNTIL i=text.length DO b.errorText[i] _ text[i]; ENDLOOP; END ELSE i _ 0; SetPupContentsBytes[b,2*(10+1+1)+i]; -- Yetch IF doStats THEN StatsDefs.StatIncr[statErrorPupsSent]; RETURN[TRUE]; END; -- initialization END. -- PupErrors(2048)\871b85B9t10 5t0 52b17B192b19B98b24B91b25B97b7B153b12B155b13B