/* ldapdiff Copyright (C) 2000-2006 Thomas.Reith@rhoen.de This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include "ldapdiff.h" static struct s_conf asdefconf[] = { {NULL, SECTIONGLOBAL, CONFLDAPHOST, "ldaphost", NULL }, {NULL, SECTIONGLOBAL, CONFLDAPPORT, "ldapport", NULL }, {NULL, SECTIONGLOBAL, CONFROOTDN, "rootdn", NULL }, {NULL, SECTIONGLOBAL, CONFROOTPW, "rootpw", NULL }, {NULL, SECTIONGLOBAL, CONFMODFILE, "modfile", NULL }, {NULL, SECTIONGLOBAL, CONFADDFILE, "addfile", NULL }, {NULL, SECTIONGLOBAL, CONFONLINEUPDATE, "onlineupdate", NULL }, {NULL, SECTIONGLOBAL, CONFOFFLINEUPDATE, "offlineupdate", NULL }, {NULL, SECTIONGLOBAL, CONFONLINEERRFATAL, "onlineerrfatal", NULL }, {NULL, SECTIONGLOBAL, CONFICONV, "iconv", NULL }, {NULL, SECTIONGLOBAL, CONFLDIFCHARSET, "ldifcharset", NULL }, {NULL, SECTIONGLOBAL, CONFLDAPCHARSET, "ldapcharset", NULL }, {NULL, SECTIONGLOBAL, CONFSCHEMACHECK, "schemacheck", NULL }, {NULL, SECTIONGLOBAL, CONFSCHEMABASE, "schemabase", NULL }, {NULL, SECTIONGLOBAL, CONFSCHEMAFILTER, "schemafilter", NULL }, {NULL, SECTIONGLOBAL, CONFSCHEMAATTRIBUTE, "schemaattribute", NULL }, {NULL, SECTIONPROFILE, CONFBASEDN, "basedn", NULL }, {NULL, SECTIONPROFILE, CONFFILTER, "filter", NULL }, {NULL, SECTIONPROFILE, CONFGROUP, "group", NULL }, {NULL, SECTIONPROFILE, CONFIGNORE, "ignore", NULL }, {NULL, SECTIONPROFILE, CONFIGNOREVAL, "ignoreval", NULL }, {NULL, SECTIONPROFILE, CONFNOEQUALITY, "noequality", NULL }, {NULL, SECTIONPROFILE, CONFMAPALIAS, "mapalias", NULL }, {NULL, SECTIONPROFILE, CONFDELETEENTRY, "deleteentry", NULL }, {NULL, SECTIONPROFILE, CONFDELETEATTRIBUTE, "deleteattribute", NULL }, {NULL, SECTIONPROFILE, CONFMODIFYBYDELADD, "modifybydeladd", NULL }, {NULL, SECTIONPROFILE, CONFADDENTRY, "addentry", NULL }, {NULL, SECTIONNONE, CONFNONE, NULL, NULL } }; static struct s_conf *asconf[MAXCONFVAR]; static char *getconf(char *section,tevarid varid) { int count = 0; char *var = "unknown"; while(asconf[count] != NULL){ if(strcmp(section,asconf[count]->section) == 0 && asconf[count]->varid == varid){ return asconf[count]->val; } count++; } count=0; while(asdefconf[count].varid != CONFNONE){ if(asdefconf[count].varid == varid){ var = asdefconf[count].var; } count++; } ldiflog(LOG0,"error: requested variable [%s]:%s not found",section,var); exit(EXITLDERROR); return NULL; } char *ldifgetgconf(tevarid varid) { return getconf(SECTGLOB,varid); } char *ldifgetpconf(tevarid varid) { extern char *profile; return getconf(profile,varid); } static void confcheck(char *section) { static struct s_conf *ascmpconf[MAXCONFVAR]; int count; int cmpcount; int found; tesectiontype sectiontype; count = 0; cmpcount = 0; while(asconf[count] != NULL){ if(strcmp(asconf[count]->section,section) == 0){ ascmpconf[cmpcount] = asconf[count]; cmpcount++; } count++; } ascmpconf[cmpcount] = NULL; sectiontype = SECTIONPROFILE; if(strcmp(section,SECTGLOB) == 0){ sectiontype = SECTIONGLOBAL; } count = 0; while(asdefconf[count].varid != CONFNONE){ if(asdefconf[count].sectiontype == sectiontype){ cmpcount = 0; found = 0; while(ascmpconf[cmpcount] != NULL){ if(strcmp(asdefconf[count].var,ascmpconf[cmpcount]->var) == 0){ found++; } cmpcount++; } if(found == 0){ ldiflog(LOG0,"config error: parameter [%s] %s missing",section,asdefconf[count].var); exit(EXITLDERROR); } } count++; } count = 0; while(ascmpconf[count] != NULL){ cmpcount = count + 1; while(ascmpconf[cmpcount] != NULL){ if(strcmp(ascmpconf[count]->var,ascmpconf[cmpcount]->var) == 0 && strcmp(ascmpconf[count]->section,ascmpconf[cmpcount]->section) == 0){ ldiflog(LOG0,"config error: parameter [%s] %s already defined",ascmpconf[cmpcount]->section,ascmpconf[cmpcount]->var); exit(EXITLDERROR); } cmpcount++; } count++; } } void ldifinitconf(char* cfile) { FILE *f; char line[MAXATTRLEN]; char section[MAXATTRLEN]; char var[MAXATTRLEN]; char val[MAXATTRLEN]; char *fname; int count; int confcount; int found; int clines = 0; fname = LDALLOC(MAXATTRLEN,sizeof(char)); /* intialize asconf array */ for(confcount = 0;confcount < MAXCONFVAR;confcount++){ asconf[confcount] = NULL; } if(cfile[0] != '/'){ getcwd(fname,MAXATTRLEN); if(strlen(fname) + strlen("/") < MAXATTRLEN){ strcat(fname,"/"); } if(strlen(fname) + strlen(cfile) < MAXATTRLEN){ strcat(fname,cfile); } } else{ strncpy(fname,cfile,MAXATTRLEN - 1); } ldiflog(LOG2,"config: using config file: %s",fname); if((f = fopen(cfile,"r")) == NULL){ ldiflog(LOG0,"fopen() of %s failed: file: %s, line: %d",fname,__FILE__,__LINE__); exit(EXITLDERROR); } confcount = 0; section[0] = 0; while(fgets(line,sizeof(line),f) != NULL){ int ccount; clines++; /* strip '\n' '\r' and '#' */ ccount = 0; while(line[ccount] != '\0'){ if(line[ccount] == '\n' || line[ccount] == '\r' || line[ccount] == '#'){ line[ccount] = '\0'; break; } ccount++; } if(strlen(line) == 0){ continue; } if(strchr(line,'[') != NULL && strchr(line,']') != NULL){ int seclength; seclength = strchr(line,']') - strchr(line,'[') - 1; if(seclength > 0){ if(strlen(section) != 0){ confcheck(section); } memset(section,0,MAXATTRLEN * sizeof(char)); strncpy(section,strchr(line,'[') + 1,seclength); ldiflog(LOG2,"config: processing section [%s]",section); continue; } } if(ldifconfnormalize(line,var,val) == -1){ ldiflog(LOG0,"config error: parse error in line %d: [%s]",clines,line); exit(EXITLDERROR); } if(strlen(section) != 0 && strlen(var) != 0 && strlen(val) != 0){ count = 0; found = 0; while(asdefconf[count].varid != CONFNONE){ if(strcmp(asdefconf[count].var,var) == 0){ struct s_conf *psconf; psconf = LDALLOC(1,sizeof(struct s_conf)); psconf->section = LDDUP(section); psconf->sectiontype = asdefconf[count].sectiontype; psconf->varid = asdefconf[count].varid; psconf->var = LDDUP(var); psconf->val = LDDUP(val); asconf[confcount] = psconf; ldiflog(LOG2,"config: processing parameter [%s] %s: %s",section,var,val); confcount++; found = 1; } count++; } if(found == 0){ ldiflog(LOG0,"config error: unknown parameter [%s] %s: %s",section,var,val); exit(EXITLDERROR); } } } /* the last section should be checked, too */ if(strlen(section) != 0){ confcheck(section); } fclose(f); free(fname); }