1 /* $OSSEC, os_xml_node_variables.c, v0.3, 2005/04/12, 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 2) as published by the FSF - Free Software
13 * Available at http://www.ossec.net/
22 #include "os_xml_internal.h"
24 int OS_ApplyVariables(OS_XML *_lxml)
26 unsigned int i, j = 0, s = 0;
32 char *var_placeh = NULL;
35 /* Getting all variables */
36 for(i = 0;i<_lxml->cur;i++)
38 if(_lxml->tp[i] == XML_VARIABLE_BEGIN)
42 for(j = i + 1;j<_lxml->cur;j++)
44 if(_lxml->rl[j] < _lxml->rl[i])
47 else if(_lxml->tp[j] == XML_ATTR)
49 if((_lxml->el[j])&&(strcasecmp(_lxml->el[j],XML_VAR_ATTRIBUTE) == 0))
53 snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Invalid variable content.");
54 _lxml->err_line = _lxml->ln[j];
57 else if(strlen(_lxml->ct[j]) >= XML_VARIABLE_MAXSIZE)
59 snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Invalid variable name size.");
60 _lxml->err_line = _lxml->ln[j];
64 /* If not used, it will be cleaned latter */
65 snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Memory error.");
67 tmp = (char**)realloc(var,(s+1)*sizeof(char *));
72 var[s] = _lxml->ct[j];
74 /* Cleaning the lxml->err */
75 strncpy(_lxml->err," ", 3);
82 snprintf(_lxml->err, XML_ERR_LENGTH,
83 "XMLERR: Only \""XML_VAR_ATTRIBUTE"\" is allowed"
84 " as an attribute for a variable.");
85 _lxml->err_line = _lxml->ln[j];
92 if((_found_var == 0)||(!_lxml->ct[i]))
94 snprintf(_lxml->err,XML_ERR_LENGTH,
95 "XMLERR: No value set for variable.");
96 _lxml->err_line = _lxml->ln[i];
101 snprintf(_lxml->err,XML_ERR_LENGTH, "XMLERR: Memory error.");
103 tmp = (char**)realloc(value,(s+1)*sizeof(char *));
108 value[s] = _lxml->ct[i];
110 strncpy(_lxml->err," ", 3);
113 else if(((_lxml->tp[i] == XML_ELEM) || (_lxml->tp[i] == XML_ATTR))&&
119 char lvar[XML_VARIABLE_MAXSIZE]; /* MAX Var size */
122 if(strlen(_lxml->ct[i]) <= 2)
126 /* Duplicating string */
127 p = strdup(_lxml->ct[i]);
132 snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Memory error.");
137 /* Reading the whole string */
140 if(*p == XML_VARIABLE_BEGIN)
144 memset(lvar, '\0', XML_VARIABLE_MAXSIZE);
148 if((*p == XML_VARIABLE_BEGIN)
157 /* Looking for var */
163 if(strcasecmp(var[j], lvar) != 0)
169 size_t tsize = strlen(_lxml->ct[i]) +
170 strlen(value[j]) - tp + 1;
172 var_placeh = strdup(_lxml->ct[i]);
176 _lxml->ct[i] = (char*)calloc(tsize +2,
179 if(_lxml->ct[i] == NULL || var_placeh == NULL)
181 snprintf(_lxml->err,XML_ERR_LENGTH, "XMLERR: Memory "
187 strncpy(_lxml->ct[i], var_placeh, tsize);
190 _lxml->ct[i][init] = '\0';
191 strncat(_lxml->ct[i], value[j],tsize - init);
194 init = strlen(_lxml->ct[i]);
195 strncat(_lxml->ct[i], p,
196 tsize - strlen(_lxml->ct[i]));
205 /* Variale not found */
206 if((j == s) && (strlen(lvar) >= 1))
208 snprintf(_lxml->err,XML_ERR_LENGTH,
209 "XMLERR: Unknown variable"
211 _lxml->err_line = _lxml->ln[i];
222 /* Maximum size for a variable */
223 if(tp >= XML_VARIABLE_MAXSIZE - 1)
225 snprintf(_lxml->err,XML_ERR_LENGTH, "XMLERR: Invalid "
226 "variable name size: '%u'.", tp);
227 _lxml->err_line = _lxml->ln[i];
236 } /* IF XML_VAR_BEGIN */
261 /* Cleaning the variables */