/* * Read one line of attribute/value pairs. This might contain * multiple pairs seperated by comma's. */ FR_TOKEN userparse(const char *buffer, VALUE_PAIR **first_pair) { VALUE_PAIR *vp; const char *p; FR_TOKEN last_token = T_OP_INVALID; FR_TOKEN previous_token; /* * We allow an empty line. */ if (buffer[0] == 0) return T_EOL; p = buffer; do { previous_token = last_token; if ((vp = pairread(&p, &last_token)) == NULL) { return last_token; } pairadd(first_pair, vp); } while (*p && (last_token == T_COMMA)); /* * Don't tell the caller that there was a comment. */ if (last_token == T_HASH) { return previous_token; } /* * And return the last token which we read. */ return last_token; }
/** Convert a valuepair string to valuepair map * * Takes a valuepair string with list and request qualifiers, converts it into a * value_pair_map_t and inserts it into the appropriate list. * * @param out Where to write the new map (must be freed with talloc_free()). * @param request Current request. * @param raw string to parse. * @param dst_request_def to use if attribute isn't qualified. * @param dst_list_def to use if attribute isn't qualified. * @param src_request_def to use if attribute isn't qualified. * @param src_list_def to use if attribute isn't qualified. * @return 0 on success, < 0 on error. */ int radius_strpair2map(value_pair_map_t **out, REQUEST *request, char const *raw, request_refs_t dst_request_def, pair_lists_t dst_list_def, request_refs_t src_request_def, pair_lists_t src_list_def) { char const *p = raw; FR_TOKEN ret; VALUE_PAIR_RAW tokens; value_pair_map_t *map; ret = pairread(&p, &tokens); if (ret != T_EOL) { REDEBUG("Failed tokenising attribute string: %s", fr_strerror()); return -1; } map = radius_str2map(request, tokens.l_opand, T_BARE_WORD, tokens.op, tokens.r_opand, tokens.quote, dst_request_def, dst_list_def, src_request_def, src_list_def); if (!map) { REDEBUG("Failed parsing attribute string: %s", fr_strerror()); return -1; } *out = map; return 0; }
/* * Read one line of attribute/value pairs. This might contain * multiple pairs seperated by comma's. */ FR_TOKEN userparse(const char *buffer, VALUE_PAIR **first_pair) { VALUE_PAIR *vp, *head, **tail; const char *p; FR_TOKEN last_token = T_OP_INVALID; FR_TOKEN previous_token; /* * We allow an empty line. */ if (buffer[0] == 0) return T_EOL; head = NULL; tail = &head; p = buffer; do { previous_token = last_token; if ((vp = pairread(&p, &last_token)) == NULL) { break; } *tail = vp; tail = &((*tail)->next); } while (*p && (last_token == T_COMMA)); /* * Don't tell the caller that there was a comment. */ if (last_token == T_HASH) { last_token = previous_token; } if (last_token == T_OP_INVALID) { pairfree(&head); } else { pairadd(first_pair, head); } /* * And return the last token which we read. */ return last_token; }