Example #1
0
static int
mailmime_size_parm_parse(const char * message, size_t length,
                         size_t * indx, size_t * result)
{
    uint32_t value;
    size_t cur_token;
    int r;

    cur_token = * indx;

    r = mailimf_token_case_insensitive_parse(message, length,
            &cur_token, "size");
    if (r != MAILIMF_NO_ERROR)
        return r;

    r = mailimf_unstrict_char_parse(message, length, &cur_token, '=');
    if (r != MAILIMF_NO_ERROR)
        return r;

    r = mailimf_cfws_parse(message, length, &cur_token);
    if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE))
        return r;

    r = mailimf_number_parse(message, length, &cur_token, &value);
    if (r != MAILIMF_NO_ERROR)
        return r;

    * indx = cur_token;
    * result = value;

    return MAILIMF_NO_ERROR;
}
Example #2
0
static int
mailmime_modification_date_parm_parse(const char * message, size_t length,
                                      size_t * indx, char ** result)
{
    char * value;
    size_t cur_token;
    int r;

    cur_token = * indx;

    r = mailimf_token_case_insensitive_parse(message, length,
            &cur_token, "modification-date");
    if (r != MAILIMF_NO_ERROR)
        return r;

    r = mailimf_unstrict_char_parse(message, length, &cur_token, '=');
    if (r != MAILIMF_NO_ERROR)
        return r;

    r = mailimf_cfws_parse(message, length, &cur_token);
    if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE))
        return r;

    r = mailmime_quoted_date_time_parse(message, length, &cur_token, &value);
    if (r != MAILIMF_NO_ERROR)
        return r;

    * indx = cur_token;
    * result = value;

    return MAILIMF_NO_ERROR;
}
Example #3
0
LIBETPAN_EXPORT
int mailmime_parameter_parse(const char * message, size_t length,
			     size_t * indx,
			     struct mailmime_parameter ** result)
{
  char * attribute;
  char * value;
  struct mailmime_parameter * parameter;
  size_t cur_token;
  int r;
  int res;

  cur_token = * indx;

  r = mailmime_attribute_parse(message, length, &cur_token, &attribute);
  if (r != MAILIMF_NO_ERROR) {
    res = r;
    goto err;
  }

  r = mailimf_unstrict_char_parse(message, length, &cur_token, '=');
  if (r != MAILIMF_NO_ERROR) {
    res = r;
    goto free_attr;
  }

  r = mailimf_cfws_parse(message, length, &cur_token);
  if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) {
    res = r;
    goto free_attr;
  }

  r = mailmime_value_parse(message, length, &cur_token, &value);
  if (r != MAILIMF_NO_ERROR) {
    res = r;
    goto free_attr;
  }

  parameter = mailmime_parameter_new(attribute, value);
  if (parameter == NULL) {
    res = MAILIMF_ERROR_MEMORY;
    goto free_value;
  }

  * result = parameter;
  * indx = cur_token;

  return MAILIMF_NO_ERROR;

 free_value:
  mailmime_value_free(value);
 free_attr:
  mailmime_attribute_free(attribute);
 err:
  return res;
}
Example #4
0
LIBETPAN_EXPORT
int mailmime_version_parse(const char * message, size_t length,
			   size_t * indx,
			   uint32_t * result)
{
  size_t cur_token;
  uint32_t hi;
  uint32_t low;
  uint32_t version;
  int r;

  cur_token = * indx;

  r = mailimf_number_parse(message, length, &cur_token, &hi);
  if (r != MAILIMF_NO_ERROR)
    return r;

  r = mailimf_unstrict_char_parse(message, length, &cur_token, '.');
  if (r != MAILIMF_NO_ERROR)
    return r;

  r = mailimf_cfws_parse(message, length, &cur_token);
  if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE))
    return r;

  r = mailimf_number_parse(message, length, &cur_token, &low);
  if (r != MAILIMF_NO_ERROR)
    return r;

  version = (hi << 16) + low;

  * result = version;
  * indx = cur_token;

  return MAILIMF_NO_ERROR;
}
Example #5
0
LIBETPAN_EXPORT
int mailmime_content_parse(const char * message, size_t length,
			   size_t * indx,
			   struct mailmime_content ** result)
{
  size_t cur_token;
  struct mailmime_type * type;
  char * subtype;
  clist * parameters_list;
  struct mailmime_content * content;
  int r;
  int res;

  cur_token = * indx;

  mailimf_cfws_parse(message, length, &cur_token);

  type = NULL;
  r = mailmime_type_parse(message, length, &cur_token, &type);
  if (r != MAILIMF_NO_ERROR) {
    res = r;
    goto err;
  }

  r = mailimf_unstrict_char_parse(message, length, &cur_token, '/');
  switch (r) {
  case MAILIMF_NO_ERROR:
    r = mailimf_cfws_parse(message, length, &cur_token);
    if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) {
      res = r;
      goto free_type;
    }
    
    r = mailmime_subtype_parse(message, length, &cur_token, &subtype);
    if (r != MAILIMF_NO_ERROR) {
      res = r;
      goto free_type;
    }
    break;

  case MAILIMF_ERROR_PARSE:
    subtype = strdup("unknown");
    break;

  default:
    res = r;
    goto free_type;
  }

  parameters_list = clist_new();
  if (parameters_list == NULL) {
    res = MAILIMF_ERROR_MEMORY;
    goto free_subtype;
  }

  while (1) {
    size_t final_token;
    struct mailmime_parameter * parameter;

    final_token = cur_token;
    r = mailimf_unstrict_char_parse(message, length, &cur_token, ';');
    if (r != MAILIMF_NO_ERROR) {
      cur_token = final_token;
      break;
    }

    r = mailimf_cfws_parse(message, length, &cur_token);
    if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) {
      res = r;
      goto free_type;
    }

    r = mailmime_parameter_parse(message, length, &cur_token, &parameter);
    if (r == MAILIMF_NO_ERROR) {
      /* do nothing */
    }
    else if (r == MAILIMF_ERROR_PARSE) {
      cur_token = final_token;
      break;
    }
    else {
      res = r;
      goto err;
    }

    r = clist_append(parameters_list, parameter);
    if (r < 0) {
      mailmime_parameter_free(parameter);
      res = MAILIMF_ERROR_MEMORY;
      goto free_parameters;
    }
  }

  content = mailmime_content_new(type, subtype, parameters_list);
  if (content == NULL) {
    res = MAILIMF_ERROR_MEMORY;
    goto free_parameters;
  }
 
  * result = content;
  * indx = cur_token;

  return MAILIMF_NO_ERROR;
 
 free_parameters:
  clist_foreach(parameters_list, (clist_func) mailmime_parameter_free, NULL);
  clist_free(parameters_list);
 free_subtype:
  mailmime_subtype_free(subtype);
 free_type:
  mailmime_type_free(type);
 err:
  return res;
}
Example #6
0
LIBETPAN_EXPORT
int mailmime_language_parse(const char * message, size_t length,
			    size_t * indx,
			    struct mailmime_language ** result)
{
  size_t cur_token;
  int r;
  int res;
  clist * list;
  int first;
  struct mailmime_language * language;

  cur_token = * indx;

  list = clist_new();
  if (list == NULL) {
    res = MAILIMF_ERROR_MEMORY;
    goto err;
  }

  first = TRUE;

  while (1) {
    char * atom;

    r = mailimf_unstrict_char_parse(message, length, &cur_token, ',');
    if (r == MAILIMF_NO_ERROR) {
      /* do nothing */
    }
    else if (r == MAILIMF_ERROR_PARSE) {
      break;
    }
    else {
      res = r;
      goto err;
    }

    r = mailimf_atom_parse(message, length, &cur_token, &atom);
    if (r == MAILIMF_NO_ERROR) {
      /* do nothing */
    }
    else if (r == MAILIMF_ERROR_PARSE) {
      break;
    }
    else {
      res = r;
      goto err;
    }

    r = clist_append(list, atom);
    if (r < 0) {
      mailimf_atom_free(atom);
      res = MAILIMF_ERROR_MEMORY;
      goto free;
    }
  }

  language = mailmime_language_new(list);
  if (language == NULL) {
    res = MAILIMF_ERROR_MEMORY;
    goto free;
  }

  * result = language;
  * indx = cur_token;

  return MAILIMF_NO_ERROR;

 free:
  clist_foreach(list, (clist_func) mailimf_atom_free, NULL);
  clist_free(list);
 err:
  return res;
}
Example #7
0
int mailmime_disposition_parse(const char * message, size_t length,
                               size_t * indx,
                               struct mailmime_disposition ** result)
{
    size_t final_token;
    size_t cur_token;
    struct mailmime_disposition_type * dsp_type;
    clist * list;
    struct mailmime_disposition * dsp;
    int r;
    int res;

    cur_token = * indx;

    r = mailmime_disposition_type_parse(message, length, &cur_token,
                                        &dsp_type);
    if (r != MAILIMF_NO_ERROR) {
        res = r;
        goto err;
    }

    list = clist_new();
    if (list == NULL) {
        res = MAILIMF_ERROR_MEMORY;
        goto free_type;
    }

    while (1) {
        struct mailmime_disposition_parm * param;

        final_token = cur_token;
        r = mailimf_unstrict_char_parse(message, length, &cur_token, ';');
        if (r == MAILIMF_NO_ERROR) {
            /* do nothing */
        }
        else if (r == MAILIMF_ERROR_PARSE) {
            break;
        }
        else {
            res = r;
            goto free_list;
        }

        param = NULL;
        r = mailmime_disposition_parm_parse(message, length, &cur_token, &param);
        if (r == MAILIMF_NO_ERROR) {
            /* do nothing */
        }
        else if (r == MAILIMF_ERROR_PARSE) {
            cur_token = final_token;
            break;
        }
        else {
            res = r;
            goto free_list;
        }

        r = clist_append(list, param);
        if (r < 0) {
            res = MAILIMF_ERROR_MEMORY;
            goto free_list;
        }
    }

    dsp = mailmime_disposition_new(dsp_type, list);
    if (dsp == NULL) {
        res = MAILIMF_ERROR_MEMORY;
        goto free_list;
    }

    * result = dsp;
    * indx = cur_token;

    return MAILIMF_NO_ERROR;

free_list:
    clist_foreach(list, (clist_func) mailmime_disposition_parm_free, NULL);
    clist_free(list);
free_type:
    mailmime_disposition_type_free(dsp_type);
err:
    return res;
}