| '-' '-' EMPTY '-' '-' { $$ = f_new_inst(FI_CONSTANT, val_empty(T_ECLIST)); }
| '-' '-' '-' EMPTY '-' '-' '-' { $$ = f_new_inst(FI_CONSTANT, val_empty(T_LCLIST)); }
-| PREPEND '(' term ',' term ')' { $$ = f_dispatch_method_x("prepend", $3->type, $3, $5); }
+ | PREPEND '(' term ',' term ')' { $$ = f_dispatch_method_x("prepend", $3->type, $3, $5); }
| ADD '(' term ',' term ')' { $$ = f_dispatch_method_x("add", $3->type, $3, $5); }
| DELETE '(' term ',' term ')' { $$ = f_dispatch_method_x("delete", $3->type, $3, $5); }
| FILTER '(' term ',' term ')' { $$ = f_dispatch_method_x("filter", $3->type, $3, $5); }
case EAF_TYPE_LC_SET:
RESULT_(T_LCLIST, ad, e->u.ptr);
break;
+ case EAF_TYPE_STRING:
+ RESULT_(T_STRING, s, (const char *) e->u.ptr->data);
+ break;
default:
bug("Unknown dynamic attribute type");
}
l->attrs[0].u.ptr = v1.val.ad;
break;
+ case EAF_TYPE_STRING:;
+ struct adata *d = lp_alloc_adata(fs->pool, strlen(v1.val.s) + 1);
+ memcpy(d->data, v1.val.s, d->length);
+ l->attrs[0].u.ptr = d;
+ break;
+
case EAF_TYPE_BITFIELD:
{
/* First, we have to find the old value */
case T_LCLIST:
ea_type = EAF_TYPE_LC_SET;
break;
+ case T_STRING:
+ ea_type = EAF_TYPE_STRING;
+ break;
case T_BYTESTRING:
ea_type = EAF_TYPE_OPAQUE;
break;
#define EAF_TYPE_INT_SET 0x0a /* Set of u32's (e.g., a community list) */
#define EAF_TYPE_EC_SET 0x0e /* Set of pairs of u32's - ext. community list */
#define EAF_TYPE_LC_SET 0x12 /* Set of triplets of u32's - large community list */
-#define EAF_TYPE_IFACE 0x16 /* Interface pointer stored in adata */
+#define EAF_TYPE_IFACE 0x14 /* Interface pointer stored in adata */
+#define EAF_TYPE_STRING 0x16 /* Text string */
#define EAF_EMBEDDED 0x01 /* Data stored in eattr.u.data (part of type spec) */
#define EAF_VAR_LENGTH 0x02 /* Attribute length is variable (part of type spec) */
case EAF_TYPE_LC_SET:
ea_show_lc_set(c, ad, pos, buf, end);
return;
+ case EAF_TYPE_STRING:
+ bsnprintf(pos, end - pos, "%s", (const char *) ad->data);
+ break;
default:
bsprintf(pos, "<type %02x>", e->type);
}