Record type of LHS of cf pairs too
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 1 Jan 2015 16:30:14 +0000 (11:30 -0500)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 1 Jan 2015 18:07:14 +0000 (13:07 -0500)
src/include/conffile.h
src/main/client.c
src/main/conffile.c
src/main/realms.c
src/modules/rlm_couchbase/mod.c
src/modules/rlm_ldap/clients.c
src/modules/rlm_ldap/rlm_ldap.c

index 21e5059..f59e747 100644 (file)
@@ -154,7 +154,7 @@ typedef struct CONF_PARSER {
 } CONF_PARSER;
 
 CONF_PAIR      *cf_pair_alloc(CONF_SECTION *parent, char const *attr, char const *value,
-                              FR_TOKEN op, FR_TOKEN value_type);
+                              FR_TOKEN op, FR_TOKEN lhs_type, FR_TOKEN rhs_type);
 CONF_PAIR      *cf_pair_dup(CONF_SECTION *parent, CONF_PAIR *cp);
 void           cf_pair_add(CONF_SECTION *parent, CONF_PAIR *cp);
 
@@ -188,6 +188,7 @@ void *cf_data_remove(CONF_SECTION *cs, char const *name);
 char const *cf_pair_attr(CONF_PAIR const *pair);
 char const *cf_pair_value(CONF_PAIR const *pair);
 FR_TOKEN cf_pair_operator(CONF_PAIR const *pair);
+FR_TOKEN cf_pair_attr_type(CONF_PAIR const *pair);
 FR_TOKEN cf_pair_value_type(CONF_PAIR const *pair);
 VALUE_PAIR *cf_pairtovp(CONF_PAIR *pair);
 char const *cf_section_name1(CONF_SECTION const *cs);
index 7bacfc9..e4981e2 100644 (file)
@@ -1245,7 +1245,7 @@ RADCLIENT *client_afrom_request(RADCLIENT_LIST *clients, REQUEST *request)
 
                        RDEBUG2("%s = '%s'", vp->da->name, value);
 
-                       cp = cf_pair_alloc(c->cs, vp->da->name, value, T_OP_SET, T_SINGLE_QUOTED_STRING);
+                       cp = cf_pair_alloc(c->cs, vp->da->name, value, T_OP_SET, T_BARE_WORD, T_SINGLE_QUOTED_STRING);
                        ci = cf_pair_to_item(cp);
                        cf_item_add(c->cs, ci);
 
index 0bca100..4fc28ea 100644 (file)
@@ -78,7 +78,8 @@ struct conf_pair {
        char const *attr;               //!< Attribute name
        char const *value;              //!< Attribute value
        FR_TOKEN op;                    //!< Operator e.g. =, :=
-       FR_TOKEN value_type;            //!< Quoting style T_(DOUBLE|SINGLE|BACK)_QUOTE_STRING or T_BARE_WORD.
+       FR_TOKEN lhs_type;              //!< Name quoting style T_(DOUBLE|SINGLE|BACK)_QUOTE_STRING or T_BARE_WORD.
+       FR_TOKEN rhs_type;              //!< Value Quoting style T_(DOUBLE|SINGLE|BACK)_QUOTE_STRING or T_BARE_WORD.
 };
 
 /** Internal data that is associated with a configuration section
@@ -299,14 +300,16 @@ static int _cf_section_free(CONF_SECTION *cs)
  * @param attr name.
  * @param value of CONF_PAIR.
  * @param op T_OP_EQ, T_OP_SET etc.
- * @param value_type T_BARE_WORD, T_DOUBLE_QUOTED_STRING, T_BACK_QUOTED_STRING
+ * @param lhs_type T_BARE_WORD, T_DOUBLE_QUOTED_STRING, T_BACK_QUOTED_STRING
+ * @param rhs_type T_BARE_WORD, T_DOUBLE_QUOTED_STRING, T_BACK_QUOTED_STRING
  * @return NULL on error, else a new CONF_SECTION parented by parent.
  */
 CONF_PAIR *cf_pair_alloc(CONF_SECTION *parent, char const *attr, char const *value,
-                        FR_TOKEN op, FR_TOKEN value_type)
+                        FR_TOKEN op, FR_TOKEN lhs_type, FR_TOKEN rhs_type)
 {
        CONF_PAIR *cp;
 
+       rad_assert(fr_equality_op[op] || fr_assignment_op[op]);
        if (!attr) return NULL;
 
        cp = talloc_zero(parent, CONF_PAIR);
@@ -314,7 +317,8 @@ CONF_PAIR *cf_pair_alloc(CONF_SECTION *parent, char const *attr, char const *val
 
        cp->item.type = CONF_ITEM_PAIR;
        cp->item.parent = parent;
-       cp->value_type = value_type;
+       cp->lhs_type = lhs_type;
+       cp->rhs_type = rhs_type;
        cp->op = op;
 
        cp->attr = talloc_typed_strdup(cp, attr);
@@ -345,7 +349,8 @@ CONF_PAIR *cf_pair_dup(CONF_SECTION *parent, CONF_PAIR *cp)
        rad_assert(parent);
        rad_assert(cp);
 
-       new = cf_pair_alloc(parent, cf_pair_attr(cp), cf_pair_value(cp), cf_pair_operator(cp), cf_pair_value_type(cp));
+       new = cf_pair_alloc(parent, cp->attr, cf_pair_value(cp),
+                           cp->op, cp->lhs_type, cp->rhs_type);
        if (new) {
                new->item.lineno = cp->item.lineno;
                new->item.filename = talloc_strdup(new, cp->item.filename);
@@ -507,7 +512,7 @@ int cf_pair_replace(CONF_SECTION *cs, CONF_PAIR *cp, char const *value)
        CONF_PAIR *newp;
        CONF_ITEM *ci, *cn, **last;
 
-       newp = cf_pair_alloc(cs, cp->attr, value, cp->op, cp->value_type);
+       newp = cf_pair_alloc(cs, cp->attr, value, cp->op, cp->lhs_type, cp->rhs_type);
        if (!newp) return -1;
 
        ci = &(cp->item);
@@ -1349,7 +1354,7 @@ int cf_item_parse(CONF_SECTION *cs, char const *name, int type, void *data, char
        if (!cp) {
                CONF_PAIR *cpn;
 
-               cpn = cf_pair_alloc(cs, name, value, T_OP_SET, T_BARE_WORD);
+               cpn = cf_pair_alloc(cs, name, value, T_OP_SET, T_BARE_WORD, T_BARE_WORD);
                if (!cpn) return -1;
                cpn->item.filename = "<internal>";
                cpn->item.lineno = 0;
@@ -1545,8 +1550,8 @@ int cf_section_parse_pass2(CONF_SECTION *cs, void *base, CONF_PARSER const *vari
        redo:
                if (!cp || !cp->value) continue;
 
-               if ((cp->value_type != T_DOUBLE_QUOTED_STRING) &&
-                   (cp->value_type != T_BARE_WORD)) continue;
+               if ((cp->rhs_type != T_DOUBLE_QUOTED_STRING) &&
+                   (cp->rhs_type != T_BARE_WORD)) continue;
 
                value = talloc_strdup(cs, cp->value); /* modified by xlat_tokenize */
                xlat = NULL;
@@ -1615,7 +1620,7 @@ static bool cf_template_merge(CONF_SECTION *cs, CONF_SECTION const *template)
                         *      Create a new pair with all of the data
                         *      of the old one.
                         */
-                       cp2 = cf_pair_alloc(cs, cp1->attr, cp1->value, cp1->op, cp1->value_type);
+                       cp2 = cf_pair_dup(cs, cp1);
                        if (!cp2) return false;
 
                        cp2->item.filename = cp1->item.filename;
@@ -1707,7 +1712,7 @@ static int cf_section_read(char const *filename, int *lineno, FILE *fp,
        char buf2[8192];
        char buf3[8192];
        char buf4[8192];
-       FR_TOKEN t1, t2, t3;
+       FR_TOKEN t1 = T_INVALID, t2, t3;
        bool has_spaces = false;
        char *cbuf = buf;
        size_t len;
@@ -2281,7 +2286,7 @@ static int cf_section_read(char const *filename, int *lineno, FILE *fp,
                         *      Add this CONF_PAIR to our CONF_SECTION
                         */
                do_set:
-                       cpn = cf_pair_alloc(this, buf1, value, t2, t3);
+                       cpn = cf_pair_alloc(this, buf1, value, t2, t1, t3);
                        if (!cpn) return -1;
                        cpn->item.filename = talloc_strdup(cpn, filename);
                        cpn->item.lineno = *lineno;
@@ -2502,7 +2507,7 @@ CONF_SECTION *cf_file_read(char const *filename)
        cs = cf_section_alloc(NULL, "main", NULL);
        if (!cs) return NULL;
 
-       cp = cf_pair_alloc(cs, "confdir", filename, T_OP_SET, T_BARE_WORD);
+       cp = cf_pair_alloc(cs, "confdir", filename, T_OP_SET, T_BARE_WORD, T_SINGLE_QUOTED_STRING);
        if (!cp) return NULL;
 
        p = strrchr(cp->value, FR_DIR_SEP);
@@ -2568,14 +2573,26 @@ FR_TOKEN cf_pair_operator(CONF_PAIR const *pair)
        return (pair ? pair->op : T_INVALID);
 }
 
-/*
- * Return the value type, should be one of the following:
- * T_BARE_WORD, T_SINGLE_QUOTED_STRING, T_BACK_QUOTED_STRING
- * T_DOUBLE_QUOTED_STRING or T_INVALID if the pair is NULL.
+/** Return the value (lhs) type
+ *
+ * @param pair to extract value type from.
+ * @return one of T_BARE_WORD, T_SINGLE_QUOTED_STRING, T_BACK_QUOTED_STRING
+ *     T_DOUBLE_QUOTED_STRING or T_INVALID if the pair is NULL.
+ */
+FR_TOKEN cf_pair_attr_type(CONF_PAIR const *pair)
+{
+       return (pair ? pair->lhs_type : T_INVALID);
+}
+
+/** Return the value (rhs) type
+ *
+ * @param pair to extract value type from.
+ * @return one of T_BARE_WORD, T_SINGLE_QUOTED_STRING, T_BACK_QUOTED_STRING
+ *     T_DOUBLE_QUOTED_STRING or T_INVALID if the pair is NULL.
  */
 FR_TOKEN cf_pair_value_type(CONF_PAIR const *pair)
 {
-       return (pair ? pair->value_type : T_INVALID);
+       return (pair ? pair->rhs_type : T_INVALID);
 }
 
 /*
@@ -2599,8 +2616,8 @@ VALUE_PAIR *cf_pairtovp(CONF_PAIR *pair)
         *      or `string`, then remember to expand it later.
         */
        if ((pair->op != T_OP_CMP_FALSE) &&
-           ((pair->value_type == T_DOUBLE_QUOTED_STRING) ||
-            (pair->value_type == T_BACK_QUOTED_STRING))) {
+           ((pair->rhs_type == T_DOUBLE_QUOTED_STRING) ||
+            (pair->rhs_type == T_BACK_QUOTED_STRING))) {
                VALUE_PAIR *vp;
 
                vp = pairmake(pair, NULL, pair->attr, NULL, pair->op);
index 50476f1..75da48b 100644 (file)
@@ -899,7 +899,7 @@ CONF_SECTION *home_server_cs_afrom_client(CONF_SECTION *client)
        }
 
        if (!cs || !(cp = cf_pair_find(cs, "type"))) {
-               cp = cf_pair_alloc(server, "type", "coa", T_OP_EQ, T_SINGLE_QUOTED_STRING);
+               cp = cf_pair_alloc(server, "type", "coa", T_OP_EQ, T_BARE_WORD, T_SINGLE_QUOTED_STRING);
                if (cp) cf_pair_add(server, cf_pair_dup(server, cp));
        } else if (strcmp(cf_pair_value(cp), "coa") != 0) {
                talloc_free(server);
index ff10d1f..942419f 100644 (file)
@@ -568,7 +568,8 @@ int mod_client_map_section(CONF_SECTION *client, CONF_SECTION const *map,
                }
 
                /* allocate config pair */
-               cp = cf_pair_alloc(client, attribute, json_object_get_string(jval), T_OP_SET, T_SINGLE_QUOTED_STRING);
+               cp = cf_pair_alloc(client, attribute, json_object_get_string(jval),
+                                  T_OP_SET, T_BARE_WORD, T_SINGLE_QUOTED_STRING);
 
                /* check pair */
                if (!cp) {
index e48b974..3f50a75 100644 (file)
@@ -112,7 +112,7 @@ static int rlm_ldap_client_map_section(ldap_instance_t const *inst, CONF_SECTION
                if (!values) continue;
 
                value = rlm_ldap_berval_to_string(NULL, values[0]);
-               cp = cf_pair_alloc(client, attr, value, T_OP_SET, T_SINGLE_QUOTED_STRING);
+               cp = cf_pair_alloc(client, attr, value, T_OP_SET, T_BARE_WORD, T_SINGLE_QUOTED_STRING);
                if (!cp) {
                        LDAP_ERR("Failed allocing pair \"%s\" = \"%s\"", attr, value);
                        talloc_free(value);
index 7e4d65a..0127a25 100644 (file)
@@ -681,7 +681,7 @@ static int mod_instantiate(CONF_SECTION *conf, void *instance)
                                /*
                                 *      For subsequent instances we need to add new conf pairs.
                                 */
-                               cp = cf_pair_alloc(conf, "server", buff, T_OP_EQ, T_SINGLE_QUOTED_STRING);
+                               cp = cf_pair_alloc(conf, "server", buff, T_OP_EQ, T_BARE_WORD, T_SINGLE_QUOTED_STRING);
                                if (!cp) return -1;
 
                                ci = cf_pair_to_item(cp);