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

Diff of /imapfilter/action.c

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

revision 1.12 by lefcha, Tue Feb 10 22:21:08 2004 UTC revision 1.13 by lefcha, Fri Feb 13 12:17:15 2004 UTC
# Line 6  Line 6 
6    
7  #include "config.h"  #include "config.h"
8  #include "imapfilter.h"  #include "imapfilter.h"
9    #include "filter.h"
10    
11    
12  extern conn_t connpri, connaux;  extern connection_t connpri, connaux;
13  extern opts_t opts;  extern options_t opts;
14    
15    
16  int action_delete(char *mesgs, char *args);  int action_delete(char *mesgs, char *args);
# Line 41  apply_action(char *mbox, char *mesgs, un Line 42  apply_action(char *mbox, char *mesgs, un
42                  return 0;                  return 0;
43    
44          log_info(LOG_ACTION, type);          log_info(LOG_ACTION, type);
45          log_info(LOG_DESTINATION_ACCOUNT, raccount->key);          log_info(LOG_DEST_ACCOUNT, raccount->key);
46          log_info(LOG_DESTINATION_MAILBOX, destmbox);          log_info(LOG_DEST_MBOX, destmbox);
47    
48          cnt = count_messages(mesgs);          cnt = count_messages(mesgs);
49    
50          switch (*type) {          switch (*type) {
51          case FILTER_ACTION_DELETE:          case ACTION_DELETE:
52                  info("%d message%s deleted.\n", cnt, plural(cnt));                  info("%d message%s deleted.\n", cnt, plural(cnt));
53                  action_delete(mesgs, args);                  action_delete(mesgs, args);
54                  break;                  break;
55          case FILTER_ACTION_COPY:          case ACTION_COPY:
56                  info("%d message%s copied from \"%s\" to mailbox \"%s\".\n",                  info("%d message%s copied from \"%s\" to mailbox \"%s\".\n",
57                      cnt, plural(cnt), mbox, destmbox);                      cnt, plural(cnt), mbox, destmbox);
58                  action_copy(mbox, mesgs, apply_namespace(destmbox,                  action_copy(mbox, mesgs, apply_namespace(destmbox,
59                          connpri.nsp.prefix, connpri.nsp.delim), args);                          connpri.ns.prefix, connpri.ns.delim), args);
60                  break;                  break;
61          case FILTER_ACTION_MOVE:          case ACTION_MOVE:
62                  info("%d message%s moved from \"%s\" to mailbox \"%s\".\n",                  info("%d message%s moved from \"%s\" to mailbox \"%s\".\n",
63                      cnt, plural(cnt), mbox, destmbox);                      cnt, plural(cnt), mbox, destmbox);
64                  action_move(mbox, mesgs, apply_namespace(destmbox,                  action_move(mbox, mesgs, apply_namespace(destmbox,
65                          connpri.nsp.prefix, connpri.nsp.delim), args);                          connpri.ns.prefix, connpri.ns.delim), args);
66                  break;                  break;
67          case FILTER_ACTION_RCOPY:          case ACTION_RCOPY:
68                  info("%d message%s copied from \"%s\" to mailbox "                  info("%d message%s copied from \"%s\" to mailbox "
69                      "\"%s\" at account %s.\n", cnt, plural(cnt),                      "\"%s\" at account %s.\n", cnt, plural(cnt),
70                      mbox, destmbox, raccount->key);                      mbox, destmbox, raccount->key);
71                  action_rcopy(mbox, mesgs, raccount, destmbox, args);                  action_rcopy(mbox, mesgs, raccount, destmbox, args);
72                  break;                  break;
73          case FILTER_ACTION_RMOVE:          case ACTION_RMOVE:
74                  info("%d message%s moved from \"%s\" to mailbox "                  info("%d message%s moved from \"%s\" to mailbox "
75                      "\"%s\" at account %s.\n", cnt, plural(cnt),                      "\"%s\" at account %s.\n", cnt, plural(cnt),
76                      mbox, destmbox, raccount->key);                      mbox, destmbox, raccount->key);
77                  action_rmove(mbox, mesgs, raccount, destmbox, args);                  action_rmove(mbox, mesgs, raccount, destmbox, args);
78                  break;                  break;
79          case FILTER_ACTION_FLAG_REPLACE:          case ACTION_FLAG_REPLACE:
80          case FILTER_ACTION_FLAG_ADD:          case ACTION_FLAG_ADD:
81          case FILTER_ACTION_FLAG_REMOVE:          case ACTION_FLAG_REMOVE:
82                  info("%d message%s flagged.\n", cnt, plural(cnt));                  info("%d message%s flagged.\n", cnt, plural(cnt));
83                  action_flag(mesgs, type, msgflags, args);                  action_flag(mesgs, type, msgflags, args);
84                  break;                  break;
85          case FILTER_ACTION_LIST:          case ACTION_LIST:
86                  info("%d message%s listed.\n", cnt, plural(cnt));                  info("%d message%s listed.\n", cnt, plural(cnt));
87                  action_list(mesgs, args);                  action_list(mesgs, args);
88                  break;                  break;
# Line 108  action_delete(char *mesgs, char *args) Line 109  action_delete(char *mesgs, char *args)
109    
110          tok = strtok_r(m, " ", &m);          tok = strtok_r(m, " ", &m);
111          while (tok) {          while (tok) {
112                  server_response(&connpri, imap_store(&connpri, tok,                  response_generic(&connpri, imap_store(&connpri, tok,
113                          STORE_FLAG_ADD, "\\Deleted"));                          ACTION_FLAG_ADD, "\\Deleted"));
114    
115                  tok = strtok_r(NULL, " ", &m);                  tok = strtok_r(NULL, " ", &m);
116          }          }
117    
118          if (opts.expunge)          if (opts.expunge)
119                  server_response(&connpri, imap_expunge(&connpri));                  response_generic(&connpri, imap_expunge(&connpri));
120    
121          xfree(mcp);          xfree(mcp);
122    
# Line 131  action_copy(char *mbox, char *mesgs, cha Line 132  action_copy(char *mbox, char *mesgs, cha
132  {  {
133          int r;          int r;
134          char *tok, *mcp, *m;          char *tok, *mcp, *m;
135          char dm[2][MBOX_NAME_LEN];          char dm[2][MBOX_LEN];
136    
137          r = 0;          r = 0;
138          tok = NULL;          tok = NULL;
# Line 143  action_copy(char *mbox, char *mesgs, cha Line 144  action_copy(char *mbox, char *mesgs, cha
144          else          else
145                  m = mcp = convert_messages(mesgs);                  m = mcp = convert_messages(mesgs);
146    
147          xstrncpy(dm[0], destmbox, MBOX_NAME_LEN - 1);          xstrncpy(dm[0], destmbox, MBOX_LEN - 1);
148          default_variables(mbox, dm[0]);          default_variables(mbox, dm[0]);
149          current_date(dm[0]);          current_date(dm[0]);
150          tok = strtok_r(m, " ", &m);          tok = strtok_r(m, " ", &m);
151          while (tok != NULL) {          while (tok != NULL) {
152                  xstrncpy(dm[1], dm[0], MBOX_NAME_LEN - 1);                  xstrncpy(dm[1], dm[0], MBOX_LEN - 1);
153                  message_date(tok, dm[1]);                  message_date(tok, dm[1]);
154    
155                  if ((r = copy_response(&connpri, imap_copy(&connpri, tok,                  if ((r = response_copy(&connpri, imap_copy(&connpri, tok,
156                                  dm[1]))) == RESPONSE_TRYCREATE)                                  dm[1]))) == RESPONSE_TRYCREATE)
157                          if (!server_response(&connpri, imap_create(&connpri,                          if (!response_generic(&connpri, imap_create(&connpri,
158                                      dm[1]))) {                                      dm[1]))) {
159                                  if (opts.subscribe)                                  if (opts.subscribe)
160                                          server_response(&connpri,                                          response_generic(&connpri,
161                                              imap_subscribe(&connpri, dm[1]));                                              imap_subscribe(&connpri, dm[1]));
162                                  r = copy_response(&connpri,                                  r = response_copy(&connpri,
163                                      imap_copy(&connpri, tok, dm[1]));                                      imap_copy(&connpri, tok, dm[1]));
164                          }                          }
165                  tok = strtok_r(NULL, " ", &m);                  tok = strtok_r(NULL, " ", &m);
# Line 195  action_rcopy(char *mbox, char *mesgs, ac Line 196  action_rcopy(char *mbox, char *mesgs, ac
196          char *flags, *date;          char *flags, *date;
197          unsigned int size;          unsigned int size;
198          char buf[RESPONSE_BUF * 2 + 1];          char buf[RESPONSE_BUF * 2 + 1];
199          char dm[3][MBOX_NAME_LEN];          char dm[3][MBOX_LEN];
200    
201          *dm[0] = *dm[1] = *dm[2] = '\0';          *dm[0] = *dm[1] = *dm[2] = '\0';
202          flags = date = NULL;          flags = date = NULL;
# Line 204  action_rcopy(char *mbox, char *mesgs, ac Line 205  action_rcopy(char *mbox, char *mesgs, ac
205                  destacc->ssl))                  destacc->ssl))
206                  return ERROR_NETWORK;                  return ERROR_NETWORK;
207    
208          r = greeting_response(&connaux);          r = response_greeting(&connaux);
209    
210          if (opts.debug)          if (opts.debug)
211                  test(&connaux);                  test(&connaux);
# Line 213  action_rcopy(char *mbox, char *mesgs, ac Line 214  action_rcopy(char *mbox, char *mesgs, ac
214                  return ERROR_NETWORK;                  return ERROR_NETWORK;
215    
216  #ifdef SSL_TLS  #ifdef SSL_TLS
217          if (destacc->ssl == SSL_DISABLED && connaux.caps & CAPABILITY_STARTTLS)          if (destacc->ssl == SSL_DISABLED && connaux.caps & CAPS_STARTTLS)
218                  if (negotiate_tls(&connaux) == RESPONSE_OK)                  if (negotiate_tls(&connaux) == RESPONSE_OK)
219                          check_capabilities(&connaux);                          check_capabilities(&connaux);
220  #endif  #endif
221    
222          if (r != RESPONSE_PREAUTH) {          if (r != RESPONSE_PREAUTH) {
223                  if (destacc->passwdattr == PASSWORD_NONE) {                  if (destacc->pass_attr == PASS_ATTR_NONE) {
224                          printf("Enter password for %s@%s: ", destacc->username,                          printf("Enter password for %s@%s: ", destacc->user,
225                              destacc->server);                              destacc->server);
226                          get_password(destacc->password, PASSWORD_LEN);                          get_password(destacc->pass, PASS_LEN);
227                          destacc->passwdattr = PASSWORD_PLAIN;                          destacc->pass_attr = PASS_ATTR_PLAIN;
228                  }                  }
229  #ifdef CRAM_MD5  #ifdef CRAM_MD5
230                  if (connaux.caps & CAPABILITY_AUTH_CRAM_MD5)                  if (connaux.caps & CAPS_CRAMMD5)
231                          r = auth_cram_md5(&connaux, destacc->username,                          r = auth_cram_md5(&connaux, destacc->user,
232                              destacc->password);                              destacc->pass);
233                  else                  else
234  #endif  #endif
235                          r = login(&connaux, destacc->username,                          r = login(&connaux, destacc->user,
236                              destacc->password);                              destacc->pass);
237    
238                  if (r == RESPONSE_NO) {                  if (r == RESPONSE_NO) {
239                          error("username %s or password rejected at %s\n",                          error("username %s or password rejected at %s\n",
240                              destacc->username, destacc->server);                              destacc->user, destacc->server);
241                          return ERROR_NETWORK;                          return ERROR_NETWORK;
242                  }                  }
243          }          }
# Line 244  action_rcopy(char *mbox, char *mesgs, ac Line 245  action_rcopy(char *mbox, char *mesgs, ac
245    
246          m = mcp = xstrdup(mesgs);          m = mcp = xstrdup(mesgs);
247    
248          xstrncpy(dm[1], destmbox, MBOX_NAME_LEN - 1);          xstrncpy(dm[1], destmbox, MBOX_LEN - 1);
249          default_variables(mbox, dm[1]);          default_variables(mbox, dm[1]);
250          current_date(dm[1]);          current_date(dm[1]);
251    
252          tok = strtok_r(m, " ", &m);          tok = strtok_r(m, " ", &m);
253          while (tok != NULL) {          while (tok != NULL) {
254                  xstrncpy(dm[2], dm[1], MBOX_NAME_LEN - 1);                  xstrncpy(dm[2], dm[1], MBOX_LEN - 1);
255                  message_date(tok, dm[2]);                  message_date(tok, dm[2]);
256    
257                  /* apply_namespace() returns a pointer to a static buffer. */                  /* apply_namespace() returns a pointer to a static buffer. */
258                  ndm = apply_namespace(dm[2], connaux.nsp.prefix,                  ndm = apply_namespace(dm[2], connaux.ns.prefix,
259                      connaux.nsp.delim);                      connaux.ns.delim);
260    
261                  /* Check only if mailbox name is different from last one. */                  /* Check only if mailbox name is different from last one. */
262                  if (strncmp(dm[0], dm[2], strlen(dm[2]))) {                  if (strncmp(dm[0], dm[2], strlen(dm[2]))) {
263                          r = check_mailbox(&connaux, ndm);                          r = check_mailbox(&connaux, ndm);
264                          if (r == RESPONSE_NO) {                          if (r == RESPONSE_NO) {
265                                  server_response(&connaux,                                  response_generic(&connaux,
266                                      imap_create(&connaux, ndm));                                      imap_create(&connaux, ndm));
267                                  if (opts.subscribe)                                  if (opts.subscribe)
268                                          server_response(&connaux,                                          response_generic(&connaux,
269                                              imap_subscribe(&connaux, ndm));                                              imap_subscribe(&connaux, ndm));
270                          }                          }
271                  }                  }
272                  xstrncpy(dm[0], dm[2], MBOX_NAME_LEN - 1);                  xstrncpy(dm[0], dm[2], MBOX_LEN - 1);
273    
274                  fetchfast_response(&connpri, &flags, &date, &size,                  response_fetchfast(&connpri, &flags, &date, &size,
275                      imap_fetch(&connpri, tok, "FAST"));                      imap_fetch(&connpri, tok, "FAST"));
276    
277                  ta = imap_append(&connaux, ndm, flags, date, size);                  ta = imap_append(&connaux, ndm, flags, date, size);
# Line 278  action_rcopy(char *mbox, char *mesgs, ac Line 279  action_rcopy(char *mbox, char *mesgs, ac
279                  xfree(flags);                  xfree(flags);
280                  xfree(date);                  xfree(date);
281    
282                  fetch_response(&connpri, 0, 1, NULL);                  response_fetch(&connpri, 0, 1, NULL);
283                  tf = imap_fetch(&connpri, tok, opts.peek ?                  tf = imap_fetch(&connpri, tok, opts.peek ?
284                      "BODY.PEEK[HEADER]" : "BODY[HEADER]");                      "BODY.PEEK[HEADER]" : "BODY[HEADER]");
285                  do {                  do {
286                          r = fetch_response(&connpri, tf, 0, buf);                          r = response_fetch(&connpri, tf, 0, buf);
287                          socket_write(&connaux, buf);                          socket_write(&connaux, buf);
288                  } while (r == RESPONSE_NONE);                  } while (r == RESPONSE_NONE);
289    
290                  socket_write(&connaux, "\r\n");                  socket_write(&connaux, "\r\n");
291    
292                  fetch_response(&connpri, 0, 1, NULL);                  response_fetch(&connpri, 0, 1, NULL);
293                  tf = imap_fetch(&connpri, tok, opts.peek ?                  tf = imap_fetch(&connpri, tok, opts.peek ?
294                      "BODY.PEEK[TEXT]" : "BODY[TEXT]");                      "BODY.PEEK[TEXT]" : "BODY[TEXT]");
295                  do {                  do {
296                          r = fetch_response(&connpri, tf, 0, buf);                          r = response_fetch(&connpri, tf, 0, buf);
297                          if (r != RESPONSE_NULLBODY)                          if (r != RESPONSE_NULLBODY)
298                                  socket_write(&connaux, buf);                                  socket_write(&connaux, buf);
299                  } while (r == RESPONSE_NONE);                  } while (r == RESPONSE_NONE);
# Line 302  action_rcopy(char *mbox, char *mesgs, ac Line 303  action_rcopy(char *mbox, char *mesgs, ac
303                  else                  else
304                          socket_write(&connaux, "\r\n");                          socket_write(&connaux, "\r\n");
305    
306                  append_response(&connaux, ta);                  response_append(&connaux, ta);
307    
308                  tok = strtok_r(NULL, " ", &m);                  tok = strtok_r(NULL, " ", &m);
309          }          }
# Line 338  int Line 339  int
339  action_flag(char *mesgs, unsigned int *type, unsigned int *msgflags,  action_flag(char *mesgs, unsigned int *type, unsigned int *msgflags,
340      char *args)      char *args)
341  {  {
         unsigned int t;  
342          char s[STORE_FLAGS_BUF];          char s[STORE_FLAGS_BUF];
343          char *tok, *m, *mcp;          char *tok, *m, *mcp;
344    
345          *s = 0;          *s = 0;
346    
347          switch (*type) {          if ((*msgflags != MSG_FLAG_NONE)) {
348          case FILTER_ACTION_FLAG_ADD:                  if ((*msgflags & MSG_FLAG_SEEN))
                 t = STORE_FLAG_ADD;  
                 break;  
         case FILTER_ACTION_FLAG_REMOVE:  
                 t = STORE_FLAG_REMOVE;  
                 break;  
         default:  
                 t = STORE_FLAG_REPLACE;  
         }  
   
         if ((*msgflags != MESSAGE_FLAG_NONE)) {  
                 if ((*msgflags & MESSAGE_FLAG_SEEN))  
349                          strncat(s, "\\Seen ", STORE_FLAGS_BUF - strlen(s) - 1);                          strncat(s, "\\Seen ", STORE_FLAGS_BUF - strlen(s) - 1);
350                  if ((*msgflags & MESSAGE_FLAG_ANSWERED))                  if ((*msgflags & MSG_FLAG_ANSWERED))
351                          strncat(s, "\\Answered ",                          strncat(s, "\\Answered ",
352                              STORE_FLAGS_BUF - strlen(s) - 1);                              STORE_FLAGS_BUF - strlen(s) - 1);
353                  if ((*msgflags & MESSAGE_FLAG_FLAGGED))                  if ((*msgflags & MSG_FLAG_FLAGGED))
354                          strncat(s, "\\Flagged ",                          strncat(s, "\\Flagged ",
355                              STORE_FLAGS_BUF - strlen(s) - 1);                              STORE_FLAGS_BUF - strlen(s) - 1);
356                  if ((*msgflags & MESSAGE_FLAG_DELETED))                  if ((*msgflags & MSG_FLAG_DELETED))
357                          strncat(s, "\\Deleted ",                          strncat(s, "\\Deleted ",
358                              STORE_FLAGS_BUF - strlen(s) - 1);                              STORE_FLAGS_BUF - strlen(s) - 1);
359                  if ((*msgflags & MESSAGE_FLAG_DRAFT))                  if ((*msgflags & MSG_FLAG_DRAFT))
360                          strncat(s, "\\Draft", STORE_FLAGS_BUF - strlen(s) - 1);                          strncat(s, "\\Draft", STORE_FLAGS_BUF - strlen(s) - 1);
361                  if ((s[strlen(s) - 1] == ' '))                  if ((s[strlen(s) - 1] == ' '))
362                          s[strlen(s) - 1] = 0;                          s[strlen(s) - 1] = 0;
# Line 378  action_flag(char *mesgs, unsigned int *t Line 367  action_flag(char *mesgs, unsigned int *t
367    
368          tok = strtok_r(m, " ", &m);          tok = strtok_r(m, " ", &m);
369          while (tok != NULL) {          while (tok != NULL) {
370                  server_response(&connpri, imap_store(&connpri, tok, t, s));                  response_generic(&connpri, imap_store(&connpri, tok, *type, s));
   
371                  tok = strtok_r(NULL, " ", &m);                  tok = strtok_r(NULL, " ", &m);
372          }          }
373    
374          if (opts.expunge)          if (opts.expunge)
375                  server_response(&connpri, imap_expunge(&connpri));                  response_generic(&connpri, imap_expunge(&connpri));
376    
377          xfree(mcp);          xfree(mcp);
378    
# Line 414  action_list(char *mesgs, char *args) Line 402  action_list(char *mesgs, char *args)
402          tok = strtok_r(m, " ", &m);          tok = strtok_r(m, " ", &m);
403          while (tok != NULL) {          while (tok != NULL) {
404                  /* Reset internal fetch counter. */                  /* Reset internal fetch counter. */
405                  fetch_response(&connpri, 0, 1, NULL);                  response_fetch(&connpri, 0, 1, NULL);
406                  t = imap_fetch(&connpri, tok, s);                  t = imap_fetch(&connpri, tok, s);
407    
408                  log_info(LOG_PREAMBLE, NULL);                  log_info(LOG_PREAMBLE, NULL);
409                  do {                  do {
410                          r = fetch_response(&connpri, t, 0, hdrs);                          r = response_fetch(&connpri, t, 0, hdrs);
411    
412                          if (*hdrs != '\0') {                          if (*hdrs != '\0') {
413                                  if (opts.headers)                                  if (opts.headers)
# Line 557  substitute_date(char *str) Line 545  substitute_date(char *str)
545  void  void
546  current_date(char *destmbox)  current_date(char *destmbox)
547  {  {
548          char s[MBOX_NAME_LEN];          char s[MBOX_LEN];
549          time_t te;          time_t te;
550          struct tm *tl;          struct tm *tl;
551    
# Line 567  current_date(char *destmbox) Line 555  current_date(char *destmbox)
555          te = time(NULL);          te = time(NULL);
556          tl = localtime(&te);          tl = localtime(&te);
557    
558          if (strftime(s, MBOX_NAME_LEN - 1, destmbox, tl))          if (strftime(s, MBOX_LEN - 1, destmbox, tl))
559                  xstrncpy(destmbox, s, MBOX_NAME_LEN - 1);                  xstrncpy(destmbox, s, MBOX_LEN - 1);
560  }  }
561    
562    
# Line 580  void Line 568  void
568  message_date(char *mesg, char *destmbox)  message_date(char *mesg, char *destmbox)
569  {  {
570          unsigned int t;          unsigned int t;
571          char s[MBOX_NAME_LEN];          char s[MBOX_LEN];
572          struct tm tl;          struct tm tl;
573          char dbuf[RESPONSE_BUF + 1];          char dbuf[RESPONSE_BUF + 1];
574    
# Line 589  message_date(char *mesg, char *destmbox) Line 577  message_date(char *mesg, char *destmbox)
577    
578          substitute_date(destmbox);          substitute_date(destmbox);
579    
580          fetch_response(&connpri, 0, 1, NULL);          response_fetch(&connpri, 0, 1, NULL);
581          t = imap_fetch(&connpri, mesg, opts.peek ?          t = imap_fetch(&connpri, mesg, opts.peek ?
582              "BODY.PEEK[HEADER.FIELDS (DATE)]" :              "BODY.PEEK[HEADER.FIELDS (DATE)]" :
583              "BODY[HEADER.FIELDS (DATE)]");              "BODY[HEADER.FIELDS (DATE)]");
584    
585          while (fetch_response(&connpri, t, 0, dbuf) == RESPONSE_NONE);          while (response_fetch(&connpri, t, 0, dbuf) == RESPONSE_NONE);
586    
587          if (((strptime(dbuf, "Date: %a, %d %b %Y %H:%M:%S", &tl) ||          if (((strptime(dbuf, "Date: %a, %d %b %Y %H:%M:%S", &tl) ||
588                      strptime(dbuf, "Date: %d %b %Y %H:%M:%S", &tl)) &&                      strptime(dbuf, "Date: %d %b %Y %H:%M:%S", &tl)) &&
589                  strftime(s, MBOX_NAME_LEN - 1, destmbox, &tl)))                  strftime(s, MBOX_LEN - 1, destmbox, &tl)))
590                  xstrncpy(destmbox, s, MBOX_NAME_LEN - 1);                  xstrncpy(destmbox, s, MBOX_LEN - 1);
591  }  }
592    
593    
# Line 617  default_variables(char *mbox, char *dest Line 605  default_variables(char *mbox, char *dest
605          s = xstrdup(destmbox);          s = xstrdup(destmbox);
606    
607          for (r = s, w = destmbox; *r != '\0';) {          for (r = s, w = destmbox; *r != '\0';) {
608                  if (w - destmbox >= MBOX_NAME_LEN - 1)                  if (w - destmbox >= MBOX_LEN - 1)
609                          break;                          break;
610                  if (*r == '$') {                  if (*r == '$') {
611                          switch (*(r + 1)) {                          switch (*(r + 1)) {
612                          case '_':                          case '_':
613                                  if (w + strlen(mbox) - destmbox >                                  if (w + strlen(mbox) - destmbox >
614                                      MBOX_NAME_LEN - 1) {                                      MBOX_LEN - 1) {
615                                          r += 2;                                          r += 2;
616                                          break;                                          break;
617                                  }                                  }

Legend:
Removed from v.1.12  
changed lines
  Added in v.1.13

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26