New feature in v3: cast!

Alan DeKok aland at deployingradius.com
Sun May 12 22:49:03 CEST 2013


Brian Candler wrote:
> 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?

  Yes.

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

  Until a month ago, the conditions were parsed *every time* they were
evaluated.  Now, they're parsed once, and a data structure is stored.

  So... it becomes possible to do type-specific checks.  i.e.

	Framed-IP-Address == "127.0.0.1"

  is wrong.  Unless the right-side is something like "%{sql: ...}"

> 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).

  Yes.

> ... which again implies this is parsed exactly the same as
> 
>     if ("127.0.0.1" < "127.0.0.2")

  Right now, yes.

> 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"

  Well, the parser isn't *completely* idiotic.  Just *mostly* idiotic.

> 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.

  I'm open to a better alternative...

  It's hard to come up with *new* syntax, because I'm wary of breaking
existing systems.  i.e.

	Framed-Pool == bar

  is allowed today.  But "bar" isn't the correct name for an attribute.
 How do we disambiguate the two possibilities?

> 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.

  Which isn't possible in unlang.  So.. the "&" is syntactic sugar for
"the contents of the attribute", and not "a reference to an attribute"

>> 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.

  Yes.

  Alan DeKok.


More information about the Freeradius-Devel mailing list