]> granicus.if.org Git - curl/commitdiff
imap: Added support for parsing the UIDVALIDITY property
authorJiri Hruska <jirka@fud.cz>
Tue, 26 Feb 2013 20:56:14 +0000 (21:56 +0100)
committerSteve Holme <steve_holme@hotmail.com>
Tue, 26 Feb 2013 22:09:19 +0000 (22:09 +0000)
Added support for parsing the UIDVALIDITY property from the SELECT
response and storing it in the per-connection structure.

lib/imap.c

index 101f2bec5e14bd22c73ed84584bcd76ecae6ee3f..b7c92ef585a5d0e5df0eb6954ce3a8ad24279fdd 100644 (file)
@@ -395,6 +395,11 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len,
           return FALSE;
         break;
 
+      case IMAP_SELECT:
+        /* SELECT is special in that its untagged responses does not have a
+           common prefix so accept anything! */
+        break;
+
       case IMAP_FETCH:
         if(!imap_matchresp(line, len, "FETCH"))
           return FALSE;
@@ -666,8 +671,12 @@ static CURLcode imap_select(struct connectdata *conn)
   CURLcode result = CURLE_OK;
   struct SessionHandle *data = conn->data;
   struct IMAP *imap = data->state.proto.imap;
+  struct imap_conn *imapc = &conn->proto.imapc;
   char *mailbox;
 
+  /* Invalidate old information in case we are switching mailboxes */
+  Curl_safefree(imapc->mailbox_uidvalidity);
+
   mailbox = imap_atom(imap->mailbox ? imap->mailbox : "");
   if(!mailbox)
     result = CURLE_OUT_OF_MEMORY;
@@ -1207,10 +1216,20 @@ static CURLcode imap_state_select_resp(struct connectdata *conn,
 {
   CURLcode result = CURLE_OK;
   struct SessionHandle *data = conn->data;
+  struct imap_conn *imapc = &conn->proto.imapc;
+  const char *line = data->state.buffer;
+  char tmp[20];
 
   (void)instate; /* no use for this yet */
 
-  if(imapcode != 'O') {
+  if(imapcode == '*') {
+    /* See if this is an UIDVALIDITY response */
+    if(sscanf(line + 2, "OK [UIDVALIDITY %19[0123456789]]", tmp) == 1) {
+      Curl_safefree(imapc->mailbox_uidvalidity);
+      imapc->mailbox_uidvalidity = strdup(tmp);
+    }
+  }
+  else if(imapcode != 'O') {
     failf(data, "Select failed");
     result = CURLE_LOGIN_DENIED;
   }