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

Diff of /imapfilter/request.c

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

revision 1.24 by lefcha, Tue Jul 9 20:17:45 2002 UTC revision 1.25 by lefcha, Sat Jul 13 14:11:08 2002 UTC
# Line 23  int test(int *sock) Line 23  int test(int *sock)
23  {  {
24      return server_response(sock, imap_noop(sock));      return server_response(sock, imap_noop(sock));
25  }  }
26    
27  #endif  #endif
28    
29    
# Line 40  int check_capabilities(int *sock) Line 41  int check_capabilities(int *sock)
41  /*  /*
42   * Get namespace of mail server's mailboxes.   * Get namespace of mail server's mailboxes.
43   */   */
44  int check_namespace(int *sock, namesp_t *nsp)  int check_namespace(int *sock, namesp_t * nsp)
45  {  {
46      nsp->prefix[0] = nsp->delim = 0;      nsp->prefix[0] = nsp->delim = 0;
47    
# Line 67  int login(int *sock, char *user, char *p Line 68  int login(int *sock, char *user, char *p
68  /*  /*
69   * Check if a mailbox exists.   * Check if a mailbox exists.
70   */   */
71  int check_mailbox(int *sock, char *mbox, namesp_t *nsp)  int check_mailbox(int *sock, char *mbox, namesp_t * nsp)
72  {  {
73      return server_response(sock, imap_examine(sock,      return server_response(sock, imap_examine(sock,
74                                                apply_namespace(mbox,                                                apply_namespace(mbox,
75                                                                nsp->prefix,                                                                nsp->prefix,
76                                                                nsp->delim)));                                                                nsp->delim)));
# Line 79  int check_mailbox(int *sock, char *mbox, Line 80  int check_mailbox(int *sock, char *mbox,
80  /*  /*
81   * Open mailbox in read-write mode.   * Open mailbox in read-write mode.
82   */   */
83  int select_mailbox(int *sock, char *mbox, namesp_t *nsp)  int select_mailbox(int *sock, char *mbox, namesp_t * nsp)
84  {  {
85      int r;      int r;
86    
87      if (mailbox_status(sock, mbox, nsp) == -2)      if (mailbox_status(sock, mbox, nsp) == -2)
88          return -2;              /* No messages exist. No filters need to          return -2;              /* No messages exist. No filters need to be
89                                     be applied. */                                     applied. */
90    
91      r = select_response(sock, imap_select(sock,      r = select_response(sock, imap_select(sock,
92                                            apply_namespace(mbox, nsp->prefix,                                            apply_namespace(mbox, nsp->prefix,
# Line 100  int select_mailbox(int *sock, char *mbox Line 101  int select_mailbox(int *sock, char *mbox
101  /*  /*
102   * Get mailbox's status.   * Get mailbox's status.
103   */   */
104  int mailbox_status(int *sock, char *mbox, namesp_t *nsp)  int mailbox_status(int *sock, char *mbox, namesp_t * nsp)
105  {  {
106      return status_response(sock, imap_status(sock,      return status_response(sock, imap_status(sock,
107                                               apply_namespace(mbox, nsp->prefix,                                            apply_namespace(mbox, nsp->prefix,
108                                                               nsp->delim),                                                            nsp->delim),
109                                               "MESSAGES RECENT UNSEEN"), mbox);                                             "MESSAGES RECENT UNSEEN"), mbox);
110  }  }
111    
112    
# Line 144  int apply_filters(filter_t ** filters) Line 145  int apply_filters(filter_t ** filters)
145          log_info(LOG_FILTER, filters[i]->key);          log_info(LOG_FILTER, filters[i]->key);
146    
147          apply_action(mesgs, &(filters[i]->action.type),          apply_action(mesgs, &(filters[i]->action.type),
148                       filters[i]->action.raccount, filters[i]->action.destmbox,                     filters[i]->action.raccount, filters[i]->action.destmbox,
149                       filters[i]->action.args);                       filters[i]->action.args);
150    
151          xfree(mesgs);          xfree(mesgs);
# Line 235  char *generate_filter_and(mask_t * mask, Line 236  char *generate_filter_and(mask_t * mask,
236      char *search;      char *search;
237      mask_t *tmp;      mask_t *tmp;
238    
239      search = (char *) xmalloc(sizeof(char) * searchbuf);      search = (char *)xmalloc(sizeof(char) * searchbuf);
240    
241      search[0] = 0;      search[0] = 0;
242    
# Line 307  char *generate_filter_or(mask_t * mask, Line 308  char *generate_filter_or(mask_t * mask,
308      mask_t **mfifo;             /* Mailbox FIFO queue. */      mask_t **mfifo;             /* Mailbox FIFO queue. */
309      mask_t *mf;                 /* Mask returned from FIFO. */      mask_t *mf;                 /* Mask returned from FIFO. */
310    
311      search = (char *) xmalloc(sizeof(char) * searchbuf);      search = (char *)xmalloc(sizeof(char) * searchbuf);
312      mfifo = (mask_t **) xmalloc(sizeof(mask_t *) * (masknum + 1));      mfifo = (mask_t **) xmalloc(sizeof(mask_t *) * (masknum + 1));
313    
314      search[0] = 0;      search[0] = 0;
# Line 362  char *generate_filter_or(mask_t * mask, Line 363  char *generate_filter_or(mask_t * mask,
363  /*  /*
364   * Apply the appropriate action.   * Apply the appropriate action.
365   */   */
366  int apply_action(char *mesgs, unsigned int *type, account_t *raccount,  int apply_action(char *mesgs, unsigned int *type, account_t * raccount,
367                   char *destmbox, char *args)                    char *destmbox, char *args)
368  {  {
369      unsigned int cnt;      unsigned int cnt;
370    
371      if (!*mesgs)      if (!*mesgs)
372          return 0;          return 0;
373        
374      log_info(LOG_ACTION, type);      log_info(LOG_ACTION, type);
375      log_info(LOG_DESTINATION_MAILBOX, destmbox);      log_info(LOG_DESTINATION_MAILBOX, destmbox);
376        
377      cnt = count_messages(mesgs);      cnt = count_messages(mesgs);
378        
379      switch (*type) {      switch (*type) {
380      case FILTER_ACTION_DELETE:      case FILTER_ACTION_DELETE:
381          info("%d message%s deleted.\n", cnt, plural(cnt));          info("%d message%s deleted.\n", cnt, plural(cnt));
# Line 423  int action_delete(char *mesgs, char *arg Line 424  int action_delete(char *mesgs, char *arg
424      char *tok, *mcp, *m, *cm;      char *tok, *mcp, *m, *cm;
425    
426      action_list(mesgs, args);      action_list(mesgs, args);
427        
428      cm = convert_messages(mesgs);      cm = convert_messages(mesgs);
429    
430      m = mcp = xstrdup(cm);      m = mcp = xstrdup(cm);
431        
432      while ((tok = strsep(&m, " ")))      while ((tok = strsep(&m, " ")))
433          server_response(&sockpri, imap_store(&sockpri, tok, "\\Deleted"));          server_response(&sockpri, imap_store(&sockpri, tok, "\\Deleted"));
434    
435        if (options & OPTION_EXPUNGE)
436            server_response(&sockpri, imap_expunge(&sockpri));
437    
438      xfree(cm);      xfree(cm);
439      xfree(mcp);      xfree(mcp);
440    
   
441      return 0;      return 0;
442  }  }
443    
# Line 446  int action_copy(char *mesgs, char *destm Line 449  int action_copy(char *mesgs, char *destm
449  {  {
450      int r = 0;      int r = 0;
451      char *tok = NULL, *mcp, *m, *cm;      char *tok = NULL, *mcp, *m, *cm;
452        
453      action_list(mesgs, args);      action_list(mesgs, args);
454        
455      cm = convert_messages(mesgs);      cm = convert_messages(mesgs);
456    
457      m = mcp = xstrdup(cm);      m = mcp = xstrdup(cm);
# Line 478  int action_move(char *mesgs, char *destm Line 481  int action_move(char *mesgs, char *destm
481      if (!action_copy(mesgs, destmbox, args))      if (!action_copy(mesgs, destmbox, args))
482          action_delete(mesgs, "\0");          action_delete(mesgs, "\0");
483    
     /* CLOSE -> SELECT much faster than EXPUNGE -> SELECT */  
     /* server_response(imap_expunge()); */  
   
484      return 0;      return 0;
485  }  }
486    
# Line 488  int action_move(char *mesgs, char *destm Line 488  int action_move(char *mesgs, char *destm
488  /*  /*
489   * Copy messages to the specified mailbox of another mail server.   * Copy messages to the specified mailbox of another mail server.
490   */   */
491  int action_rcopy(char *mesgs, account_t *destacc, char *destmbox, char *args)  int action_rcopy(char *mesgs, account_t * destacc, char *destmbox, char *args)
492  {  {
493      int r;      int r;
494      char *tok, *m, *mcp, *ndm;      char *tok, *m, *mcp, *ndm;
495      unsigned int n, t = 0;      unsigned int n, t = 0;
496      char buf[RESPONSE_BUF];      char buf[RESPONSE_BUF];
497        
498      if (init_connection(&sockaux, destacc->server, destacc->port,      if (init_connection(&sockaux, destacc->server, destacc->port,
499                          destacc->ssl))                          destacc->ssl))
500          return ERROR_NETWORK;          return ERROR_NETWORK;
501        
502      r = greeting_response(&sockaux);      r = greeting_response(&sockaux);
503        
504      if (r == RESPONSE_BYE || check_capabilities(&sockaux))      if (r == RESPONSE_BYE || check_capabilities(&sockaux))
505          return ERROR_NETWORK;          return ERROR_NETWORK;
506        
507  #ifdef DEBUG  #ifdef DEBUG
508      test(&sockaux);      test(&sockaux);
509  #endif  #endif
510        
511      if (r != RESPONSE_PREAUTH) {      if (r != RESPONSE_PREAUTH) {
512          if (destacc->passwdattr == PASSWORD_NONE) {          if (destacc->passwdattr == PASSWORD_NONE) {
513              printf("Enter password for %s@%s: ", destacc->username,              printf("Enter password for %s@%s: ", destacc->username,
# Line 526  int action_rcopy(char *mesgs, account_t Line 526  int action_rcopy(char *mesgs, account_t
526    
527      /* apply_namespace() returns a pointer to a static buffer. */      /* apply_namespace() returns a pointer to a static buffer. */
528      ndm = apply_namespace(destmbox, nspaux.prefix, nspaux.delim);      ndm = apply_namespace(destmbox, nspaux.prefix, nspaux.delim);
529        
530      r = check_mailbox(&sockaux, ndm, &nspaux);      r = check_mailbox(&sockaux, ndm, &nspaux);
531    
532      if (r == RESPONSE_OK)      if (r == RESPONSE_OK)
# Line 535  int action_rcopy(char *mesgs, account_t Line 535  int action_rcopy(char *mesgs, account_t
535          server_response(&sockaux, imap_create(&sockaux, ndm));          server_response(&sockaux, imap_create(&sockaux, ndm));
536          server_response(&sockaux, imap_subscribe(&sockaux, ndm));          server_response(&sockaux, imap_subscribe(&sockaux, ndm));
537      }      }
   
538      m = mcp = xstrdup(mesgs);      m = mcp = xstrdup(mesgs);
539    
540      while ((tok = strsep(&m, " "))) {      while ((tok = strsep(&m, " "))) {
541          fetchsize_response(&sockpri, &n,          fetchsize_response(&sockpri, &n,
542                                 imap_fetch(&sockpri, tok, "RFC822.SIZE"));                             imap_fetch(&sockpri, tok, "RFC822.SIZE"));
543            
544          t = imap_append(&sockaux, ndm, n);          t = imap_append(&sockaux, ndm, n);
545    
546          fetch_response(&sockpri, 1, NULL, 0);          fetch_response(&sockpri, 1, NULL, 0);
547          do {          do {
548              r = fetch_response(&sockpri, 0, buf, imap_fetch(&sockpri, tok,              r = fetch_response(&sockpri, 0, buf, imap_fetch(&sockpri, tok,
549                                                              "RFC822.HEADER"));                                                            "RFC822.HEADER"));
550    
551              socket_write(&sockaux, buf);              socket_write(&sockaux, buf);
552          } while (r == RESPONSE_NONE);          } while (r == RESPONSE_NONE);
553            
554          socket_write(&sockaux, "\r\n");          socket_write(&sockaux, "\r\n");
555    
556          fetch_response(&sockpri, 1, NULL, 0);          fetch_response(&sockpri, 1, NULL, 0);
557          do {          do {
558              r = fetch_response(&sockpri, 0, buf, imap_fetch(&sockpri, tok,              r = fetch_response(&sockpri, 0, buf, imap_fetch(&sockpri, tok,
559                                                              "BODY[TEXT]"));                                                              "BODY[TEXT]"));
560                
561              socket_write(&sockaux, buf);              socket_write(&sockaux, buf);
562          } while (r == RESPONSE_NONE);          } while (r == RESPONSE_NONE);
563            
564          socket_write(&sockaux, "\r\n\r\n");          socket_write(&sockaux, "\r\n\r\n");
565            
566          append_response(&sockaux, t);          append_response(&sockaux, t);
567      }      }
568    
569      logout(&sockaux);      logout(&sockaux);
570        
571      action_list(mesgs, args);      action_list(mesgs, args);
572        
573      xfree(mcp);      xfree(mcp);
574    
575      return 0;      return 0;
# Line 580  int action_rcopy(char *mesgs, account_t Line 579  int action_rcopy(char *mesgs, account_t
579  /*  /*
580   * Move messages to the specified mailbox of another mail server.   * Move messages to the specified mailbox of another mail server.
581   */   */
582  int action_rmove(char *mesgs, account_t *destacc, char *destmbox, char *args)  int action_rmove(char *mesgs, account_t * destacc, char *destmbox, char *args)
583  {  {
584      if (!action_rcopy(mesgs, destacc, destmbox, args))      if (!action_rcopy(mesgs, destacc, destmbox, args))
585          action_delete(mesgs, "\0");          action_delete(mesgs, "\0");
586          
587      return 0;      return 0;
588  }  }
589    
# Line 612  int action_list(char *mesgs, char *args) Line 611  int action_list(char *mesgs, char *args)
611    
612          do {          do {
613              r = fetch_response(&sockpri, 0, hdrs, imap_fetch(&sockpri, tok, s));              r = fetch_response(&sockpri, 0, hdrs, imap_fetch(&sockpri, tok, s));
614                
615              if (*hdrs) {              if (*hdrs) {
616                  if (options & OPTION_HEADERS)                  if (options & OPTION_HEADERS)
617                      info("%s\n", hdrs);                      info("%s\n", hdrs);
# Line 636  unsigned int count_messages(char *mesgs) Line 635  unsigned int count_messages(char *mesgs)
635  {  {
636      unsigned int cnt = 0;      unsigned int cnt = 0;
637      char *c = mesgs;      char *c = mesgs;
638        
639      while ((c = strchr(c, ' '))) {      while ((c = strchr(c, ' '))) {
640          cnt++;          cnt++;
641          c++;          c++;
# Line 655  char *convert_messages(char *mesgs) Line 654  char *convert_messages(char *mesgs)
654      unsigned int maxlen;      unsigned int maxlen;
655      unsigned int start, end, tmp;      unsigned int start, end, tmp;
656      char *c, *cp, *tail;      char *c, *cp, *tail;
657        
658      start = end = tmp = 0;      start = end = tmp = 0;
659      maxlen = strlen(mesgs) + 1;      maxlen = strlen(mesgs) + 1;
660      tail = NULL;      tail = NULL;
661    
662      c = cp = xstrdup(mesgs);      c = cp = xstrdup(mesgs);
663    
664      start = (unsigned int) strtoul(mesgs, &tail, 10);      start = (unsigned int)strtoul(mesgs, &tail, 10);
665      end = start;      end = start;
666    
667      do {      do {
668          if (tail) {          if (tail) {
669              tmp = (unsigned int) strtoul(tail, &tail, 10);              tmp = (unsigned int)strtoul(tail, &tail, 10);
670              if (!tmp)              if (!tmp)
671                  tail = NULL;                  tail = NULL;
672          }          }

Legend:
Removed from v.1.24  
changed lines
  Added in v.1.25

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26