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;
if (idata->state != IMAP_SELECTED) {
idata->state = IMAP_DISCONNECTED;
+ mutt_socket_close (idata->conn);
idata->status = 0;
}
}
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;
- /*} else {
- return 0;
- } */
}
else if (option (OPTIMAPSERVERNOISE)
&& (ascii_strncasecmp ("NO", s, 2) == 0)) {
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;
}
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);
- /* 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))
{
CONNECTION *conn;
IMAP_DATA *idata;
- char buf[LONG_STRING], mbox[LONG_STRING];
+ char buf[LONG_STRING];
char mailbox[LONG_STRING];
- int r;
IMAP_MBOX mx;
if (imap_parse_path (ctx->path, &mx))
/* 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;
- /* check mailbox existance */
-
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. */
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 */
- 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;
}
}
#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) &&
- (!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 */
- {
snprintf (tmp, sizeof (tmp), _("Append messages to %s?"), s);
if ((rc = mutt_yesorno (tmp, M_YES)) == M_NO)
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)