workaround a stupid issue in how decoding is performed in mutt *sigh*
[apps/madmutt.git] / imap / command.c
index c33776b..e915320 100644 (file)
@@ -85,58 +85,32 @@ int imap_cmd_start (IMAP_DATA * idata, const char *cmd)
 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;
@@ -279,7 +253,7 @@ static int cmd_handle_untagged (IMAP_DATA * idata)
   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;