Rocco Rutte:
authorpdmef <pdmef@e385b8ad-14ed-0310-8656-cc95a2468c6d>
Wed, 27 Jul 2005 02:39:27 +0000 (02:39 +0000)
committerpdmef <pdmef@e385b8ad-14ed-0310-8656-cc95a2468c6d>
Wed, 27 Jul 2005 02:39:27 +0000 (02:39 +0000)
- merge in latest mutt changes

git-svn-id: svn://svn.berlios.de/mutt-ng/trunk@355 e385b8ad-14ed-0310-8656-cc95a2468c6d

ChangeLog.mutt
imap/command.c
imap/imap.c
muttlib.c

index d72a363..8e12b1b 100644 (file)
@@ -1,3 +1,19 @@
+2005-07-27 00:40:15  Brendan Cully  <brendan@kublai.com>  (brendan)
+
+       * imap/command.c: More fiddling with fatal state handling. Not
+       tested, and probably as wrong as what was already there.
+
+2005-07-27 00:32:18  Brendan Cully  <brendan@kublai.com>  (brendan)
+
+       * muttlib.c: Rework mutt_save_confirm to support confirmappend
+       with IMAP mailboxes.  I hope I got all cases right.
+
+2005-07-26 23:57:38  Brendan Cully  <brendan@kublai.com>  (brendan)
+
+       * imap/imap.c: Adjust imap_access so that it doesn't issue STATUS
+       on the selected mailbox, and have imap_open_mailbox_append use
+       imap_access instead of rolling its own.
+
 2005-07-26 18:45:01  TAKAHASHI Tamotsu  <ttakah@lapis.plala.or.jp>  (brendan)
 
        * crypt-gpgme.c, mutt_ssl_gnutls.c, po/POTFILES.in: Partial
 2005-07-26 18:45:01  TAKAHASHI Tamotsu  <ttakah@lapis.plala.or.jp>  (brendan)
 
        * crypt-gpgme.c, mutt_ssl_gnutls.c, po/POTFILES.in: Partial
index ba9d666..40a1cf3 100644 (file)
@@ -279,8 +279,8 @@ static void cmd_handle_fatal (IMAP_DATA * idata)
   idata->status = IMAP_FATAL;
 
   if ((idata->state == IMAP_SELECTED) &&
   idata->status = IMAP_FATAL;
 
   if ((idata->state == IMAP_SELECTED) &&
-      (idata->reopen & IMAP_REOPEN_ALLOW) && !idata->ctx->closing) {
-    /*mx_fastclose_mailbox (idata->ctx); */
+      (idata->reopen & IMAP_REOPEN_ALLOW)) {
+    /* mx_fastclose_mailbox (idata->ctx); */
     mutt_error (_("Mailbox closed"));
     mutt_sleep (1);
     idata->state = IMAP_DISCONNECTED;
     mutt_error (_("Mailbox closed"));
     mutt_sleep (1);
     idata->state = IMAP_DISCONNECTED;
@@ -290,6 +290,7 @@ static void cmd_handle_fatal (IMAP_DATA * idata)
 
   if (idata->state != IMAP_SELECTED) {
     idata->state = IMAP_DISCONNECTED;
 
   if (idata->state != IMAP_SELECTED) {
     idata->state = IMAP_DISCONNECTED;
+    mutt_socket_close (idata->conn);
     idata->status = 0;
   }
 }
     idata->status = 0;
   }
 }
@@ -359,17 +360,9 @@ static int cmd_handle_untagged (IMAP_DATA * idata)
     s += 3;
     SKIPWS (s);
     mutt_error ("%s", s);
     s += 3;
     SKIPWS (s);
     mutt_error ("%s", s);
-    idata->status = IMAP_BYE;
-
-    /*if (imap_reconnect(idata->ctx)!=0) {
-       if (idata->state == IMAP_SELECTED)
-       mx_fastclose_mailbox (idata->ctx); *//* XXX memleak? */
-    mutt_socket_close (idata->conn);
-    idata->state = IMAP_DISCONNECTED;
+    mutt_sleep (2);
+    cmd_handle_fatal (idata);
     return -1;
     return -1;
-    /*} else {
-       return 0;
-       } */
   }
   else if (option (OPTIMAPSERVERNOISE)
            && (ascii_strncasecmp ("NO", s, 2) == 0)) {
   }
   else if (option (OPTIMAPSERVERNOISE)
            && (ascii_strncasecmp ("NO", s, 2) == 0)) {
index 099be62..2a4dff5 100644 (file)
@@ -47,7 +47,9 @@ static int imap_check_capabilities (IMAP_DATA * idata);
 static void imap_set_flag (IMAP_DATA * idata, int aclbit, int flag,
                            const char *str, char *flags, size_t flsize);
 
 static void imap_set_flag (IMAP_DATA * idata, int aclbit, int flag,
                            const char *str, char *flags, size_t flsize);
 
-/* imap_access: Check permissions on an IMAP mailbox. */
+/* imap_access: Check permissions on an IMAP mailbox.
+ * TODO: ACL checks. Right now we assume if it exists we can
+ * mess with it. */
 int imap_access (const char *path, int flags)
 {
   IMAP_DATA *idata;
 int imap_access (const char *path, int flags)
 {
   IMAP_DATA *idata;
@@ -67,10 +69,16 @@ int imap_access (const char *path, int flags)
   }
 
   imap_fix_path (idata, mx.mbox, mailbox, sizeof (mailbox));
   }
 
   imap_fix_path (idata, mx.mbox, mailbox, sizeof (mailbox));
+
+  /* we may already be in the folder we're checking */
+  if (!ascii_strcmp(idata->mailbox, mx.mbox)) {
+    FREE (&mx.mbox);
+    return 0;
+  }
+
   FREE (&mx.mbox);
   imap_munge_mbox_name (mbox, sizeof (mbox), mailbox);
 
   FREE (&mx.mbox);
   imap_munge_mbox_name (mbox, sizeof (mbox), mailbox);
 
-  /* TODO: ACL checks. Right now we assume if it exists we can mess with it. */
   if (mutt_bit_isset (idata->capabilities, IMAP4REV1))
     snprintf (buf, sizeof (buf), "STATUS %s (UIDVALIDITY)", mbox);
   else if (mutt_bit_isset (idata->capabilities, STATUS))
   if (mutt_bit_isset (idata->capabilities, IMAP4REV1))
     snprintf (buf, sizeof (buf), "STATUS %s (UIDVALIDITY)", mbox);
   else if (mutt_bit_isset (idata->capabilities, STATUS))
@@ -694,9 +702,8 @@ int imap_open_mailbox_append (CONTEXT * ctx)
 {
   CONNECTION *conn;
   IMAP_DATA *idata;
 {
   CONNECTION *conn;
   IMAP_DATA *idata;
-  char buf[LONG_STRING], mbox[LONG_STRING];
+  char buf[LONG_STRING];
   char mailbox[LONG_STRING];
   char mailbox[LONG_STRING];
-  int r;
   IMAP_MBOX mx;
 
   if (imap_parse_path (ctx->path, &mx))
   IMAP_MBOX mx;
 
   if (imap_parse_path (ctx->path, &mx))
@@ -705,58 +712,31 @@ int imap_open_mailbox_append (CONTEXT * ctx)
   /* in APPEND mode, we appear to hijack an existing IMAP connection -
    * ctx is brand new and mostly empty */
 
   /* in APPEND mode, we appear to hijack an existing IMAP connection -
    * ctx is brand new and mostly empty */
 
-  if (!(idata = imap_conn_find (&(mx.account), 0)))
-    goto fail;
+  if (!(idata = imap_conn_find (&(mx.account), 0))) {
+    FREE(&mx.mbox);
+    return (-1);
+  }
   conn = idata->conn;
 
   ctx->magic = M_IMAP;
   ctx->data = idata;
 
   conn = idata->conn;
 
   ctx->magic = M_IMAP;
   ctx->data = idata;
 
-  /* check mailbox existance */
-
   imap_fix_path (idata, mx.mbox, mailbox, sizeof (mailbox));
 
   imap_fix_path (idata, mx.mbox, mailbox, sizeof (mailbox));
 
-  /* We may be appending to the same folder we've selected. */
-  if (!ascii_strcmp(idata->mailbox, mx.mbox)) {
-    FREE (&mx.mbox);
-    return 0;
-  }
-
-  imap_munge_mbox_name (mbox, sizeof (mbox), mailbox);
+  FREE(&mx.mbox);
 
 
-  if (mutt_bit_isset (idata->capabilities, IMAP4REV1))
-    snprintf (buf, sizeof (buf), "STATUS %s (UIDVALIDITY)", mbox);
-  else if (mutt_bit_isset (idata->capabilities, STATUS))
-    /* We have no idea what the other guy wants. UW imapd 8.3 wants this
-     * (but it does not work if another mailbox is selected) */
-    snprintf (buf, sizeof (buf), "STATUS %s (UID-VALIDITY)", mbox);
-  else {
-    /* STATUS not supported */
-    mutt_message _("Unable to append to IMAP mailboxes at this server");
-
-    goto fail;
-  }
-
-  r = imap_exec (idata, buf, IMAP_CMD_FAIL_OK);
-  if (r == -2) {
-    /* command failed cause folder doesn't exist */
-    snprintf (buf, sizeof (buf), _("Create %s?"), mailbox);
-    if (option (OPTCONFIRMCREATE) && mutt_yesorno (buf, 1) < 1)
-      goto fail;
+  /* really we should also check for W_OK */
+  if (!imap_access (ctx->path, F_OK))
+    return 0;
 
 
-    if (imap_create_mailbox (idata, mailbox) < 0)
-      goto fail;
-  }
-  else if (r == -1)
-    /* Hmm, some other failure */
-    goto fail;
+  snprintf (buf, sizeof (buf), _("Create %s?"), mailbox);
+  if (option (OPTCONFIRMCREATE) && mutt_yesorno (buf, 1) < 1)
+    return -1;
 
 
-  FREE (&mx.mbox);
-  return 0;
+  if (imap_create_mailbox (idata, mailbox) < 0)
+    return -1;
 
 
-fail:
-  FREE (&mx.mbox);
-  return -1;
+  return (0);
 }
 
 /* imap_logout: Gracefully log out of server. */
 }
 
 /* imap_logout: Gracefully log out of server. */
@@ -1079,12 +1059,11 @@ void imap_close_mailbox (CONTEXT * ctx)
     return;
 
   if (ctx == idata->ctx) {
     return;
 
   if (ctx == idata->ctx) {
-    if (idata->state == IMAP_SELECTED) {
+    if (idata->state != IMAP_FATAL && idata->state == IMAP_SELECTED) {
       /* mx_close_mailbox won't sync if there are no deleted messages
       * and the mailbox is unchanged, so we may have to close here */
       /* mx_close_mailbox won't sync if there are no deleted messages
       * and the mailbox is unchanged, so we may have to close here */
-      if (idata->status != IMAP_FATAL && !ctx->deleted && 
-          imap_exec (idata, "CLOSE", 0))
-      mutt_error (_("CLOSE failed"));
+      if (!ctx->deleted && imap_exec (idata, "CLOSE", 0))
+        mutt_error (_("CLOSE failed"));
       idata->state = IMAP_AUTHENTICATED;
     }
 
       idata->state = IMAP_AUTHENTICATED;
     }
 
index 72566aa..94c7816 100644 (file)
--- a/muttlib.c
+++ b/muttlib.c
@@ -1225,16 +1225,10 @@ int mutt_save_confirm (const char *s, struct stat *st)
   }
 #endif
 
   }
 #endif
 
-  if (stat (s, st) != -1) {
-    if (magic == -1) {
-      mutt_error (_("%s is not a mailbox!"), s);
-      return 1;
-    }
-
+  if (magic > 0 && !mx_access (s, W_OK)) {
     if (option (OPTCONFIRMAPPEND) &&
     if (option (OPTCONFIRMAPPEND) &&
-        (!TrashPath || (mutt_strcmp (s, TrashPath) != 0)))
+        (!TrashPath || (mutt_strcmp (s, TrashPath) != 0))) {
       /* if we're appending to the trash, there's no point in asking */
       /* if we're appending to the trash, there's no point in asking */
-    {
       snprintf (tmp, sizeof (tmp), _("Append messages to %s?"), s);
       if ((rc = mutt_yesorno (tmp, M_YES)) == M_NO)
         ret = 1;
       snprintf (tmp, sizeof (tmp), _("Append messages to %s?"), s);
       if ((rc = mutt_yesorno (tmp, M_YES)) == M_NO)
         ret = 1;
@@ -1242,6 +1236,13 @@ int mutt_save_confirm (const char *s, struct stat *st)
         ret = -1;
     }
   }
         ret = -1;
     }
   }
+
+  if (stat (s, st) != -1) {
+    if (magic == -1) {
+      mutt_error (_("%s is not a mailbox!"), s);
+      return 1;
+    }
+  }
   else {
 #ifdef USE_IMAP
     if (magic != M_IMAP)
   else {
 #ifdef USE_IMAP
     if (magic != M_IMAP)