X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=pop.c;fp=pop.c;h=512dfda3397bdcb58f83d224829b523b1066c7a8;hp=30dcf2de01b2abac59b323d5fb094cfcd20d1681;hb=c1a6303fea322f1de432897524b25fa238896225;hpb=a31de505502560546791fc0158b03c41b7a721ec;ds=sidebyside diff --git a/pop.c b/pop.c index 30dcf2d..512dfda 100644 --- a/pop.c +++ b/pop.c @@ -454,55 +454,48 @@ static pop_query_status pop_fetch_data(pop_data_t *pop_data, const char *query, progress_t *bar, int (*funct)(char *, void *), void *data) { - char buf[LONG_STRING]; - char *inbuf; - char *p; - pop_query_status ret; - int chunk = 0; - long pos = 0; - ssize_t lenbuf = 0; + pop_query_status ret; + char buf[LONG_STRING]; + buffer_t inbuf; + ssize_t pos = 0; - m_strcpy(buf, sizeof(buf), query); - ret = _pop_query(pop_data, buf, sizeof(buf)); - if (ret != PQ_OK) - return ret; + buffer_init(&inbuf); - inbuf = p_new(char, sizeof(buf)); + m_strcpy(buf, sizeof(buf), query); + ret = _pop_query(pop_data, buf, sizeof(buf)); + if (ret != PQ_OK) + return ret; - for (;;) { - chunk = - mutt_socket_readln(buf, sizeof (buf), pop_data->conn); - if (chunk < 0) { - pop_data->status = POP_DISCONNECTED; - ret = PQ_NOT_CONNECTED; - break; - } + for (;;) { + int dot = 0; - p = buf; - if (!lenbuf && buf[0] == '.') { - if (buf[1] != '.') - break; - p++; - } + if (mutt_socket_readln2(&inbuf, pop_data->conn) < 0) { + pop_data->status = POP_DISCONNECTED; + ret = PQ_NOT_CONNECTED; + break; + } - m_strcpy(inbuf + lenbuf,sizeof(buf), p); - pos += chunk; + if (bar) { + mutt_progress_bar(bar, pos += inbuf.len); + } - if (chunk >= ssizeof(buf)) { - lenbuf += strlen (p); - } else { - if (bar) - mutt_progress_bar (bar, pos); - if (ret == 0 && funct (inbuf, data) < 0) - ret = PFD_FUNCT_ERROR; - lenbuf = 0; - } + if (inbuf.data[0] == '.') { + if (inbuf.data[1] != '.') + break; + dot = 1; + } - p_realloc(&inbuf, lenbuf + sizeof(buf)); - } + if (funct(inbuf.data + dot, data) < 0) { + buffer_wipe(&inbuf); + ret = PFD_FUNCT_ERROR; + break; + } - p_delete(&inbuf); - return ret; + buffer_reset(&inbuf); + } + + buffer_wipe(&inbuf); + return ret; } static int fetch_capa (char *line, void *data)