Example #1
0
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;
}
Example #2
0
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;
}