cl_log(LOG_WARNING,"Closest point was node (%s).", xmlGetNodePath(lastMatch));
cl_log(LOG_WARNING,"Closest point was node (%s) starting from %s.", xmlGetNodePath(lastMatch), root?root->name:NULL);
find_xml_node_nested(xmlNodePtr root, const char **search_path, int len){	int	j;	xmlNodePtr child;	xmlNodePtr lastMatch;	FNIN();	if (root == NULL) {		FNRET(NULL);	}	if(search_path == NULL) {		CRM_DEBUG("Will never find NULL :)");		FNRET(NULL);	}		#ifdef XML_TRACE	dump_array(LOG_DEBUG,		   "Looking for.",		   search_path, len);#endif	child = root->children, lastMatch = NULL;	for (j=0; j < len; ++j) {		gboolean is_found = FALSE;		if (search_path[j] == NULL) {			len = j; /* a NULL also means stop searching */			break;		}				while(child != NULL) {			const char * child_name = (const char*)child->name;#ifdef XML_TRACE			CRM_DEBUG("comparing (%s) with (%s).",				   search_path[j],				   child->name);#endif			if (strcmp(child_name, search_path[j]) == 0) {				lastMatch = child;				child = lastMatch->children;#ifdef XML_TRACE				CRM_DEBUG("found node (%s) @line (%ld).",					   search_path[j],					   xmlGetLineNo(child));#endif				is_found = TRUE;				break;			}			child = child->next;		}		if (is_found == FALSE) {#ifdef XML_TRACE			CRM_DEBUG(				"No more siblings left... %s cannot be found.",				search_path[j]);#endif			break;		}	}	if (j == len	    && lastMatch != NULL	    && strcmp(lastMatch->name, search_path[j-1]) == 0) {#ifdef XML_TRACE		CRM_DEBUG("returning node (%s).",			   xmlGetNodePath(lastMatch));#endif		FNRET(lastMatch);	}	dump_array(LOG_WARNING,		   "Could not find the full path to the node you specified.",		   search_path, len);	cl_log(LOG_WARNING,"Closest point was node (%s).",	       xmlGetNodePath(lastMatch));	FNRET(NULL);    }