X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=imap%2Fcommand.c;h=45d6ba313625f13ff543f232006679c3fa82b6b9;hb=1b7a73c786059b66cfe5e89b2ba74b9c890309fc;hp=ebf468e576ebf8628fe7cc9799f4fb55846b2d40;hpb=a8477ebaa09990b3688164cbe5cf661c4189541d;p=apps%2Fmadmutt.git diff --git a/imap/command.c b/imap/command.c index ebf468e..45d6ba3 100644 --- a/imap/command.c +++ b/imap/command.c @@ -2,7 +2,7 @@ * Copyright notice from original mutt: * Copyright (C) 1996-8 Michael R. Elkins * Copyright (C) 1996-9 Brandon Long - * Copyright (C) 1999-2002 Brendan Cully + * Copyright (C) 1999-2005 Brendan Cully * * This file is part of mutt-ng, see http://www.muttng.org/. * It's licensed under the GNU General Public License, @@ -16,15 +16,16 @@ # include "config.h" #endif -#include "mutt.h" -#include "imap_private.h" -#include "message.h" -#include "mx.h" - #include "lib/mem.h" #include "lib/intl.h" #include "lib/debug.h" +#include "mutt.h" +#include "message.h" +#include "mx.h" +#include "ascii.h" +#include "imap_private.h" + #include #include @@ -36,6 +37,7 @@ static int cmd_handle_untagged (IMAP_DATA * idata); static void cmd_make_sequence (IMAP_DATA * idata); static void cmd_parse_capabilities (IMAP_DATA * idata, char *s); static void cmd_parse_expunge (IMAP_DATA * idata, const char *s); +static void cmd_parse_lsub (IMAP_DATA* idata, char* s); static void cmd_parse_fetch (IMAP_DATA * idata, char *s); static void cmd_parse_myrights (IMAP_DATA * idata, char *s); @@ -71,12 +73,12 @@ int imap_cmd_start (IMAP_DATA * idata, const char *cmd) cmd_make_sequence (idata); /* seq, space, cmd, \r\n\0 */ outlen = str_len (idata->cmd.seq) + str_len (cmd) + 4; - out = (char *) safe_malloc (outlen); + out = (char *) mem_malloc (outlen); snprintf (out, outlen, "%s %s\r\n", idata->cmd.seq, cmd); rc = mutt_socket_write (idata->conn, out); - FREE (&out); + mem_free (&out); return (rc < 0) ? IMAP_CMD_BAD : 0; } @@ -100,7 +102,7 @@ int imap_cmd_step (IMAP_DATA * idata) * line */ do { if (len == cmd->blen) { - safe_realloc (&cmd->buf, cmd->blen + IMAP_CMD_BUFSIZE); + mem_realloc (&cmd->buf, cmd->blen + IMAP_CMD_BUFSIZE); cmd->blen = cmd->blen + IMAP_CMD_BUFSIZE; debug_print (3, ("grew buffer to %u bytes\n", cmd->blen)); } @@ -121,7 +123,7 @@ int imap_cmd_step (IMAP_DATA * idata) /* don't let one large string make cmd->buf hog memory forever */ if ((cmd->blen > IMAP_CMD_BUFSIZE) && (len <= IMAP_CMD_BUFSIZE)) { - safe_realloc (&cmd->buf, IMAP_CMD_BUFSIZE); + mem_realloc (&cmd->buf, IMAP_CMD_BUFSIZE); cmd->blen = IMAP_CMD_BUFSIZE; debug_print (3, ("shrank buffer to %u bytes\n", cmd->blen)); } @@ -183,13 +185,13 @@ int imap_exec (IMAP_DATA * idata, const char *cmd, int flags) cmd_make_sequence (idata); /* seq, space, cmd, \r\n\0 */ outlen = str_len (idata->cmd.seq) + str_len (cmd) + 4; - out = (char *) safe_malloc (outlen); + out = (char *) mem_malloc (outlen); snprintf (out, outlen, "%s %s\r\n", idata->cmd.seq, cmd); rc = mutt_socket_write_d (idata->conn, out, flags & IMAP_CMD_PASS ? IMAP_LOG_PASS : IMAP_LOG_CMD); - FREE (&out); + mem_free (&out); if (rc < 0) { cmd_handle_fatal (idata); @@ -347,6 +349,8 @@ static int cmd_handle_untagged (IMAP_DATA * idata) } else if (ascii_strncasecmp ("CAPABILITY", s, 10) == 0) cmd_parse_capabilities (idata, s); + else if (ascii_strncasecmp ("LSUB", s, 4) == 0) + cmd_parse_lsub (idata, s); else if (ascii_strncasecmp ("MYRIGHTS", s, 8) == 0) cmd_parse_myrights (idata, s); else if (ascii_strncasecmp ("BYE", s, 3) == 0) { @@ -394,7 +398,7 @@ static void cmd_parse_capabilities (IMAP_DATA * idata, char *s) debug_print (2, ("Handling CAPABILITY\n")); s = imap_next_word (s); - FREE (&idata->capstr); + mem_free (&idata->capstr); idata->capstr = str_dup (s); memset (idata->capabilities, 0, sizeof (idata->capabilities)); @@ -491,6 +495,60 @@ static void cmd_parse_fetch (IMAP_DATA * idata, char *s) } } +static void cmd_parse_lsub (IMAP_DATA* idata, char* s) { + char buf[STRING]; + char errstr[STRING]; + BUFFER err, token; + ciss_url_t url; + char *ep; + + if (!option (OPTIMAPCHECKSUBSCRIBED)) + return; + + s = imap_next_word (s); /* flags */ + + if (*s != '(') { + debug_print (1, ("Bad LSUB response\n")); + return; + } + + s++; + ep = s; + for (ep = s; *ep && *ep != ')'; ep++); + do { + if (!ascii_strncasecmp (s, "\\NoSelect", 9)) + return; + while (s < ep && *s != ' ' && *s != ')') + s++; + if (*s == ' ') + s++; + } while (s != ep); + + s = imap_next_word (s); /* delim */ + s = imap_next_word (s); /* name */ + + if (s) { + imap_unmunge_mbox_name (s); + debug_print (2, ("Subscribing to %s\n", s)); + + strfcpy (buf, "mailboxes \"", sizeof (buf)); + mutt_account_tourl (&idata->conn->account, &url); + url.path = s; + if (!str_cmp (url.user, ImapUser)) + url.user = NULL; + url_ciss_tostring (&url, buf + 11, sizeof (buf) - 10, 0); + str_cat (buf, sizeof (buf), "\""); + memset (&token, 0, sizeof (token)); + err.data = errstr; + err.dsize = sizeof (errstr); + if (mutt_parse_rc_line (buf, &token, &err)) + debug_print (1, ("Error adding subscribed mailbox: %s\n", errstr)); + mem_free (&token.data); + } + else + debug_print (1, ("Bad LSUB response\n")); +} + /* cmd_parse_myrights: set rights bits according to MYRIGHTS response */ static void cmd_parse_myrights (IMAP_DATA * idata, char *s) {