38
44
* FAIL - error processing config file *
40
46
* Author: Alexei Vladishev *
44
51
******************************************************************************/
45
int parse_cfg_file(char *cfg_file,struct cfg_line *cfg)
52
int parse_cfg_file(const char *cfg_file,struct cfg_line *cfg)
48
char line[MAX_STRING_LEN];
49
char parameter[MAX_STRING_LEN];
58
file=fopen(cfg_file,"r");
61
fprintf(stderr, "Cannot open config file [%s] [%s]\n",cfg_file,strerror(errno));
66
while(fgets(line,MAX_STRING_LEN,file) != NULL)
70
if(line[0]=='#') continue;
71
if(strlen(line)==1) continue;
73
strscpy(parameter,line);
75
value=strstr(line,"=");
79
fprintf(stderr, "Error in line [%s] Line %d\n", line, lineno);
83
value[strlen(value)-1]=0;
85
parameter[value-line-1]=0;
88
while(cfg[i].parameter != 0)
90
if(strcmp(cfg[i].parameter, parameter) == 0)
92
if(cfg[i].function != 0)
95
if(func(value)!=SUCCEED)
97
fprintf(stderr, "Wrong value of [%s] in line %d.\n", cfg[i].parameter, lineno);
103
if(cfg[i].type == TYPE_INT)
106
if( (cfg[i].min!=0) || (cfg[i].max!=0))
108
if( (var<cfg[i].min) || (var>cfg[i].max) )
110
fprintf(stderr, "Wrong value of [%s] in line %d. Should be between %d and %d.\n", cfg[i].parameter, lineno, cfg[i].min, cfg[i].max);
115
*((int*)cfg[i].variable)=var;
119
/* Can this be done without "c" ? */
120
c=(char **)cfg[i].variable;
121
*c=(char *)strdup(value);
122
/* *((char*)cfg[i].variable)=strdup(value);*/
130
/* Check for mandatory parameters */
132
while(cfg[i].parameter != 0)
134
if(cfg[i].mandatory ==1)
136
if(cfg[i].type == TYPE_INT)
138
/* pointer=(int *)cfg[i].variable;
140
if(*((int*)cfg[i].variable) == 0)
142
fprintf(stderr,"Missing mandatory parameter [%s]\n", cfg[i].parameter);
146
if(cfg[i].type == TYPE_STRING)
148
c=(char **)cfg[i].variable;
151
fprintf(stderr, "Missing mandatory parameter [%s]\n", cfg[i].parameter);
58
#define ZBX_MAX_INCLUDE_LEVEL 10
60
#define ZBX_CFG_LTRIM_CHARS "\t "
61
#define ZBX_CFG_RTRIM_CHARS ZBX_CFG_LTRIM_CHARS "\r\n\0"
77
if(++level > ZBX_MAX_INCLUDE_LEVEL)
79
/* Ignore include files of depth 10 */
85
if( NULL == (file = fopen(cfg_file,"r")) )
91
for(lineno = 1; fgets(line,MAX_STRING_LEN,file) != NULL; lineno++)
93
zbx_ltrim(line, ZBX_CFG_LTRIM_CHARS);
95
if(line[0]=='#') continue;
96
if(strlen(line) < 3) continue;
100
value = strstr(line,"=");
103
zbx_error("Error in line [%d] \"%s\"", lineno, line);
111
zbx_rtrim(parameter, ZBX_CFG_RTRIM_CHARS);
113
zbx_ltrim(value, ZBX_CFG_LTRIM_CHARS);
114
zbx_rtrim(value, ZBX_CFG_RTRIM_CHARS);
116
zabbix_log(LOG_LEVEL_DEBUG, "cfg: para: [%s] val [%s]", parameter, value);
118
if(strcmp(parameter, "Include") == 0)
120
parse_cfg_file(value, cfg);
123
for(i = 0; value[i] != '\0'; i++)
133
for(i = 0; cfg[i].parameter != 0; i++)
135
if(strcmp(cfg[i].parameter, parameter))
138
zabbix_log(LOG_LEVEL_DEBUG, "Accepted configuration parameter: '%s' = '%s'",parameter, value);
140
if(cfg[i].function != 0)
142
if(cfg[i].function(value) != SUCCEED)
143
goto lbl_incorrect_config;
145
else if(TYPE_INT == cfg[i].type)
149
if ( (cfg[i].min && var < cfg[i].min) ||
150
(cfg[i].max && var > cfg[i].max) )
151
goto lbl_incorrect_config;
153
*((int*)cfg[i].variable) = var;
157
*((char **)cfg[i].variable) = strdup(value);
165
/* Check for mandatory parameters */
166
for(i = 0; cfg[i].parameter != 0; i++)
168
if(PARM_MAND != cfg[i].mandatory)
171
if(TYPE_INT == cfg[i].type)
173
if(*((int*)cfg[i].variable) == 0)
174
goto lbl_missing_mandatory;
176
else if(TYPE_STRING == cfg[i].type)
178
if((*(char **)cfg[i].variable) == NULL)
179
goto lbl_missing_mandatory;
186
zbx_error("Cannot open config file [%s] [%s].",cfg_file,strerror(errno));
189
lbl_missing_mandatory:
190
zbx_error("Missing mandatory parameter [%s].", cfg[i].parameter);
193
lbl_incorrect_config:
194
zbx_error("Wrong value of [%s] in line %d.", cfg[i].parameter, lineno);