~ubuntu-branches/ubuntu/precise/gnarwl/precise

« back to all changes in this revision

Viewing changes to src/config.c

  • Committer: Bazaar Package Importer
  • Author(s): Cajus Pollmeier
  • Date: 2004-05-28 19:43:08 UTC
  • Revision ID: james.westby@ubuntu.com-20040528194308-g91ssv0i7ub7tu40
Tags: upstream-3.3
ImportĀ upstreamĀ versionĀ 3.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <stdlib.h>
 
2
#include <stdio.h>
 
3
#include <errno.h>
 
4
#include <string.h>
 
5
#include <ldap.h>
 
6
 
 
7
#ifndef __LCLINT__
 
8
#include <syslog.h>
 
9
#endif
 
10
 
 
11
#include <conf.h>
 
12
#include "config.h"
 
13
#include "util.h"
 
14
 
 
15
#ifndef LDAP_VERSION2
 
16
#define PROTVER2 LDAP_PROTOCOL_DETECT
 
17
#else 
 
18
#define PROTVER2 LDAP_VERSION2
 
19
#endif
 
20
 
 
21
#ifndef LDAP_VERSION3
 
22
#define PROTVER3 LDAP_PROTOCOL_DETECT
 
23
#else 
 
24
#define PROTVER3 LDAP_VERSION3
 
25
#endif
 
26
 
 
27
 
 
28
struct conf cfg;
 
29
int verbose=LVL_CRIT;
 
30
 
 
31
void putEntry(char* key, char* val) {
 
32
  
 
33
  if (key==NULL || val==NULL) return;
 
34
  
 
35
  if (!strcasecmp(key,"login")) {
 
36
    cfg.uid=val;
 
37
    return;
 
38
  }
 
39
  if (!strcasecmp(key,"password")) {
 
40
    cfg.pwd=val;
 
41
    return;
 
42
  }
 
43
  if (!strcasecmp(key,"badheaders")) {
 
44
    cfg.mfilter=val;
 
45
    return;
 
46
  }
 
47
  if (!strcasecmp(key,"blacklist")) {
 
48
    cfg.blist=val;
 
49
    return;
 
50
  }
 
51
  if (!strcasecmp(key,"forceheader")) {
 
52
    cfg.mailheader=val;
 
53
    return;
 
54
  }
 
55
  
 
56
  if (!strcasecmp(key,"forcefooter")) {
 
57
    cfg.mailfooter=val;
 
58
    return;
 
59
  }
 
60
  
 
61
  
 
62
  // val may not be NULL below
 
63
  
 
64
  if (!strcasecmp(key,"map_field")) {
 
65
    int i=0;
 
66
    char **entry=splitString(val,1,' ');
 
67
    
 
68
    free(val);
 
69
    if (entry[1]==NULL) return;
 
70
    
 
71
    while(cfg.macro_attr[i]!=NULL) i++;
 
72
    cfg.macro_attr=(char**)realloc(cfg.macro_attr,(i+2)*sizeof(char**));
 
73
    cfg.macro_name=(char**)realloc(cfg.macro_name,(i+2)*sizeof(char**));
 
74
    if (cfg.macro_attr==NULL || cfg.macro_name==NULL) oom();
 
75
    cfg.macro_attr[i+1]=NULL;
 
76
    cfg.macro_name[i+1]=NULL;
 
77
    cfg.macro_attr[i]=entry[1];
 
78
    cfg.macro_name[i]=entry[0];
 
79
    
 
80
    return;
 
81
  }
 
82
  
 
83
  if (!strcasecmp(key,"server")) {
 
84
    cfg.server=val;
 
85
    return;
 
86
  }
 
87
  if (!strcasecmp(key,"port")) {
 
88
    cfg.port=atoi(val);
 
89
    return;
 
90
  }
 
91
  if (!strcasecmp(key,"scope")) {
 
92
    if (!strcasecmp(val,"base")) cfg.scope=LDAP_SCOPE_BASE;
 
93
    if (!strcasecmp(val,"one")) cfg.scope=LDAP_SCOPE_ONELEVEL;
 
94
    if (!strcasecmp(val,"sub")) cfg.scope=LDAP_SCOPE_SUBTREE;
 
95
    return;                                                                     
 
96
  }
 
97
  if (!strcasecmp(key,"base")) {
 
98
    cfg.base=val;
 
99
    return;
 
100
  }
 
101
  if (!strcasecmp(key,"queryfilter")) {
 
102
    cfg.qfilter=val;
 
103
    return;
 
104
  }
 
105
  if (!strcasecmp(key,"result")) {
 
106
    cfg.result=val;
 
107
    return;
 
108
  }
 
109
  if (!strcasecmp(key,"charset")) {
 
110
    cfg.charset=val;
 
111
    return;
 
112
  }
 
113
  if (!strcasecmp(key,"map_sender")) {
 
114
    cfg.map_sender=val;
 
115
    return;
 
116
  }
 
117
  if (!strcasecmp(key,"map_receiver")) {
 
118
    cfg.map_receiver=val;
 
119
    return;
 
120
  }
 
121
  if (!strcasecmp(key,"blockfiles")) {
 
122
    cfg.dbdir=val;
 
123
    return;
 
124
  }
 
125
  if (!strcasecmp(key,"blockexpire")) {
 
126
    cfg.dbexp=atoi(val);
 
127
    return;
 
128
  }
 
129
  if (!strcasecmp(key,"mta")) {
 
130
    char** tmp=splitString(val,1,' ');
 
131
    free(val);
 
132
    val=NULL;
 
133
    if(tmp[0]!=NULL) cfg.mta=tmp[0];
 
134
    if(tmp[1]!=NULL) cfg.mta_opts=tmp[1];
 
135
    return;
 
136
  }
 
137
  if (!strcasecmp(key,"recvheader")) {
 
138
    int i=0;
 
139
    char** tmp=splitString(val,-1,' ');
 
140
    
 
141
    free(val);
 
142
    while(cfg.recv_header[i]!=NULL) {
 
143
      free(cfg.recv_header[i]);
 
144
      i++;
 
145
    }
 
146
    free(cfg.recv_header);
 
147
    i=0;
 
148
    while(tmp[i]!=0) i++;
 
149
    cfg.recv_header=(char**)malloc((i+1)*sizeof(char**));
 
150
    cfg.recv_header=tmp;
 
151
    return;
 
152
  }
 
153
  if (!strcasecmp(key,"map_subject")) {
 
154
    cfg.map_subject=val;
 
155
    return;
 
156
  }
 
157
  if (!strcasecmp(key,"maxreceivers")) {
 
158
    cfg.maxmail=atoi(val);
 
159
    return;
 
160
  }
 
161
  if (!strcasecmp(key,"maxheader")) {
 
162
    // Adding 2 is a cosmetical fix
 
163
    cfg.maxheader=atoi(val)+2;
 
164
    return;
 
165
  }
 
166
  if (!strcasecmp(key,"loglevel")) {
 
167
    verbose=atoi(val);
 
168
    return;
 
169
  }
 
170
  if (!strcasecmp(key,"umask")) {
 
171
    //val[0]=' ';
 
172
    cfg.umask=(int)strtol(val,NULL,8);
 
173
    return;
 
174
  }
 
175
  if (!strcasecmp(key,"protocol")) {
 
176
    switch(atoi(val)) {
 
177
      case 2: {cfg.protver=PROTVER2; break;}
 
178
      case 3: {cfg.protver=PROTVER3; break;}
 
179
    }
 
180
    return;
 
181
  }
 
182
  
 
183
  syslog(LOG_MAIL|LOG_WARNING,"WARN/CFG Unknown config directive: %s",key);
 
184
}
 
185
 
 
186
void setDefaults(void) {
 
187
  cfg.umask=UMASK;
 
188
  cfg.base=DEFAULT_BASE;
 
189
  cfg.protver=LDAP_PROTOCOL_DETECT;
 
190
  cfg.uid=NULL;
 
191
  cfg.pwd=NULL;
 
192
  cfg.server=DEFAULT_SERVER;
 
193
  cfg.qfilter=DEFAULT_QFILTER;
 
194
  cfg.mfilter=NULL;
 
195
  cfg.scope=LDAP_SCOPE_SUBTREE;
 
196
  cfg.port=LDAP_PORT;
 
197
  cfg.dbdir=BLOCKDIR;
 
198
  cfg.dbexp=DEFAULT_EXPIRE;
 
199
  cfg.mta=DEFAULT_MTA;
 
200
  cfg.mta_opts="";
 
201
  cfg.blist=NULL;
 
202
  cfg.charset=NULL;
 
203
  cfg.maxmail=DEFAULT_MAIL_LIMIT;
 
204
  cfg.maxheader=DEFAULT_MAIL_LIMIT;
 
205
  cfg.result=DEFAULT_MES;
 
206
  cfg.map_sender=DEFAULT_MAP_SENDER;
 
207
  cfg.map_receiver=DEFAULT_MAP_RECEIVER;
 
208
  cfg.map_subject=DEFAULT_MAP_SUBJECT;
 
209
  cfg.macro_attr=(char**)calloc(1,sizeof(char**));
 
210
  cfg.macro_name=(char**)calloc(1,sizeof(char**));
 
211
  cfg.recv_header=(char**)calloc(3,sizeof(char**));
 
212
  cpyStr(&cfg.recv_header[0],"to");
 
213
  cpyStr(&cfg.recv_header[1],"cc");
 
214
  if (cfg.macro_attr==NULL || cfg.macro_name==NULL) oom();
 
215
}
 
216
 
 
217
void readConf(char *cfile) {
 
218
  FILE *fptr;
 
219
  char buf[MAXLINE];
 
220
  char** tmp;
 
221
  int pos=0;
 
222
 
 
223
  setDefaults();
 
224
  fptr=fopen(cfile,"r");
 
225
  if (fptr==NULL) {
 
226
    syslog(LOG_MAIL|LOG_ERR,"CRIT/IO %s",cfile);
 
227
    exit(EXIT_FAILURE);
 
228
  }
 
229
  while(((fgets(buf, (size_t)sizeof(buf), fptr)) && (buf != NULL))) {
 
230
    if (!((buf[0]=='#') || (*buf=='\n'))) { 
 
231
      if (buf[strlen(buf)-1]=='\n') buf[strlen(buf)-1]=(char)NULL;
 
232
      tmp=splitString(buf,1,' ');
 
233
      //printf("%s:%s\n",tmp[0],tmp[1]);
 
234
      putEntry(tmp[0],tmp[1]);
 
235
      free(tmp[0]);
 
236
    }
 
237
  }
 
238
  (void)fclose(fptr);
 
239
  
 
240
  while(cfg.macro_attr[pos]!=NULL) pos++;
 
241
  tmp=(char**)calloc(sizeof(char**)*2+pos*sizeof(char**),sizeof(char**));
 
242
  if (tmp==NULL) oom();
 
243
  memcpy(tmp,cfg.macro_attr,sizeof(char**)*pos);
 
244
  tmp[pos]=cfg.result;
 
245
  free(cfg.macro_attr);
 
246
  cfg.macro_attr=tmp;
 
247
}