... fixme - not done yet - very sketchy ...
... for now, see the sample behaviour file.


THE BEHAVIOUR EXPRESSION

Intro
-----

When the server receives a new request, it creates a new data structure
for the request called the 'job'. The job holds all information about
the request as it is processed by the server.

The server keeps two distinct lists of A/V pairs with each job: the
request list and the reply list. When a new request is received, the
request list is filled with all information present in the packet,
together with some extra things like a timestamp, the source IP address
and port the request was sent from, etc. 

The reply list is the list of attributes that will eventually be encoded
into a response to the client.

During processing, the behaviour expression may freely modify both
lists. All operators have a default list associated with each of the
operands, but you can also specify the lists to use explicitly. For
example, the default list for most of the attribute is the request list,
so that if you write 

	Service-Type == Login

the server compares the value of the last instance of the Service-Type
attribute on the *request* list to the constant value called 'Login'. But
if you write

	Framed-Protocol = PPP

the server adds a Framed-Protocol attribute at the bottom of the *reply*
list, and gives it the value for PPP.

Generally speaking, when an operator 'reads' from an attribute, it looks
at the request list, and when it 'writes' to it, it looks at the reply
list by default.

You can always override the default list; if you write this: 

	REP:Service-Type == Login

the server uses the value of the last instance of Service-Type on
the reply list instead of the request list. Similarly, if you'd write

	REQ:User-Name := User-Name beforelast "@"

The server replaces the value of the last instance of the User-Name
attribute on the *request* list with the contents of that same attribute
before the last "@" character in the attribute, converting eg.  
jsmith@example.com to jsmith.


