/[imapfilter]/imapfilter/file.c
ViewVC logotype

Contents of /imapfilter/file.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (show annotations)
Sat Aug 11 15:54:57 2001 UTC (22 years, 7 months ago) by lefcha
Branch: MAIN
Changes since 1.1: +51 -32 lines
File MIME type: text/plain
Added ALLOW type filters

1 #include <stdio.h>
2 #include <errno.h>
3 #include <regex.h>
4 #include <string.h>
5 #include <stdlib.h>
6 #include <limits.h>
7
8 #include "config.h"
9 #include "imapfilter.h"
10 #include "file.h"
11 #include "log.h"
12
13
14 account_data account;
15 filter_entry **dfilters; /* Filters of DENY type. */
16 filter_entry **afilters; /* Filters of ALLOW type. */
17 int dfcnt = 0;
18 int afcnt = 0; /* DENY and ALLOW type filters found
19 in the configuration file */
20
21
22 /*
23 * Finds path to configuration file, opens it and calls parse_config().
24 */
25 int read_config(char *cfg)
26 {
27 int r;
28 FILE *fp;
29 char *home = NULL;
30
31 if (!cfg) {
32 cfg = (char *) malloc(PATH_MAX * sizeof(char));
33
34 home = getenv("HOME");
35
36 snprintf(cfg, PATH_MAX, "%s/%s", home, ".imapfilterrc");
37 }
38 #ifdef DEBUG
39 printf("debug: configuration file: %s\n", cfg);
40 #endif
41
42 fp = fopen(cfg, "r");
43
44 if (!fp) {
45 fprintf(stderr, "imapfilter: Could not open config file %s; %s\n",
46 cfg, strerror(errno));
47 return FAILURE;
48 }
49
50 account.port = 143; /* Default IMAP protocol port to connect. */
51
52 r = parse_config(fp);
53
54 fclose(fp);
55
56 return r;
57 }
58
59 /*
60 * Parses configuration file.
61 */
62 int parse_config(FILE * fp)
63 {
64 int i;
65 unsigned int row = 0;
66 char line[LINE_MAX];
67 regex_t comreg[4];
68 regmatch_t match[4];
69 const char *reg[] = {
70 "^[[:blank:]]*(SERVER|PORT|USERNAME|PASSWORD|LOGFILE)[[:blank:]]*=[[:blank:]]*([[:graph:]]*)[[:blank:]]*",
71 "^[[:blank:]]*(DENY|ALLOW)[[:blank:]]*=[[:blank:]]*(FROM|CC|BCC|SUBJECT|TO):? ([[:print:]]*)",
72 "^[[:blank:]]*(DENY|ALLOW)[[:blank:]]*=[[:blank:]]*([[:graph:]]+):? ([[:print:]]*)",
73 "^[[:blank:]]*#{0,1}.*"
74 };
75
76 for (i = 0; i < 4; i++)
77 regcomp(&comreg[i], reg[i], REG_EXTENDED);
78
79 while (fgets(line, LINE_MAX - 1, fp)) {
80 row++;
81 if (!regexec(&comreg[0], line, 3, match, 0)) {
82 set_account(line, match);
83 continue;
84 } else if (!regexec(&comreg[1], line, 4, match, 0)) {
85 standard_filter(line, match);
86 continue;
87 } else if (!regexec(&comreg[2], line, 4, match, 0)) {
88 custom_filter(line, match);
89 continue;
90 } else if (!regexec(&comreg[3], line, 1, match, 0))
91 continue;
92 else {
93 fprintf(stderr,
94 "imapfilter: parse error in config file at row %d\n",
95 row);
96 return FAILURE;
97 }
98 }
99 #ifdef DEBUG
100 printf("debug: account setting SERVER: '%s'\n"
101 "debug: account setting PORT: %d\n"
102 "debug: account setting USERNAME: '%s'\n"
103 "debug: account setting PASSWORD: '%s'\n"
104 "debug: account setting LOGFILE: '%s'\n",
105 account.server, account.port, account.username,
106 account.password, account.logfile);
107 #endif
108 return SUCCESS;
109 }
110
111
112 /*
113 * An account setting was found from parse_config(), changes the
114 * apropriate variable.
115 */
116 void set_account(char *line, regmatch_t * match)
117 {
118 int s;
119 char port[6];
120
121 if (!strncmp(line + match[1].rm_so, "SERVER", 6)) {
122 s = min((match[2].rm_eo - match[2].rm_so), SERVER_MAX - 1);
123 strncpy(account.server, line + match[2].rm_so, s);
124 account.server[s] = 0;
125 } else if (!strncmp(line + match[1].rm_so, "PORT", 4)) {
126 strncpy(port, line + match[2].rm_so,
127 min((match[2].rm_eo - match[2].rm_so), sizeof(port)));
128 account.port = strtoul(port, NULL, 0);
129 } else if (!strncmp(line + match[1].rm_so, "USERNAME", 8)) {
130 s = min((match[2].rm_eo - match[2].rm_so), USERNAME_MAX - 1);
131 strncpy(account.username, line + match[2].rm_so, s);
132 account.username[s] = 0;
133 } else if (!strncmp(line + match[1].rm_so, "PASSWORD", 8)) {
134 s = min((match[2].rm_eo - match[2].rm_so), PASSWORD_MAX - 1);
135 strncpy(account.password, line + match[2].rm_so, s);
136 account.password[s] = 0;
137 } else if (!strncmp(line + match[1].rm_so, "LOGFILE", 7)) {
138 s = min((match[2].rm_eo - match[2].rm_so), PATH_MAX - 1);
139 strncpy(account.logfile, line + match[2].rm_so, s);
140 account.logfile[s] = 0;
141 }
142 }
143
144
145 /*
146 * A filter entry was found from parse_config() proccesses it and saves it.
147 */
148 void set_filters(char *line, regmatch_t * match, int expl)
149 {
150 int s;
151 int *fcnt;
152 filter_entry ***filters;
153
154 if (!(strncmp(line + match[1].rm_so, "DENY", 4))) {
155 #ifdef DEBUG
156 printf("debug: filter entry: DENY");
157 #endif
158 fcnt = &dfcnt;
159 filters = &dfilters;
160 } else {
161 #ifdef DEBUG
162 printf("debug: filter entry: ALLOW");
163 #endif
164 fcnt = &afcnt;
165 filters = &afilters;
166 }
167
168 /* Every FILTER_ENTRIES_MAX, space for more filters is realloc() -ed. */
169 if (!*fcnt)
170 *filters =
171 (filter_entry **) malloc(FILTER_ENTRIES_MAX *
172 sizeof(filter_entry *));
173 else if (!(*fcnt % FILTER_ENTRIES_MAX))
174 *filters = (filter_entry **) realloc(*filters,
175 (((*fcnt /
176 FILTER_ENTRIES_MAX) +
177 1) * FILTER_ENTRIES_MAX) *
178 sizeof(filter_entry *));
179
180 (*filters)[*fcnt] = (filter_entry *) malloc(sizeof(filter_entry));
181
182 (*filters)[*fcnt]->custom = expl;
183
184 s = min((match[2].rm_eo - match[2].rm_so), FIELD_NAME_MAX - 1);
185 strncpy((*filters)[*fcnt]->name, line + match[2].rm_so, s);
186 (*filters)[*fcnt]->name[s] = 0;
187
188 s = min((match[3].rm_eo - match[3].rm_so), FIELD_BODY_MAX - 1);
189 strncpy((*filters)[*fcnt]->body, line + match[3].rm_so, s);
190 (*filters)[*fcnt]->body[s] = 0;
191
192 #ifdef DEBUG
193 printf(" '%s': '%s'\n", (*filters)[*fcnt]->name,
194 (*filters)[*fcnt]->body);
195 #endif
196
197 (*fcnt)++;
198 }

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26