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

Diff of /imapfilter/request.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.4 by lefcha, Mon Oct 1 11:48:51 2001 UTC revision 1.5 by lefcha, Tue Oct 2 07:31:52 2001 UTC
# Line 28  int test(void) Line 28  int test(void)
28  int login(char *user, char *pass)  int login(char *user, char *pass)
29  {  {
30      imap_login(user, pass);      imap_login(user, pass);
31        
32      log_info(LOG_USERNAME, user);      log_info(LOG_USERNAME, user);
33            
34      return server_response("LOGIN");      return server_response("LOGIN");
35  }  }
36    
# Line 41  int login(char *user, char *pass) Line 41  int login(char *user, char *pass)
41  int select_mailbox(char *mbox)  int select_mailbox(char *mbox)
42  {  {
43      int r;      int r;
44        
45      imap_select(mbox);      imap_select(mbox);
46      r = server_response("SELECT");      r = server_response("SELECT");
47        
48      if (!r)      if (!r)
49          mailbox_status(mbox);          mailbox_status(mbox);
50        
51      log_info(LOG_MAILBOX, mbox);      log_info(LOG_MAILBOX, mbox);
52        
53      return r;      return r;
54  }  }
55    
# Line 60  int select_mailbox(char *mbox) Line 60  int select_mailbox(char *mbox)
60  int mailbox_status(char *mbox)  int mailbox_status(char *mbox)
61  {  {
62      int r = 0;      int r = 0;
63        
64      if (!(options & OPTION_DETAILS_QUITE)) {      if (!(options & OPTION_DETAILS_QUITE)) {
65          imap_status(mbox, "MESSAGES RECENT UNSEEN");          imap_status(mbox, "MESSAGES RECENT UNSEEN");
66          r = status_response();          r = status_response();
67          info(" in mailbox %s.\n", mbox);          info(" in mailbox %s.\n", mbox);
68      }      }
       
69      return r;      return r;
70  }  }
71  /*  /*
# Line 103  int apply_filters(filter_t ** filters, c Line 102  int apply_filters(filter_t ** filters, c
102    
103          if (match_filter(filters[i], mesgs))          if (match_filter(filters[i], mesgs))
104              continue;              continue;
105            
106          log_info(LOG_FILTER, filters[i]->key);          log_info(LOG_FILTER, filters[i]->key);
107    
108          apply_action(mesgs, &(filters[i]->action.type),          apply_action(mesgs, &(filters[i]->action.type),
109                       filters[i]->action.destmbox, filters[i]->action.args);                     filters[i]->action.destmbox, filters[i]->action.args);
110      }      }
111    
112      return 0;      return 0;
# Line 121  int apply_filters(filter_t ** filters, c Line 120  int apply_filters(filter_t ** filters, c
120  int match_filter(filter_t * filter, char *mesgs)  int match_filter(filter_t * filter, char *mesgs)
121  {  {
122      char *search;      char *search;
123      
124      if (filter->mode == FILTER_MODE_OR)      if (filter->mode == FILTER_MODE_OR)
125          search = generate_filter_or(filter->masks, filter->masknum, filter->masklen);          search = generate_filter_or(filter->masks, filter->masknum,
126                                        filter->masklen);
127      else      else
128          search = generate_filter_and(filter->masks, filter->masknum, filter->masklen);          search = generate_filter_and(filter->masks, filter->masknum,
129                                         filter->masklen);
130    
131      imap_search(search);      imap_search(search);
132      search_response(mesgs);      search_response(mesgs);
133        
134      free(search);      free(search);
135        
136      if (!*mesgs)      if (!*mesgs)
137          return 1;          return 1;
138            
139      return 0;      return 0;
140  }  }
141    
# Line 162  void queue_fifo(mask_t ** mfifo, mask_t Line 163  void queue_fifo(mask_t ** mfifo, mask_t
163          i = 0;          i = 0;
164          return;          return;
165      }      }
   
166      mfifo[i++] = mask;      mfifo[i++] = mask;
167      mfifo[i] = NULL;      mfifo[i] = NULL;
168  }  }
# Line 179  mask_t *dequeue_fifo(mask_t ** mfifo) Line 179  mask_t *dequeue_fifo(mask_t ** mfifo)
179          j = 0;          j = 0;
180          return NULL;          return NULL;
181      }      }
   
182      return mfifo[j++];      return mfifo[j++];
183  }  }
184    
# Line 195  char *generate_filter_and(mask_t * mask, Line 194  char *generate_filter_and(mask_t * mask,
194      char *search;      char *search;
195      mask_t **mfifo;             /* Mailbox FIFO queue. */      mask_t **mfifo;             /* Mailbox FIFO queue. */
196      mask_t *mf;                 /* Mask returned from FIFO. */      mask_t *mf;                 /* Mask returned from FIFO. */
197        
198      search = (char *) malloc(sizeof(char) * searchbuf);      search = (char *) xmalloc(sizeof(char) * searchbuf);
199      mfifo = (mask_t **) malloc(sizeof(mask_t *) * (masknum + 1));      mfifo = (mask_t **) xmalloc(sizeof(mask_t *) * (masknum + 1));
200        
     if (!search || !mfifo)  
         fatal(ERROR_MEMORY_ALLOCATION, "imapfilter: allocating memory; %s\n",  
               strerror(errno));  
       
201      search[0] = 0;      search[0] = 0;
202      empty_fifo(mfifo);      empty_fifo(mfifo);
203    
# Line 226  char *generate_filter_and(mask_t * mask, Line 221  char *generate_filter_and(mask_t * mask,
221              }              }
222    
223              empty_fifo(mfifo);              empty_fifo(mfifo);
224                
225              search[len - 1] = ')';              search[len - 1] = ')';
226              search[len] = ' ';              search[len] = ' ';
227              search[++len] = 0;              search[++len] = 0;
228          }          }
   
229          queue_fifo(mfifo, mask);          queue_fifo(mfifo, mask);
230    
231          mask = mask->next;          mask = mask->next;
# Line 241  char *generate_filter_and(mask_t * mask, Line 235  char *generate_filter_and(mask_t * mask,
235          search[len] = '(';          search[len] = '(';
236          search[++len] = 0;          search[++len] = 0;
237      }      }
   
238      while ((mf = dequeue_fifo(mfifo))) {      while ((mf = dequeue_fifo(mfifo))) {
239          strncat(search, mf->body, searchbuf - len - 1);          strncat(search, mf->body, searchbuf - len - 1);
240          len = strlen(search);          len = strlen(search);
241          search[len] = ' ';          search[len] = ' ';
242          search[++len] = 0;          search[++len] = 0;
243      }      }
244        
245      if (strchr(search, '(')) {      if (strchr(search, '(')) {
246          search[len - 1] = ')';          search[len - 1] = ')';
247          search[len] = 0;          search[len] = 0;
248      }      }
   
249      if (search[len - 1] == ' ')      if (search[len - 1] == ' ')
250          search[len - 1] = 0;          search[len - 1] = 0;
251        
252      return search;      return search;
253  }  }
254    
# Line 272  char *generate_filter_or(mask_t * mask, Line 264  char *generate_filter_or(mask_t * mask,
264      char *search;      char *search;
265      mask_t **mfifo;             /* Mailbox FIFO queue. */      mask_t **mfifo;             /* Mailbox FIFO queue. */
266      mask_t *mf;                 /* Mask returned from FIFO. */      mask_t *mf;                 /* Mask returned from FIFO. */
267        
268      search = (char *) malloc(sizeof(char) * searchbuf);      search = (char *) xmalloc(sizeof(char) * searchbuf);
269      mfifo = (mask_t **) malloc(sizeof(mask_t *) * (masknum + 1));      mfifo = (mask_t **) xmalloc(sizeof(mask_t *) * (masknum + 1));
       
     if (!search || !mfifo)  
         fatal(ERROR_MEMORY_ALLOCATION, "imapfilter: allocating memory; %s\n",  
               strerror(errno));  
270    
271      search[0] = 0;      search[0] = 0;
272      empty_fifo(mfifo);      empty_fifo(mfifo);
# Line 298  char *generate_filter_or(mask_t * mask, Line 286  char *generate_filter_or(mask_t * mask,
286          if (mask) {          if (mask) {
287              if (len == 4 && search[0] == 'A')              if (len == 4 && search[0] == 'A')
288                  search[0] = len = 0;                  search[0] = len = 0;
289                
290              strncat(search, "OR ", searchbuf - len - 1);              strncat(search, "OR ", searchbuf - len - 1);
291              len += 3;              len += 3;
292          }          }
   
293          if (search[0] != 'A') {          if (search[0] != 'A') {
294              search[len] = '(';              search[len] = '(';
295              search[++len] = 0;              search[++len] = 0;
296          }          }
   
297          while ((mf = dequeue_fifo(mfifo))) {          while ((mf = dequeue_fifo(mfifo))) {
298              strncat(search, mf->body, searchbuf - len - 1);              strncat(search, mf->body, searchbuf - len - 1);
299              len = strlen(search);              len = strlen(search);
# Line 320  char *generate_filter_or(mask_t * mask, Line 306  char *generate_filter_or(mask_t * mask,
306              search[len] = ' ';              search[len] = ' ';
307              search[++len] = 0;              search[++len] = 0;
308          }          }
   
309          empty_fifo(mfifo);          empty_fifo(mfifo);
310      }      }
311    
# Line 336  char *generate_filter_or(mask_t * mask, Line 321  char *generate_filter_or(mask_t * mask,
321  int apply_action(char *mesgs, unsigned int *type, char *destmbox, char *args)  int apply_action(char *mesgs, unsigned int *type, char *destmbox, char *args)
322  {  {
323      unsigned int cnt;      unsigned int cnt;
324        
325      if (!*mesgs)      if (!*mesgs)
326          return 0;          return 0;
327        
328      log_info(LOG_ACTION, type);      log_info(LOG_ACTION, type);
329      log_info(LOG_DESTINATION_MAILBOX, destmbox);      log_info(LOG_DESTINATION_MAILBOX, destmbox);
330        
331      cnt = convert_messages(mesgs);      cnt = convert_messages(mesgs);
332        
333      switch (*type) {      switch (*type) {
334      case FILTER_ACTION_DELETE:      case FILTER_ACTION_DELETE:
335          info("%d messages deleted.\n", cnt);          info("%d messages deleted.\n", cnt);
# Line 363  int apply_action(char *mesgs, unsigned i Line 348  int apply_action(char *mesgs, unsigned i
348          action_list(mesgs, args);          action_list(mesgs, args);
349          break;          break;
350      }      }
351        
352      if(!*args)      if (!*args)
353          log_info(LOG_WRITE, NULL);          log_info(LOG_WRITE, NULL);
354        
355      return 0;      return 0;
356  }  }
357    
# Line 379  int action_delete(char *mesgs, char *arg Line 364  int action_delete(char *mesgs, char *arg
364      const char *delim = " ";      const char *delim = " ";
365      char *tok, *mcp, *m, *acp, *occur;      char *tok, *mcp, *m, *acp, *occur;
366    
367      m = mcp = strdup(mesgs);      m = mcp = xstrdup(mesgs);
368      acp = strdup(args);      acp = xstrdup(args);
369        
370      while((occur = strchr(acp, ',')))      while ((occur = strchr(acp, ',')))
371          *occur = ' ';          *occur = ' ';
372    
373      while ((tok = strsep(&m, delim))) {      while ((tok = strsep(&m, delim))) {
# Line 393  int action_delete(char *mesgs, char *arg Line 378  int action_delete(char *mesgs, char *arg
378          imap_store(tok, "\\Deleted");          imap_store(tok, "\\Deleted");
379          server_response("STORE");          server_response("STORE");
380      }      }
381        
382      free(mcp);      free(mcp);
383    
384      return 0;      return 0;
# Line 408  int action_copy(char *mesgs, char *destm Line 393  int action_copy(char *mesgs, char *destm
393      const char *delim = " ";      const char *delim = " ";
394      char *tok, *mcp, *m, *acp, *occur;      char *tok, *mcp, *m, *acp, *occur;
395    
396      m = mcp = strdup(mesgs);      m = mcp = xstrdup(mesgs);
397      acp = strdup(args);      acp = xstrdup(args);
398        
399      while ((occur = strchr(acp, ',')))      while ((occur = strchr(acp, ',')))
400          *occur = ' ';          *occur = ' ';
401    
# Line 419  int action_copy(char *mesgs, char *destm Line 404  int action_copy(char *mesgs, char *destm
404              imap_fetch(1, tok, acp);              imap_fetch(1, tok, acp);
405              fetch_response();              fetch_response();
406          }          }
   
407          imap_copy(tok, destmbox);          imap_copy(tok, destmbox);
408          if (copy_response() == 1) {          if (copy_response() == 1) {
409              imap_create(destmbox);              imap_create(destmbox);
# Line 457  int action_move(char *mesgs, char *destm Line 441  int action_move(char *mesgs, char *destm
441  int action_list(char *mesgs, char *args)  int action_list(char *mesgs, char *args)
442  {  {
443      const char *delim = " ";      const char *delim = " ";
444      char *tok, *mcp, *m, *occur;      char *tok, *mcp, *m, *acp, *occur;
445        
446      if (!*args)      if (!*args)
447          return 0;          return 0;
448    
449      while ((occur = strchr(args, ',')))      m = mcp = xstrdup(mesgs);
450        acp = xstrdup(args);
451        
452        while ((occur = strchr(acp, ',')))
453          *occur = ' ';          *occur = ' ';
454    
     m = mcp = strdup(mesgs);  
   
455      while ((tok = strsep(&m, delim))) {      while ((tok = strsep(&m, delim))) {
456          imap_fetch(1, tok, args);          imap_fetch(1, tok, acp);
457          fetch_response();          fetch_response();
458      }      }
459    
460      free(mcp);      free(mcp);
461        free(acp);
462    
463      return 0;      return 0;
464  }  }
# Line 480  int action_list(char *mesgs, char *args) Line 466  int action_list(char *mesgs, char *args)
466    
467  /*  /*
468   * Convert messages with contiguous sequense number to the corresponding   * Convert messages with contiguous sequense number to the corresponding
469   * number range, eg. 5 6 7 => 5:7   * number range, eg. 1 2 3 5 7 8 --> 1:3 5 7:8
470   */   */
471  unsigned int convert_messages(char *mesgs)  unsigned int convert_messages(char *mesgs)
472  {  {
473      unsigned int cnt, len;      unsigned int cnt, len;
474      unsigned int start, end, tmp;      unsigned int start, end, tmp;
475      char *cp, *tail = NULL;      char *cp, *tail = NULL;
476        
477      cnt = len = start = end = tmp = 0;      cnt = len = start = end = tmp = 0;
478    
479      cp = strdup(mesgs);      cp = xstrdup(mesgs);
480    
481      start = (unsigned int) strtoul(cp, &tail, 0);      start = (unsigned int) strtoul(cp, &tail, 0);
482      cnt++;      cnt++;
# Line 502  unsigned int convert_messages(char *mesg Line 488  unsigned int convert_messages(char *mesg
488              if (tmp)              if (tmp)
489                  cnt++;                  cnt++;
490          }          }
   
491          if (tmp == end + 1)          if (tmp == end + 1)
492              end++;              end++;
493          else {          else {
# Line 521  unsigned int convert_messages(char *mesg Line 506  unsigned int convert_messages(char *mesg
506      mesgs[len - 1] = 0;      mesgs[len - 1] = 0;
507    
508      free(cp);      free(cp);
509        
510      return cnt;      return cnt;
511  }  }

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.5

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26