New feature in v3: cast!

Brian Candler B.Candler at pobox.com
Sun May 12 20:02:14 CEST 2013


On Sun, May 12, 2013 at 08:40:14AM -0400, Alan DeKok wrote:
> > 1. Why is <ipaddr> necessary before the literal? Surely an unquoted
> > 127.0.0.1 can't be parsed as anything else.
> 
>   See my other example for why it's necessary.
> 
>   In *some* cases, you know the data type of an expression.  In those
> cases, you can easily do type-specific comparisons.  That's what unlang
> does today:
> 
> 	if (Framed-IP-Address == 127.0.0.1) {
> 
>   The type is "ipaddr", because of Framed-IP-Address.  The RHS is in
> fact parsed into a second Framed-IP-Address attribute, and the two are
> compared.

So if I understand you rightly, you're saying that the unlang expressions

   Framed-IP-Address == 127.0.0.1

and

   Framed-IP-Address == "127.0.0.1"

are treated identically - it's the type of the LHS which makes a difference,
and no distinction is made between an IP literal and a string literal. Is
that correct?

Is there a fundamental reason why literal values can't have types?

The canonical example would be the difference between 1 and "1". Say:

    if (Acct-Session-Time < 100)

But presumably

    if (Acct-Session-Time < "100")

is handled the same today (i.e. the "100" is converted to an integer because
of the LHS type).

>   However... you can't currently do a type-safe comparison like:
> 
> 	if (127.0.0.1 < 127.0.0.2) {
> 
>   The interpretor does *string* comparisons.  Which is wrong for IP
> addresses.

... which again implies this is parsed exactly the same as

    if ("127.0.0.1" < "127.0.0.2")

But there must be something else going on, because on the LHS at least,
Framed-IP-Address is not parsed the same as "Framed-IP-Address"

> > 2. What does the & in front of Framed-IP-Address do?
> 
> $ man unlang  :)
> 
>   It's a reference.
> 
> 	if (&User-Name == &Filter-Id) {
> 
>   Does type-safe comparisons on the *values* of the two attributes.

That's pretty different to most languages though, were A == B compares the
values of A and B, and & gives you a reference to the variable; you want to
compare the values, not the references.

Having said that, I seem to remember that C++ does magic dereferencing,
converting references to values where required.  But the main purpose of
taking a reference is to allow a variable to be assigned to at a distance.

> The
> v2 unlang code would require you to do:
> 
> 	if (User-Name == "%{Filter-Id}") {

Ah yes, because of things like Acct-Status-Type == Start, where the RHS has
to be considered as an enumerated value rather than another attribute.

Regards,

Brian.


More information about the Freeradius-Devel mailing list