static void do_print_info(struct rfc2045 *s) { const char *content_type, *transfer_encoding, *charset; off_t start, end, body; const char *disposition; const char *disposition_name; const char *disposition_filename; const char *content_name; off_t nlines, nbodylines; const char *p; rfc2045_mimeinfo(s, &content_type, &transfer_encoding, &charset); rfc2045_mimepos(s, &start, &end, &body, &nlines, &nbodylines); rfc2045_dispositioninfo(s, &disposition, &disposition_name, &disposition_filename); content_name=rfc2045_contentname(s); printf("content-type: %s\n", content_type); if (content_name) { char *s=rfc2047_decode_simple(content_name); if (!s) { perror("rfc2047_decode_simple"); exit(1); } printf("content-name: %s\n", s); free(s); } printf("content-transfer-encoding: %s\n", transfer_encoding); printf("charset: %s\n", charset); if (disposition && *disposition) printf("content-disposition: %s\n", disposition); if (disposition_name && *disposition_name) { char *s=rfc2047_decode_simple(disposition_name); if (!s) { perror("rfc2047_decode_simple"); exit(1); } printf("content-disposition-name: %s\n", s); free(s); } if (disposition_filename && *disposition_filename) { char *s=rfc2047_decode_simple(disposition_filename); if (!s) { perror("rfc2047_decode_simple"); exit(1); } printf("content-disposition-filename: %s\n", s); free(s); } if (*(p=rfc2045_content_id(s))) printf("content-id: <%s>\n", p); if (*(p=rfc2045_content_description(s))) { char *s=rfc2047_decode_simple(p); if (!s) { perror("rfc2047_decode_simple"); exit(1); } printf("content-description: %s\n", s); free(s); } if (*(p=rfc2045_content_language(s))) printf("content-language: %s\n", p); if (*(p=rfc2045_content_md5(s))) printf("content-md5: %s\n", p); printf("starting-pos: %lu\n", (unsigned long)start); printf("starting-pos-body: %lu\n", (unsigned long)body); printf("ending-pos: %lu\n", (unsigned long)end); printf("line-count: %lu\n", (unsigned long)nlines); printf("body-line-count: %lu\n", (unsigned long)nbodylines); }
void msgbodystructure( void (*writefunc)(const char *, size_t), int dox, FILE *fp, struct rfc2045 *mimep) { const char *content_type_s; const char *content_transfer_encoding_s; const char *charset_s; off_t start_pos, end_pos, start_body; off_t nlines, nbodylines; const char *disposition_s; char *p, *q; rfc2045_mimeinfo(mimep, &content_type_s, &content_transfer_encoding_s, &charset_s); rfc2045_mimepos(mimep, &start_pos, &end_pos, &start_body, &nlines, &nbodylines); disposition_s=mimep->content_disposition; (*writefunc)("(", 1); if (mimep->firstpart && mimep->firstpart->isdummy && mimep->firstpart->next) /* MULTIPART */ { struct rfc2045 *childp; for (childp=mimep->firstpart; (childp=childp->next) != 0; ) msgbodystructure(writefunc, dox, fp, childp); (*writefunc)(" \"", 2); p=strchr(content_type_s, '/'); if (p) msgappends(writefunc, p+1, strlen(p+1)); (*writefunc)("\"", 1); if (dox) { (*writefunc)(" ", 1); do_param_list(writefunc, mimep->content_type_attr); (*writefunc)(" ", 1); do_disposition(writefunc, disposition_s, mimep->content_disposition_attr); (*writefunc)(" ", 1); contentstr(writefunc, rfc2045_content_language(mimep)); } } else { char *mybuf; char buf[40]; const char *cp; mybuf=my_strdup(content_type_s); q=strtok(mybuf, " /"); (*writefunc)("\"", 1); if (q) msgappends(writefunc, q, strlen(q)); (*writefunc)("\" \"", 3); if (q) q=strtok(0, " /"); if (q) msgappends(writefunc, q, strlen(q)); free(mybuf); (*writefunc)("\" ", 2); do_param_list(writefunc, mimep->content_type_attr); (*writefunc)(" ", 1); cp=rfc2045_content_id(mimep); if (!cp || !*cp) contentstr(writefunc, cp); else { (*writefunc)("\"<", 2); msgappends(writefunc, cp, strlen(cp)); (*writefunc)(">\"", 2); } (*writefunc)(" ", 1); contentstr(writefunc, rfc2045_content_description(mimep)); (*writefunc)(" \"", 2); msgappends(writefunc, content_transfer_encoding_s, strlen(content_transfer_encoding_s)); (*writefunc)("\" ", 2); sprintf(buf, "%lu", (unsigned long) (end_pos-start_body+nbodylines)); /* nbodylines added for CRs */ (*writefunc)(buf, strlen(buf)); if ( (content_type_s[0] == 't' || content_type_s[0] == 'T') && (content_type_s[1] == 'e' || content_type_s[1] == 'E') && (content_type_s[2] == 'x' || content_type_s[2] == 'X') && (content_type_s[3] == 't' || content_type_s[3] == 'T') && (content_type_s[4] == '/' || content_type_s[4] == 0)) { (*writefunc)(" ", 1); sprintf(buf, "%lu", (unsigned long)nbodylines); (*writefunc)(buf, strlen(buf)); } if (mimep->firstpart && !mimep->firstpart->isdummy) /* message/rfc822 */ { (*writefunc)(" ", 1); msgenvelope(writefunc, fp, mimep->firstpart); (*writefunc)(" ", 1); msgbodystructure(writefunc, dox, fp, mimep->firstpart); (*writefunc)(" ", 1); sprintf(buf, "%lu", (unsigned long)nbodylines); (*writefunc)(buf, strlen(buf)); } if (dox) { (*writefunc)(" ", 1); contentstr(writefunc, rfc2045_content_md5(mimep)); (*writefunc)(" ", 1); do_disposition(writefunc, disposition_s, mimep->content_disposition_attr); (*writefunc)(" NIL", 4); /* TODO Content-Language: */ } } (*writefunc)(")", 1); }