#include <lib-mx/mx.h>
#include "mutt.h"
+#include "buffy.h"
#include "message.h"
#include "imap_private.h"
int imap_cmd_step (IMAP_DATA * idata)
{
IMAP_COMMAND *cmd = &idata->cmd;
- unsigned int len = 0;
- int c;
if (idata->status == IMAP_FATAL) {
cmd_handle_fatal (idata);
return IMAP_CMD_BAD;
}
- /* read into buffer, expanding buffer as necessary until we have a full
- * line */
- do {
- if (len == cmd->blen) {
- p_realloc(&cmd->buf, cmd->blen + IMAP_CMD_BUFSIZE);
- cmd->blen = cmd->blen + IMAP_CMD_BUFSIZE;
- }
-
- if (len)
- len--;
-
- c = mutt_socket_readln (cmd->buf + len, cmd->blen - len, idata->conn);
- if (c <= 0) {
- /* cmd_handle_fatal (idata); */
- return IMAP_CMD_BAD;
- }
-
- len += c;
- }
- /* if we've read all the way to the end of the buffer, we haven't read a
- * full line (mutt_socket_readln strips the \r, so we always have at least
- * one character free when we've read a full line) */
- while (len == cmd->blen);
-
- /* don't let one large string make cmd->buf hog memory forever */
- if ((cmd->blen > IMAP_CMD_BUFSIZE) && (len <= IMAP_CMD_BUFSIZE)) {
- p_realloc(&cmd->buf, IMAP_CMD_BUFSIZE);
- cmd->blen = IMAP_CMD_BUFSIZE;
+ buffer_reset(&cmd->buf);
+ if (mutt_socket_readln2(&cmd->buf, idata->conn) < 0) {
+ /* cmd_handle_fatal (idata); */
+ return IMAP_CMD_BAD;
}
- idata->lastread = time (NULL);
+ idata->lastread = time(NULL);
/* handle untagged messages. The caller still gets its shot afterwards. */
- if (!m_strncmp(cmd->buf, "* ", 2) && cmd_handle_untagged (idata))
+ if (!m_strncmp(cmd->buf.data, "* ", 2) && cmd_handle_untagged (idata))
return IMAP_CMD_BAD;
/* server demands a continuation response from us */
- if (cmd->buf[0] == '+')
+ if (cmd->buf.data[0] == '+')
return IMAP_CMD_RESPOND;
/* tagged completion code */
- if (!m_strncmp(cmd->buf, cmd->seq, SEQLEN)) {
+ if (!m_strncmp(cmd->buf.data, cmd->seq, SEQLEN)) {
imap_cmd_finish (idata);
- return imap_code (cmd->buf) ? IMAP_CMD_OK : IMAP_CMD_NO;
+ return imap_code(cmd->buf.data) ? IMAP_CMD_OK : IMAP_CMD_NO;
}
return IMAP_CMD_CONTINUE;
char *pn;
int count;
- s = imap_next_word (idata->cmd.buf);
+ s = imap_next_word (idata->cmd.buf.data);
if ((idata->state == IMAP_SELECTED) && isdigit ((unsigned char) *s)) {
pn = 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 (s) {
imap_unmunge_mbox_name (s);
- m_strcpy(buf, sizeof(buf), "mailboxes \"");
- mutt_account_tourl (&idata->conn->account, &url);
+ mutt_account_tourl(&idata->conn->account, &url);
url.path = s;
if (!m_strcmp(url.user, ImapUser))
url.user = NULL;
- url_ciss_tostring (&url, buf + 11, sizeof (buf) - 10, 0);
- m_strcat(buf, sizeof(buf), "\"");
- p_clear(&token, 1);
- err.data = errstr;
- err.dsize = sizeof (errstr);
- mutt_parse_rc_line (buf, &token, &err);
- p_delete(&token.data);
+ url_ciss_tostring(&url, buf, sizeof(buf), 0);
+ buffy_do_mailboxes(buf, 1);
}
}