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

Diff of /imapfilter/response.c

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

revision 1.23 by lefcha, Fri Jul 26 18:21:11 2002 UTC revision 1.23.2.4 by lefcha, Sun Sep 29 19:54:58 2002 UTC
# Line 7  Line 7 
7  #include <sys/time.h>  #include <sys/time.h>
8  #include <sys/types.h>  #include <sys/types.h>
9  #include <regex.h>  #include <regex.h>
10    #include <setjmp.h>
11    
12  #include "config.h"  #include "config.h"
13  #include "imapfilter.h"  #include "imapfilter.h"
# Line 14  Line 15 
15    
16  extern int sockpri;  extern int sockpri;
17  extern unsigned int capabilities;  extern unsigned int capabilities;
18    extern jmp_buf acctloop;
19    
20  static char *vbuf = NULL;       /* Virtual buffer. */  static char *vbuf = NULL;       /* Virtual buffer. */
21  static size_t vbufs = 0;        /* Virtual buffer size. */  static size_t vbufs = 0;        /* Virtual buffer size. */
# Line 44  int server_response(int *sock, unsigned Line 46  int server_response(int *sock, unsigned
46    
47      do {      do {
48          receive_response(sock, buf);          receive_response(sock, buf);
49            bye_response(buf);
50          check_vbuf(strlen(buf));          check_vbuf(strlen(buf));
51          strncat(vbuf, buf, vbufs - strlen(vbuf));          strncat(vbuf, buf, vbufs - strlen(vbuf));
52      } while (tag && !strcasestr(buf, ultostr(tag, 16)));      } while (tag && !strcasestr(buf, ultostr(tag, 16)));
# Line 53  int server_response(int *sock, unsigned Line 56  int server_response(int *sock, unsigned
56    
57    
58  /*  /*
59     * Check if server sent a BYE response (connection is closed immediately).
60     */
61    void bye_response(char *buf)
62    {
63        if (strcasestr(buf, "* BYE"))
64            longjmp(acctloop, -1);
65    }
66    
67    
68    /*
69   * Process the greeting that server sends during connection.   * Process the greeting that server sends during connection.
70   */   */
71  int greeting_response(int *sock)  int greeting_response(int *sock)
# Line 60  int greeting_response(int *sock) Line 73  int greeting_response(int *sock)
73      char buf[RESPONSE_BUF];      char buf[RESPONSE_BUF];
74    
75      receive_response(sock, buf);      receive_response(sock, buf);
76        bye_response(buf);
77    
78      if (strcasestr(buf, "BYE"))      if (strcasestr(buf, "* PREAUTH"))
         return RESPONSE_BYE;  
     else if (strcasestr(buf, "PREAUTH"))  
79          return RESPONSE_PREAUTH;          return RESPONSE_PREAUTH;
80    
81      return RESPONSE_OK;      return RESPONSE_OK;
# Line 71  int greeting_response(int *sock) Line 83  int greeting_response(int *sock)
83    
84    
85  /*  /*
86     * Process the data that server sent due to IMAP LOGOUT client request.
87     */
88    int logout_response(int *sock, unsigned int tag)
89    {
90        char buf[RESPONSE_BUF];
91    
92        reset_vbuf();
93    
94        do {
95            receive_response(sock, buf);
96            check_vbuf(strlen(buf));
97            strncat(vbuf, buf, vbufs - strlen(vbuf));
98        } while (!strcasestr(buf, ultostr(tag, 16)));
99    
100        return analyze_response(buf);
101    }
102    
103    
104    /*
105   * Process the data that server sent due to IMAP CAPABILITY client request.   * Process the data that server sent due to IMAP CAPABILITY client request.
106   */   */
107  int capability_response(int *sock, unsigned int tag)  int capability_response(int *sock, unsigned int tag)
# Line 81  int capability_response(int *sock, unsig Line 112  int capability_response(int *sock, unsig
112    
113      do {      do {
114          receive_response(sock, buf);          receive_response(sock, buf);
115            bye_response(buf);
116          check_vbuf(strlen(buf));          check_vbuf(strlen(buf));
117          strncat(vbuf, buf, vbufs - strlen(vbuf));          strncat(vbuf, buf, vbufs - strlen(vbuf));
118      } while (!strcasestr(buf, ultostr(tag, 16)));      } while (!strcasestr(buf, ultostr(tag, 16)));
# Line 107  int namespace_response(int *sock, unsign Line 139  int namespace_response(int *sock, unsign
139      reset_vbuf();      reset_vbuf();
140    
141      do {      do {
142            receive_response(sock, buf);
143            bye_response(buf);
144          check_vbuf(strlen(buf));          check_vbuf(strlen(buf));
145          strncat(vbuf, buf, vbufs - strlen(vbuf));          strncat(vbuf, buf, vbufs - strlen(vbuf));
         receive_response(sock, buf);  
146      } while (!strcasestr(buf, ultostr(tag, 16)));      } while (!strcasestr(buf, ultostr(tag, 16)));
147    
148      if ((c = strcasestr(vbuf, "* NAMESPACE"))) {      if ((c = strcasestr(vbuf, "* NAMESPACE"))) {
# Line 145  int status_response(int *sock, unsigned Line 178  int status_response(int *sock, unsigned
178    
179      do {      do {
180          receive_response(sock, buf);          receive_response(sock, buf);
181            bye_response(buf);
182          check_vbuf(strlen(buf));          check_vbuf(strlen(buf));
183          strncat(vbuf, buf, vbufs - strlen(vbuf));          strncat(vbuf, buf, vbufs - strlen(vbuf));
184      } while (!strcasestr(buf, ultostr(tag, 16)));      } while (!strcasestr(buf, ultostr(tag, 16)));
# Line 188  int select_response(int *sock, unsigned Line 222  int select_response(int *sock, unsigned
222    
223      do {      do {
224          receive_response(sock, buf);          receive_response(sock, buf);
225            bye_response(buf);
226          check_vbuf(strlen(buf));          check_vbuf(strlen(buf));
227          strncat(vbuf, buf, vbufs - strlen(vbuf));          strncat(vbuf, buf, vbufs - strlen(vbuf));
228      } while (!strcasestr(buf, ultostr(tag, 16)));      } while (!strcasestr(buf, ultostr(tag, 16)));
# Line 212  int search_response(int *sock, unsigned Line 247  int search_response(int *sock, unsigned
247    
248      do {      do {
249          receive_response(sock, buf);          receive_response(sock, buf);
250            bye_response(buf);
251          check_vbuf(strlen(buf));          check_vbuf(strlen(buf));
252          strncat(vbuf, buf, vbufs - strlen(vbuf));          strncat(vbuf, buf, vbufs - strlen(vbuf));
253      } while (!strcasestr(buf, ultostr(tag, 16)));      } while (!strcasestr(buf, ultostr(tag, 16)));
# Line 223  int search_response(int *sock, unsigned Line 259  int search_response(int *sock, unsigned
259    
260          c += 9;          c += 9;
261    
262          while (*c && (isdigit(*c) || *c == ' '))          while (*c && (isdigit((unsigned char)(*c)) || *c == ' '))
263              *(m++) = *(c++);              *(m++) = *(c++);
264    
265          *m = 0;          *m = 0;
# Line 235  int search_response(int *sock, unsigned Line 271  int search_response(int *sock, unsigned
271  /*  /*
272   * Process the data that server sent due to IMAP FETCH client request.   * Process the data that server sent due to IMAP FETCH client request.
273   */   */
274  int fetch_response(int *sock, int reset, char *fetch, unsigned int tag)  int fetch_response(int *sock, int reset, char *fetch)
275  {  {
276      char buf[RESPONSE_BUF];      char buf[RESPONSE_BUF];
277      unsigned int i;      unsigned int i;
# Line 249  int fetch_response(int *sock, int reset, Line 285  int fetch_response(int *sock, int reset,
285      i = 0;      i = 0;
286    
287      receive_response(sock, buf);      receive_response(sock, buf);
288        bye_response(buf);
289    
290      b = buf;      b = buf;
291    
# Line 283  int fetchsize_response(int *sock, unsign Line 320  int fetchsize_response(int *sock, unsign
320    
321      do {      do {
322          receive_response(sock, buf);          receive_response(sock, buf);
323            bye_response(buf);
324          check_vbuf(strlen(buf));          check_vbuf(strlen(buf));
325          strncat(vbuf, buf, vbufs - strlen(vbuf));          strncat(vbuf, buf, vbufs - strlen(vbuf));
326      } while (!strcasestr(buf, ultostr(tag, 16)));      } while (!strcasestr(buf, ultostr(tag, 16)));
# Line 307  int append_response(int *sock, unsigned Line 345  int append_response(int *sock, unsigned
345    
346      do {      do {
347          receive_response(sock, buf);          receive_response(sock, buf);
348            bye_response(buf);
349          check_vbuf(strlen(buf));          check_vbuf(strlen(buf));
350          strncat(vbuf, buf, vbufs - strlen(vbuf));          strncat(vbuf, buf, vbufs - strlen(vbuf));
351      } while (!strcasestr(buf, ultostr(tag, 16)));      } while (!strcasestr(buf, ultostr(tag, 16)));
# Line 331  int copy_response(int *sock, unsigned in Line 370  int copy_response(int *sock, unsigned in
370    
371      do {      do {
372          receive_response(sock, buf);          receive_response(sock, buf);
373            bye_response(buf);
374          check_vbuf(strlen(buf));          check_vbuf(strlen(buf));
375          strncat(vbuf, buf, vbufs - strlen(vbuf));          strncat(vbuf, buf, vbufs - strlen(vbuf));
376      } while (!strcasestr(buf, ultostr(tag, 16)));      } while (!strcasestr(buf, ultostr(tag, 16)));
# Line 383  int analyze_response(char *buf) Line 423  int analyze_response(char *buf)
423   */   */
424  void init_vbuf(void)  void init_vbuf(void)
425  {  {
426      vbuf = xmalloc(4096);      vbuf = xmalloc(VIRTUAL_BUF);
427      *vbuf = 0;      *vbuf = 0;
428      vbufs = 4096;      vbufs = VIRTUAL_BUF;
429  }  }
430    
431    
# Line 404  void reset_vbuf(void) Line 444  void reset_vbuf(void)
444  void check_vbuf(size_t n)  void check_vbuf(size_t n)
445  {  {
446      if (n + strlen(vbuf) >= vbufs) {      if (n + strlen(vbuf) >= vbufs) {
447          vbufs += 4096;          vbufs += VIRTUAL_BUF;
448          vbuf = xrealloc(vbuf, vbufs);          vbuf = xrealloc(vbuf, vbufs);
449      }      }
450  }  }

Legend:
Removed from v.1.23  
changed lines
  Added in v.1.23.2.4

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26