xref: /aosp_15_r20/external/libconfig/contrib/ls-config/src/ls-config.c (revision 2e9d491483b805f09ea864149eadd5680efcc72a)
1*2e9d4914SAndroid Build Coastguard Worker #include <stdio.h>
2*2e9d4914SAndroid Build Coastguard Worker #include <stdlib.h>
3*2e9d4914SAndroid Build Coastguard Worker #include <limits.h>
4*2e9d4914SAndroid Build Coastguard Worker #include <string.h>
5*2e9d4914SAndroid Build Coastguard Worker #include <unistd.h>
6*2e9d4914SAndroid Build Coastguard Worker #include <getopt.h>
7*2e9d4914SAndroid Build Coastguard Worker #include <locale.h>
8*2e9d4914SAndroid Build Coastguard Worker #include <libintl.h>
9*2e9d4914SAndroid Build Coastguard Worker #include <errno.h>
10*2e9d4914SAndroid Build Coastguard Worker #include <sys/types.h>
11*2e9d4914SAndroid Build Coastguard Worker #include <sys/stat.h>
12*2e9d4914SAndroid Build Coastguard Worker #include <fcntl.h>
13*2e9d4914SAndroid Build Coastguard Worker #include <math.h>
14*2e9d4914SAndroid Build Coastguard Worker #include <libconfig.h>
15*2e9d4914SAndroid Build Coastguard Worker 
16*2e9d4914SAndroid Build Coastguard Worker #define PACKAGE    "LS bash config"
17*2e9d4914SAndroid Build Coastguard Worker #define VERSION    "1.0.3"
18*2e9d4914SAndroid Build Coastguard Worker 
19*2e9d4914SAndroid Build Coastguard Worker // global flags
20*2e9d4914SAndroid Build Coastguard Worker struct flags {
21*2e9d4914SAndroid Build Coastguard Worker 	int quiet; //quiet output
22*2e9d4914SAndroid Build Coastguard Worker 	int names; //set for printout config variables names
23*2e9d4914SAndroid Build Coastguard Worker 	int types; //set for printout config variables types
24*2e9d4914SAndroid Build Coastguard Worker 	int values; //set for printout config variables values
25*2e9d4914SAndroid Build Coastguard Worker 	int indexes; //set for printout config variables indexes
26*2e9d4914SAndroid Build Coastguard Worker 	int counter; //set for printout config varibales counting (for grout, list, array. in other cases it return 1)
27*2e9d4914SAndroid Build Coastguard Worker 	int unset; //unset valriable
28*2e9d4914SAndroid Build Coastguard Worker 	int boolstring; //set for output bool variable (0|1) as test (false|true)
29*2e9d4914SAndroid Build Coastguard Worker 	int mode; //1 - for setting variable, 0 - for get hist data
30*2e9d4914SAndroid Build Coastguard Worker 	int error; //error status handling
31*2e9d4914SAndroid Build Coastguard Worker };
32*2e9d4914SAndroid Build Coastguard Worker 
33*2e9d4914SAndroid Build Coastguard Worker //take valur from input and comvert it to int
34*2e9d4914SAndroid Build Coastguard Worker //TODO: Read long too
getNumber()35*2e9d4914SAndroid Build Coastguard Worker int getNumber() {
36*2e9d4914SAndroid Build Coastguard Worker   char buf[1000];
37*2e9d4914SAndroid Build Coastguard Worker   int test,val;
38*2e9d4914SAndroid Build Coastguard Worker   unsigned int inp;
39*2e9d4914SAndroid Build Coastguard Worker   fgets(buf, sizeof buf, stdin);
40*2e9d4914SAndroid Build Coastguard Worker   test = sscanf(buf, "%u", &inp);
41*2e9d4914SAndroid Build Coastguard Worker   val = (int) inp;
42*2e9d4914SAndroid Build Coastguard Worker   if(val < 0) val *= -1;
43*2e9d4914SAndroid Build Coastguard Worker   if(test > 0) return val;
44*2e9d4914SAndroid Build Coastguard Worker   return (int) 0;
45*2e9d4914SAndroid Build Coastguard Worker }
46*2e9d4914SAndroid Build Coastguard Worker 
47*2e9d4914SAndroid Build Coastguard Worker //printout help messsage
printHelp()48*2e9d4914SAndroid Build Coastguard Worker void printHelp() {
49*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("Configuration file handling\n"));
50*2e9d4914SAndroid Build Coastguard Worker 	printf("\n");
51*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("Usage: ls-config [OPTION]\n"));
52*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("Reading and writening data from configuration files\n"));
53*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("in libconfig9 format.\n"));
54*2e9d4914SAndroid Build Coastguard Worker 	printf("\n");
55*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("CAUTION: using without given config file are cause error!\n"));
56*2e9d4914SAndroid Build Coastguard Worker 	printf("\n");
57*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("Available options:\n"));
58*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("   -f, --file=FILE       Configuration file to handle.\n"));
59*2e9d4914SAndroid Build Coastguard Worker 	printf("\n");
60*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("   -s, --set=PATH        Set configuration variable of given path.\n"));
61*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("   -d, --data=DATA       Configuration variable value (only with -s)\n"));
62*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("   -p, --type=TYPE       Configuration value type\n"));
63*2e9d4914SAndroid Build Coastguard Worker 	printf("\n");
64*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("   -g, --get=PATH        Get configuration variable of given path.\n"));
65*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("   -n, --names           Printout variables names.\n"));
66*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("   -t, --types           Printout variables types.\n"));
67*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("   -v, --values          Printout variables values.\n"));
68*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("   -i, --indexes         Printout variables indexes.\n"));
69*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("   -c, --count           Printout elements count (only: array, list, group).\n"));
70*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("   -b, --bool-string     Printout boolean variables as text.\n"));
71*2e9d4914SAndroid Build Coastguard Worker 	printf("\n");
72*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("   -q, --quiet           Quiet output to use in scripts.\n"));
73*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("   -h, --help            Print this help message.\n"));
74*2e9d4914SAndroid Build Coastguard Worker 	printf("\n");
75*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("TYPE:    Variable types:\n"));
76*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("         group  - variables group,\n"));
77*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("         array  - array of variables,\n"));
78*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("         list   - list of variables,\n"));
79*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("         int    - integer number,\n"));
80*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("         int64  - 64bit integer number,\n"));
81*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("         float  - float point number,\n"));
82*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("         bool   - boolean value,\n"));
83*2e9d4914SAndroid Build Coastguard Worker 	printf(gettext("         string - character string.\n"));
84*2e9d4914SAndroid Build Coastguard Worker 	printf("\n");
85*2e9d4914SAndroid Build Coastguard Worker 	printf("(c) 2013 by LucaS web sutio - http://www.lucas.net.pl\n");
86*2e9d4914SAndroid Build Coastguard Worker 	printf("Author: Łukasz A. Grabowski\n");
87*2e9d4914SAndroid Build Coastguard Worker    printf(gettext("Licence: "));
88*2e9d4914SAndroid Build Coastguard Worker 	printf("GPL v2.\n");
89*2e9d4914SAndroid Build Coastguard Worker    exit(0);
90*2e9d4914SAndroid Build Coastguard Worker };
91*2e9d4914SAndroid Build Coastguard Worker 
92*2e9d4914SAndroid Build Coastguard Worker //set configuration int value
set_config_int(config_setting_t * setting,char * dataString,struct flags optflags)93*2e9d4914SAndroid Build Coastguard Worker int set_config_int(config_setting_t *setting, char *dataString, struct flags optflags) {
94*2e9d4914SAndroid Build Coastguard Worker 	long bufl; //int (long) to get from input data string
95*2e9d4914SAndroid Build Coastguard Worker 	int buf, scs; //config int, success status
96*2e9d4914SAndroid Build Coastguard Worker 	char *erp; //error output
97*2e9d4914SAndroid Build Coastguard Worker 
98*2e9d4914SAndroid Build Coastguard Worker 	//convert input data to int
99*2e9d4914SAndroid Build Coastguard Worker 	errno = 0;
100*2e9d4914SAndroid Build Coastguard Worker 	bufl = strtol(dataString, &erp, 0);
101*2e9d4914SAndroid Build Coastguard Worker 	if(((errno == ERANGE && (bufl == LONG_MAX || bufl == LONG_MIN)) || (errno != 0 && bufl == 0)) || (erp == dataString) || bufl > INT_MAX || bufl < INT_MIN) {
102*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Incorrect data format.\n"));
103*2e9d4914SAndroid Build Coastguard Worker   			return 12;
104*2e9d4914SAndroid Build Coastguard Worker 		};
105*2e9d4914SAndroid Build Coastguard Worker 	buf = (int)bufl;
106*2e9d4914SAndroid Build Coastguard Worker 
107*2e9d4914SAndroid Build Coastguard Worker 	//set configuration variable
108*2e9d4914SAndroid Build Coastguard Worker 	scs = config_setting_set_int(setting, buf);
109*2e9d4914SAndroid Build Coastguard Worker 	if(scs == CONFIG_FALSE) {
110*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
111*2e9d4914SAndroid Build Coastguard Worker 		return 11;
112*2e9d4914SAndroid Build Coastguard Worker 	};
113*2e9d4914SAndroid Build Coastguard Worker 	return 0;
114*2e9d4914SAndroid Build Coastguard Worker };
115*2e9d4914SAndroid Build Coastguard Worker 
116*2e9d4914SAndroid Build Coastguard Worker //set configuration int64 value
set_config_int64(config_setting_t * setting,char * dataString,struct flags optflags)117*2e9d4914SAndroid Build Coastguard Worker int set_config_int64(config_setting_t *setting, char *dataString, struct flags optflags) {
118*2e9d4914SAndroid Build Coastguard Worker 	long bufl; //long to get from input data string
119*2e9d4914SAndroid Build Coastguard Worker 	int scs; //success status
120*2e9d4914SAndroid Build Coastguard Worker 	char *erp; //error output
121*2e9d4914SAndroid Build Coastguard Worker 
122*2e9d4914SAndroid Build Coastguard Worker 	//convert input data to long
123*2e9d4914SAndroid Build Coastguard Worker 	errno = 0;
124*2e9d4914SAndroid Build Coastguard Worker 	bufl = strtol(dataString, &erp, 0);
125*2e9d4914SAndroid Build Coastguard Worker 	if(((errno == ERANGE && (bufl == LONG_MAX || bufl == LONG_MIN)) || (errno != 0 && bufl == 0)) || (erp == dataString)) {
126*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Incorrect data format.\n"));
127*2e9d4914SAndroid Build Coastguard Worker 			return 12;
128*2e9d4914SAndroid Build Coastguard Worker 		};
129*2e9d4914SAndroid Build Coastguard Worker 
130*2e9d4914SAndroid Build Coastguard Worker 	//set configuration variable
131*2e9d4914SAndroid Build Coastguard Worker 	scs = config_setting_set_int64(setting, bufl);
132*2e9d4914SAndroid Build Coastguard Worker 	if(scs == CONFIG_FALSE) {
133*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
134*2e9d4914SAndroid Build Coastguard Worker 		return 11;
135*2e9d4914SAndroid Build Coastguard Worker 	};
136*2e9d4914SAndroid Build Coastguard Worker 	return 0;
137*2e9d4914SAndroid Build Coastguard Worker };
138*2e9d4914SAndroid Build Coastguard Worker 
139*2e9d4914SAndroid Build Coastguard Worker //set configuration float value
set_config_float(config_setting_t * setting,char * dataString,struct flags optflags)140*2e9d4914SAndroid Build Coastguard Worker int set_config_float(config_setting_t *setting, char *dataString, struct flags optflags) {
141*2e9d4914SAndroid Build Coastguard Worker 	double buff; //double (float) to get from input data string
142*2e9d4914SAndroid Build Coastguard Worker 	int scs; //success status
143*2e9d4914SAndroid Build Coastguard Worker 	char *erp; //error output
144*2e9d4914SAndroid Build Coastguard Worker 
145*2e9d4914SAndroid Build Coastguard Worker 	//convert input data to double
146*2e9d4914SAndroid Build Coastguard Worker 	errno = 0;
147*2e9d4914SAndroid Build Coastguard Worker 	buff = strtod(dataString, &erp);
148*2e9d4914SAndroid Build Coastguard Worker    if(((errno == ERANGE && (buff == HUGE_VALF || buff == HUGE_VALL)) || (errno != 0 && buff == 0)) || (erp == dataString)) {
149*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Incorrect data format.\n"));
150*2e9d4914SAndroid Build Coastguard Worker 		return 12;
151*2e9d4914SAndroid Build Coastguard Worker 	}
152*2e9d4914SAndroid Build Coastguard Worker 
153*2e9d4914SAndroid Build Coastguard Worker 	//set configuration variable
154*2e9d4914SAndroid Build Coastguard Worker 	scs = config_setting_set_float(setting, buff);
155*2e9d4914SAndroid Build Coastguard Worker 	if(scs == CONFIG_FALSE) {
156*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
157*2e9d4914SAndroid Build Coastguard Worker 		return 11;
158*2e9d4914SAndroid Build Coastguard Worker 	};
159*2e9d4914SAndroid Build Coastguard Worker 	return 0;
160*2e9d4914SAndroid Build Coastguard Worker };
161*2e9d4914SAndroid Build Coastguard Worker 
162*2e9d4914SAndroid Build Coastguard Worker //set configuration boolean value
set_config_bool(config_setting_t * setting,char * dataString,struct flags optflags)163*2e9d4914SAndroid Build Coastguard Worker int set_config_bool(config_setting_t *setting, char *dataString, struct flags optflags) {
164*2e9d4914SAndroid Build Coastguard Worker 	int scs, buf; //success status, input convert burrer
165*2e9d4914SAndroid Build Coastguard Worker 
166*2e9d4914SAndroid Build Coastguard Worker 	//convert input data
167*2e9d4914SAndroid Build Coastguard Worker 	//chceck both 1/0 and true/false string
168*2e9d4914SAndroid Build Coastguard Worker 	buf = -1;
169*2e9d4914SAndroid Build Coastguard Worker 	if(!strcmp(dataString, "1") || !strcmp(dataString, "true") || !strcmp(dataString, "TRUE")) buf = 1;
170*2e9d4914SAndroid Build Coastguard Worker 	if(!strcmp(dataString, "0") || !strcmp(dataString, "false") || !strcmp(dataString, "FALSE")) buf = 0;
171*2e9d4914SAndroid Build Coastguard Worker 	if(buf < 0) {
172*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Incorrect data format.\n"));
173*2e9d4914SAndroid Build Coastguard Worker 		return 12;
174*2e9d4914SAndroid Build Coastguard Worker 	}
175*2e9d4914SAndroid Build Coastguard Worker 
176*2e9d4914SAndroid Build Coastguard Worker 	//set configuration variable
177*2e9d4914SAndroid Build Coastguard Worker 	scs = config_setting_set_bool(setting, buf);
178*2e9d4914SAndroid Build Coastguard Worker 	if(scs == CONFIG_FALSE) {
179*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
180*2e9d4914SAndroid Build Coastguard Worker 		return 11;
181*2e9d4914SAndroid Build Coastguard Worker 	};
182*2e9d4914SAndroid Build Coastguard Worker 	return 0;
183*2e9d4914SAndroid Build Coastguard Worker };
184*2e9d4914SAndroid Build Coastguard Worker 
185*2e9d4914SAndroid Build Coastguard Worker //configuratnion variable path look like: foo.bar.car
186*2e9d4914SAndroid Build Coastguard Worker //this fuction return string giving path to parent element (foo.bar)
path_parent(char * dataPath)187*2e9d4914SAndroid Build Coastguard Worker char* path_parent(char *dataPath) {
188*2e9d4914SAndroid Build Coastguard Worker 	char *str_ptr, *last_ptr, *newpath, *dot="."; //tokenized buffer, last buffer, new parent path, separator
189*2e9d4914SAndroid Build Coastguard Worker 	newpath = malloc(1);
190*2e9d4914SAndroid Build Coastguard Worker 	memset(newpath, 0, 1);
191*2e9d4914SAndroid Build Coastguard Worker 	last_ptr = malloc(1);
192*2e9d4914SAndroid Build Coastguard Worker 	memset(last_ptr, 0, 1);
193*2e9d4914SAndroid Build Coastguard Worker 
194*2e9d4914SAndroid Build Coastguard Worker 	//tokenize string and save last token
195*2e9d4914SAndroid Build Coastguard Worker 	str_ptr = strtok(dataPath, ".");
196*2e9d4914SAndroid Build Coastguard Worker 	last_ptr = (char*)realloc(last_ptr, (strlen(str_ptr)+1)*sizeof(char));
197*2e9d4914SAndroid Build Coastguard Worker 	strcpy(last_ptr, str_ptr);
198*2e9d4914SAndroid Build Coastguard Worker 
199*2e9d4914SAndroid Build Coastguard Worker 	//loop overt path to build new path without last element
200*2e9d4914SAndroid Build Coastguard Worker 	while(str_ptr != NULL) {
201*2e9d4914SAndroid Build Coastguard Worker 		str_ptr = strtok(NULL, ".");
202*2e9d4914SAndroid Build Coastguard Worker 		if(str_ptr != NULL) {
203*2e9d4914SAndroid Build Coastguard Worker 			if(strlen(last_ptr) > 0 ) {
204*2e9d4914SAndroid Build Coastguard Worker 				newpath = (char*)realloc(newpath, (strlen(newpath)+strlen(last_ptr)+2)*sizeof(char));
205*2e9d4914SAndroid Build Coastguard Worker 				strcat(newpath, dot);
206*2e9d4914SAndroid Build Coastguard Worker 				strcat(newpath, last_ptr);
207*2e9d4914SAndroid Build Coastguard Worker 			};
208*2e9d4914SAndroid Build Coastguard Worker 			last_ptr = (char*)realloc(last_ptr, (strlen(str_ptr)+1)*sizeof(char));
209*2e9d4914SAndroid Build Coastguard Worker 			strcpy(last_ptr, str_ptr);
210*2e9d4914SAndroid Build Coastguard Worker 		} else {
211*2e9d4914SAndroid Build Coastguard Worker 			last_ptr = (char*)realloc(last_ptr, (1)*sizeof(char));
212*2e9d4914SAndroid Build Coastguard Worker 			memset(last_ptr, 0, 1);
213*2e9d4914SAndroid Build Coastguard Worker 		};
214*2e9d4914SAndroid Build Coastguard Worker   	};
215*2e9d4914SAndroid Build Coastguard Worker 	free(dataPath);
216*2e9d4914SAndroid Build Coastguard Worker 
217*2e9d4914SAndroid Build Coastguard Worker 	//if new path empty thren return null
218*2e9d4914SAndroid Build Coastguard Worker 	if(strlen(newpath) == 0) {
219*2e9d4914SAndroid Build Coastguard Worker 		free(newpath);
220*2e9d4914SAndroid Build Coastguard Worker 		newpath = NULL;
221*2e9d4914SAndroid Build Coastguard Worker 	};
222*2e9d4914SAndroid Build Coastguard Worker 	return newpath;
223*2e9d4914SAndroid Build Coastguard Worker };
224*2e9d4914SAndroid Build Coastguard Worker 
225*2e9d4914SAndroid Build Coastguard Worker //get element name from configuration variable path
226*2e9d4914SAndroid Build Coastguard Worker //e.g.: from foo.bar return bar
path_name(char * dataPath)227*2e9d4914SAndroid Build Coastguard Worker char* path_name(char *dataPath) {
228*2e9d4914SAndroid Build Coastguard Worker 	char *str_ptr, *name, *tk; //tokenized buffer, element name, copy of dataPath
229*2e9d4914SAndroid Build Coastguard Worker 	name = malloc(1);
230*2e9d4914SAndroid Build Coastguard Worker 
231*2e9d4914SAndroid Build Coastguard Worker 	//make copy of dataPath
232*2e9d4914SAndroid Build Coastguard Worker 	tk = malloc((strlen(dataPath)+1)*sizeof(char));
233*2e9d4914SAndroid Build Coastguard Worker 	memset(name, 0, 1);
234*2e9d4914SAndroid Build Coastguard Worker 	strcpy(tk, dataPath);
235*2e9d4914SAndroid Build Coastguard Worker 
236*2e9d4914SAndroid Build Coastguard Worker 	//tokenize dataPath
237*2e9d4914SAndroid Build Coastguard Worker 	str_ptr = strtok(tk, ".");
238*2e9d4914SAndroid Build Coastguard Worker 
239*2e9d4914SAndroid Build Coastguard Worker 	//loop over tokenize pathh to get last element
240*2e9d4914SAndroid Build Coastguard Worker 	while(str_ptr != NULL) {
241*2e9d4914SAndroid Build Coastguard Worker 		name = (char*)realloc(name, (strlen(str_ptr)+1)*sizeof(char));
242*2e9d4914SAndroid Build Coastguard Worker 		strcpy(name, str_ptr);
243*2e9d4914SAndroid Build Coastguard Worker 		str_ptr = strtok(NULL, ".");
244*2e9d4914SAndroid Build Coastguard Worker   	};
245*2e9d4914SAndroid Build Coastguard Worker 	free(tk);
246*2e9d4914SAndroid Build Coastguard Worker 
247*2e9d4914SAndroid Build Coastguard Worker 	//if no element name then return null
248*2e9d4914SAndroid Build Coastguard Worker 	if(strlen(name) == 0) {
249*2e9d4914SAndroid Build Coastguard Worker 		free(name);
250*2e9d4914SAndroid Build Coastguard Worker 		name = NULL;
251*2e9d4914SAndroid Build Coastguard Worker 	};
252*2e9d4914SAndroid Build Coastguard Worker 	return name;
253*2e9d4914SAndroid Build Coastguard Worker };
254*2e9d4914SAndroid Build Coastguard Worker 
255*2e9d4914SAndroid Build Coastguard Worker //set configuration path
256*2e9d4914SAndroid Build Coastguard Worker //@return int success
257*2e9d4914SAndroid Build Coastguard Worker //@param configFile - name (with path) of configuration fille
258*2e9d4914SAndroid Build Coastguard Worker //@param dataPath - path of configuration variable (in config file)
259*2e9d4914SAndroid Build Coastguard Worker //@param optflags - global options flags
260*2e9d4914SAndroid Build Coastguard Worker //@param dataString - data to store in configuration variable in string format
261*2e9d4914SAndroid Build Coastguard Worker //@param dataType - type of variable to save
set_config(char * configFile,char * dataPath,struct flags optflags,char * dataString,char * dataType)262*2e9d4914SAndroid Build Coastguard Worker int set_config(char *configFile, char *dataPath, struct flags optflags, char *dataString, char *dataType) {
263*2e9d4914SAndroid Build Coastguard Worker 	config_t cfg; //libcongig configuration handler
264*2e9d4914SAndroid Build Coastguard Worker 	config_setting_t *setting, *ss; //libconfig element handrer: mant, and subset (uset for multielement types)
265*2e9d4914SAndroid Build Coastguard Worker 	config_init(&cfg);
266*2e9d4914SAndroid Build Coastguard Worker 	int scs, dt, dattyp; //sucess statu, data type
267*2e9d4914SAndroid Build Coastguard Worker 	char *npath; // new variable configuration path path
268*2e9d4914SAndroid Build Coastguard Worker 
269*2e9d4914SAndroid Build Coastguard Worker 	//open and read configuration file
270*2e9d4914SAndroid Build Coastguard Worker 	if(!config_read_file(&cfg, configFile)) {
271*2e9d4914SAndroid Build Coastguard Worker   		config_destroy(&cfg);
272*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Can't read configuration file.\n"));
273*2e9d4914SAndroid Build Coastguard Worker   		return 1;
274*2e9d4914SAndroid Build Coastguard Worker  	};
275*2e9d4914SAndroid Build Coastguard Worker 
276*2e9d4914SAndroid Build Coastguard Worker 	//if no data path or data string then cause error
277*2e9d4914SAndroid Build Coastguard Worker 	if(dataPath == NULL) {
278*2e9d4914SAndroid Build Coastguard Worker   		config_destroy(&cfg);
279*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Conviguration variable path not given.\n"));
280*2e9d4914SAndroid Build Coastguard Worker   		return 4;
281*2e9d4914SAndroid Build Coastguard Worker 	};
282*2e9d4914SAndroid Build Coastguard Worker 	if(dataString == NULL) {
283*2e9d4914SAndroid Build Coastguard Worker   		config_destroy(&cfg);
284*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Configuration variable value not given.\n"));
285*2e9d4914SAndroid Build Coastguard Worker   		return 9;
286*2e9d4914SAndroid Build Coastguard Worker 	};
287*2e9d4914SAndroid Build Coastguard Worker 
288*2e9d4914SAndroid Build Coastguard Worker  	//find configuration variable of given path
289*2e9d4914SAndroid Build Coastguard Worker 	setting = config_lookup(&cfg, dataPath);
290*2e9d4914SAndroid Build Coastguard Worker 	if(setting == NULL) {
291*2e9d4914SAndroid Build Coastguard Worker 		//if variable of given path not found get element name and partent path,
292*2e9d4914SAndroid Build Coastguard Worker 		//then try to create it
293*2e9d4914SAndroid Build Coastguard Worker 		npath = path_name(dataPath);
294*2e9d4914SAndroid Build Coastguard Worker 		dataPath = path_parent(dataPath);
295*2e9d4914SAndroid Build Coastguard Worker 		if(dataPath == NULL) {
296*2e9d4914SAndroid Build Coastguard Worker 			setting = config_root_setting(&cfg);
297*2e9d4914SAndroid Build Coastguard Worker 		} else {
298*2e9d4914SAndroid Build Coastguard Worker 			setting = config_lookup(&cfg, dataPath);
299*2e9d4914SAndroid Build Coastguard Worker 		};
300*2e9d4914SAndroid Build Coastguard Worker 		if(setting == NULL) {
301*2e9d4914SAndroid Build Coastguard Worker 			//if parent not exists exit with error
302*2e9d4914SAndroid Build Coastguard Worker 			config_destroy(&cfg);
303*2e9d4914SAndroid Build Coastguard Worker 			if(optflags.quiet == 0) printf(gettext("ERROR! Inavlid configuration variable path.\n"));
304*2e9d4914SAndroid Build Coastguard Worker   			return 16;
305*2e9d4914SAndroid Build Coastguard Worker 		};
306*2e9d4914SAndroid Build Coastguard Worker 		//chceck type of parent element (named alement can be added only to group element)
307*2e9d4914SAndroid Build Coastguard Worker 		dt = config_setting_type(setting);
308*2e9d4914SAndroid Build Coastguard Worker 		if(dt != CONFIG_TYPE_GROUP) {
309*2e9d4914SAndroid Build Coastguard Worker 			config_destroy(&cfg);
310*2e9d4914SAndroid Build Coastguard Worker 			if(optflags.quiet == 0) printf(gettext("ERROR! New named configuration variable can be added only to group element.\n"));
311*2e9d4914SAndroid Build Coastguard Worker   			return 17;
312*2e9d4914SAndroid Build Coastguard Worker 		};
313*2e9d4914SAndroid Build Coastguard Worker 		//check if new element type are given
314*2e9d4914SAndroid Build Coastguard Worker 		if(dataType == NULL) {
315*2e9d4914SAndroid Build Coastguard Worker 			config_destroy(&cfg);
316*2e9d4914SAndroid Build Coastguard Worker 			if(optflags.quiet == 0) printf(gettext("ERROR! Configuration variable type not given.\n"));
317*2e9d4914SAndroid Build Coastguard Worker   			return 13;
318*2e9d4914SAndroid Build Coastguard Worker 		};
319*2e9d4914SAndroid Build Coastguard Worker 		//now get type based on his name
320*2e9d4914SAndroid Build Coastguard Worker 		if(!strcmp(dataType, "int")) {
321*2e9d4914SAndroid Build Coastguard Worker 			dattyp = CONFIG_TYPE_INT;
322*2e9d4914SAndroid Build Coastguard Worker 		} else if(!strcmp(dataType, "int64")) {
323*2e9d4914SAndroid Build Coastguard Worker 			dattyp = CONFIG_TYPE_INT64;
324*2e9d4914SAndroid Build Coastguard Worker 		} else if(!strcmp(dataType, "float")) {
325*2e9d4914SAndroid Build Coastguard Worker 			dattyp = CONFIG_TYPE_FLOAT;
326*2e9d4914SAndroid Build Coastguard Worker 		} else if(!strcmp(dataType, "string")) {
327*2e9d4914SAndroid Build Coastguard Worker 			dattyp = CONFIG_TYPE_STRING;
328*2e9d4914SAndroid Build Coastguard Worker 		} else if(!strcmp(dataType, "bool")) {
329*2e9d4914SAndroid Build Coastguard Worker 			dattyp = CONFIG_TYPE_BOOL;
330*2e9d4914SAndroid Build Coastguard Worker 		} else if(!strcmp(dataType, "array")) {
331*2e9d4914SAndroid Build Coastguard Worker 			dattyp = CONFIG_TYPE_ARRAY;
332*2e9d4914SAndroid Build Coastguard Worker 		} else if(!strcmp(dataType, "list")) {
333*2e9d4914SAndroid Build Coastguard Worker 			dattyp = CONFIG_TYPE_LIST;
334*2e9d4914SAndroid Build Coastguard Worker 		} else if(!strcmp(dataType, "group")) {
335*2e9d4914SAndroid Build Coastguard Worker 			dattyp = CONFIG_TYPE_GROUP;
336*2e9d4914SAndroid Build Coastguard Worker 		} else {
337*2e9d4914SAndroid Build Coastguard Worker 			//if given type no mutch eny then cause error and exit
338*2e9d4914SAndroid Build Coastguard Worker 			config_destroy(&cfg);
339*2e9d4914SAndroid Build Coastguard Worker 			if(optflags.quiet == 0) printf(gettext("ERROR! Inlegal data type.\n"));
340*2e9d4914SAndroid Build Coastguard Worker   			return 14;
341*2e9d4914SAndroid Build Coastguard Worker 		};
342*2e9d4914SAndroid Build Coastguard Worker 		//add new element to configuration file
343*2e9d4914SAndroid Build Coastguard Worker 		ss = config_setting_add(setting, npath, dattyp);
344*2e9d4914SAndroid Build Coastguard Worker 		if(ss == NULL) {
345*2e9d4914SAndroid Build Coastguard Worker 			config_destroy(&cfg);
346*2e9d4914SAndroid Build Coastguard Worker 			if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
347*2e9d4914SAndroid Build Coastguard Worker   			return 11;
348*2e9d4914SAndroid Build Coastguard Worker 		};
349*2e9d4914SAndroid Build Coastguard Worker 		scs = 0;
350*2e9d4914SAndroid Build Coastguard Worker 		//and based on new type set his value
351*2e9d4914SAndroid Build Coastguard Worker 		switch(dattyp) {
352*2e9d4914SAndroid Build Coastguard Worker 			case CONFIG_TYPE_INT:
353*2e9d4914SAndroid Build Coastguard Worker 				scs = set_config_int(ss, dataString, optflags);
354*2e9d4914SAndroid Build Coastguard Worker 				break;
355*2e9d4914SAndroid Build Coastguard Worker 			case CONFIG_TYPE_INT64:
356*2e9d4914SAndroid Build Coastguard Worker 				scs = set_config_int64(ss, dataString, optflags);
357*2e9d4914SAndroid Build Coastguard Worker 				break;
358*2e9d4914SAndroid Build Coastguard Worker 			case CONFIG_TYPE_FLOAT:
359*2e9d4914SAndroid Build Coastguard Worker 				scs = set_config_float(ss, dataString, optflags);
360*2e9d4914SAndroid Build Coastguard Worker 				break;
361*2e9d4914SAndroid Build Coastguard Worker 			case CONFIG_TYPE_STRING:
362*2e9d4914SAndroid Build Coastguard Worker 				scs = config_setting_set_string(ss, dataString);
363*2e9d4914SAndroid Build Coastguard Worker 				if(scs == CONFIG_FALSE) {
364*2e9d4914SAndroid Build Coastguard Worker 					if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
365*2e9d4914SAndroid Build Coastguard Worker   					scs = 11;
366*2e9d4914SAndroid Build Coastguard Worker 				} else scs = 0;
367*2e9d4914SAndroid Build Coastguard Worker 				break;
368*2e9d4914SAndroid Build Coastguard Worker 			case CONFIG_TYPE_BOOL:
369*2e9d4914SAndroid Build Coastguard Worker 				scs = set_config_bool(ss, dataString, optflags);
370*2e9d4914SAndroid Build Coastguard Worker 				break;
371*2e9d4914SAndroid Build Coastguard Worker 		};
372*2e9d4914SAndroid Build Coastguard Worker 		if(scs > 0) {
373*2e9d4914SAndroid Build Coastguard Worker 			//if occurs some error wihe setting variable value exit with error
374*2e9d4914SAndroid Build Coastguard Worker 			config_destroy(&cfg);
375*2e9d4914SAndroid Build Coastguard Worker 			return scs;
376*2e9d4914SAndroid Build Coastguard Worker       };
377*2e9d4914SAndroid Build Coastguard Worker 	} else {
378*2e9d4914SAndroid Build Coastguard Worker 		//but if we found element of given path, try to set his value
379*2e9d4914SAndroid Build Coastguard Worker 		//first of all determinate type of value
380*2e9d4914SAndroid Build Coastguard Worker 		dt = config_setting_type(setting);
381*2e9d4914SAndroid Build Coastguard Worker 		switch(dt) {
382*2e9d4914SAndroid Build Coastguard Worker 			case CONFIG_TYPE_INT:
383*2e9d4914SAndroid Build Coastguard Worker 				if(dataType != NULL && strcmp(dataType, "int")) {
384*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
385*2e9d4914SAndroid Build Coastguard Worker 					if(optflags.quiet == 0) printf(gettext("ERROR! inconsistent value type.\n"));
386*2e9d4914SAndroid Build Coastguard Worker   					return 10;
387*2e9d4914SAndroid Build Coastguard Worker 				};
388*2e9d4914SAndroid Build Coastguard Worker 				//then set value
389*2e9d4914SAndroid Build Coastguard Worker 				scs = set_config_int(setting, dataString, optflags);
390*2e9d4914SAndroid Build Coastguard Worker 				if(scs > 0) {
391*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
392*2e9d4914SAndroid Build Coastguard Worker   					return scs;
393*2e9d4914SAndroid Build Coastguard Worker 				};
394*2e9d4914SAndroid Build Coastguard Worker 				break;
395*2e9d4914SAndroid Build Coastguard Worker 			case CONFIG_TYPE_INT64:
396*2e9d4914SAndroid Build Coastguard Worker 				if(dataType != NULL && strcmp(dataType, "int64")) {
397*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
398*2e9d4914SAndroid Build Coastguard Worker 					if(optflags.quiet == 0) printf(gettext("ERROR! inconsistent value type.\n"));
399*2e9d4914SAndroid Build Coastguard Worker   					return 10;
400*2e9d4914SAndroid Build Coastguard Worker 				};
401*2e9d4914SAndroid Build Coastguard Worker 				//then set value
402*2e9d4914SAndroid Build Coastguard Worker 				scs = set_config_int64(setting, dataString, optflags);
403*2e9d4914SAndroid Build Coastguard Worker 				if(scs > 0) {
404*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
405*2e9d4914SAndroid Build Coastguard Worker   					return scs;
406*2e9d4914SAndroid Build Coastguard Worker 				};
407*2e9d4914SAndroid Build Coastguard Worker 				break;
408*2e9d4914SAndroid Build Coastguard Worker 			case CONFIG_TYPE_FLOAT:
409*2e9d4914SAndroid Build Coastguard Worker 				if(dataType != NULL && strcmp(dataType, "float")) {
410*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
411*2e9d4914SAndroid Build Coastguard Worker 					if(optflags.quiet == 0) printf(gettext("ERROR! inconsistent value type.\n"));
412*2e9d4914SAndroid Build Coastguard Worker   					return 10;
413*2e9d4914SAndroid Build Coastguard Worker 				};
414*2e9d4914SAndroid Build Coastguard Worker 				//then set value
415*2e9d4914SAndroid Build Coastguard Worker 				scs = set_config_float(setting, dataString, optflags);
416*2e9d4914SAndroid Build Coastguard Worker 				if(scs > 0) {
417*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
418*2e9d4914SAndroid Build Coastguard Worker   					return scs;
419*2e9d4914SAndroid Build Coastguard Worker 				};
420*2e9d4914SAndroid Build Coastguard Worker 				break;
421*2e9d4914SAndroid Build Coastguard Worker 			case CONFIG_TYPE_STRING:
422*2e9d4914SAndroid Build Coastguard Worker 				if(dataType != NULL && strcmp(dataType, "string")) {
423*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
424*2e9d4914SAndroid Build Coastguard Worker 					if(optflags.quiet == 0) printf(gettext("ERROR! inconsistent value type.\n"));
425*2e9d4914SAndroid Build Coastguard Worker   					return 10;
426*2e9d4914SAndroid Build Coastguard Worker 				};
427*2e9d4914SAndroid Build Coastguard Worker 				//then set value
428*2e9d4914SAndroid Build Coastguard Worker 				scs = config_setting_set_string(setting, dataString);
429*2e9d4914SAndroid Build Coastguard Worker 				if(scs == CONFIG_FALSE) {
430*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
431*2e9d4914SAndroid Build Coastguard Worker 					if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
432*2e9d4914SAndroid Build Coastguard Worker   					return 11;
433*2e9d4914SAndroid Build Coastguard Worker 				};
434*2e9d4914SAndroid Build Coastguard Worker 				break;
435*2e9d4914SAndroid Build Coastguard Worker 			case CONFIG_TYPE_BOOL:
436*2e9d4914SAndroid Build Coastguard Worker 				if(dataType != NULL && strcmp(dataType, "bool")) {
437*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
438*2e9d4914SAndroid Build Coastguard Worker 					if(optflags.quiet == 0) printf(gettext("ERROR! inconsistent value type.\n"));
439*2e9d4914SAndroid Build Coastguard Worker   					return 10;
440*2e9d4914SAndroid Build Coastguard Worker 				};
441*2e9d4914SAndroid Build Coastguard Worker 				//then set value
442*2e9d4914SAndroid Build Coastguard Worker 				scs = set_config_bool(setting, dataString, optflags);
443*2e9d4914SAndroid Build Coastguard Worker 				if(scs > 0) {
444*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
445*2e9d4914SAndroid Build Coastguard Worker   					return scs;
446*2e9d4914SAndroid Build Coastguard Worker 				};
447*2e9d4914SAndroid Build Coastguard Worker 				break;
448*2e9d4914SAndroid Build Coastguard Worker 			case CONFIG_TYPE_ARRAY:
449*2e9d4914SAndroid Build Coastguard Worker 				//if array are empty we can set alement of any scalar type
450*2e9d4914SAndroid Build Coastguard Worker 				if(config_setting_length(setting) == 0) {
451*2e9d4914SAndroid Build Coastguard Worker 					//but we must have his type
452*2e9d4914SAndroid Build Coastguard Worker 					if(dataType == NULL) {
453*2e9d4914SAndroid Build Coastguard Worker 						config_destroy(&cfg);
454*2e9d4914SAndroid Build Coastguard Worker 						if(optflags.quiet == 0) printf(gettext("ERROR! Configuration variable type not given.\n"));
455*2e9d4914SAndroid Build Coastguard Worker   						return 13;
456*2e9d4914SAndroid Build Coastguard Worker 					};
457*2e9d4914SAndroid Build Coastguard Worker 					if(!strcmp(dataType, "int")) {
458*2e9d4914SAndroid Build Coastguard Worker 						dattyp = CONFIG_TYPE_INT;
459*2e9d4914SAndroid Build Coastguard Worker 					} else if(!strcmp(dataType, "int64")) {
460*2e9d4914SAndroid Build Coastguard Worker 						dattyp = CONFIG_TYPE_INT64;
461*2e9d4914SAndroid Build Coastguard Worker 					} else if(!strcmp(dataType, "float")) {
462*2e9d4914SAndroid Build Coastguard Worker 						dattyp = CONFIG_TYPE_FLOAT;
463*2e9d4914SAndroid Build Coastguard Worker 					} else if(!strcmp(dataType, "string")) {
464*2e9d4914SAndroid Build Coastguard Worker 						dattyp = CONFIG_TYPE_STRING;
465*2e9d4914SAndroid Build Coastguard Worker 					} else if(!strcmp(dataType, "bool")) {
466*2e9d4914SAndroid Build Coastguard Worker 						dattyp = CONFIG_TYPE_BOOL;
467*2e9d4914SAndroid Build Coastguard Worker 					} else {
468*2e9d4914SAndroid Build Coastguard Worker 						//only scalar type availabe
469*2e9d4914SAndroid Build Coastguard Worker 						config_destroy(&cfg);
470*2e9d4914SAndroid Build Coastguard Worker 						if(optflags.quiet == 0) printf(gettext("ERROR! Prohibited data type.\n"));
471*2e9d4914SAndroid Build Coastguard Worker   						return 18;
472*2e9d4914SAndroid Build Coastguard Worker 					};
473*2e9d4914SAndroid Build Coastguard Worker 					//first of all we must add new element to array
474*2e9d4914SAndroid Build Coastguard Worker 					ss = config_setting_add(setting, NULL, dattyp);
475*2e9d4914SAndroid Build Coastguard Worker 					if(ss == NULL) {
476*2e9d4914SAndroid Build Coastguard Worker 						config_destroy(&cfg);
477*2e9d4914SAndroid Build Coastguard Worker 						if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
478*2e9d4914SAndroid Build Coastguard Worker   						return 11;
479*2e9d4914SAndroid Build Coastguard Worker 					};
480*2e9d4914SAndroid Build Coastguard Worker 					//then based on his type set value
481*2e9d4914SAndroid Build Coastguard Worker 					switch(dattyp) {
482*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_INT:
483*2e9d4914SAndroid Build Coastguard Worker 							scs = set_config_int(ss, dataString, optflags);
484*2e9d4914SAndroid Build Coastguard Worker 							if(scs > 0) {
485*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
486*2e9d4914SAndroid Build Coastguard Worker   								return scs;
487*2e9d4914SAndroid Build Coastguard Worker 							};
488*2e9d4914SAndroid Build Coastguard Worker 							break;
489*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_INT64:
490*2e9d4914SAndroid Build Coastguard Worker 							scs = set_config_int64(ss, dataString, optflags);
491*2e9d4914SAndroid Build Coastguard Worker 							if(scs > 0) {
492*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
493*2e9d4914SAndroid Build Coastguard Worker   								return scs;
494*2e9d4914SAndroid Build Coastguard Worker 							};
495*2e9d4914SAndroid Build Coastguard Worker 							break;
496*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_FLOAT:
497*2e9d4914SAndroid Build Coastguard Worker 							scs = set_config_float(ss, dataString, optflags);
498*2e9d4914SAndroid Build Coastguard Worker 							if(scs > 0) {
499*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
500*2e9d4914SAndroid Build Coastguard Worker   								return scs;
501*2e9d4914SAndroid Build Coastguard Worker 							};
502*2e9d4914SAndroid Build Coastguard Worker 							break;
503*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_STRING:
504*2e9d4914SAndroid Build Coastguard Worker 							scs = config_setting_set_string(ss, dataString);
505*2e9d4914SAndroid Build Coastguard Worker 							if(scs == CONFIG_FALSE) {
506*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
507*2e9d4914SAndroid Build Coastguard Worker 								if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
508*2e9d4914SAndroid Build Coastguard Worker   								return 11;
509*2e9d4914SAndroid Build Coastguard Worker 							};
510*2e9d4914SAndroid Build Coastguard Worker 							break;
511*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_BOOL:
512*2e9d4914SAndroid Build Coastguard Worker 							scs = set_config_bool(ss, dataString, optflags);
513*2e9d4914SAndroid Build Coastguard Worker 							if(scs > 0) {
514*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
515*2e9d4914SAndroid Build Coastguard Worker   								return scs;
516*2e9d4914SAndroid Build Coastguard Worker 							};
517*2e9d4914SAndroid Build Coastguard Worker 							break;
518*2e9d4914SAndroid Build Coastguard Worker 					};
519*2e9d4914SAndroid Build Coastguard Worker 				} else {
520*2e9d4914SAndroid Build Coastguard Worker 					//but if we have some element in array, we can add only element of same type
521*2e9d4914SAndroid Build Coastguard Worker 					//so, because all element in arry must be same type, we get type of first element
522*2e9d4914SAndroid Build Coastguard Worker 					//and based on it set new element
523*2e9d4914SAndroid Build Coastguard Worker 					dattyp = config_setting_type(config_setting_get_elem(setting, 0));
524*2e9d4914SAndroid Build Coastguard Worker 					switch(dattyp) {
525*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_INT:
526*2e9d4914SAndroid Build Coastguard Worker 							if(dataType != NULL && strcmp(dataType, "int")) {
527*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
528*2e9d4914SAndroid Build Coastguard Worker 								if(optflags.quiet == 0) printf(gettext("ERROR! inconsistent value type.\n"));
529*2e9d4914SAndroid Build Coastguard Worker   								return 10;
530*2e9d4914SAndroid Build Coastguard Worker 							};
531*2e9d4914SAndroid Build Coastguard Worker 							//add new element
532*2e9d4914SAndroid Build Coastguard Worker 							ss = config_setting_add(setting, NULL, dattyp);
533*2e9d4914SAndroid Build Coastguard Worker 							if(ss == NULL) {
534*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
535*2e9d4914SAndroid Build Coastguard Worker 								if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
536*2e9d4914SAndroid Build Coastguard Worker   								return 11;
537*2e9d4914SAndroid Build Coastguard Worker 							};
538*2e9d4914SAndroid Build Coastguard Worker 							//then set his value
539*2e9d4914SAndroid Build Coastguard Worker 							scs = set_config_int(ss, dataString, optflags);
540*2e9d4914SAndroid Build Coastguard Worker 							if(scs > 0) {
541*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
542*2e9d4914SAndroid Build Coastguard Worker 								return scs;
543*2e9d4914SAndroid Build Coastguard Worker 							};
544*2e9d4914SAndroid Build Coastguard Worker 							break;
545*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_INT64:
546*2e9d4914SAndroid Build Coastguard Worker 							if(dataType != NULL && strcmp(dataType, "int64")) {
547*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
548*2e9d4914SAndroid Build Coastguard Worker 								if(optflags.quiet == 0) printf(gettext("ERROR! inconsistent value type.\n"));
549*2e9d4914SAndroid Build Coastguard Worker   								return 10;
550*2e9d4914SAndroid Build Coastguard Worker 							};
551*2e9d4914SAndroid Build Coastguard Worker 							//add new element
552*2e9d4914SAndroid Build Coastguard Worker 							ss = config_setting_add(setting, NULL, dattyp);
553*2e9d4914SAndroid Build Coastguard Worker 							if(ss == NULL) {
554*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
555*2e9d4914SAndroid Build Coastguard Worker 								if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
556*2e9d4914SAndroid Build Coastguard Worker   								return 11;
557*2e9d4914SAndroid Build Coastguard Worker 							};
558*2e9d4914SAndroid Build Coastguard Worker 							//then set his value
559*2e9d4914SAndroid Build Coastguard Worker 							scs = set_config_int64(ss, dataString, optflags);
560*2e9d4914SAndroid Build Coastguard Worker 							if(scs > 0) {
561*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
562*2e9d4914SAndroid Build Coastguard Worker 								return scs;
563*2e9d4914SAndroid Build Coastguard Worker 							};
564*2e9d4914SAndroid Build Coastguard Worker 							break;
565*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_FLOAT:
566*2e9d4914SAndroid Build Coastguard Worker 							if(dataType != NULL && strcmp(dataType, "float")) {
567*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
568*2e9d4914SAndroid Build Coastguard Worker 								if(optflags.quiet == 0) printf(gettext("ERROR! inconsistent value type.\n"));
569*2e9d4914SAndroid Build Coastguard Worker   								return 10;
570*2e9d4914SAndroid Build Coastguard Worker 							};
571*2e9d4914SAndroid Build Coastguard Worker 							//add new element
572*2e9d4914SAndroid Build Coastguard Worker 							ss = config_setting_add(setting, NULL, dattyp);
573*2e9d4914SAndroid Build Coastguard Worker 							if(ss == NULL) {
574*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
575*2e9d4914SAndroid Build Coastguard Worker 								if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
576*2e9d4914SAndroid Build Coastguard Worker   								return 11;
577*2e9d4914SAndroid Build Coastguard Worker 							};
578*2e9d4914SAndroid Build Coastguard Worker 							//then set his value
579*2e9d4914SAndroid Build Coastguard Worker 							scs = set_config_float(ss, dataString, optflags);
580*2e9d4914SAndroid Build Coastguard Worker 							if(scs > 0) {
581*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
582*2e9d4914SAndroid Build Coastguard Worker 								return scs;
583*2e9d4914SAndroid Build Coastguard Worker 							};
584*2e9d4914SAndroid Build Coastguard Worker 							break;
585*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_STRING:
586*2e9d4914SAndroid Build Coastguard Worker 							if(dataType != NULL && strcmp(dataType, "string")) {
587*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
588*2e9d4914SAndroid Build Coastguard Worker 								if(optflags.quiet == 0) printf(gettext("ERROR! inconsistent value type.\n"));
589*2e9d4914SAndroid Build Coastguard Worker   								return 10;
590*2e9d4914SAndroid Build Coastguard Worker 							};
591*2e9d4914SAndroid Build Coastguard Worker 							//add new element
592*2e9d4914SAndroid Build Coastguard Worker 							ss = config_setting_add(setting, NULL, dattyp);
593*2e9d4914SAndroid Build Coastguard Worker 							if(ss == NULL) {
594*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
595*2e9d4914SAndroid Build Coastguard Worker 								if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
596*2e9d4914SAndroid Build Coastguard Worker   								return 11;
597*2e9d4914SAndroid Build Coastguard Worker 							};
598*2e9d4914SAndroid Build Coastguard Worker 							//then set his value
599*2e9d4914SAndroid Build Coastguard Worker 							scs = config_setting_set_string(ss, dataString);
600*2e9d4914SAndroid Build Coastguard Worker 							if(scs == CONFIG_FALSE) {
601*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
602*2e9d4914SAndroid Build Coastguard Worker 								if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
603*2e9d4914SAndroid Build Coastguard Worker   								return 11;
604*2e9d4914SAndroid Build Coastguard Worker 							};
605*2e9d4914SAndroid Build Coastguard Worker 							break;
606*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_BOOL:
607*2e9d4914SAndroid Build Coastguard Worker 							if(dataType != NULL && strcmp(dataType, "bool")) {
608*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
609*2e9d4914SAndroid Build Coastguard Worker 								if(optflags.quiet == 0) printf(gettext("ERROR! inconsistent value type.\n"));
610*2e9d4914SAndroid Build Coastguard Worker   								return 10;
611*2e9d4914SAndroid Build Coastguard Worker 							};
612*2e9d4914SAndroid Build Coastguard Worker 							//add new element
613*2e9d4914SAndroid Build Coastguard Worker 							ss = config_setting_add(setting, NULL, dattyp);
614*2e9d4914SAndroid Build Coastguard Worker 							if(ss == NULL) {
615*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
616*2e9d4914SAndroid Build Coastguard Worker 								if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
617*2e9d4914SAndroid Build Coastguard Worker   								return 11;
618*2e9d4914SAndroid Build Coastguard Worker 							};
619*2e9d4914SAndroid Build Coastguard Worker 							//then set his value
620*2e9d4914SAndroid Build Coastguard Worker 							scs = set_config_bool(ss, dataString, optflags);
621*2e9d4914SAndroid Build Coastguard Worker 							if(scs > 0) {
622*2e9d4914SAndroid Build Coastguard Worker 								config_destroy(&cfg);
623*2e9d4914SAndroid Build Coastguard Worker 								return scs;
624*2e9d4914SAndroid Build Coastguard Worker 							};
625*2e9d4914SAndroid Build Coastguard Worker 							break;
626*2e9d4914SAndroid Build Coastguard Worker 					};
627*2e9d4914SAndroid Build Coastguard Worker 				};
628*2e9d4914SAndroid Build Coastguard Worker 				break;
629*2e9d4914SAndroid Build Coastguard Worker 			case CONFIG_TYPE_LIST:
630*2e9d4914SAndroid Build Coastguard Worker 				//in case adding element to list, we can add any type of element
631*2e9d4914SAndroid Build Coastguard Worker 				if(dataType == NULL) {
632*2e9d4914SAndroid Build Coastguard Worker 					//but we must konwn his type
633*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
634*2e9d4914SAndroid Build Coastguard Worker 					if(optflags.quiet == 0) printf(gettext("ERROR! Configuration variable type not given.\n"));
635*2e9d4914SAndroid Build Coastguard Worker   					return 13;
636*2e9d4914SAndroid Build Coastguard Worker 				};
637*2e9d4914SAndroid Build Coastguard Worker 				if(!strcmp(dataType, "int")) {
638*2e9d4914SAndroid Build Coastguard Worker 					dattyp = CONFIG_TYPE_INT;
639*2e9d4914SAndroid Build Coastguard Worker 				} else if(!strcmp(dataType, "int64")) {
640*2e9d4914SAndroid Build Coastguard Worker 					dattyp = CONFIG_TYPE_INT64;
641*2e9d4914SAndroid Build Coastguard Worker 				} else if(!strcmp(dataType, "float")) {
642*2e9d4914SAndroid Build Coastguard Worker 					dattyp = CONFIG_TYPE_FLOAT;
643*2e9d4914SAndroid Build Coastguard Worker 				} else if(!strcmp(dataType, "string")) {
644*2e9d4914SAndroid Build Coastguard Worker 					dattyp = CONFIG_TYPE_STRING;
645*2e9d4914SAndroid Build Coastguard Worker 				} else if(!strcmp(dataType, "bool")) {
646*2e9d4914SAndroid Build Coastguard Worker 					dattyp = CONFIG_TYPE_BOOL;
647*2e9d4914SAndroid Build Coastguard Worker 				} else if(!strcmp(dataType, "array")) {
648*2e9d4914SAndroid Build Coastguard Worker 					dattyp = CONFIG_TYPE_ARRAY;
649*2e9d4914SAndroid Build Coastguard Worker 				} else if(!strcmp(dataType, "list")) {
650*2e9d4914SAndroid Build Coastguard Worker 					dattyp = CONFIG_TYPE_LIST;
651*2e9d4914SAndroid Build Coastguard Worker 				} else if(!strcmp(dataType, "group")) {
652*2e9d4914SAndroid Build Coastguard Worker 					dattyp = CONFIG_TYPE_GROUP;
653*2e9d4914SAndroid Build Coastguard Worker 				} else {
654*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
655*2e9d4914SAndroid Build Coastguard Worker 					if(optflags.quiet == 0) printf(gettext("ERROR! Inlegal data type.\n"));
656*2e9d4914SAndroid Build Coastguard Worker   					return 14;
657*2e9d4914SAndroid Build Coastguard Worker 				};
658*2e9d4914SAndroid Build Coastguard Worker 				//add new element of given type
659*2e9d4914SAndroid Build Coastguard Worker 				ss = config_setting_add(setting, NULL, dattyp);
660*2e9d4914SAndroid Build Coastguard Worker 				if(ss == NULL) {
661*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
662*2e9d4914SAndroid Build Coastguard Worker 					if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
663*2e9d4914SAndroid Build Coastguard Worker   					return 11;
664*2e9d4914SAndroid Build Coastguard Worker 				};
665*2e9d4914SAndroid Build Coastguard Worker 				//now, based on type, set element value
666*2e9d4914SAndroid Build Coastguard Worker 				scs = 0;
667*2e9d4914SAndroid Build Coastguard Worker 				switch(dattyp) {
668*2e9d4914SAndroid Build Coastguard Worker 					case CONFIG_TYPE_INT:
669*2e9d4914SAndroid Build Coastguard Worker 						scs = set_config_int(ss, dataString, optflags);
670*2e9d4914SAndroid Build Coastguard Worker 						break;
671*2e9d4914SAndroid Build Coastguard Worker 					case CONFIG_TYPE_INT64:
672*2e9d4914SAndroid Build Coastguard Worker 						scs = set_config_int64(ss, dataString, optflags);
673*2e9d4914SAndroid Build Coastguard Worker 						break;
674*2e9d4914SAndroid Build Coastguard Worker 					case CONFIG_TYPE_FLOAT:
675*2e9d4914SAndroid Build Coastguard Worker 						scs = set_config_int64(ss, dataString, optflags);
676*2e9d4914SAndroid Build Coastguard Worker 						break;
677*2e9d4914SAndroid Build Coastguard Worker 					case CONFIG_TYPE_STRING:
678*2e9d4914SAndroid Build Coastguard Worker 						scs = config_setting_set_string(ss, dataString);
679*2e9d4914SAndroid Build Coastguard Worker 						if(scs == CONFIG_FALSE) {
680*2e9d4914SAndroid Build Coastguard Worker 							config_destroy(&cfg);
681*2e9d4914SAndroid Build Coastguard Worker 							if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
682*2e9d4914SAndroid Build Coastguard Worker   							return 11;
683*2e9d4914SAndroid Build Coastguard Worker 						};
684*2e9d4914SAndroid Build Coastguard Worker 						scs = 0;
685*2e9d4914SAndroid Build Coastguard Worker 						break;
686*2e9d4914SAndroid Build Coastguard Worker 					case CONFIG_TYPE_BOOL:
687*2e9d4914SAndroid Build Coastguard Worker 						scs = set_config_int64(ss, dataString, optflags);
688*2e9d4914SAndroid Build Coastguard Worker 						break;
689*2e9d4914SAndroid Build Coastguard Worker 				};
690*2e9d4914SAndroid Build Coastguard Worker 				if(scs > 0) {
691*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
692*2e9d4914SAndroid Build Coastguard Worker   					return scs;
693*2e9d4914SAndroid Build Coastguard Worker 				};
694*2e9d4914SAndroid Build Coastguard Worker 				//finaly outpt index of new added element
695*2e9d4914SAndroid Build Coastguard Worker 				if(optflags.quiet == 0) {
696*2e9d4914SAndroid Build Coastguard Worker 					printf(gettext("Added element index: %d\n"), config_setting_index(ss));
697*2e9d4914SAndroid Build Coastguard Worker 				} else {
698*2e9d4914SAndroid Build Coastguard Worker 					printf("%d", config_setting_index(ss));
699*2e9d4914SAndroid Build Coastguard Worker 				};
700*2e9d4914SAndroid Build Coastguard Worker 				break;
701*2e9d4914SAndroid Build Coastguard Worker 			case CONFIG_TYPE_GROUP:
702*2e9d4914SAndroid Build Coastguard Worker 				//to group we can add any type of element, but we must have his name
703*2e9d4914SAndroid Build Coastguard Worker 				if(dataType == NULL) {
704*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
705*2e9d4914SAndroid Build Coastguard Worker 					if(optflags.quiet == 0) printf(gettext("ERROR! Configuration variable type not given.\n"));
706*2e9d4914SAndroid Build Coastguard Worker   					return 13;
707*2e9d4914SAndroid Build Coastguard Worker 				};
708*2e9d4914SAndroid Build Coastguard Worker 				if(strlen(dataString) < 1) {
709*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
710*2e9d4914SAndroid Build Coastguard Worker 					if(optflags.quiet == 0) printf(gettext("ERROR! Bad name of configuration variable.\n"));
711*2e9d4914SAndroid Build Coastguard Worker   					return 15;
712*2e9d4914SAndroid Build Coastguard Worker 				};
713*2e9d4914SAndroid Build Coastguard Worker 				//determinate type of new variable
714*2e9d4914SAndroid Build Coastguard Worker 				if(!strcmp(dataType, "int")) {
715*2e9d4914SAndroid Build Coastguard Worker 					dattyp = CONFIG_TYPE_INT;
716*2e9d4914SAndroid Build Coastguard Worker 				} else if(!strcmp(dataType, "int64")) {
717*2e9d4914SAndroid Build Coastguard Worker 					dattyp = CONFIG_TYPE_INT64;
718*2e9d4914SAndroid Build Coastguard Worker 				} else if(!strcmp(dataType, "float")) {
719*2e9d4914SAndroid Build Coastguard Worker 					dattyp = CONFIG_TYPE_FLOAT;
720*2e9d4914SAndroid Build Coastguard Worker 				} else if(!strcmp(dataType, "string")) {
721*2e9d4914SAndroid Build Coastguard Worker 					dattyp = CONFIG_TYPE_STRING;
722*2e9d4914SAndroid Build Coastguard Worker 				} else if(!strcmp(dataType, "bool")) {
723*2e9d4914SAndroid Build Coastguard Worker 					dattyp = CONFIG_TYPE_BOOL;
724*2e9d4914SAndroid Build Coastguard Worker 				} else if(!strcmp(dataType, "array")) {
725*2e9d4914SAndroid Build Coastguard Worker 					dattyp = CONFIG_TYPE_ARRAY;
726*2e9d4914SAndroid Build Coastguard Worker 				} else if(!strcmp(dataType, "list")) {
727*2e9d4914SAndroid Build Coastguard Worker 					dattyp = CONFIG_TYPE_LIST;
728*2e9d4914SAndroid Build Coastguard Worker 				} else if(!strcmp(dataType, "group")) {
729*2e9d4914SAndroid Build Coastguard Worker 					dattyp = CONFIG_TYPE_GROUP;
730*2e9d4914SAndroid Build Coastguard Worker 				} else {
731*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
732*2e9d4914SAndroid Build Coastguard Worker 					if(optflags.quiet == 0) printf(gettext("ERROR! Inlegal data type.\n"));
733*2e9d4914SAndroid Build Coastguard Worker   					return 14;
734*2e9d4914SAndroid Build Coastguard Worker 				};
735*2e9d4914SAndroid Build Coastguard Worker 				//then add new alement
736*2e9d4914SAndroid Build Coastguard Worker 				ss = config_setting_add(setting, dataString, dattyp);
737*2e9d4914SAndroid Build Coastguard Worker 				if(ss == NULL) {
738*2e9d4914SAndroid Build Coastguard Worker 					config_destroy(&cfg);
739*2e9d4914SAndroid Build Coastguard Worker 					if(optflags.quiet == 0) printf(gettext("ERROR! Variable set failed.\n"));
740*2e9d4914SAndroid Build Coastguard Worker   					return 11;
741*2e9d4914SAndroid Build Coastguard Worker 				};
742*2e9d4914SAndroid Build Coastguard Worker 				//in case of adding new element to group we not set his value
743*2e9d4914SAndroid Build Coastguard Worker 				//(value field of input are used to get variable name)
744*2e9d4914SAndroid Build Coastguard Worker 				//We only output index of new added element
745*2e9d4914SAndroid Build Coastguard Worker 				if(optflags.quiet == 0) {
746*2e9d4914SAndroid Build Coastguard Worker 					printf(gettext("Added element index: %d\n"), config_setting_index(ss));
747*2e9d4914SAndroid Build Coastguard Worker 				} else {
748*2e9d4914SAndroid Build Coastguard Worker 					printf("%d", config_setting_index(ss));
749*2e9d4914SAndroid Build Coastguard Worker 				};
750*2e9d4914SAndroid Build Coastguard Worker 				break;
751*2e9d4914SAndroid Build Coastguard Worker 		};
752*2e9d4914SAndroid Build Coastguard Worker 	}
753*2e9d4914SAndroid Build Coastguard Worker 
754*2e9d4914SAndroid Build Coastguard Worker 	//Finaly write configuration file
755*2e9d4914SAndroid Build Coastguard Worker 	scs = config_write_file(&cfg, configFile);
756*2e9d4914SAndroid Build Coastguard Worker 	if(scs == CONFIG_FALSE) {
757*2e9d4914SAndroid Build Coastguard Worker   		config_destroy(&cfg);
758*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Configuration file write failed.\n"));
759*2e9d4914SAndroid Build Coastguard Worker   		return 8;
760*2e9d4914SAndroid Build Coastguard Worker  	};
761*2e9d4914SAndroid Build Coastguard Worker  	config_destroy(&cfg);
762*2e9d4914SAndroid Build Coastguard Worker 	return 0;
763*2e9d4914SAndroid Build Coastguard Worker };
764*2e9d4914SAndroid Build Coastguard Worker 
765*2e9d4914SAndroid Build Coastguard Worker //unset configuration path
766*2e9d4914SAndroid Build Coastguard Worker //(remove variable from configuration file)
767*2e9d4914SAndroid Build Coastguard Worker //@return int success
768*2e9d4914SAndroid Build Coastguard Worker //@param char* configFile - the name (with path) of configuration file
769*2e9d4914SAndroid Build Coastguard Worker //@param char* configPath - path to configuration valriable to remove (unset)
770*2e9d4914SAndroid Build Coastguard Worker //@param struct flags optflags - global flags
unset_config(char * configFile,char * dataPath,struct flags optflags)771*2e9d4914SAndroid Build Coastguard Worker int unset_config(char *configFile, char *dataPath, struct flags optflags) {
772*2e9d4914SAndroid Build Coastguard Worker 	config_t cfg; //configuration file handler
773*2e9d4914SAndroid Build Coastguard Worker 	config_setting_t *setting, *par; //configuration valriale handler, and paren variable handler
774*2e9d4914SAndroid Build Coastguard Worker 	int idx, scs; //index of variable, sucess status
775*2e9d4914SAndroid Build Coastguard Worker 	//open configuration file
776*2e9d4914SAndroid Build Coastguard Worker 	config_init(&cfg);
777*2e9d4914SAndroid Build Coastguard Worker 	if(!config_read_file(&cfg, configFile)) {
778*2e9d4914SAndroid Build Coastguard Worker   		config_destroy(&cfg);
779*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Can't read configuration file.\n"));
780*2e9d4914SAndroid Build Coastguard Worker   		return 1;
781*2e9d4914SAndroid Build Coastguard Worker  	};
782*2e9d4914SAndroid Build Coastguard Worker 	//chceck if data path given
783*2e9d4914SAndroid Build Coastguard Worker 	if(dataPath == NULL) {
784*2e9d4914SAndroid Build Coastguard Worker   		config_destroy(&cfg);
785*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Conviguration variable path not given.\n"));
786*2e9d4914SAndroid Build Coastguard Worker   		return 4;
787*2e9d4914SAndroid Build Coastguard Worker 	};
788*2e9d4914SAndroid Build Coastguard Worker 	//now find variable of given path
789*2e9d4914SAndroid Build Coastguard Worker 	setting = config_lookup(&cfg, dataPath);
790*2e9d4914SAndroid Build Coastguard Worker 	if(setting == NULL) {
791*2e9d4914SAndroid Build Coastguard Worker   		config_destroy(&cfg);
792*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Given variable path not found.\n"));
793*2e9d4914SAndroid Build Coastguard Worker   		return 3;
794*2e9d4914SAndroid Build Coastguard Worker  	};
795*2e9d4914SAndroid Build Coastguard Worker 	//get element index
796*2e9d4914SAndroid Build Coastguard Worker 	idx = config_setting_index(setting);
797*2e9d4914SAndroid Build Coastguard Worker 	if(idx < 0) {
798*2e9d4914SAndroid Build Coastguard Worker   		config_destroy(&cfg);
799*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Can't remove root element.\n"));
800*2e9d4914SAndroid Build Coastguard Worker   		return 5;
801*2e9d4914SAndroid Build Coastguard Worker  	};
802*2e9d4914SAndroid Build Coastguard Worker 	//now find parent element
803*2e9d4914SAndroid Build Coastguard Worker 	par = config_setting_parent(setting);
804*2e9d4914SAndroid Build Coastguard Worker 	if(par == NULL) {
805*2e9d4914SAndroid Build Coastguard Worker   		config_destroy(&cfg);
806*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Can't find parent element.\n"));
807*2e9d4914SAndroid Build Coastguard Worker   		return 6;
808*2e9d4914SAndroid Build Coastguard Worker  	};
809*2e9d4914SAndroid Build Coastguard Worker 	//then remove element
810*2e9d4914SAndroid Build Coastguard Worker 	scs = config_setting_remove_elem(par, idx);
811*2e9d4914SAndroid Build Coastguard Worker 	if(scs == CONFIG_FALSE) {
812*2e9d4914SAndroid Build Coastguard Worker   		config_destroy(&cfg);
813*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Variable unset failed.\n"));
814*2e9d4914SAndroid Build Coastguard Worker   		return 7;
815*2e9d4914SAndroid Build Coastguard Worker  	};
816*2e9d4914SAndroid Build Coastguard Worker 	//Finaly write configuration file
817*2e9d4914SAndroid Build Coastguard Worker 	scs = config_write_file(&cfg, configFile);
818*2e9d4914SAndroid Build Coastguard Worker 	if(scs == CONFIG_FALSE) {
819*2e9d4914SAndroid Build Coastguard Worker   		config_destroy(&cfg);
820*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Configuration file write failed.\n"));
821*2e9d4914SAndroid Build Coastguard Worker   		return 8;
822*2e9d4914SAndroid Build Coastguard Worker  	};
823*2e9d4914SAndroid Build Coastguard Worker  	config_destroy(&cfg);
824*2e9d4914SAndroid Build Coastguard Worker 	return 0;
825*2e9d4914SAndroid Build Coastguard Worker };
826*2e9d4914SAndroid Build Coastguard Worker 
827*2e9d4914SAndroid Build Coastguard Worker //get configuratioin variable
828*2e9d4914SAndroid Build Coastguard Worker //(read it from configuration file)
829*2e9d4914SAndroid Build Coastguard Worker //@return char* variable value
830*2e9d4914SAndroid Build Coastguard Worker //@param char* configFile - configuration file name (with path)
831*2e9d4914SAndroid Build Coastguard Worker //@param cher* dataPath - configuration variable path (in file)
832*2e9d4914SAndroid Build Coastguard Worker //@param struct flags optflags - global flags
read_config(char * configFile,char * dataPath,struct flags optflags)833*2e9d4914SAndroid Build Coastguard Worker int read_config(char *configFile, char *dataPath, struct flags optflags) {
834*2e9d4914SAndroid Build Coastguard Worker 	config_t cfg; //configuration file handler
835*2e9d4914SAndroid Build Coastguard Worker 	config_setting_t *setting, *ss; //configuration element handler, and helper handler (config element too)
836*2e9d4914SAndroid Build Coastguard Worker 	int comaset, varindex, varcounter; //helper flat for buid output strings, varibale index, counter
837*2e9d4914SAndroid Build Coastguard Worker 	unsigned int maxel, i; //max elements, and loop index
838*2e9d4914SAndroid Build Coastguard Worker 	char buffer[256]; //reading buffer
839*2e9d4914SAndroid Build Coastguard Worker 	const char *cbuffer;
840*2e9d4914SAndroid Build Coastguard Worker 	const char *coma=";"; //output string variable separator
841*2e9d4914SAndroid Build Coastguard Worker 	int ibuffer, ssize; //value int buffer
842*2e9d4914SAndroid Build Coastguard Worker 	char *dataName, *dataTypeName, *dataValueString; //name of variable, type of variable, value of variable
843*2e9d4914SAndroid Build Coastguard Worker 	int dataType, st; //internale variable type
844*2e9d4914SAndroid Build Coastguard Worker 	//initialize values
845*2e9d4914SAndroid Build Coastguard Worker 	dataValueString = malloc(1);
846*2e9d4914SAndroid Build Coastguard Worker 	dataTypeName = malloc(1);
847*2e9d4914SAndroid Build Coastguard Worker 	memset(dataValueString, 0, 1);
848*2e9d4914SAndroid Build Coastguard Worker 	memset(dataTypeName, 0, 1);
849*2e9d4914SAndroid Build Coastguard Worker 	varindex = 0;
850*2e9d4914SAndroid Build Coastguard Worker 	varcounter = 0;
851*2e9d4914SAndroid Build Coastguard Worker 	//open and read configuration file
852*2e9d4914SAndroid Build Coastguard Worker 	config_init(&cfg);
853*2e9d4914SAndroid Build Coastguard Worker 	if(!config_read_file(&cfg, configFile)) {
854*2e9d4914SAndroid Build Coastguard Worker   		config_destroy(&cfg);
855*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Can't read configuration file.\n"));
856*2e9d4914SAndroid Build Coastguard Worker   		return 1;
857*2e9d4914SAndroid Build Coastguard Worker  	};
858*2e9d4914SAndroid Build Coastguard Worker 	//now find variable element of given path
859*2e9d4914SAndroid Build Coastguard Worker 	if(dataPath == NULL) {
860*2e9d4914SAndroid Build Coastguard Worker 		//if path not givne load root element (default)
861*2e9d4914SAndroid Build Coastguard Worker 		setting = config_root_setting(&cfg);
862*2e9d4914SAndroid Build Coastguard Worker 	} else {
863*2e9d4914SAndroid Build Coastguard Worker 		setting = config_lookup(&cfg, dataPath);
864*2e9d4914SAndroid Build Coastguard Worker 	};
865*2e9d4914SAndroid Build Coastguard Worker 	if(setting == NULL) {
866*2e9d4914SAndroid Build Coastguard Worker   		config_destroy(&cfg);
867*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Given variable path not found.\n"));
868*2e9d4914SAndroid Build Coastguard Worker   		return 3;
869*2e9d4914SAndroid Build Coastguard Worker  	};
870*2e9d4914SAndroid Build Coastguard Worker 	//read variable name
871*2e9d4914SAndroid Build Coastguard Worker 	dataName = config_setting_name(setting);
872*2e9d4914SAndroid Build Coastguard Worker 	if(dataName == NULL) dataName = "NULL"; //in case variable have no name convert to string representation
873*2e9d4914SAndroid Build Coastguard Worker 	//read variable type
874*2e9d4914SAndroid Build Coastguard Worker 	dataType = config_setting_type(setting);
875*2e9d4914SAndroid Build Coastguard Worker 	//next conver type to human readable and read variable value based on his type
876*2e9d4914SAndroid Build Coastguard Worker 	//and in cases in type not scalar read index and coutn variables
877*2e9d4914SAndroid Build Coastguard Worker 	switch(dataType) {
878*2e9d4914SAndroid Build Coastguard Worker 		case CONFIG_TYPE_INT:
879*2e9d4914SAndroid Build Coastguard Worker 			dataTypeName = (char*)realloc(dataTypeName, 4*sizeof(char));
880*2e9d4914SAndroid Build Coastguard Worker 			strcpy(dataTypeName, "int");
881*2e9d4914SAndroid Build Coastguard Worker 			sprintf(buffer, "%d", config_setting_get_int(setting));
882*2e9d4914SAndroid Build Coastguard Worker 			dataValueString = (char*)realloc(dataValueString, (strlen(buffer)+1)*sizeof(char));
883*2e9d4914SAndroid Build Coastguard Worker 			strcpy(dataValueString, buffer);
884*2e9d4914SAndroid Build Coastguard Worker 			break;
885*2e9d4914SAndroid Build Coastguard Worker 		case CONFIG_TYPE_INT64:
886*2e9d4914SAndroid Build Coastguard Worker 			dataTypeName = (char*)realloc(dataTypeName, 6*sizeof(char));
887*2e9d4914SAndroid Build Coastguard Worker 			strcpy(dataTypeName, "int64");
888*2e9d4914SAndroid Build Coastguard Worker 			sprintf(buffer, "%lld", config_setting_get_int64(setting));
889*2e9d4914SAndroid Build Coastguard Worker 			dataValueString = (char*)realloc(dataValueString, (strlen(buffer)+1)*sizeof(char));
890*2e9d4914SAndroid Build Coastguard Worker 			strcpy(dataValueString, buffer);
891*2e9d4914SAndroid Build Coastguard Worker 			break;
892*2e9d4914SAndroid Build Coastguard Worker 		case CONFIG_TYPE_FLOAT:
893*2e9d4914SAndroid Build Coastguard Worker 			dataTypeName = (char*)realloc(dataTypeName, 9*sizeof(char));
894*2e9d4914SAndroid Build Coastguard Worker 			strcpy(dataTypeName, "float");
895*2e9d4914SAndroid Build Coastguard Worker 			sprintf(buffer, "%f", config_setting_get_float(setting));
896*2e9d4914SAndroid Build Coastguard Worker 			dataValueString = (char*)realloc(dataValueString, (strlen(buffer)+1)*sizeof(char));
897*2e9d4914SAndroid Build Coastguard Worker 			strcpy(dataValueString, buffer);
898*2e9d4914SAndroid Build Coastguard Worker 			break;
899*2e9d4914SAndroid Build Coastguard Worker 		case CONFIG_TYPE_STRING:
900*2e9d4914SAndroid Build Coastguard Worker 			dataTypeName = (char*)realloc(dataTypeName, 7*sizeof(char));
901*2e9d4914SAndroid Build Coastguard Worker 			strcpy(dataTypeName, "string");
902*2e9d4914SAndroid Build Coastguard Worker 			cbuffer = config_setting_get_string(setting);
903*2e9d4914SAndroid Build Coastguard Worker 			dataValueString = (char*)realloc(dataValueString, (strlen(cbuffer)+1)*sizeof(char));
904*2e9d4914SAndroid Build Coastguard Worker 			strcpy(dataValueString, cbuffer);
905*2e9d4914SAndroid Build Coastguard Worker 			break;
906*2e9d4914SAndroid Build Coastguard Worker 		case CONFIG_TYPE_BOOL:
907*2e9d4914SAndroid Build Coastguard Worker 			dataTypeName = (char*)realloc(dataTypeName, 5*sizeof(char));
908*2e9d4914SAndroid Build Coastguard Worker 			strcpy(dataTypeName, "bool");
909*2e9d4914SAndroid Build Coastguard Worker 			if(optflags.boolstring == 1) {
910*2e9d4914SAndroid Build Coastguard Worker 				//if expect bool as string, convert it to human readable
911*2e9d4914SAndroid Build Coastguard Worker 				ibuffer = config_setting_get_bool(setting);
912*2e9d4914SAndroid Build Coastguard Worker 				if(ibuffer == CONFIG_TRUE) {
913*2e9d4914SAndroid Build Coastguard Worker 					dataValueString = (char*)realloc(dataValueString, 5*sizeof(char));
914*2e9d4914SAndroid Build Coastguard Worker 					strcpy(dataValueString, "true");
915*2e9d4914SAndroid Build Coastguard Worker 				} else {
916*2e9d4914SAndroid Build Coastguard Worker 					dataValueString = (char*)realloc(dataValueString, 6*sizeof(char));
917*2e9d4914SAndroid Build Coastguard Worker 					strcpy(dataValueString, "false");
918*2e9d4914SAndroid Build Coastguard Worker 				}
919*2e9d4914SAndroid Build Coastguard Worker 			} else {
920*2e9d4914SAndroid Build Coastguard Worker 					//else output as digit
921*2e9d4914SAndroid Build Coastguard Worker 					sprintf(buffer, "%d", config_setting_get_bool(setting));
922*2e9d4914SAndroid Build Coastguard Worker 					dataValueString = (char*)realloc(dataValueString, (strlen(buffer)+1)*sizeof(char));
923*2e9d4914SAndroid Build Coastguard Worker 					strcpy(dataValueString, buffer);
924*2e9d4914SAndroid Build Coastguard Worker 			};
925*2e9d4914SAndroid Build Coastguard Worker 			break;
926*2e9d4914SAndroid Build Coastguard Worker 		case CONFIG_TYPE_ARRAY:
927*2e9d4914SAndroid Build Coastguard Worker 			dataTypeName = (char*)realloc(dataTypeName, 6*sizeof(char));
928*2e9d4914SAndroid Build Coastguard Worker 			strcpy(dataTypeName, "array");
929*2e9d4914SAndroid Build Coastguard Worker 			//get element count
930*2e9d4914SAndroid Build Coastguard Worker 			maxel = (unsigned int)config_setting_length(setting);
931*2e9d4914SAndroid Build Coastguard Worker 			comaset = 0;
932*2e9d4914SAndroid Build Coastguard Worker 			//and loop over all elements
933*2e9d4914SAndroid Build Coastguard Worker 			for(i = 0; i < maxel; i++) {
934*2e9d4914SAndroid Build Coastguard Worker 				//get element
935*2e9d4914SAndroid Build Coastguard Worker 				ss = config_setting_get_elem(setting, i);
936*2e9d4914SAndroid Build Coastguard Worker 				if(ss != NULL) {
937*2e9d4914SAndroid Build Coastguard Worker 					st = config_setting_type(ss);
938*2e9d4914SAndroid Build Coastguard Worker 					switch(st) {
939*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_INT:
940*2e9d4914SAndroid Build Coastguard Worker 							sprintf(buffer, "%d", config_setting_get_int(ss));
941*2e9d4914SAndroid Build Coastguard Worker 							dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+strlen(buffer)+2)*sizeof(char));
942*2e9d4914SAndroid Build Coastguard Worker 							if(comaset == 1) strcat(dataValueString, coma);
943*2e9d4914SAndroid Build Coastguard Worker 							strcat(dataValueString, buffer);
944*2e9d4914SAndroid Build Coastguard Worker 						break;
945*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_INT64:
946*2e9d4914SAndroid Build Coastguard Worker 							sprintf(buffer, "%lld", config_setting_get_int64(ss));
947*2e9d4914SAndroid Build Coastguard Worker 							dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+strlen(buffer)+2)*sizeof(char));
948*2e9d4914SAndroid Build Coastguard Worker 							if(comaset == 1) strcat(dataValueString, coma);
949*2e9d4914SAndroid Build Coastguard Worker 							strcat(dataValueString, buffer);
950*2e9d4914SAndroid Build Coastguard Worker 						break;
951*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_FLOAT:
952*2e9d4914SAndroid Build Coastguard Worker 							sprintf(buffer, "%f", config_setting_get_float(ss));
953*2e9d4914SAndroid Build Coastguard Worker 							dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+strlen(buffer)+2)*sizeof(char));
954*2e9d4914SAndroid Build Coastguard Worker 							if(comaset == 1) strcat(dataValueString, coma);
955*2e9d4914SAndroid Build Coastguard Worker 							strcat(dataValueString, buffer);
956*2e9d4914SAndroid Build Coastguard Worker 						break;
957*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_STRING:
958*2e9d4914SAndroid Build Coastguard Worker 							ssize = (int)strlen(config_setting_get_string(ss));
959*2e9d4914SAndroid Build Coastguard Worker 
960*2e9d4914SAndroid Build Coastguard Worker 							dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+ssize+2)*sizeof(char));
961*2e9d4914SAndroid Build Coastguard Worker 							if(comaset == 1) strcat(dataValueString, coma);
962*2e9d4914SAndroid Build Coastguard Worker 							strcat(dataValueString, config_setting_get_string(ss));
963*2e9d4914SAndroid Build Coastguard Worker 						break;
964*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_BOOL:
965*2e9d4914SAndroid Build Coastguard Worker 							if(optflags.boolstring == 1) {
966*2e9d4914SAndroid Build Coastguard Worker 								ibuffer = config_setting_get_bool(ss);
967*2e9d4914SAndroid Build Coastguard Worker 								if(ibuffer == CONFIG_TRUE) {
968*2e9d4914SAndroid Build Coastguard Worker 									//if bool must be outputed as humen readable - convert it
969*2e9d4914SAndroid Build Coastguard Worker 									dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+4+2)*sizeof(char));
970*2e9d4914SAndroid Build Coastguard Worker 									if(comaset == 1) strcat(dataValueString, coma);
971*2e9d4914SAndroid Build Coastguard Worker 									strcat(dataValueString, "true");
972*2e9d4914SAndroid Build Coastguard Worker 								} else {
973*2e9d4914SAndroid Build Coastguard Worker 									dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+5+2)*sizeof(char));
974*2e9d4914SAndroid Build Coastguard Worker 									if(comaset == 1) strcat(dataValueString, coma);
975*2e9d4914SAndroid Build Coastguard Worker 									strcat(dataValueString, "false");
976*2e9d4914SAndroid Build Coastguard Worker 								}
977*2e9d4914SAndroid Build Coastguard Worker 							} else {
978*2e9d4914SAndroid Build Coastguard Worker 								//else output as digit
979*2e9d4914SAndroid Build Coastguard Worker 								sprintf(buffer, "%d", config_setting_get_bool(ss));
980*2e9d4914SAndroid Build Coastguard Worker 								dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+strlen(buffer)+2)*sizeof(char));
981*2e9d4914SAndroid Build Coastguard Worker 								if(comaset == 1) strcat(dataValueString, coma);
982*2e9d4914SAndroid Build Coastguard Worker 								strcat(dataValueString, buffer);
983*2e9d4914SAndroid Build Coastguard Worker 							};
984*2e9d4914SAndroid Build Coastguard Worker 						break;
985*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_ARRAY:
986*2e9d4914SAndroid Build Coastguard Worker 								//if array contains array output as kwyword ARRAY
987*2e9d4914SAndroid Build Coastguard Worker 								dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+7)*sizeof(char));
988*2e9d4914SAndroid Build Coastguard Worker 								if(comaset == 1) strcat(dataValueString, coma);
989*2e9d4914SAndroid Build Coastguard Worker 								strcat(dataValueString, "ARRAY");
990*2e9d4914SAndroid Build Coastguard Worker 						break;
991*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_LIST:
992*2e9d4914SAndroid Build Coastguard Worker 								//if array contains list output as keyword LIST
993*2e9d4914SAndroid Build Coastguard Worker 								dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+6)*sizeof(char));
994*2e9d4914SAndroid Build Coastguard Worker 								if(comaset == 1) strcat(dataValueString, coma);
995*2e9d4914SAndroid Build Coastguard Worker 								strcat(dataValueString, "LIST");
996*2e9d4914SAndroid Build Coastguard Worker 						break;
997*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_GROUP:
998*2e9d4914SAndroid Build Coastguard Worker 								//if array contains group output as keywort GROUP
999*2e9d4914SAndroid Build Coastguard Worker 								dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+7)*sizeof(char));
1000*2e9d4914SAndroid Build Coastguard Worker 								if(comaset == 1) strcat(dataValueString, coma);
1001*2e9d4914SAndroid Build Coastguard Worker 								strcat(dataValueString, "GROUP");
1002*2e9d4914SAndroid Build Coastguard Worker 						break;
1003*2e9d4914SAndroid Build Coastguard Worker 					};
1004*2e9d4914SAndroid Build Coastguard Worker 					comaset = 1;
1005*2e9d4914SAndroid Build Coastguard Worker 				};
1006*2e9d4914SAndroid Build Coastguard Worker 			};
1007*2e9d4914SAndroid Build Coastguard Worker 			break;
1008*2e9d4914SAndroid Build Coastguard Worker 		case CONFIG_TYPE_LIST:
1009*2e9d4914SAndroid Build Coastguard Worker 			dataTypeName = (char*)realloc(dataTypeName, 5*sizeof(char));
1010*2e9d4914SAndroid Build Coastguard Worker 			strcpy(dataTypeName, "list");
1011*2e9d4914SAndroid Build Coastguard Worker 			//get element count
1012*2e9d4914SAndroid Build Coastguard Worker 			maxel = (unsigned int)config_setting_length(setting);
1013*2e9d4914SAndroid Build Coastguard Worker 			//end loop over all elements
1014*2e9d4914SAndroid Build Coastguard Worker 			comaset = 0;
1015*2e9d4914SAndroid Build Coastguard Worker 			for(i = 0; i < maxel; i++) {
1016*2e9d4914SAndroid Build Coastguard Worker 				ss = config_setting_get_elem(setting, i);
1017*2e9d4914SAndroid Build Coastguard Worker 				if(ss != NULL) {
1018*2e9d4914SAndroid Build Coastguard Worker 					st = config_setting_type(ss);
1019*2e9d4914SAndroid Build Coastguard Worker 					switch(st) {
1020*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_INT:
1021*2e9d4914SAndroid Build Coastguard Worker 							sprintf(buffer, "%d", config_setting_get_int(ss));
1022*2e9d4914SAndroid Build Coastguard Worker 							dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+strlen(buffer)+2)*sizeof(char));
1023*2e9d4914SAndroid Build Coastguard Worker 							if(comaset == 1) strcat(dataValueString, coma);
1024*2e9d4914SAndroid Build Coastguard Worker 							strcat(dataValueString, buffer);
1025*2e9d4914SAndroid Build Coastguard Worker 						break;
1026*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_INT64:
1027*2e9d4914SAndroid Build Coastguard Worker 							sprintf(buffer, "%lld", config_setting_get_int64(ss));
1028*2e9d4914SAndroid Build Coastguard Worker 							dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+strlen(buffer)+2)*sizeof(char));
1029*2e9d4914SAndroid Build Coastguard Worker 							if(comaset == 1) strcat(dataValueString, coma);
1030*2e9d4914SAndroid Build Coastguard Worker 							strcat(dataValueString, buffer);
1031*2e9d4914SAndroid Build Coastguard Worker 						break;
1032*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_FLOAT:
1033*2e9d4914SAndroid Build Coastguard Worker 							sprintf(buffer, "%f", config_setting_get_float(ss));
1034*2e9d4914SAndroid Build Coastguard Worker 							dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+strlen(buffer)+2)*sizeof(char));
1035*2e9d4914SAndroid Build Coastguard Worker 							if(comaset == 1) strcat(dataValueString, coma);
1036*2e9d4914SAndroid Build Coastguard Worker 							strcat(dataValueString, buffer);
1037*2e9d4914SAndroid Build Coastguard Worker 						break;
1038*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_STRING:
1039*2e9d4914SAndroid Build Coastguard Worker 							ssize = (int)strlen(config_setting_get_string(ss));
1040*2e9d4914SAndroid Build Coastguard Worker 
1041*2e9d4914SAndroid Build Coastguard Worker 							dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+ssize+2)*sizeof(char));
1042*2e9d4914SAndroid Build Coastguard Worker 							if(comaset == 1) strcat(dataValueString, coma);
1043*2e9d4914SAndroid Build Coastguard Worker 							strcat(dataValueString, config_setting_get_string(ss));
1044*2e9d4914SAndroid Build Coastguard Worker 						break;
1045*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_BOOL:
1046*2e9d4914SAndroid Build Coastguard Worker 							if(optflags.boolstring == 1) {
1047*2e9d4914SAndroid Build Coastguard Worker 								ibuffer = config_setting_get_bool(ss);
1048*2e9d4914SAndroid Build Coastguard Worker 								if(ibuffer == CONFIG_TRUE) {
1049*2e9d4914SAndroid Build Coastguard Worker 									//if bool must be printout as humanreadable - convert it
1050*2e9d4914SAndroid Build Coastguard Worker 									dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+4+2)*sizeof(char));
1051*2e9d4914SAndroid Build Coastguard Worker 									if(comaset == 1) strcat(dataValueString, coma);
1052*2e9d4914SAndroid Build Coastguard Worker 									strcat(dataValueString, "true");
1053*2e9d4914SAndroid Build Coastguard Worker 								} else {
1054*2e9d4914SAndroid Build Coastguard Worker 									dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+5+2)*sizeof(char));
1055*2e9d4914SAndroid Build Coastguard Worker 									if(comaset == 1) strcat(dataValueString, coma);
1056*2e9d4914SAndroid Build Coastguard Worker 									strcat(dataValueString, "false");
1057*2e9d4914SAndroid Build Coastguard Worker 								}
1058*2e9d4914SAndroid Build Coastguard Worker 							} else {
1059*2e9d4914SAndroid Build Coastguard Worker 								//else output as int
1060*2e9d4914SAndroid Build Coastguard Worker 								sprintf(buffer, "%d", config_setting_get_bool(ss));
1061*2e9d4914SAndroid Build Coastguard Worker 								dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+strlen(buffer)+2)*sizeof(char));
1062*2e9d4914SAndroid Build Coastguard Worker 								if(comaset == 1) strcat(dataValueString, coma);
1063*2e9d4914SAndroid Build Coastguard Worker 								strcat(dataValueString, buffer);
1064*2e9d4914SAndroid Build Coastguard Worker 							};
1065*2e9d4914SAndroid Build Coastguard Worker 						break;
1066*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_ARRAY:
1067*2e9d4914SAndroid Build Coastguard Worker 								//if list contain array output as keyword ARRAY
1068*2e9d4914SAndroid Build Coastguard Worker 								dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+7)*sizeof(char));
1069*2e9d4914SAndroid Build Coastguard Worker 								if(comaset == 1) strcat(dataValueString, coma);
1070*2e9d4914SAndroid Build Coastguard Worker 								strcat(dataValueString, "ARRAY");
1071*2e9d4914SAndroid Build Coastguard Worker 						break;
1072*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_LIST:
1073*2e9d4914SAndroid Build Coastguard Worker 								//if list contain list output as keyword LIST
1074*2e9d4914SAndroid Build Coastguard Worker 								dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+6)*sizeof(char));
1075*2e9d4914SAndroid Build Coastguard Worker 								if(comaset == 1) strcat(dataValueString, coma);
1076*2e9d4914SAndroid Build Coastguard Worker 								strcat(dataValueString, "LIST");
1077*2e9d4914SAndroid Build Coastguard Worker 						break;
1078*2e9d4914SAndroid Build Coastguard Worker 						case CONFIG_TYPE_GROUP:
1079*2e9d4914SAndroid Build Coastguard Worker 								//if list contain group output as keyword GROUP
1080*2e9d4914SAndroid Build Coastguard Worker 								dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+7)*sizeof(char));
1081*2e9d4914SAndroid Build Coastguard Worker 								if(comaset == 1) strcat(dataValueString, coma);
1082*2e9d4914SAndroid Build Coastguard Worker 								strcat(dataValueString, "GROUP");
1083*2e9d4914SAndroid Build Coastguard Worker 						break;
1084*2e9d4914SAndroid Build Coastguard Worker 					};
1085*2e9d4914SAndroid Build Coastguard Worker 					comaset = 1;
1086*2e9d4914SAndroid Build Coastguard Worker 				};
1087*2e9d4914SAndroid Build Coastguard Worker 			};
1088*2e9d4914SAndroid Build Coastguard Worker 			break;
1089*2e9d4914SAndroid Build Coastguard Worker 		case CONFIG_TYPE_GROUP:
1090*2e9d4914SAndroid Build Coastguard Worker 			dataTypeName = (char*)realloc(dataTypeName, 6*sizeof(char));
1091*2e9d4914SAndroid Build Coastguard Worker 			strcpy(dataTypeName, "group");
1092*2e9d4914SAndroid Build Coastguard Worker 			//get elementc count
1093*2e9d4914SAndroid Build Coastguard Worker 			maxel = (unsigned int)config_setting_length(setting);
1094*2e9d4914SAndroid Build Coastguard Worker 			//and loop over all elements
1095*2e9d4914SAndroid Build Coastguard Worker 			//but in group case, we return inside variables names
1096*2e9d4914SAndroid Build Coastguard Worker 			comaset = 0;
1097*2e9d4914SAndroid Build Coastguard Worker 			for(i = 0; i < maxel; i++) {
1098*2e9d4914SAndroid Build Coastguard Worker 				ss = config_setting_get_elem(setting, i);
1099*2e9d4914SAndroid Build Coastguard Worker 				if(ss != NULL) {
1100*2e9d4914SAndroid Build Coastguard Worker 					ssize = (int)strlen(config_setting_name(ss));
1101*2e9d4914SAndroid Build Coastguard Worker 					dataValueString = (char*)realloc(dataValueString, (strlen(dataValueString)+ssize+2)*sizeof(char));
1102*2e9d4914SAndroid Build Coastguard Worker 					if(comaset == 1) strcat(dataValueString, coma);
1103*2e9d4914SAndroid Build Coastguard Worker 					strcat(dataValueString, config_setting_name(ss));
1104*2e9d4914SAndroid Build Coastguard Worker 					comaset = 1;
1105*2e9d4914SAndroid Build Coastguard Worker 				};
1106*2e9d4914SAndroid Build Coastguard Worker 			};
1107*2e9d4914SAndroid Build Coastguard Worker 			break;
1108*2e9d4914SAndroid Build Coastguard Worker 	};
1109*2e9d4914SAndroid Build Coastguard Worker 
1110*2e9d4914SAndroid Build Coastguard Worker 	//last we get readed variable index, and element count
1111*2e9d4914SAndroid Build Coastguard Worker 	varindex = config_setting_index(setting);
1112*2e9d4914SAndroid Build Coastguard Worker 	varcounter = config_setting_length(setting);
1113*2e9d4914SAndroid Build Coastguard Worker 
1114*2e9d4914SAndroid Build Coastguard Worker 	//and finaly output data
1115*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.names == 1 && optflags.quiet == 0) printf(gettext("Variable name:           %s\n"), dataName);
1116*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.names == 1 && optflags.quiet == 1) printf("%s", dataName);
1117*2e9d4914SAndroid Build Coastguard Worker 	if((optflags.types == 1 && optflags.quiet == 1) && optflags.names == 1) printf(":");
1118*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.types == 1 && optflags.quiet == 0) printf(gettext("Variable type:           %s\n"), dataTypeName);
1119*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.types == 1 && optflags.quiet == 1) printf("%s", dataTypeName);
1120*2e9d4914SAndroid Build Coastguard Worker 	if((optflags.values == 1 && optflags.quiet == 1) && (optflags.names == 1 || optflags.types == 1)) printf(":");
1121*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.values == 1 && optflags.quiet == 0) printf(gettext("Variable value:          %s\n"), dataValueString);
1122*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.values == 1 && optflags.quiet == 1) printf("%s", dataValueString);
1123*2e9d4914SAndroid Build Coastguard Worker 	if((optflags.indexes == 1 && optflags.quiet == 1) && (optflags.names == 1 || optflags.types == 1 || optflags.values == 1)) printf(":");
1124*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.indexes == 1 && optflags.quiet == 0) printf(gettext("Variable index:          %d\n"), varindex);
1125*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.indexes == 1 && optflags.quiet == 1) printf("%d", varindex);
1126*2e9d4914SAndroid Build Coastguard Worker 	if((optflags.counter == 1 && optflags.quiet == 1) && (optflags.names == 1 || optflags.types == 1 || optflags.values == 1 || optflags.indexes == 1)) printf(":");
1127*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.counter == 1 && optflags.quiet == 0) printf(gettext("Variable elements count: %d\n"), varcounter);
1128*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.counter == 1 && optflags.quiet == 1) printf("%d", varcounter);
1129*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.quiet == 1) printf("\n");
1130*2e9d4914SAndroid Build Coastguard Worker 
1131*2e9d4914SAndroid Build Coastguard Worker 	config_destroy(&cfg);
1132*2e9d4914SAndroid Build Coastguard Worker 	return 0;
1133*2e9d4914SAndroid Build Coastguard Worker }
1134*2e9d4914SAndroid Build Coastguard Worker 
main(int argc,char ** argv)1135*2e9d4914SAndroid Build Coastguard Worker int main(int argc, char **argv) {
1136*2e9d4914SAndroid Build Coastguard Worker 	//firs set locale and domain to work with internationalization
1137*2e9d4914SAndroid Build Coastguard Worker 	setlocale(LC_ALL, "");
1138*2e9d4914SAndroid Build Coastguard Worker 	bindtextdomain("ls-config", "/usr/share/locale");
1139*2e9d4914SAndroid Build Coastguard Worker 	textdomain("ls-config");
1140*2e9d4914SAndroid Build Coastguard Worker 
1141*2e9d4914SAndroid Build Coastguard Worker 	//then declare and init values
1142*2e9d4914SAndroid Build Coastguard Worker    int opt,test; //used for read innput: option, and testing
1143*2e9d4914SAndroid Build Coastguard Worker 	int fd; //file descriptor
1144*2e9d4914SAndroid Build Coastguard Worker 	char *sinp, *dataPath=NULL, *dataString=NULL, *dataType=NULL; //string input, configuration variable path, input data, variable type
1145*2e9d4914SAndroid Build Coastguard Worker 	char *configFile=NULL; //config file name (with path)
1146*2e9d4914SAndroid Build Coastguard Worker    struct flags optflags = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //global flags initialize
1147*2e9d4914SAndroid Build Coastguard Worker 	int excode; //program exit code
1148*2e9d4914SAndroid Build Coastguard Worker 	excode = 0;
1149*2e9d4914SAndroid Build Coastguard Worker 
1150*2e9d4914SAndroid Build Coastguard Worker 	sinp = malloc(sizeof(char) * 256);
1151*2e9d4914SAndroid Build Coastguard Worker 
1152*2e9d4914SAndroid Build Coastguard Worker 	//long options reading
1153*2e9d4914SAndroid Build Coastguard Worker 	struct option long_options[] = {
1154*2e9d4914SAndroid Build Coastguard Worker 		/* These options set a flag. */
1155*2e9d4914SAndroid Build Coastguard Worker 		{"quiet",   no_argument, &optflags.quiet, 1},
1156*2e9d4914SAndroid Build Coastguard Worker 		{"names",   no_argument, &optflags.names, 1},
1157*2e9d4914SAndroid Build Coastguard Worker 		{"types",   no_argument, &optflags.types, 1},
1158*2e9d4914SAndroid Build Coastguard Worker 		{"values",   no_argument, &optflags.values, 1},
1159*2e9d4914SAndroid Build Coastguard Worker 		{"indexes",   no_argument, &optflags.indexes, 1},
1160*2e9d4914SAndroid Build Coastguard Worker 		{"count",   no_argument, &optflags.counter, 1},
1161*2e9d4914SAndroid Build Coastguard Worker 		{"unset",   no_argument, &optflags.unset, 1},
1162*2e9d4914SAndroid Build Coastguard Worker 		{"bool-string",   no_argument, &optflags.boolstring, 1},
1163*2e9d4914SAndroid Build Coastguard Worker 		/* These options don't set a flag.
1164*2e9d4914SAndroid Build Coastguard Worker 		 We distinguish them by their indices. */
1165*2e9d4914SAndroid Build Coastguard Worker 		{"help", no_argument, 0, 'h'},
1166*2e9d4914SAndroid Build Coastguard Worker 		{"set",  required_argument, 0, 's'},
1167*2e9d4914SAndroid Build Coastguard Worker 		{"get",  optional_argument, 0, 'g'},
1168*2e9d4914SAndroid Build Coastguard Worker 		{"data", required_argument, 0, 'd'},
1169*2e9d4914SAndroid Build Coastguard Worker 		{"type", required_argument, 0, 'p'},
1170*2e9d4914SAndroid Build Coastguard Worker 		{"file", required_argument, 0, 'f'},
1171*2e9d4914SAndroid Build Coastguard Worker 		{0, 0, 0, 0}
1172*2e9d4914SAndroid Build Coastguard Worker 	};
1173*2e9d4914SAndroid Build Coastguard Worker 
1174*2e9d4914SAndroid Build Coastguard Worker 	//next collect all input (given as options to program)
1175*2e9d4914SAndroid Build Coastguard Worker 	while(1) {
1176*2e9d4914SAndroid Build Coastguard Worker 		int option_index = 0;
1177*2e9d4914SAndroid Build Coastguard Worker 		opt = getopt_long (argc, argv, "qntvicubs:g:d:p:hf:", long_options, &option_index);
1178*2e9d4914SAndroid Build Coastguard Worker 
1179*2e9d4914SAndroid Build Coastguard Worker 		if(opt == -1) break;
1180*2e9d4914SAndroid Build Coastguard Worker 
1181*2e9d4914SAndroid Build Coastguard Worker 		switch (opt) {
1182*2e9d4914SAndroid Build Coastguard Worker 			case 0:
1183*2e9d4914SAndroid Build Coastguard Worker 				/* If this option set a flag, do nothing else now. */
1184*2e9d4914SAndroid Build Coastguard Worker 				if(long_options[option_index].flag != 0) break;
1185*2e9d4914SAndroid Build Coastguard Worker 				if(strcmp(long_options[option_index].name, "set") == 0 && optarg) {
1186*2e9d4914SAndroid Build Coastguard Worker 					test = sscanf(optarg, "%s", sinp);
1187*2e9d4914SAndroid Build Coastguard Worker 					if(test > 0) {
1188*2e9d4914SAndroid Build Coastguard Worker 						dataPath = (char*)malloc((strlen(sinp)+1)*sizeof(char));
1189*2e9d4914SAndroid Build Coastguard Worker 						strcpy(dataPath, sinp);
1190*2e9d4914SAndroid Build Coastguard Worker 					};
1191*2e9d4914SAndroid Build Coastguard Worker 					optflags.mode = 1;
1192*2e9d4914SAndroid Build Coastguard Worker 				};
1193*2e9d4914SAndroid Build Coastguard Worker 				if(strcmp(long_options[option_index].name, "get") == 0 && optarg) {
1194*2e9d4914SAndroid Build Coastguard Worker 					test = sscanf(optarg, "%s", sinp);
1195*2e9d4914SAndroid Build Coastguard Worker 					if(test > 0) {
1196*2e9d4914SAndroid Build Coastguard Worker 						dataPath = (char*)malloc((strlen(sinp)+1)*sizeof(char));
1197*2e9d4914SAndroid Build Coastguard Worker 						strcpy(dataPath, sinp);
1198*2e9d4914SAndroid Build Coastguard Worker 					};
1199*2e9d4914SAndroid Build Coastguard Worker 					optflags.mode = 0;
1200*2e9d4914SAndroid Build Coastguard Worker 				};
1201*2e9d4914SAndroid Build Coastguard Worker 				if(strcmp(long_options[option_index].name, "data") == 0 && optarg) {
1202*2e9d4914SAndroid Build Coastguard Worker 					test = sscanf(optarg, "%[^\n]s", sinp);
1203*2e9d4914SAndroid Build Coastguard Worker 					if(test > 0) {
1204*2e9d4914SAndroid Build Coastguard Worker 						dataString = (char*)malloc((strlen(sinp)+1)*sizeof(char));
1205*2e9d4914SAndroid Build Coastguard Worker 						strcpy(dataString, sinp);
1206*2e9d4914SAndroid Build Coastguard Worker 					};
1207*2e9d4914SAndroid Build Coastguard Worker 				};
1208*2e9d4914SAndroid Build Coastguard Worker 				if(strcmp(long_options[option_index].name, "type") == 0 && optarg) {
1209*2e9d4914SAndroid Build Coastguard Worker 					test = sscanf(optarg, "%s", sinp);
1210*2e9d4914SAndroid Build Coastguard Worker 					if(test > 0) {
1211*2e9d4914SAndroid Build Coastguard Worker 						dataType = (char*)malloc((strlen(sinp)+1)*sizeof(char));
1212*2e9d4914SAndroid Build Coastguard Worker 						strcpy(dataType, sinp);
1213*2e9d4914SAndroid Build Coastguard Worker 					};
1214*2e9d4914SAndroid Build Coastguard Worker 				};
1215*2e9d4914SAndroid Build Coastguard Worker 				if(strcmp(long_options[option_index].name, "file") == 0 && optarg) {
1216*2e9d4914SAndroid Build Coastguard Worker 					test = sscanf(optarg, "%[^\n]s", sinp);
1217*2e9d4914SAndroid Build Coastguard Worker 					if(test > 0) {
1218*2e9d4914SAndroid Build Coastguard Worker 						configFile = (char*)malloc((strlen(sinp)+1)*sizeof(char));
1219*2e9d4914SAndroid Build Coastguard Worker 						strcpy(configFile, sinp);
1220*2e9d4914SAndroid Build Coastguard Worker 					};
1221*2e9d4914SAndroid Build Coastguard Worker 				};
1222*2e9d4914SAndroid Build Coastguard Worker 				break;
1223*2e9d4914SAndroid Build Coastguard Worker 			case 'q':
1224*2e9d4914SAndroid Build Coastguard Worker 				optflags.quiet = 1;
1225*2e9d4914SAndroid Build Coastguard Worker 				break;
1226*2e9d4914SAndroid Build Coastguard Worker 			case 'n':
1227*2e9d4914SAndroid Build Coastguard Worker 				optflags.names = 1;
1228*2e9d4914SAndroid Build Coastguard Worker 				break;
1229*2e9d4914SAndroid Build Coastguard Worker 			case 't':
1230*2e9d4914SAndroid Build Coastguard Worker 				optflags.types = 1;
1231*2e9d4914SAndroid Build Coastguard Worker 				break;
1232*2e9d4914SAndroid Build Coastguard Worker 			case 'v':
1233*2e9d4914SAndroid Build Coastguard Worker 				optflags.values = 1;
1234*2e9d4914SAndroid Build Coastguard Worker 				break;
1235*2e9d4914SAndroid Build Coastguard Worker 			case 'i':
1236*2e9d4914SAndroid Build Coastguard Worker 				optflags.indexes = 1;
1237*2e9d4914SAndroid Build Coastguard Worker 				break;
1238*2e9d4914SAndroid Build Coastguard Worker 			case 'c':
1239*2e9d4914SAndroid Build Coastguard Worker 				optflags.counter = 1;
1240*2e9d4914SAndroid Build Coastguard Worker 				break;
1241*2e9d4914SAndroid Build Coastguard Worker 			case 'u':
1242*2e9d4914SAndroid Build Coastguard Worker 				optflags.unset = 1;
1243*2e9d4914SAndroid Build Coastguard Worker 				break;
1244*2e9d4914SAndroid Build Coastguard Worker 			case 'b':
1245*2e9d4914SAndroid Build Coastguard Worker 				optflags.boolstring = 1;
1246*2e9d4914SAndroid Build Coastguard Worker 				break;
1247*2e9d4914SAndroid Build Coastguard Worker 			case 's':
1248*2e9d4914SAndroid Build Coastguard Worker 				if(optarg) {
1249*2e9d4914SAndroid Build Coastguard Worker 					test = sscanf(optarg, "%s", sinp);
1250*2e9d4914SAndroid Build Coastguard Worker 					if(test > 0) {
1251*2e9d4914SAndroid Build Coastguard Worker 						dataPath = (char*)malloc((strlen(sinp)+1)*sizeof(char));
1252*2e9d4914SAndroid Build Coastguard Worker 						strcpy(dataPath, sinp);
1253*2e9d4914SAndroid Build Coastguard Worker 					};
1254*2e9d4914SAndroid Build Coastguard Worker 					optflags.mode = 1;
1255*2e9d4914SAndroid Build Coastguard Worker 				};
1256*2e9d4914SAndroid Build Coastguard Worker 				break;
1257*2e9d4914SAndroid Build Coastguard Worker 			case 'g':
1258*2e9d4914SAndroid Build Coastguard Worker 				if(optarg) {
1259*2e9d4914SAndroid Build Coastguard Worker 					test = sscanf(optarg, "%s", sinp);
1260*2e9d4914SAndroid Build Coastguard Worker 					if(test > 0) {
1261*2e9d4914SAndroid Build Coastguard Worker 						dataPath = (char*)malloc((strlen(sinp)+1)*sizeof(char));
1262*2e9d4914SAndroid Build Coastguard Worker 						strcpy(dataPath, sinp);
1263*2e9d4914SAndroid Build Coastguard Worker 					};
1264*2e9d4914SAndroid Build Coastguard Worker 				};
1265*2e9d4914SAndroid Build Coastguard Worker 				optflags.mode = 0;
1266*2e9d4914SAndroid Build Coastguard Worker 				break;
1267*2e9d4914SAndroid Build Coastguard Worker 			case 'd':
1268*2e9d4914SAndroid Build Coastguard Worker 				if(optarg) {
1269*2e9d4914SAndroid Build Coastguard Worker 					test = sscanf(optarg, "%[^\n]s", sinp);
1270*2e9d4914SAndroid Build Coastguard Worker 					if(test > 0) {
1271*2e9d4914SAndroid Build Coastguard Worker 						dataString = (char*)malloc((strlen(sinp)+1)*sizeof(char));
1272*2e9d4914SAndroid Build Coastguard Worker 						strcpy(dataString, sinp);
1273*2e9d4914SAndroid Build Coastguard Worker 					};
1274*2e9d4914SAndroid Build Coastguard Worker 				};
1275*2e9d4914SAndroid Build Coastguard Worker 				break;
1276*2e9d4914SAndroid Build Coastguard Worker 			case 'p':
1277*2e9d4914SAndroid Build Coastguard Worker 				if(optarg) {
1278*2e9d4914SAndroid Build Coastguard Worker 					test = sscanf(optarg, "%s", sinp);
1279*2e9d4914SAndroid Build Coastguard Worker 					if(test > 0) {
1280*2e9d4914SAndroid Build Coastguard Worker 						dataType = (char*)malloc((strlen(sinp)+1)*sizeof(char));
1281*2e9d4914SAndroid Build Coastguard Worker 						strcpy(dataType, sinp);
1282*2e9d4914SAndroid Build Coastguard Worker 					};
1283*2e9d4914SAndroid Build Coastguard Worker 				};
1284*2e9d4914SAndroid Build Coastguard Worker 				break;
1285*2e9d4914SAndroid Build Coastguard Worker 			case 'h':
1286*2e9d4914SAndroid Build Coastguard Worker 				//free input buffer and printout help message
1287*2e9d4914SAndroid Build Coastguard Worker 				free(sinp);
1288*2e9d4914SAndroid Build Coastguard Worker 				printHelp(); //this function contain exit from program
1289*2e9d4914SAndroid Build Coastguard Worker 				break;
1290*2e9d4914SAndroid Build Coastguard Worker 			case 'f':
1291*2e9d4914SAndroid Build Coastguard Worker 				test = sscanf(optarg, "%[^\n]s", sinp);
1292*2e9d4914SAndroid Build Coastguard Worker 				if(test > 0) {
1293*2e9d4914SAndroid Build Coastguard Worker 					configFile = (char*)malloc((strlen(sinp)+1)*sizeof(char));
1294*2e9d4914SAndroid Build Coastguard Worker 					strcpy(configFile, sinp);
1295*2e9d4914SAndroid Build Coastguard Worker 				};
1296*2e9d4914SAndroid Build Coastguard Worker 				break;
1297*2e9d4914SAndroid Build Coastguard Worker 			case '?':
1298*2e9d4914SAndroid Build Coastguard Worker 				break;
1299*2e9d4914SAndroid Build Coastguard Worker 			default:
1300*2e9d4914SAndroid Build Coastguard Worker 				break;
1301*2e9d4914SAndroid Build Coastguard Worker 		}
1302*2e9d4914SAndroid Build Coastguard Worker 	};
1303*2e9d4914SAndroid Build Coastguard Worker 
1304*2e9d4914SAndroid Build Coastguard Worker 	//first of all we must ensure, then configuration file are available with right access mode
1305*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.mode == 0 && access(configFile, R_OK) < 0) optflags.error = 1;
1306*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.mode == 1) {
1307*2e9d4914SAndroid Build Coastguard Worker 		fd = open(configFile, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
1308*2e9d4914SAndroid Build Coastguard Worker 		if(fd < 0) {
1309*2e9d4914SAndroid Build Coastguard Worker 			optflags.error = 1;
1310*2e9d4914SAndroid Build Coastguard Worker  		};
1311*2e9d4914SAndroid Build Coastguard Worker 		close(fd);
1312*2e9d4914SAndroid Build Coastguard Worker    };
1313*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.error > 0) {
1314*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Can't read configuration file.\n"));
1315*2e9d4914SAndroid Build Coastguard Worker 		free(sinp);
1316*2e9d4914SAndroid Build Coastguard Worker 		free(configFile);
1317*2e9d4914SAndroid Build Coastguard Worker 		exit(1);
1318*2e9d4914SAndroid Build Coastguard Worker    };
1319*2e9d4914SAndroid Build Coastguard Worker 
1320*2e9d4914SAndroid Build Coastguard Worker 	//now if we want to set variable, we must have his path
1321*2e9d4914SAndroid Build Coastguard Worker    if(optflags.mode == 1 && dataPath == NULL) {
1322*2e9d4914SAndroid Build Coastguard Worker 		if(optflags.quiet == 0) printf(gettext("ERROR! Conviguration variable path not given.\n"));
1323*2e9d4914SAndroid Build Coastguard Worker 		free(sinp);
1324*2e9d4914SAndroid Build Coastguard Worker 		free(configFile);
1325*2e9d4914SAndroid Build Coastguard Worker 		exit(4);
1326*2e9d4914SAndroid Build Coastguard Worker    };
1327*2e9d4914SAndroid Build Coastguard Worker 
1328*2e9d4914SAndroid Build Coastguard Worker 	//if no output data requested, set to default output
1329*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.names == 0 && optflags.types == 0 && optflags.values == 0 && optflags.indexes == 0 && optflags.counter == 0) {
1330*2e9d4914SAndroid Build Coastguard Worker 		optflags.names = 1;
1331*2e9d4914SAndroid Build Coastguard Worker 		optflags.types = 1;
1332*2e9d4914SAndroid Build Coastguard Worker 		optflags.values = 1;
1333*2e9d4914SAndroid Build Coastguard Worker 	};
1334*2e9d4914SAndroid Build Coastguard Worker 
1335*2e9d4914SAndroid Build Coastguard Worker 	//now we invode main work of this software based on request type (set, unset of get)
1336*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.mode == 0) excode = read_config(configFile, dataPath, optflags);
1337*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.mode == 1 && optflags.unset == 1) excode = unset_config(configFile, dataPath, optflags);
1338*2e9d4914SAndroid Build Coastguard Worker 	if(optflags.mode == 1 && optflags.unset == 0) excode = set_config(configFile, dataPath, optflags, dataString, dataType);
1339*2e9d4914SAndroid Build Coastguard Worker 
1340*2e9d4914SAndroid Build Coastguard Worker 	//then finalize free resources and exit returnig excode
1341*2e9d4914SAndroid Build Coastguard Worker 	free(sinp);
1342*2e9d4914SAndroid Build Coastguard Worker 	free(configFile);
1343*2e9d4914SAndroid Build Coastguard Worker 	exit(excode);
1344*2e9d4914SAndroid Build Coastguard Worker }
1345*2e9d4914SAndroid Build Coastguard Worker 
1346