1 /* $OSSEC, os_xml_access.c, v0.3, 2005/02/11, Daniel B. Cid$ */
3 /* Copyright (C) 2009 Trend Micro Inc.
6 * This program is a free software; you can redistribute it
7 * and/or modify it under the terms of the GNU General Public
8 * License (version 3) as published by the FSF - Free Software
23 /* Internal functions */
24 char **_GetElements(OS_XML *_lxml, char **element_name,int type);
25 char **_GetElementContent(OS_XML *_lxml, char **element_name, char *attr);
28 /* OS_ElementExist: v1.0: 2005/02/26
29 * Check if a element exists
30 * The element_name must be NULL terminated (last char)
32 int OS_ElementExist(OS_XML *_lxml, char **element_name)
34 int i=0,j=0,matched=0,totalmatch=0;
36 if(element_name == NULL)
39 for(i=0,j=0;i<_lxml->cur;i++)
41 if(element_name[j] == NULL)
43 if((_lxml->tp[i] == XML_ELEM)&&(_lxml->rl[i] == j))
45 if(strcmp(_lxml->el[i],element_name[j]) == 0)
49 if(element_name[j] == NULL)
57 if((matched == 1) &&(j > _lxml->rl[i])&&
58 (_lxml->tp[i] == XML_ELEM))
68 /* RootElementExist: v1.0: 2005/02/26
69 * Check if a root element exists
71 int OS_RootElementExist(OS_XML *_lxml, char *element_name)
73 char *(elements[])={element_name,NULL};
74 return(OS_ElementExist(_lxml,elements));
78 /* GetAttributes: v.0.1: 2005/03/01
79 * Get the attributes of the element_name
81 char **OS_GetAttributes(OS_XML *_lxml, char **element_name)
83 return(_GetElements(_lxml,element_name,XML_ATTR));
89 /* GetElements: v0.1: 2005/03/01
90 * Get the elements children of the element_name
92 char **OS_GetElements(OS_XML *_lxml, char **element_name)
94 return(_GetElements(_lxml, element_name,XML_ELEM));
100 /* _GetElements: v0.1: 2005/03/01
101 * Get the elements or attributes (internal use)
103 char **_GetElements(OS_XML *_lxml, char **element_name,int type)
105 int i=0,j=0,k=0,matched=0,ready=0,size=0;
108 if((type == XML_ELEM) && (element_name == NULL))
111 for(i=0,j=0;i<_lxml->cur;i++)
113 if((ready != 1) &&(element_name[j] == NULL))
124 if((ready == 1)&&(_lxml->tp[i] == type))
126 if(((type == XML_ATTR)&&(_lxml->rl[i] == j-1)
127 &&(_lxml->el[i] != NULL))||
128 ((type == XML_ELEM)&&(_lxml->rl[i] == j)&&
129 (_lxml->el[i] != NULL)))
131 int el_size = strlen(_lxml->el[i])+1;
133 ret = (char**)realloc(ret,(k+1)*sizeof(char *));
136 ret[k]=(char*)calloc(el_size,sizeof(char));
142 strncpy(ret[k],_lxml->el[i],el_size-1);
147 else if((_lxml->tp[i] == XML_ELEM)&&(_lxml->rl[i] == j)&&
148 (element_name[j] != NULL))
150 if(strcmp(_lxml->el[i],element_name[j]) == 0)
160 if(((_lxml->tp[i]==XML_ATTR)&&(j > _lxml->rl[i]+1))||
161 ((_lxml->tp[i] == XML_ELEM)&&(j > _lxml->rl[i])))
165 if(element_name == NULL)
175 ret = (char**)realloc(ret,(k+1)*sizeof(char *));
184 /* OS_GetOneContentforElement: v0.1: 2005/03/01
185 * Get one value for a specific element.
187 char *OS_GetOneContentforElement(OS_XML *_lxml, char **element_name)
190 char *uniqret = NULL;
194 ret = _GetElementContent(_lxml, element_name, NULL);
218 /* OS_GetElementContent: v0.1: 2005/03/01
219 * Get all values for a specific element
221 char **OS_GetElementContent(OS_XML *_lxml, char **element_name)
224 return(_GetElementContent(_lxml, element_name, NULL));
228 /* OS_GetContents: v0.1: 2005/03/01
229 * Get the contents for a specific element
230 * Use element_name = NULL to start the state
232 char **OS_GetContents(OS_XML *_lxml, char **element_name)
234 if(element_name == NULL)
239 return(_GetElementContent(_lxml, element_name, NULL));
244 /* OS_GetAttributeContent: v0.1: 2005/03/01
245 * Get one value for a specific attribute
247 char *OS_GetAttributeContent(OS_XML *_lxml, char **element_name,
248 char *attribute_name)
251 char *uniqret = NULL;
256 ret = _GetElementContent(_lxml, element_name,attribute_name);
263 int retsize= strlen(ret[0])+1;
264 if((retsize < XML_MAXSIZE) && (retsize > 0))
266 uniqret = (char *)calloc(retsize,sizeof(char));
269 strncpy(uniqret, ret[0], retsize-1);
287 /* _GetElementContent: v0.1: 2005/03/01
288 * Get the values for an element or attribute
290 char **_GetElementContent(OS_XML *_lxml, char **element_name, char *attr)
292 int i = 0,j = 0,k = 0,matched = 0;
295 /* Element name can not be null. */
296 if(element_name == NULL)
299 if(_lxml->fol == _lxml->cur)
307 for(i=_lxml->fol;i>=0;i--)
310 if(_lxml->rl[i] == 0)
321 /* Looping through all nodes */
322 for(j=0; i<_lxml->cur; i++)
324 if(element_name[j] == NULL)
330 /* Setting maximum depth of 16. */
335 /* If the type is not an element and the relation doesn't match,
338 if((_lxml->tp[i] != XML_ELEM) || (_lxml->rl[i] != j))
340 /* If the node relation is higher than we currently xml
341 * node, zero the position and look at it again (i--).
356 /* If the element name matches what we are looking for. */
357 else if(strcmp(_lxml->el[i], element_name[j]) == 0)
362 /* Get content if we are at the end of the array. */
363 if(element_name[j] == NULL)
365 /* If we have an attribute to match. */
369 for(k=i+1; k<_lxml->cur; k++)
371 if(_lxml->tp[k] == XML_ELEM)
376 if(strcmp(attr, _lxml->el[k]) == 0)
384 if(_lxml->ct[i] != NULL)
386 /* Increasing the size of the array. */
387 ret = (char**) realloc(ret,(k+2) * sizeof(char*));
393 /* Adding new entry. */
394 ret[k] = strdup(_lxml->ct[i]);
410 else if(_lxml->fol != 0)
417 /* Setting new array pointer. */
418 if((i<_lxml->cur-1) && (_lxml->tp[i+1] == XML_ELEM))