| 2899 | } |
| 2900 | |
| 2901 | xmlNode* |
| 2902 | get_xpath_object(const char *xpath, xmlNode *xml_obj, int error_level) |
| 2903 | { |
| 2904 | xmlNode *result = NULL; |
| 2905 | xmlXPathObjectPtr xpathObj = NULL; |
| 2906 | char *nodePath = NULL; |
| 2907 | char *matchNodePath = NULL; |
| 2908 | |
| 2909 | if(xpath == NULL) { |
| 2910 | return xml_obj; /* or return NULL? */ |
| 2911 | } |
| 2912 | |
| 2913 | xpathObj = xpath_search(xml_obj, xpath); |
| 2914 | nodePath = (char *)xmlGetNodePath(xml_obj); |
| 2915 | if(xpathObj == NULL || xpathObj->nodesetval == NULL || xpathObj->nodesetval->nodeNr < 1) { |
| 2916 | do_crm_log(error_level, "No match for %s in %s", xpath, crm_str(nodePath)); |
| 2917 | crm_log_xml_trace(xml_obj, "Unexpected Input"); |
| 2918 | |
| 2919 | } else if(xpathObj->nodesetval->nodeNr > 1) { |
| 2920 | int lpc = 0, max = xpathObj->nodesetval->nodeNr; |
| 2921 | do_crm_log(error_level, "Too many matches for %s in %s", xpath, crm_str(nodePath)); |
| 2922 | |
| 2923 | for(lpc = 0; lpc < max; lpc++) { |
| 2924 | xmlNode *match = getXpathResult(xpathObj, lpc); |
| 2925 | CRM_CHECK(match != NULL, continue); |
| 2926 | |
| 2927 | matchNodePath = (char *)xmlGetNodePath(match); |
| 2928 | do_crm_log(error_level, "%s[%d] = %s", xpath, lpc, crm_str(matchNodePath)); |
| 2929 | free(matchNodePath); |
| 2930 | } |
| 2931 | crm_log_xml_trace(xml_obj, "Bad Input"); |
| 2932 | |
| 2933 | } else { |
| 2934 | result = getXpathResult(xpathObj, 0); |
| 2935 | } |
| 2936 | |
| 2937 | if(xpathObj) { |
| 2938 | xmlXPathFreeObject(xpathObj); |
| 2939 | } |
| 2940 | free(nodePath); |
| 2941 | |
| 2942 | return result; |
| 2943 | } |
| 2944 | |
| 2945 | const char * |
| 2946 | crm_element_value(xmlNode *data, const char *name) |
no test coverage detected