This is just a small hack i needed some time ago. The programm reads an
ascii scriptfile where a messageport name and the structure of the
incomming messages is given, and monitors the port. If a message arrives,
it's dumped to the specified output using the defined structure.
To exit press CTRL-C use the break command.
Example scriptfile:
; Cmd Offset Text
; --------------------------------------------------------------------
OUTPUT "CON:0/100/640/156/PortSnoop/auto/smart/close"
PORT "REXX"
TEXT $0c,"Monitoring 'REXX' port",$0a
MPTR "Message ($%06lx)",$0a
TEXT $0a
BYTE=$08 "LN_TYPE $%02lx",$0a
BYTE=$09 "LN_PRI $%02lx",$0a
ASTR=$0a "LN_NAME $%08lx ('%s')",$0a
APTR=$0e "MN_REPLYPORT $%08lx",$0a
APTR=$0e.ASTR=$0a " LN_NAME $%08lx ('%s')",$0a
WORD=$12 "MN_LENGTH $%04lx",$0a
TEXT $0a
LONG=$1c "rm_Action $%08lx",$0a
LONG=$20 "rm_Result1 $%08lx",$0a
LONG=$24 "rm_Result2 $%08lx",$0a
ASTR=$28 "rm_Args,16*4 $%08lx ('%s')",$0a
APTR=$68 "rm_PassPort $%08lx",$0a
APTR=$68.ASTR=$0a " LN_NAME $%08lx ('%s')",$0a
END
; --------------------------------------------------------------------
Any field of the message can be displayed. It's even possible, to
reference values. That means that the value, which is contained at offset,
is taken as a new structure address.
Example:
APTR=$0e "MN_REPLYPORT $%08lx",$0a
-> the address of the replyport is printed.
APTR=$0e.ASTR=$0a " LN_NAME $%08lx ('%s')",$0a
1 2
-> the address of the reply-port (1) contained at offset $0e of the
message is taken as a pointer to a new structure (in this case
the node structure of the message replyport). The pointer at
offset $0a (2) of the new (actual) structure is taken again as
pointer to another structure (in this case the LN_NAME field).
Finally the name of the replyport (LN_NAME), which is pointed to
at offset $0a (2), is printed together with the address of the
last (the node) structure.
Syntax of the script file:
each line consists of COMMAND [OFFSET] ['TEXT' | "TEXT" | $xx]
where
COMMAND see syntax below
OFFSET a hexadecimal offset into the message, wich is given
with an equal sign
example: $09 to access the LN_PRI field of a node
TEXT surrounded by either single- or doublequote. Also
single chars given in hexadecimal can be printed
(including PrintF()-style formatting).
example: $09,"LN_PRI = %02lx",$0a
note1: add a carrige-return (= $0a) to each line!
note2: always specify long size in PrintF()-style
Syntax of the commands:
Command Argument Description
----------------------------------------------------------------------
; comment introducer
OUTPUT <filename> specifies the output
e.g. OUTPUT "CON:0/0/640/256/Snoop"
or OUTPUT "RAM:output.txt"
PORT [text | $address] the name or the address
e.g. PORT "REXX" of the port to monitor
or PORT $BADC0DE
TEXT <text> displays given text
e.g. TEXT $0c,"Hello!",$0a
MPTR <textfmt> (1) insert the adress of
e.g. MPTR "Adr of Msg = %lx",$0a the message
BYTE <offset textfmt> (1) reads the value which
e.g. BYTE=$09 "LN_PRI=%02lx",$0a is stored at offset as
byte.
WORD see BYTE, only as word
LONG see BYTE, only as long
APTR see LONG
BPTR see LONG, shown as value*4
ASTR <offset textfmt> (2) reads the value and
e.g. ASTR=$0a $0c,"LN_NAME %s",$0a displays the text, which
is pointed to
BSTR see ASTR, only value*4
END signals the end of the
script. (important!)
----------------------------------------------------------------------
<textfmt> means PrintF() style format parameters.
(1) Has only one format parameter: "%lx"
(2) Has two format parameters: "%s" and "%lx"
|