]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add cf_pair_replace_or_add()
authorAlan T. DeKok <aland@freeradius.org>
Mon, 20 Apr 2026 17:27:12 +0000 (13:27 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Mon, 20 Apr 2026 17:27:57 +0000 (13:27 -0400)
in preparation for '-S foo.bar=baz'

src/lib/server/cf_util.c
src/lib/server/cf_util.h

index b8eac4fdb4de2685f32813fde8d2682332039422..e19702aa6d5b655f97f42b42da123ede2c9a64af 100644 (file)
@@ -2424,3 +2424,55 @@ void _cf_canonicalize_error(CONF_ITEM *ci, ssize_t slen, char const *msg, char c
        talloc_free(spaces);
        talloc_free(text);
 }
+
+/*
+ *     Create or find a CONF_PAIR, including parents.
+ *
+ *     This is only used by the command-line argument '-S foo.bar=baz'
+ *
+ *     This function mangles "name" in place.
+ */
+int cf_pair_replace_or_add(CONF_SECTION *cs, char *ref, char const *value)
+{
+       char *name2;
+       CONF_PAIR *cp;
+
+       while (*ref) {
+               char *p;
+               CONF_SECTION *subcs;
+
+               p = strchr(ref, '.');
+               if (!p) break;
+
+               *(p++) = '\0';
+               if (*p == '[') {
+                       name2 = p + 1;
+                       p = strchr(name2, ']'); /* doesn't support nesting, too bad */
+                       if (!p) {
+                               fr_strerror_printf("Missing ']' after %s", name2);
+                               return -1;
+                       }
+                       *(p++) = '\0';
+
+               } else {
+                       name2 = NULL;
+               }
+
+               subcs = cf_section_find(cs, ref, name2);
+               if (!subcs) {
+                       subcs = cf_section_alloc(cs, cs, ref, name2);
+                       if (!subcs) return -1;
+               }
+
+               cs = subcs;
+               ref = p;
+       }
+
+       cp = cf_pair_find(cs, ref);
+       if (cp) return cf_pair_replace(cs, cp, value);
+
+       cp = cf_pair_alloc(cs, ref, value, T_OP_EQ, T_BARE_WORD, T_BARE_WORD);
+       if (!cp) return -1;
+
+       return 0;
+}
index 405438ee1fbbfa2d25d8a8e178c13ba6f63006b3..87d8192ea080319afc65aee5d3706bda9acba1a0 100644 (file)
@@ -218,6 +218,8 @@ CONF_PAIR   *cf_pair_find_next(CONF_SECTION const *cs, CONF_PAIR const *prev, char
 
 CONF_PAIR      *cf_pair_find_in_parent(CONF_SECTION const *cs, char const *attr);
 
+int            cf_pair_replace_or_add(CONF_SECTION *cs, char *ref, char const *value) CC_HINT(nonnull);
+
 unsigned int   cf_pair_count_descendents(CONF_SECTION const *cs);
 
 unsigned int   cf_pair_count(CONF_SECTION const *cs, char const *attr);