00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00024
00025
00026
00027 #include <stdlib.h>
00028 #include <malloc.h>
00029 #include <stdio.h>
00030 #include <string.h>
00031 #include "lcmaps_log.h"
00032 #include "_lcmaps_db_read.h"
00033
00034
00035
00036
00037 #define MAXDBENTRIES 250
00038 #define MAXPAIRS 2
00041 #define WHITESPACE_CHARS " \t\n"
00042 #define QUOTING_CHARS "\""
00043 #define ESCAPING_CHARS "\\"
00044 #define COMMENT_CHARS "#"
00047 #define PAIR_SEP_CHARS ","
00048
00049 #define VARVAL_SEP_CHARS "="
00050
00051
00052
00053
00054
00059 #define PAIR_TERMINATOR_CHARS PAIR_SEP_CHARS WHITESPACE_CHARS
00060
00064 #define VARVAL_TERMINATOR_CHARS VARVAL_SEP_CHARS WHITESPACE_CHARS
00065
00066 #ifndef NUL
00067 #define NUL '\0'
00068 #endif
00069
00070
00071
00072
00073 static int lcmaps_db_read_entries(FILE *);
00074 static int lcmaps_db_parse_line(char *, lcmaps_db_entry_t **);
00075 static int lcmaps_db_parse_pair(char *, char **, char **);
00076 static int lcmaps_db_parse_string(char **);
00077
00078
00079
00080
00081 static lcmaps_db_entry_t * lcmaps_db_list=NULL;
00083
00084
00085
00086
00096 lcmaps_db_entry_t ** lcmaps_db_read(
00097 char * lcmaps_db_fname
00098 )
00099 {
00100 FILE * lcmaps_db_fhandle;
00101 int no_entries;
00102
00103 lcmaps_db_fhandle = fopen(lcmaps_db_fname, "r");
00104 if (lcmaps_db_fhandle == NULL)
00105 {
00106
00107 return NULL;
00108 }
00109
00110 no_entries=lcmaps_db_read_entries(lcmaps_db_fhandle);
00111 if (no_entries < 0)
00112 {
00113 lcmaps_log(0,"lcmaps.mod-lcmaps_db_read(): Parse error in line %d of %s\n",
00114 -(no_entries), lcmaps_db_fname);
00115 fclose(lcmaps_db_fhandle);
00116 return NULL;
00117 }
00118 else if (no_entries > MAXDBENTRIES)
00119 {
00120 lcmaps_log(0,"lcmaps.mod-lcmaps_db_read(): Too many entries found in %s\n",
00121 lcmaps_db_fname);
00122 lcmaps_log(0,"lcmaps.mod-lcmaps_db_read(): Only the first %d entries are used\n",
00123 MAXDBENTRIES);
00124 }
00125 fclose(lcmaps_db_fhandle);
00126
00127 return &lcmaps_db_list;
00128 }
00129
00139 static int lcmaps_db_read_entries(
00140 FILE * dbstream
00141 )
00142 {
00143 char line[1024];
00144 int nlines=0;
00145 int no_entries=0;
00146 lcmaps_db_entry_t * entry=NULL;
00147
00148 nlines=0;
00149 no_entries=0;
00150
00151 while (fgets(line, sizeof(line), dbstream))
00152 {
00153 ++nlines;
00154
00155 if (! lcmaps_db_parse_line(line, &entry))
00156 {
00157
00158 if (entry != NULL) free(entry);
00159 return -(nlines);
00160 }
00161 if (entry != NULL)
00162 {
00163 lcmaps_log_debug(3,"line %d: %s, %s\n",nlines,entry->pluginname,entry->pluginargs);
00164
00165 ++no_entries;
00166 if (no_entries > MAXDBENTRIES)
00167 {
00168 if (entry != NULL) free(entry);
00169 return no_entries;
00170 }
00171 if ( lcmaps_db_fill_entry(&lcmaps_db_list, entry)==NULL )
00172 {
00173
00174 if (entry != NULL) free(entry);
00175 return -(nlines);
00176 }
00177 if (entry != NULL) free(entry);
00178 entry=NULL;
00179 }
00180 else
00181 {
00182
00183 continue;
00184 }
00185 }
00186 if (entry != NULL) free(entry);
00187 return no_entries;
00188 }
00189
00190
00191
00192
00193
00205 lcmaps_db_entry_t * lcmaps_db_fill_entry(
00206 lcmaps_db_entry_t ** list,
00207 lcmaps_db_entry_t * entry
00208 )
00209 {
00210 lcmaps_db_entry_t * plist;
00211
00212 if (entry == NULL)
00213 {
00214 lcmaps_log(0,"lcmaps.mod-lcmaps_db_fill_entry(): error null entry\n");
00215 return NULL;
00216 }
00217
00218 if (!(*list))
00219 {
00220 lcmaps_log_debug(2,"lcmaps.mod-lcmaps_db_fill_entry(): creating first list entry\n");
00221 *list=plist=(lcmaps_db_entry_t *)malloc(sizeof(lcmaps_db_entry_t));
00222 }
00223 else
00224 {
00225 lcmaps_log_debug(2,"lcmaps.mod-lcmaps_db_fill_entry(): creating new list entry\n");
00226 plist=*list;
00227 while (plist->next) plist=plist->next;
00228 plist=plist->next=(lcmaps_db_entry_t *)malloc(sizeof(lcmaps_db_entry_t));
00229 }
00230 if (!plist)
00231 {
00232 lcmaps_log(0,"lcmaps.mod-lcmaps_db_fill_entry(): error creating new list entry\n");
00233 return NULL;
00234 }
00235 plist->next=NULL;
00236
00237 if (entry->pluginname != NULL)
00238 {
00239 strncpy(plist->pluginname,entry->pluginname,LCMAPS_MAXPATHLEN);
00240 (plist->pluginname)[LCMAPS_MAXPATHLEN]=NUL;
00241 }
00242 else
00243 strncpy(plist->pluginname,"",LCMAPS_MAXPATHLEN);
00244
00245 if (entry->pluginargs != NULL)
00246 {
00247 strncpy(plist->pluginargs,entry->pluginargs,LCMAPS_MAXARGSTRING);
00248 (plist->pluginargs)[LCMAPS_MAXARGSTRING]=NUL;
00249 }
00250 else
00251 strncpy(plist->pluginargs,"",LCMAPS_MAXARGSTRING);
00252
00253 return plist;
00254 }
00255
00268 static int lcmaps_db_parse_line(
00269 char * line,
00270 lcmaps_db_entry_t ** entry
00271 )
00272 {
00273 char * var_val_pairs[MAXPAIRS];
00274 char * var;
00275 char * val;
00276 int ipair;
00277 int no_pairs;
00278 size_t len;
00279 lcmaps_db_entry_t * tmp_entry=NULL;
00280
00281
00282 if ((line == NULL) || (*entry != NULL))
00283 {
00284 lcmaps_log(0,"lcmaps.mod-lcmaps_db_parse_line(): something wrong with arguments\n");
00285 goto error;
00286 }
00287
00288
00289 line += strspn(line, WHITESPACE_CHARS);
00290
00291
00292 if (strchr(COMMENT_CHARS, *line) != NULL)
00293 {
00294
00295 *entry=NULL;
00296 return 1;
00297 }
00298
00299
00300 if (*line == NUL)
00301 {
00302
00303 *entry=NULL;
00304 return 1;
00305 }
00306
00307
00308 ipair=0;
00309 len=0;
00310 while (*line != NUL)
00311 {
00312 len=strcspn(line, PAIR_SEP_CHARS);
00313 if (len > 0)
00314 {
00315 var_val_pairs[ipair] = line;
00316 ipair++;
00317 line+=len;
00318 if (*line == NUL)
00319 {
00320
00321 continue;
00322 }
00323 if (strchr(PAIR_SEP_CHARS, *line) != NULL)
00324 {
00325 *line=NUL;
00326 line += 1;
00327 }
00328 }
00329 else
00330 {
00331
00332 line += 1;
00333 }
00334 line += strspn(line, WHITESPACE_CHARS);
00335 }
00336 no_pairs=ipair;
00337 if (no_pairs)
00338 {
00339 tmp_entry=malloc(sizeof(*tmp_entry));
00340 if (tmp_entry == NULL)
00341 {
00342 lcmaps_log(0,"lcmaps.mod-lcmaps_db_parse_line(): error allocating memory\n");
00343 goto error;
00344 }
00345
00346
00347 (tmp_entry->pluginname)[0] = NUL;
00348 (tmp_entry->pluginargs)[0] = NUL;
00349 for (ipair=0; ipair < no_pairs; ipair++)
00350 {
00351 int rc=0;
00352 lcmaps_log_debug(3,"pair %d:%s-endpair\n",ipair, var_val_pairs[ipair]);
00353 rc=lcmaps_db_parse_pair(var_val_pairs[ipair], &var, &val);
00354 if (! rc)
00355 {
00356
00357 lcmaps_log(0,"lcmaps.mod-lcmaps_db_parse_line(): error parsing variable-value pair\n");
00358 goto error;
00359 }
00360 lcmaps_log_debug(3,"var: %s, value: %s\n",var,val);
00361
00362 if (strncmp(var,"pluginname",strlen("pluginname")) == 0)
00363 {
00364
00365 strncpy(tmp_entry->pluginname,val,LCMAPS_MAXPATHLEN);
00366 (tmp_entry->pluginname)[LCMAPS_MAXPATHLEN]=NUL;
00367 }
00368 else if (strncmp(var,"pluginargs",strlen("pluginargs")) == 0)
00369 {
00370
00371 strncpy(tmp_entry->pluginargs,val,LCMAPS_MAXARGSTRING);
00372 (tmp_entry->pluginargs)[LCMAPS_MAXARGSTRING]=NUL;
00373 }
00374 else
00375 {
00376
00377 }
00378 }
00379 }
00380
00381
00382 *entry=tmp_entry;
00383 return 1;
00384
00385 error:
00386 if (tmp_entry != NULL) free(tmp_entry);
00387 return 0;
00388 }
00389
00404 static int lcmaps_db_parse_pair(
00405 char * pair,
00406 char ** pvar,
00407 char ** pval
00408 )
00409 {
00410 int len;
00411 char * var;
00412 char * val;
00413
00414 if (pair == NULL)
00415 {
00416 lcmaps_log(0,"lcmaps.mod-lcmaps_db_parse_pair(): cannot parse empty pair\n");
00417 return 0;
00418 }
00419
00420
00421 pair += strspn(pair, WHITESPACE_CHARS);
00422 if (*pair == NUL)
00423 {
00424 lcmaps_log(0,"lcmaps.mod-lcmaps_db_parse_pair(): cannot parse empty pair\n");
00425 return 0;
00426 }
00427
00428 var=pair;
00429 len=strcspn(pair, VARVAL_SEP_CHARS);
00430 pair+=len;
00431 if (*pair == NUL)
00432 {
00433
00434 lcmaps_log(0,"lcmaps.mod-lcmaps_db_parse_pair(): cannot find =\n");
00435 return 0;
00436 }
00437
00438 if (strchr(VARVAL_SEP_CHARS, *pair) != NULL)
00439 {
00440
00441 *pair=NUL;
00442 if (! lcmaps_db_parse_string(&var))
00443 {
00444
00445 return 0;
00446 }
00447 pair+=1;
00448 if (*pair==NUL)
00449 {
00450
00451
00452 val=pair;
00453 *pvar=var;
00454 *pval=val;
00455 return 1;
00456 }
00457 else
00458 {
00459
00460 pair += strspn(pair, WHITESPACE_CHARS);
00461 if (*pair == NUL)
00462 {
00463
00464
00465 val=pair;
00466 *pvar=var;
00467 *pval=val;
00468 return 1;
00469 }
00470 val=pair;
00471 if (! lcmaps_db_parse_string(&val))
00472 {
00473
00474 return 0;
00475 }
00476 }
00477 }
00478 else
00479 {
00480
00481 lcmaps_log(0,"lcmaps.mod-lcmaps_db_parse_pair(): cannot find =\n");
00482 return 0;
00483 }
00484
00485
00486 *pvar=var;
00487 *pval=val;
00488 return 1;
00489 }
00490
00501 static int lcmaps_db_parse_string(
00502 char ** pstring
00503 )
00504 {
00505 char * end;
00506 char * string;
00507
00508 string=*pstring;
00509
00510 if (*string==NUL)
00511 {
00512 lcmaps_log(0,"lcmaps.mod-lcmaps_db_parse_string(): error parsing null string\n");
00513 return 0;
00514 }
00515
00516
00517 if (strchr(QUOTING_CHARS, *string) != NULL)
00518 {
00519
00520
00521
00522
00523 string++;
00524 end=string;
00525 do
00526 {
00527 end += strcspn(end, QUOTING_CHARS);
00528 if (*end == NUL)
00529 {
00530 lcmaps_log(0,"lcmaps.mod-lcmaps_db_parse_string(): missing closing quote\n");
00531 return 0;
00532 }
00533
00534
00535 }
00536 while (strchr(ESCAPING_CHARS, *(end - 1)) != NULL);
00537 }
00538 else
00539 {
00540 end = string + strcspn(string, WHITESPACE_CHARS);
00541 }
00542 *end=NUL;
00543 *pstring=string;
00544
00545 return 1;
00546 }
00547
00548
00549
00550
00551
00562 int lcmaps_db_clean_list(
00563 lcmaps_db_entry_t ** list
00564 )
00565 {
00566 lcmaps_db_entry_t * entry;
00567
00568 entry=*list;
00569 while (entry)
00570 {
00571 lcmaps_db_entry_t * next_entry;
00572 lcmaps_log_debug(2,"cleaning db entry for module %s\n",entry->pluginname);
00573 next_entry=entry->next;
00574 free(entry);
00575 entry=next_entry;
00576 }
00577 *list=entry=NULL;
00578 return 0;
00579 }
00580
00581
00582
00583
00584
00592 int lcmaps_db_clean()
00593 {
00594 if(lcmaps_db_clean_list(&lcmaps_db_list) != 0)
00595 {
00596 lcmaps_log(0,"lcmaps.mod-lcmaps_db_clean() error: could not clean list\n");
00597 return 1;
00598 }
00599 return 0;
00600 }
00601
00602
00603
00604
00605
00606
00607
00608