struct mailmime_parameter * mailmime_parameter_dup(struct mailmime_parameter * param) { char * name; char * value; struct mailmime_parameter * dup_param; name = strdup(param->pa_name); if (name == NULL) goto err; value = strdup(param->pa_value); if (value == NULL) goto free_name; dup_param = mailmime_parameter_new(name, value); if (dup_param == NULL) goto free_value; return dup_param; free_value: free(value); free_name: free(name); err: return NULL; }
struct mailmime_parameter * mailmime_param_new_with_data(char * name, char * value) { char * param_name; char * param_value; struct mailmime_parameter * param; param_name = strdup(name); if (param_name == NULL) goto err; param_value = strdup(value); if (param_value == NULL) goto free_name; param = mailmime_parameter_new(param_name, param_value); if (param == NULL) goto free_value; return param; free_value: free(param_value); free_name: free(param_name); err: return NULL; }
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; }
static struct mailmime * part_new_empty(struct mailmime_content * content, struct mailmime_fields * mime_fields, const char * boundary_prefix, int force_single) { struct mailmime * build_info; clist * list; int r; int mime_type; list = NULL; if (force_single) { mime_type = MAILMIME_SINGLE; } else { switch (content->ct_type->tp_type) { case MAILMIME_TYPE_DISCRETE_TYPE: mime_type = MAILMIME_SINGLE; break; case MAILMIME_TYPE_COMPOSITE_TYPE: switch (content->ct_type->tp_data.tp_composite_type->ct_type) { case MAILMIME_COMPOSITE_TYPE_MULTIPART: mime_type = MAILMIME_MULTIPLE; break; case MAILMIME_COMPOSITE_TYPE_MESSAGE: if (strcasecmp(content->ct_subtype, "rfc822") == 0) mime_type = MAILMIME_MESSAGE; else mime_type = MAILMIME_SINGLE; break; default: goto err; } break; default: goto err; } } if (mime_type == MAILMIME_MULTIPLE) { char * attr_name; char * attr_value; struct mailmime_parameter * param; clist * parameters; char * boundary; list = clist_new(); if (list == NULL) goto err; attr_name = strdup("boundary"); boundary = generate_boundary(boundary_prefix); attr_value = boundary; if (attr_name == NULL) { free(attr_name); goto free_list; } param = mailmime_parameter_new(attr_name, attr_value); if (param == NULL) { free(attr_value); free(attr_name); goto free_list; } if (content->ct_parameters == NULL) { parameters = clist_new(); if (parameters == NULL) { mailmime_parameter_free(param); goto free_list; } } else parameters = content->ct_parameters; r = clist_append(parameters, param); if (r != 0) { clist_free(parameters); mailmime_parameter_free(param); goto free_list; } if (content->ct_parameters == NULL) content->ct_parameters = parameters; } build_info = mailmime_new(mime_type, NULL, 0, mime_fields, content, NULL, NULL, NULL, list, NULL, NULL); if (build_info == NULL) { clist_free(list); return NULL; } return build_info; free_list: clist_free(list); err: return NULL; }