! ! Register binds for use in BLISS-36 linkages ! %IF %BLISS(BLISS36) %THEN GLOBAL BIND TF = 0, S1 = 1, S2 = 2, T1 = 3, T2 = 4, T3 = 5, T4 = 6, P1 = 7, P2 = 8, P3 = 9, P4 = 10, S = 14, P = 15; %FI ! ! Linkage definitions ! ! ! Call with no arguments, return true/false in TF ! LINKAGE INONE = %IF %BLISS(BLISS36) %THEN PUSHJ : LINKAGE_REGS(P,13,TF) ! GLOBAL(SPTR = S) NOPRESERVE(S1,S2) PRESERVE(T1,T2,T3,T4,P1,P2,P3,P4); %ELSE CALL; %FI ! ! Call with argument in S1, return true/false in TF ! LINKAGE IS1 = %IF %BLISS(BLISS36) %THEN PUSHJ (REGISTER=S1) : LINKAGE_REGS(P,13,TF) ! GLOBAL(SPTR = S) NOPRESERVE(S1,S2) PRESERVE(T1,T2,T3,T4,P1,P2,P3,P4); %ELSE CALL; %FI ! ! Call arg in S1, and S2, return true/false in TF ! LINKAGE IS1S2 = %IF %BLISS(BLISS36) %THEN PUSHJ (REGISTER=S1, REGISTER=S2) : LINKAGE_REGS(P,13,TF) ! GLOBAL(SPTR = S) PRESERVE(T1,T2,T3,T4,P1,P2,P3,P4); %ELSE CALL; %FI ! ! Call with args in S1, S2, T1, return true/false in TF ! LINKAGE IS1T1 = %IF %BLISS(BLISS36) %THEN PUSHJ (REGISTER=S1, REGISTER=S2, REGISTER=T1) : LINKAGE_REGS (P, 13, TF) ! GLOBAL(SPTR=S) PRESERVE(T1,T2,T3,T4,P1,P2,P3,P4); %ELSE CALL; %FI ! ! Call arg in S1, returns value in S2 ! LINKAGE IS1RS2 = %IF %BLISS(BLISS36) %THEN PUSHJ (REGISTER=S1) : LINKAGE_REGS(P,13,S2) ! GLOBAL(SPTR = S) NOPRESERVE (TF) PRESERVE(T1,T2,T3,T4,P1,P2,P3,P4); %ELSE CALL; %FI %SBTTL 'External routine declarations' ! ! External routine names and declarations ! ! ! MLRNET routines ! ! Accept connection ! ! Usage: ! ! STATUS = NET_ACCEPT_CONNECTION (); ! ! Accepts connection from an active process. Returns true if connection ! accepted without error, false otherwise. ! %IF %BLISS(BLISS36) %THEN MACRO NET_ACCEPT_CONNECTION = %NAME('N$COND')%; %FI EXTERNAL ROUTINE NET_ACCEPT_CONNECTION : INONE; ! ! Initiate connection to remote node ! ! Usage: ! STATUS = NET_INITIATE_CONNECTION (NODE_NAME); ! ! Attempts to initiate an active connection to the node given by the ! ASCIZ string starting at NODE_NAME. Returns true if the connection ! is made, false otherwise. ! !%IF %BLISS(BLISS36) !%THEN !MACRO ! NET_INITIATE_CONNECTION = %NAME('N$CONS')%; !%FI !EXTERNAL ROUTINE ! NET_INITIATE_CONNECTION : IS1; ! ! Send string ! ! Usage: ! ! STATUS = NET_SEND_DATA (ADDRESS, LENGTH); ! ! Send the ASCII data which starts at ADDRESS and is LENGTH characters long ! out on the network connection. If the data is transmitted without error, ! return true, otherwise false. ! %IF %BLISS(BLISS36) %THEN MACRO NET_SEND_DATA = %NAME('N$SEND')%; %FI EXTERNAL ROUTINE NET_SEND_DATA : IS1S2; ! ! Receive data ! ! Usage: ! STATUS = NET_RECEIVE_DATA (BUFADDRESS, MAX_LENGTH, RESULT_LENGTH); ! ! Receive a buffer of data (normally one line), storing it into the buffer ! which starts at BUF_ADDRESS. MAX_LENGTH characters may be stored in the ! buffer. Return the number of characters stored in RESULT_LENGTH. If ! an error occurs, return false, else return true. ! %IF %BLISS(BLISS36) %THEN MACRO NET_RECEIVE_DATA = %NAME('N%RECV')%; %FI EXTERNAL ROUTINE NET_RECEIVE_DATA : IS1T1; ! ! Close the link ! ! Usage: ! STATUS = NET_CLOSE_LINK (); ! ! Close the current link. If an error occurs return false, otherwise return ! true. ! %IF %BLISS(BLISS36) %THEN MACRO NET_CLOSE_LINK = %NAME('N$CLOS')%; %FI EXTERNAL ROUTINE NET_CLOSE_LINK : INONE; ! ! MLRQUE routines ! ! ! Start received message ! ! Usage: ! STATUS = QUE_INITIALIZE_RECEIVE (); ! ! Initialize processing for creating a new message. If no error occurs, return ! true, otherwise return false and store error code in ERRCOD. ! %IF %BLISS(BLISS36) %THEN MACRO QUE_INITIALIZE_RECEIVE = %NAME('Q$RINI') %; %FI EXTERNAL ROUTINE QUE_INITIALIZE_RECEIVE : INONE; ! ! Routine to requeue a user because of a temporary failure in attempting to ! send mail to them. ! ! STATUS = QUE_REQUEUE_USER(User_name); ! %IF %BLISS(BLISS36) %THEN MACRO QUE_REQUEUE_USER = %NAME('Q$RINI') %; %FI EXTERNAL ROUTINE QUE_REQUEUE_USER : IS1T1; ! ! Insert an item into a message ! ! Usage: ! STATUS = QUE_INSERT_ENTITY (ITEM_TYPE, ITEM_LENGTH, ITEM_ADDRESS) ! ! Add an item to the current message. The type of the item is indicated ! by ITEM_TYPE (mailbox, from address, or message text). The length ! of the item is given by ITEM_LENGTH and the address by ITEM_ADDRESS. ! Return true if the item is added correctly, otherwise return false ! and an error code in ERRCOD. ! %IF %BLISS(BLISS36) %THEN MACRO QUE_INSERT_ENTITY = %NAME('Q%INSE') %; %FI EXTERNAL ROUTINE QUE_INSERT_ENTITY : IS1T1; ! ! Create request (after all data is inserted) ! ! Usage: ! ! STATUS = QUE_CREATE_REQUEST (); ! ! Create a request to forward the current message. Return true if ! request is created okay, false otherwise. ! %IF %BLISS(BLISS36) %THEN MACRO QUE_CREATE_REQUEST = %NAME('Q$RCRE') %; %FI EXTERNAL ROUTINE QUE_CREATE_REQUEST : INONE; ! ! Abort request ! ! Usage: ! STATUS = QUE_ABORT_REQUEST (); ! ! Abort the current message. Return true if request aborted, otherwise ! return false and an error code in ERRCOD (indicates an internal error). ! %IF %BLISS(BLISS36) %THEN MACRO QUE_ABORT_REQUEST = %NAME('Q$ABRT') %; %FI EXTERNAL ROUTINE QUE_ABORT_REQUEST : INONE; ! ! Routines for outgoing mail ! ! Setup next message ! ! Usage: ! STATUS = QUE_GET_NEXT_MESSAGE (NODE_NAME_LENGTH, NODE_NAME_ADDRESS); ! ! Sets up for the next message to be sent to the node given by ! NODE_NAME_ADDRESS and NODE_NAME_LENGTH. If there is a message to send, ! it returns true, otherwise it returns false with an error code in ERRCOD. ! %IF %BLISS(BLISS36) %THEN MACRO QUE_GET_NEXT_MESSAGE = %NAME('Q$RFET') %; %FI EXTERNAL ROUTINE QUE_GET_NEXT_MESSAGE : IS1S2; ! ! Get item from current message ! ! Usage: ! STATUS = QUE_GET_ITEM (ITEM_TYPE, RETURNED_LENGTH, RETURNED_ADDRESS); ! %IF %BLISS(BLISS36) %THEN MACRO QUE_GET_ENTITY = %NAME('Q%GETE') %; %FI EXTERNAL ROUTINE QUE_GET_ENTITY : IS1T1; ! ! Requeue a message ! ! Usage: ! STATUS = QUE_REQUEUE_MESSAGE (); ! ! Put the message (which could not be sent for some reason) at the end of ! the nodes list of messages. Return true if successful, false and an error ! code in ERRCOD otherwise (internal error). ! %IF %BLISS(BLISS36) %THEN MACRO QUE_REQUEUE_MESSAGE = %NAME('Q$REQC') %; %FI EXTERNAL ROUTINE QUE_REQUEUE_MESSAGE : INONE; ! ! Declare message sent ! ! Usage: ! STATUS = QUE_MESSAGE_SENT (); ! ! Declare that a message has been successfully passed off to another ! delivery agent and is no longer our responsibility. Returns true ! if successful, false and an error code otherwise (internal error). ! %IF %BLISS(BLISS36) %THEN MACRO QUE_MESSAGE_SENT = %NAME('Q$SENT') %; %FI EXTERNAL ROUTINE QUE_MESSAGE_SENT : INONE; ! ! File processing routines ! ! ! Create text file ! ! FIL_CREATE_MESSAGE (FDB_ADDRESS); ! ! Create a new text file to contain a message. Return the address of the !FDB in FDB_ADDRESS. If the file cannot be created, return false, otherwise !return true. ! %IF %BLISS(BLISS36) %THEN MACRO FIL_CREATE_MESSAGE = %NAME('F%MTFL') %; %FI EXTERNAL ROUTINE FIL_CREATE_MESSAGE : IS1; ! ! Append text to file ! ! FIL_APPEND_TEXT (BUFFER_ADDRESS, BUFFER_LENGTH) ! ! Append a buffer of text starting at BUFFER_ADDRESS, BUFFER_LENGTH characters !long, to the currently open text file. ! %IF %BLISS(BLISS36) %THEN MACRO FIL_APPEND_TEXT = %NAME('F%ATFL') %; %FI EXTERNAL ROUTINE FIL_APPEND_TEXT : IS1S2; ! ! Close text file ! ! FIL_CLOSE () ! ! Close the currently open text file (input or output) ! %IF %BLISS(BLISS36) %THEN MACRO FIL_CLOSE = %NAME('F$CTFL') %; %FI EXTERNAL ROUTINE FIL_CLOSE : INONE; ! ! Abort text file ! ! FIL_ABORT () ! ! Abort the currently open text file (input or output). If output, the file !being created should be aborted such that it will be deleted. ! %IF %BLISS(BLISS36) %THEN MACRO FIL_ABORT = %NAME('F$KTFL') %; %FI EXTERNAL ROUTINE FIL_ABORT : INONE; ! ! Initialize for reading a file ! ! FIL_OPEN_MESSAGE (FDB, FDB_LENGTH); ! ! Open the given message file for reading. %IF %BLISS(BLISS36) %THEN MACRO FIL_OPEN_MESSAGE = %NAME('F%xxxx') %; %FI EXTERNAL ROUTINE FIL_OPEN_MESSAGE : IS1S2; ! ! Read character from text file ! ! FIL_READ_CHARACTER (CHARACTER); ! ! %IF %BLISS(BLISS36) %THEN MACRO FIL_READ_CHARACTER = %NAME('F%yyyy') %; %FI EXTERNAL ROUTINE FIL_READ_CHARACTER : IS1T1; ! ! Text generation routines ! %IF %BLISS(BLISS36) %THEN MACRO BUILD_INITIAL_SMTP_RESPONSE = %NAME('T$IRSP') %; %FI EXTERNAL ROUTINE BUILD_INITIAL_SMTP_RESPONSE; ! ! Generate a response line ! %IF %BLISS(BLISS36) %THEN MACRO BUILD_RECEIVED_LINE = %NAME('T$RCVD') %; %FI EXTERNAL ROUTINE BUILD_RECEIVED_LINE; ! ! Message logging routines ! ! ! LOG_MESSAGE (MESSAGE_ADDRESS); ! %IF %BLISS(BLISS36) %THEN MACRO LOG_MESSAGE = %NAME('LOGMSG') %; %FI EXTERNAL ROUTINE LOG_MESSAGE : IS1S2; %SBTTL 'Info_message interface symbol definitions' ! ! Informational types we call call the info routines with ! GLOBAL LITERAL INFORMATIONAL_INFO = 0, ! General information error INFORMATIONAL_WARN = 1, ! Warning message INFORMATIONAL_ERROR = 2; ! Error message %SBTTL 'Message processing interface symbols' ! ! Item types (entities) ! GLOBAL LITERAL %NAME('$QEMBX') = 0, ! Destination mailbox name (recipient or forward path) %NAME('$QEMTF') = 1, ! Message text file %NAME('$QEMES') = 2, ! Message text (in memory) %NAME('$QEFRM') = 3; ! From address (reverse path) ! ! Define more usuable symbols for BLISS usage. ! LITERAL ITEM_RECIPIENT = %NAME('$QEMBX'), ! Recipient (forward path) ITEM_MESSAGE_FILE = %NAME('$QEMTF'), ! Message text file ITEM_MESSAGE_TEXT = %NAME('$QEMES'), ! Message text in memory ITEM_FROM_ADDRESS = %NAME('$QEFRM'); ! From address (reverse path) %SBTTL 'Standard declarations' ! ! The following macro is expanded at the top of each routine to declare ! all necessary Mailer-wide local items. ! MACRO STANDARD_MAILER_DECLARATIONS = %IF %BLISS(BLISS36) %THEN ! EXTERNAL REGISTER ! SPTR = S; %FI %;