/** Print a map to a string * * @param[out] buffer for the output string * @param[in] bufsize of the buffer * @param[in] map to print * @return the size of the string printed */ size_t radius_map2str(char *buffer, size_t bufsize, value_pair_map_t const *map) { size_t len; char *p = buffer; char *end = buffer + bufsize; len = radius_tmpl2str(buffer, bufsize, map->dst); p += len; *(p++) = ' '; strlcpy(p, fr_token_name(map->op), end - p); p += strlen(p); *(p++) = ' '; /* * The RHS doesn't matter for many operators */ if ((map->op == T_OP_CMP_TRUE) || (map->op == T_OP_CMP_FALSE)) { strlcpy(p, "ANY", (end - p)); p += strlen(p); return p - buffer; } rad_assert(map->src != NULL); len = radius_tmpl2str(p, end - p, map->src); p += len; return p - buffer; }
/** Print a map to a string * * @param[out] buffer for the output string * @param[in] bufsize of the buffer * @param[in] map to print * @return the size of the string printed */ size_t radius_map2str(char *buffer, size_t bufsize, value_pair_map_t const *map) { size_t len; char *p = buffer; char *end = buffer + bufsize; len = radius_tmpl2str(buffer, bufsize, map->dst); p += len; *(p++) = ' '; strlcpy(p, fr_token_name(map->op), end - p); p += strlen(p); *(p++) = ' '; /* * The RHS doesn't matter for many operators */ if ((map->op == T_OP_CMP_TRUE) || (map->op == T_OP_CMP_FALSE)) { strlcpy(p, "ANY", (end - p)); p += strlen(p); return p - buffer; } rad_assert(map->src != NULL); if ((map->dst->type == VPT_TYPE_ATTR) && (map->dst->da->type == PW_TYPE_STRING) && (map->src->type == VPT_TYPE_LITERAL)) { *(p++) = '\''; len = radius_tmpl2str(p, end - p, map->src); p += len; *(p++) = '\''; *p = '\0'; } else { len = radius_tmpl2str(p, end - p, map->src); p += len; } return p - buffer; }
/** Convert module specific attribute id to value_pair_tmpl_t. * * @param[in] ctx for talloc * @param[in] name string to convert. * @param[in] type Type of quoting around value. * @param[in] request_def The default request to insert unqualified * attributes into. * @param[in] list_def The default list to insert unqualified attributes into. * @return pointer to new VPT. */ value_pair_tmpl_t *radius_str2tmpl(TALLOC_CTX *ctx, char const *name, FR_TOKEN type, request_refs_t request_def, pair_lists_t list_def) { int rcode; char const *p; value_pair_tmpl_t *vpt; char buffer[1024]; vpt = talloc_zero(ctx, value_pair_tmpl_t); vpt->name = talloc_typed_strdup(vpt, name); switch (type) { case T_BARE_WORD: /* * If we can parse it as an attribute, it's an attribute. * Otherwise, treat it as a literal. */ rcode = radius_parse_attr(vpt, vpt->name, request_def, list_def); if (rcode == -2) { talloc_free(vpt); return NULL; } if (rcode == 0) { break; } /* FALL-THROUGH */ case T_SINGLE_QUOTED_STRING: vpt->type = VPT_TYPE_LITERAL; break; case T_DOUBLE_QUOTED_STRING: p = name; while (*p) { if (*p == '\\') { if (!p[1]) break; p += 2; continue; } if (*p == '%') break; p++; } /* * If the double quoted string needs to be * expanded at run time, make it an xlat * expansion. Otherwise, convert it to be a * literal. */ if (*p) { vpt->type = VPT_TYPE_XLAT; } else { vpt->type = VPT_TYPE_LITERAL; } break; case T_BACK_QUOTED_STRING: vpt->type = VPT_TYPE_EXEC; break; case T_OP_REG_EQ: /* hack */ vpt->type = VPT_TYPE_REGEX; break; default: rad_assert(0); return NULL; } radius_tmpl2str(buffer, sizeof(buffer), vpt); return vpt; }