int nntpdriver_size(mailsession * session, uint32_t indx, size_t * result) { newsnntp * nntp; struct newsnntp_xover_resp_item * item; int r; int done; nntp = session_get_nntp_session(session); done = FALSE; do { r = newsnntp_xover_single(nntp, indx, &item); switch (r) { case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_USERNAME: r = nntpdriver_authenticate_user(session); if (r != MAIL_NO_ERROR) return r; break; case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_PASSWORD: r = nntpdriver_authenticate_password(session); if (r != MAIL_NO_ERROR) return r; break; case NEWSNNTP_NO_ERROR: done = TRUE; break; default: return nntpdriver_nntp_error_to_mail_error(r); } } while (!done); * result = item->ovr_size; xover_resp_item_free(item); return MAIL_NO_ERROR; }
static clist * read_xover_resp_list(newsnntp * f) { char * line; clist * xover_resp_list; struct newsnntp_xover_resp_item * n; clist * values_list; clistiter * current; uint32_t article; char * subject; char * author; char * date; char * message_id; char * references; size_t size; uint32_t line_count; clist * others; int r; xover_resp_list = clist_new(); if (xover_resp_list == NULL) goto err; while (1) { char * p; line = read_line(f); if (line == NULL) goto free_list; if (mailstream_is_end_multiline(line)) break; /* parse the data separated with \t */ values_list = clist_new(); if (values_list == NULL) goto free_list; while ((p = strchr(line, '\t')) != NULL) { * p = 0; p ++; r = clist_append(values_list, line); if (r < 0) goto free_values_list; line = p; } r = clist_append(values_list, line); if (r < 0) goto free_values_list; /* set the known data */ current = clist_begin(values_list); if (current == NULL) { clist_free(values_list); continue; } article = 0; if (clist_content(current) != NULL) { article = atoi((char *) clist_content(current)); } current = clist_next(current); if (current == NULL) { clist_free(values_list); continue; } subject = clist_content(current); current = clist_next(current); if (current == NULL) { clist_free(values_list); continue; } author = clist_content(current); current = clist_next(current); if (current == NULL) { clist_free(values_list); continue; } date = clist_content(current); current = clist_next(current); if (current == NULL) { clist_free(values_list); continue; } message_id = clist_content(current); current = clist_next(current); if (current == NULL) { clist_free(values_list); continue; } references = clist_content(current); current = clist_next(current); if (current == NULL) { clist_free(values_list); continue; } size = 0; if (clist_content(current) != NULL) { size = atoi((char *) clist_content(current)); } current = clist_next(current); if (current == NULL) { clist_free(values_list); continue; } line_count = 0; if (clist_content(current) != NULL) { line_count = atoi((char *) clist_content(current)); } current = clist_next(current); /* make a copy of the other data */ others = clist_new(); if (others == NULL) { goto free_values_list; } while (current) { char * val; char * original_val; original_val = clist_content(current); val = strdup(original_val); if (val == NULL) { clist_foreach(others, (clist_func) free, NULL); clist_free(others); goto free_list; } r = clist_append(others, val); if (r < 0) { goto free_list; } current = clist_next(current); } clist_free(values_list); n = xover_resp_item_new(article, subject, author, date, message_id, references, size, line_count, others); if (n == NULL) { clist_foreach(others, (clist_func) free, NULL); clist_free(others); goto free_list; } r = clist_append(xover_resp_list, n); if (r < 0) { xover_resp_item_free(n); goto free_list; } } return xover_resp_list; free_list: newsnntp_xover_resp_list_free(xover_resp_list); err: return NULL; free_values_list: clist_foreach(values_list, (clist_func) free, NULL); clist_free(values_list); return NULL; }