15 |
|
|
16 |
char *generate_filter_and(mask_t * mask, unsigned int masknum, unsigned int masklen); |
char *generate_filter_and(mask_t * mask, unsigned int masknum, unsigned int masklen); |
17 |
char *generate_filter_or(mask_t * mask, unsigned int masknum, unsigned int masklen); |
char *generate_filter_or(mask_t * mask, unsigned int masknum, unsigned int masklen); |
18 |
|
char *normalize_mask(char *body); |
19 |
|
void convert_date(char *body); |
20 |
|
|
21 |
void empty_fifo(mask_t ** mfifo); |
void empty_fifo(mask_t ** mfifo); |
22 |
void queue_fifo(mask_t ** mfifo, mask_t * mask); |
void queue_fifo(mask_t ** mfifo, mask_t * mask); |
119 |
strncat(search, "OR (", searchbuf - len - 1); |
strncat(search, "OR (", searchbuf - len - 1); |
120 |
len += 4; |
len += 4; |
121 |
|
|
122 |
strncat(search, tmp->body, searchbuf - len - 1); |
strncat(search, normalize_mask(tmp->body), |
123 |
|
searchbuf - len - 1); |
124 |
len = strlen(search); |
len = strlen(search); |
125 |
search[len] = ' '; |
search[len] = ' '; |
126 |
search[++len] = '\0'; |
search[++len] = '\0'; |
133 |
mask->next->type != MASK_TYPE_OR) { |
mask->next->type != MASK_TYPE_OR) { |
134 |
search[len] = '('; |
search[len] = '('; |
135 |
search[++len] = '\0'; |
search[++len] = '\0'; |
136 |
strncat(search, mask->body, |
strncat(search, normalize_mask(mask->body), |
137 |
searchbuf - len - 1); |
searchbuf - len - 1); |
138 |
len = strlen(search); |
len = strlen(search); |
139 |
search[len] = ')'; |
search[len] = ')'; |
142 |
mask = mask->next; |
mask = mask->next; |
143 |
} |
} |
144 |
} else { |
} else { |
145 |
strncat(search, tmp->body, searchbuf - len - 1); |
strncat(search, normalize_mask(tmp->body), |
146 |
|
searchbuf - len - 1); |
147 |
len = strlen(search); |
len = strlen(search); |
148 |
search[len] = ' '; |
search[len] = ' '; |
149 |
search[++len] = '\0'; |
search[++len] = '\0'; |
203 |
search[++len] = '\0'; |
search[++len] = '\0'; |
204 |
} |
} |
205 |
while ((mf = dequeue_fifo(mfifo)) != NULL) { |
while ((mf = dequeue_fifo(mfifo)) != NULL) { |
206 |
strncat(search, mf->body, searchbuf - len - 1); |
strncat(search, normalize_mask(mf->body), searchbuf - len - 1); |
207 |
len = strlen(search); |
len = strlen(search); |
208 |
search[len] = ' '; |
search[len] = ' '; |
209 |
search[++len] = '\0'; |
search[++len] = '\0'; |
226 |
|
|
227 |
|
|
228 |
/* |
/* |
229 |
|
* Make any necessary conversions to the mask body before sending it to server. |
230 |
|
*/ |
231 |
|
char * |
232 |
|
normalize_mask(char *body) |
233 |
|
{ |
234 |
|
static char nb[MASK_BODY_LEN]; |
235 |
|
|
236 |
|
|
237 |
|
if (strstr(body, "OLDER") || |
238 |
|
strstr(body, "NEWER")) { |
239 |
|
xstrncpy(nb, body, MASK_BODY_LEN - 1); |
240 |
|
convert_date(nb); |
241 |
|
|
242 |
|
return nb; |
243 |
|
} |
244 |
|
return body; |
245 |
|
} |
246 |
|
|
247 |
|
|
248 |
|
/* |
249 |
|
* Converts masks related to date filtering, because IMAP servers do not |
250 |
|
* understand for example "OLDER 3", but "BEFORE 18-Oct-2001" (if |
251 |
|
* hypothetically current date was 21-Oct-2001). |
252 |
|
*/ |
253 |
|
void |
254 |
|
convert_date(char *body) |
255 |
|
{ |
256 |
|
char *cp, *c; |
257 |
|
char s[16]; |
258 |
|
time_t te; |
259 |
|
struct tm *tl; |
260 |
|
|
261 |
|
cp = xstrdup(body); |
262 |
|
body[0] = '\0'; |
263 |
|
|
264 |
|
if (strstr(cp, "NOT")) |
265 |
|
strncat(body, "NOT ", 4); |
266 |
|
|
267 |
|
if ((c = strstr(cp, "OLDER"))) |
268 |
|
strncat(body, "BEFORE ", 7); |
269 |
|
else if ((c = strstr(cp, "NEWER"))) |
270 |
|
strncat(body, "SINCE ", 6); |
271 |
|
|
272 |
|
c += 6; |
273 |
|
|
274 |
|
te = time(NULL) - (time_t) (strtoul(c, NULL, 10) * 24 * 60 * 60); |
275 |
|
tl = localtime(&te); |
276 |
|
|
277 |
|
if (strftime(s, 15, "%d-%b-%Y", tl)) |
278 |
|
strncat(body, s, 15); |
279 |
|
|
280 |
|
xfree(cp); |
281 |
|
} |
282 |
|
|
283 |
|
|
284 |
|
|
285 |
|
|
286 |
|
|
287 |
|
|
288 |
|
/* |
289 |
* Empty the FIFO inventory. |
* Empty the FIFO inventory. |
290 |
*/ |
*/ |
291 |
void |
void |