Main Page | Modules | Data Structures | File List | Data Fields | Globals | Related Pages

lcmaps_db_read.c

Go to the documentation of this file.
00001 /*                                                                                                            
00002  * Copyright (c) Members of the EGEE Collaboration. 2004.
00003  * See http://eu-egee.org/partners/ for details on the copyright holders.
00004  * For license conditions see the license file or
00005  * http://eu-egee.org/license.html
00006  */
00007 
00008 /*                                                                                                            
00009  * Copyright (c) 2001 EU DataGrid.                                                                             
00010  * For license conditions see http://www.eu-datagrid.org/license.html                                          
00011  *
00012  * Copyright (c) 2001, 2002 by 
00013  *     Martijn Steenbakkers <martijn@nikhef.nl>,
00014  *     David Groep <davidg@nikhef.nl>,
00015  *     NIKHEF Amsterdam, the Netherlands
00016  */
00017 
00024 /*****************************************************************************
00025                             Include header files
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                                 Definitions
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  * Characters that terminate pairs, values and variables in the lcmaps database file. This
00053  * is a combination of whitespace and separators.
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                           Module specific prototypes
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                        Define module specific variables
00080 ******************************************************************************/
00081 static lcmaps_db_entry_t *  lcmaps_db_list=NULL; 
00083 /******************************************************************************
00084     Function: lcmaps_db_read
00085     documentation in _lcmaps_db_read.h
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         /* Cannot open file */
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 /*    lcmaps_db_fill_entry(no_entries,NULL); */
00151     while (fgets(line, sizeof(line), dbstream))
00152     {
00153         ++nlines;
00154 
00155         if (! lcmaps_db_parse_line(line, &entry))
00156         {
00157             /* parse error, return line number */
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             /* entry found */
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                 /* error filling lcmaps_db */
00174                 if (entry != NULL) free(entry);
00175                 return -(nlines);
00176             }
00177             if (entry != NULL) free(entry);
00178             entry=NULL;
00179         }
00180         else
00181         {
00182             /* no entry found, but no error */
00183             continue;
00184         }
00185     }
00186     if (entry != NULL) free(entry);
00187     return no_entries;
00188 }
00189 
00190 /******************************************************************************
00191     Function: lcmaps_db_fill_entry
00192     documentation in _lcmaps_db_read.h
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     /* Check arguments */
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     /* Skip over leading whitespace */
00289     line += strspn(line, WHITESPACE_CHARS);
00290 
00291     /* Check for comment at start of line and ignore line if present */
00292     if (strchr(COMMENT_CHARS, *line) != NULL) 
00293     {
00294         /* Ignore line, return NULL entry. */
00295         *entry=NULL;
00296         return 1;
00297     }
00298 
00299     /* Check for empty line */
00300     if (*line == NUL)
00301     {
00302         /* Empty line, return NULL entry. */
00303         *entry=NULL;
00304         return 1;
00305     }
00306 
00307     /* Look for variable-value pairs by checking the PAIR_SEP_CHARS */
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                 /* probably end of line */
00321                 continue;
00322             }
00323             if (strchr(PAIR_SEP_CHARS, *line) != NULL)
00324             {
00325                 *line=NUL;
00326                 line += 1;
00327             }
00328         }
00329         else
00330         {
00331             /* len = 0, so *line=PAIR_SEP_CHARS */
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         /* Initialize tmp_entry */
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                 /* error parsing variable-value pair */
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                 /* found plugin name */
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                 /* found plugin database */
00371                 strncpy(tmp_entry->pluginargs,val,LCMAPS_MAXARGSTRING);
00372                 (tmp_entry->pluginargs)[LCMAPS_MAXARGSTRING]=NUL;
00373             }
00374             else
00375             {
00376                 /* unknown option: do nothing */
00377             }
00378         }
00379     }
00380 
00381     /* succes */
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     /* Skip over leading whitespace */
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         /* Cannot find '=' */
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         /* Found ' var =' and replace '=' with NUL*/
00441         *pair=NUL;
00442         if (! lcmaps_db_parse_string(&var))
00443         {
00444             /* error parsing variable name */
00445             return 0;
00446         }
00447         pair+=1;
00448         if (*pair==NUL)
00449         {
00450             /* No value found */
00451 /*            val=NULL; */
00452             val=pair;
00453             *pvar=var;
00454             *pval=val;
00455             return 1;
00456         }
00457         else
00458         {
00459             /* Skip over leading whitespace */
00460             pair += strspn(pair, WHITESPACE_CHARS);
00461             if (*pair == NUL)
00462             {
00463                 /* No value found */
00464 /*                val=NULL; */
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                 /* error parsing value */
00474                 return 0;
00475             }
00476         }
00477     }
00478     else
00479     {
00480         /* Cannot find '=' */
00481         lcmaps_log(0,"lcmaps.mod-lcmaps_db_parse_pair(): cannot find =\n");
00482         return 0;
00483     }
00484 
00485     /* success */
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     /* Is string quoted ? */
00517     if (strchr(QUOTING_CHARS, *string) != NULL)
00518     {
00519         /*
00520          * Yes, skip over opening quote and look for unescaped
00521          * closing double quote
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; /* Missing closing quote */
00532             }
00533 
00534             /* Make sure it's not escaped */
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     Function: lcmaps_db_clean_list
00550     documentation in _lcmaps_db_read.h
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     Function: lcmaps_db_clean
00583     documentation in _lcmaps_db_read.h
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 CVS Information:
00604     $Source: /cvs/jra1mw/org.glite.security.lcmaps/src/pluginmanager/lcmaps_db_read.c,v $
00605     $Date: 2005/02/27 01:30:41 $
00606     $Revision: 1.7 $
00607     $Author: msteenba $
00608 ******************************************************************************/

Generated on Sun May 29 21:22:10 2005 for lcmaps by doxygen 1.3.5