/*
+ * Copyright notice from original mutt:
* Copyright (C) 1996-8 Michael R. Elkins <me@mutt.org>
* Copyright (C) 1996-9 Brandon Long <blong@fiction.net>
* Copyright (C) 1999-2002 Brendan Cully <brendan@kublai.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
- */
+ *
+ * This file is part of mutt-ng, see http://www.muttng.org/.
+ * It's licensed under the GNU General Public License,
+ * please see the file GPL in the top level source directory.
+ */
/* general IMAP utility functions */
#include "config.h"
#include "mutt.h"
-#include "mx.h" /* for M_IMAP */
+#include "mx.h" /* for M_IMAP */
+#include "ascii.h"
#include "url.h"
#include "imap_private.h"
#include "mutt_ssl.h"
+#include "lib/mem.h"
+#include "lib/intl.h"
+#include "lib/debug.h"
+
#include <stdlib.h>
#include <ctype.h>
* Outputs: The buffer is rewritten in place with the canonical IMAP path.
* Returns 0 on success, or -1 if imap_parse_path chokes or url_ciss_tostring
* fails, which it might if there isn't enough room in the buffer. */
-int imap_expand_path (char* path, size_t len)
+int imap_expand_path (char *path, size_t len)
{
IMAP_MBOX mx;
ciss_url_t url;
url.path = mx.mbox;
rc = url_ciss_tostring (&url, path, len, U_DECODE_PASSWD);
- FREE (&mx.mbox);
+ mem_free (&mx.mbox);
return rc;
}
/* imap_parse_path: given an IMAP mailbox name, return host, port
* and a path IMAP servers will recognise.
* mx.mbox is malloc'd, caller must free it */
-int imap_parse_path (const char* path, IMAP_MBOX* mx)
+int imap_parse_path (const char *path, IMAP_MBOX * mx)
{
static unsigned short ImapPort = 0;
static unsigned short ImapsPort = 0;
- struct servent* service;
- char tmp[128];
+ struct servent *service;
ciss_url_t url;
char *c;
- int n;
- if (!ImapPort)
- {
+ if (!ImapPort) {
service = getservbyname ("imap", "tcp");
if (service)
ImapPort = ntohs (service->s_port);
else
ImapPort = IMAP_PORT;
- dprint (3, (debugfile, "Using default IMAP port %d\n", ImapPort));
+ debug_print (3, ("Using default IMAP port %d\n", ImapPort));
}
- if (!ImapsPort)
- {
+ if (!ImapsPort) {
service = getservbyname ("imaps", "tcp");
if (service)
ImapsPort = ntohs (service->s_port);
else
ImapsPort = IMAP_SSL_PORT;
- dprint (3, (debugfile, "Using default IMAPS port %d\n", ImapsPort));
+ debug_print (3, ("Using default IMAPS port %d\n", ImapsPort));
}
/* Defaults */
mx->account.port = ImapPort;
mx->account.type = M_ACCT_TYPE_IMAP;
- c = safe_strdup (path);
+ c = str_dup (path);
url_parse_ciss (&url, c);
- if (url.scheme == U_IMAP || url.scheme == U_IMAPS)
- {
- if (mutt_account_fromurl (&mx->account, &url) < 0)
- {
- FREE (&c);
- return -1;
- }
- mx->mbox = safe_strdup (url.path);
+ if (!(url.scheme == U_IMAP || url.scheme == U_IMAPS) ||
+ mutt_account_fromurl (&mx->account, &url) < 0) {
+ mem_free (&c);
+ return -1;
+ }
- if (url.scheme == U_IMAPS)
- mx->account.flags |= M_ACCT_SSL;
+ mx->mbox = str_dup (url.path);
- FREE (&c);
- }
- /* old PINE-compatibility code */
- else
- {
- FREE (&c);
- if (sscanf (path, "{%127[^}]}", tmp) != 1)
- return -1;
-
- c = strchr (path, '}');
- if (!c)
- return -1;
- else
- /* walk past closing '}' */
- mx->mbox = safe_strdup (c+1);
-
- if ((c = strrchr (tmp, '@')))
- {
- *c = '\0';
- strfcpy (mx->account.user, tmp, sizeof (mx->account.user));
- strfcpy (tmp, c+1, sizeof (tmp));
- mx->account.flags |= M_ACCT_USER;
- }
-
- if ((n = sscanf (tmp, "%127[^:/]%127s", mx->account.host, tmp)) < 1)
- {
- dprint (1, (debugfile, "imap_parse_path: NULL host in %s\n", path));
- FREE (&mx->mbox);
- return -1;
- }
-
- if (n > 1) {
- if (sscanf (tmp, ":%hu%127s", &(mx->account.port), tmp) >= 1)
- mx->account.flags |= M_ACCT_PORT;
- if (sscanf (tmp, "/%s", tmp) == 1)
- {
- if (!ascii_strncmp (tmp, "ssl", 3))
- mx->account.flags |= M_ACCT_SSL;
- else
- {
- dprint (1, (debugfile, "imap_parse_path: Unknown connection type in %s\n", path));
- FREE (&mx->mbox);
- return -1;
- }
- }
- }
- }
-
-#if defined(USE_SSL) || defined(USE_GNUTLS)
- if (option (OPTIMAPFORCESSL))
+ if (url.scheme == U_IMAPS)
mx->account.flags |= M_ACCT_SSL;
-#endif
+
+ mem_free (&c);
if ((mx->account.flags & M_ACCT_SSL) && !(mx->account.flags & M_ACCT_PORT))
mx->account.port = ImapsPort;
/* imap_pretty_mailbox: called by mutt_pretty_mailbox to make IMAP paths
* look nice. */
-void imap_pretty_mailbox (char* path)
+void imap_pretty_mailbox (char *path)
{
IMAP_MBOX home, target;
ciss_url_t url;
- char* delim;
+ char *delim;
int tlen;
int hlen = 0;
char home_match = 0;
if (imap_parse_path (path, &target) < 0)
return;
- tlen = mutt_strlen (target.mbox);
+ tlen = str_len (target.mbox);
/* check whether we can do '=' substitution */
- if (mx_is_imap(Maildir) && !imap_parse_path (Maildir, &home))
- {
- hlen = mutt_strlen (home.mbox);
+ if (mx_get_magic (Maildir) == M_IMAP && !imap_parse_path (Maildir, &home)) {
+ hlen = str_len (home.mbox);
if (tlen && mutt_account_match (&home.account, &target.account) &&
- !mutt_strncmp (home.mbox, target.mbox, hlen))
- {
- if (! hlen)
- home_match = 1;
+ !str_ncmp (home.mbox, target.mbox, hlen)) {
+ if (!hlen)
+ home_match = 1;
else
- for (delim = ImapDelimChars; *delim != '\0'; delim++)
- if (target.mbox[hlen] == *delim)
- home_match = 1;
+ for (delim = ImapDelimChars; *delim != '\0'; delim++)
+ if (target.mbox[hlen] == *delim)
+ home_match = 1;
}
- FREE (&home.mbox);
+ mem_free (&home.mbox);
}
/* do the '=' substitution */
if (home_match) {
*path++ = '=';
/* copy remaining path, skipping delimiter */
- if (! hlen)
+ if (!hlen)
hlen = -1;
memcpy (path, target.mbox + hlen + 1, tlen - hlen - 1);
path[tlen - hlen - 1] = '\0';
}
- else
- {
+ else {
mutt_account_tourl (&target.account, &url);
url.path = target.mbox;
/* FIXME: That hard-coded constant is bogus. But we need the actual
url_ciss_tostring (&url, path, 1024, 0);
}
- FREE (&target.mbox);
+ mem_free (&target.mbox);
}
/* -- library functions -- */
/* imap_continue: display a message and ask the user if she wants to
* go on. */
-int imap_continue (const char* msg, const char* resp)
+int imap_continue (const char *msg, const char *resp)
{
imap_error (msg, resp);
return mutt_yesorno (_("Continue?"), 0);
/* imap_new_idata: Allocate and initialise a new IMAP_DATA structure.
* Returns NULL on failure (no mem) */
-IMAP_DATA* imap_new_idata (void) {
- return safe_calloc (1, sizeof (IMAP_DATA));
+IMAP_DATA *imap_new_idata (void)
+{
+ return mem_calloc (1, sizeof (IMAP_DATA));
}
/* imap_free_idata: Release and clear storage in an IMAP_DATA structure. */
-void imap_free_idata (IMAP_DATA** idata) {
+void imap_free_idata (IMAP_DATA ** idata)
+{
if (!idata)
return;
- FREE (&(*idata)->capstr);
+ mem_free (&(*idata)->capstr);
mutt_free_list (&(*idata)->flags);
- FREE (&((*idata)->cmd.buf));
- FREE (idata);
+ mem_free (&((*idata)->cmd.buf));
+ mem_free (idata);
}
/*
* are not required to do this.
* Moreover, IMAP servers may dislike the path ending with the delimiter.
*/
-char *imap_fix_path (IMAP_DATA *idata, char *mailbox, char *path,
- size_t plen)
+char *imap_fix_path (IMAP_DATA * idata, char *mailbox, char *path,
+ size_t plen)
{
int x = 0;
- if (!mailbox || !*mailbox)
- {
+ if (!mailbox || !*mailbox) {
strfcpy (path, "INBOX", plen);
return path;
}
- while (mailbox && *mailbox && (x < (plen - 1)))
- {
- if ((*mailbox == '/') || (*mailbox == idata->delim))
- {
- while ((*mailbox == '/') || (*mailbox == idata->delim)) mailbox++;
+ while (mailbox && *mailbox && (x < (plen - 1))) {
+ if ((*mailbox == '/') || (*mailbox == idata->delim)) {
+ while ((*mailbox == '/') || (*mailbox == idata->delim))
+ mailbox++;
path[x] = idata->delim;
}
- else
- {
+ else {
path[x] = *mailbox;
mailbox++;
}
/* imap_get_literal_count: write number of bytes in an IMAP literal into
* bytes, return 0 on success, -1 on failure. */
-int imap_get_literal_count(const char *buf, long *bytes)
+int imap_get_literal_count (const char *buf, long *bytes)
{
char *pc;
char *pn;
while (isdigit ((unsigned char) *pc))
pc++;
*pc = 0;
- *bytes = atoi(pn);
+ *bytes = atoi (pn);
return (0);
}
/* imap_get_qualifier: in a tagged response, skip tag and status for
* the qualifier message. Used by imap_copy_message for TRYCREATE */
-char* imap_get_qualifier (char* buf)
+char *imap_get_qualifier (char *buf)
{
char *s = buf;
if (*s == '\\') {
s++;
if (*s)
- s++;
+ s++;
continue;
}
if (*s == '\"')
struct tm t;
time_t tz;
- t.tm_mday = (s[0] == ' '? s[1] - '0' : (s[0] - '0') * 10 + (s[1] - '0'));
+ t.tm_mday = (s[0] == ' ' ? s[1] - '0' : (s[0] - '0') * 10 + (s[1] - '0'));
s += 2;
if (*s != '-')
return 0;
if (*s != '-')
return 0;
s++;
- t.tm_year = (s[0] - '0') * 1000 + (s[1] - '0') * 100 + (s[2] - '0') * 10 + (s[3] - '0') - 1900;
+ t.tm_year =
+ (s[0] - '0') * 1000 + (s[1] - '0') * 100 + (s[2] - '0') * 10 + (s[3] -
+ '0') -
+ 1900;
s += 4;
if (*s != ' ')
return 0;
/* imap_qualify_path: make an absolute IMAP folder target, given IMAP_MBOX
* and relative path. */
-void imap_qualify_path (char *dest, size_t len, IMAP_MBOX *mx, char* path)
+void imap_qualify_path (char *dest, size_t len, IMAP_MBOX * mx, char *path)
{
ciss_url_t url;
const char *s;
pt = dest;
- s = src;
+ s = src;
*pt++ = '"';
/* save room for trailing quote-char */
dlen -= 2;
-
- for (; *s && dlen; s++)
- {
- if (strchr (quote, *s))
- {
+
+ for (; *s && dlen; s++) {
+ if (strchr (quote, *s)) {
dlen -= 2;
if (!dlen)
- break;
+ break;
*pt++ = '\\';
*pt++ = *s;
}
- else
- {
+ else {
*pt++ = *s;
dlen--;
}
else
return;
- while (*s)
- {
- if (*s == '\"')
- {
+ while (*s) {
+ if (*s == '\"') {
*d = '\0';
return;
}
- if (*s == '\\')
- {
+ if (*s == '\\') {
s++;
}
- if (*s)
- {
+ if (*s) {
*d = *s;
d++;
s++;
{
char *buf;
- buf = safe_strdup (src);
+ buf = str_dup (src);
imap_utf7_encode (&buf);
imap_quote_string (dest, dlen, buf);
- FREE (&buf);
+ mem_free (&buf);
}
void imap_unmunge_mbox_name (char *s)
{
char *buf;
- imap_unquote_string(s);
+ imap_unquote_string (s);
- buf = safe_strdup (s);
- if (buf)
- {
+ buf = str_dup (s);
+ if (buf) {
imap_utf7_decode (&buf);
- strncpy (s, buf, strlen (s));
+ strncpy (s, buf, str_len (s));
}
-
- FREE (&buf);
+
+ mem_free (&buf);
}
/* imap_wordcasecmp: find word a in word list b */
-int imap_wordcasecmp(const char *a, const char *b)
+int imap_wordcasecmp (const char *a, const char *b)
{
char tmp[SHORT_STRING];
- char *s = (char *)b;
+ char *s = (char *) b;
int i;
- tmp[SHORT_STRING-1] = 0;
- for(i=0;i < SHORT_STRING-2;i++,s++)
- {
- if (!*s || ISSPACE(*s))
- {
+ tmp[SHORT_STRING - 1] = 0;
+ for (i = 0; i < SHORT_STRING - 2; i++, s++) {
+ if (!*s || ISSPACE (*s)) {
tmp[i] = 0;
break;
}
tmp[i] = *s;
}
- tmp[i+1] = 0;
+ tmp[i + 1] = 0;
- return ascii_strcasecmp(a, tmp);
+ return ascii_strcasecmp (a, tmp);
}
/*
IMAP_DATA *idata;
conn = mutt_socket_head ();
- while (conn)
- {
- if (conn->account.type == M_ACCT_TYPE_IMAP)
- {
- idata = (IMAP_DATA*) conn->data;
+ while (conn) {
+ if (conn->account.type == M_ACCT_TYPE_IMAP) {
+ idata = (IMAP_DATA *) conn->data;
if (idata->state >= IMAP_AUTHENTICATED
- && time(NULL) >= idata->lastread + ImapKeepalive)
- {
- if (idata->ctx)
- ctx = idata->ctx;
- else
- {
- ctx = safe_calloc (1, sizeof (CONTEXT));
- ctx->data = idata;
- }
- imap_check_mailbox (ctx, NULL, 1);
- if (!idata->ctx)
- FREE (&ctx);
+ && time (NULL) >= idata->lastread + ImapKeepalive) {
+ if (idata->ctx)
+ ctx = idata->ctx;
+ else {
+ ctx = mem_calloc (1, sizeof (CONTEXT));
+ ctx->data = idata;
+ }
+ imap_check_mailbox (ctx, NULL, 1);
+ if (!idata->ctx)
+ mem_free (&ctx);
}
}
int rc;
short imap_passive = option (OPTIMAPPASSIVE);
-
+
set_option (OPTIMAPPASSIVE);
set_option (OPTKEEPQUIET);
sigaction (SIGALRM, &act, &oldalrm);
alarm (ImapKeepalive);
- while (waitpid (pid, &rc, 0) < 0 && errno == EINTR)
- {
- alarm (0); /* cancel a possibly pending alarm */
+ while (waitpid (pid, &rc, 0) < 0 && errno == EINTR) {
+ alarm (0); /* cancel a possibly pending alarm */
imap_keepalive ();
alarm (ImapKeepalive);
}
- alarm (0); /* cancel a possibly pending alarm */
-
+ alarm (0); /* cancel a possibly pending alarm */
+
sigaction (SIGALRM, &oldalrm, NULL);
sigprocmask (SIG_SETMASK, &oldmask, NULL);
/* Allow/disallow re-opening a folder upon expunge. */
-void imap_allow_reopen (CONTEXT *ctx)
+void imap_allow_reopen (CONTEXT * ctx)
{
if (ctx && ctx->magic == M_IMAP && CTX_DATA->ctx == ctx)
CTX_DATA->reopen |= IMAP_REOPEN_ALLOW;
}
-void imap_disallow_reopen (CONTEXT *ctx)
+void imap_disallow_reopen (CONTEXT * ctx)
{
if (ctx && ctx->magic == M_IMAP && CTX_DATA->ctx == ctx)
CTX_DATA->reopen &= ~IMAP_REOPEN_ALLOW;