diff --git a/mshow.c b/mshow.c index 7dc6174..349b655 100644 --- a/mshow.c +++ b/mshow.c @@ -96,6 +96,9 @@ char * mimetype(char *ct) { char *s; + + if (!ct) + return 0; for (s = ct; *s && *s != ';' && *s != ' ' && *s != '\t'; s++) ; @@ -106,6 +109,9 @@ char * tlmimetype(char *ct) { char *s; + + if (!ct) + return 0; for (s = ct; *s && *s != ';' && *s != ' ' && *s != '\t' && *s != '/'; s++) ; @@ -118,17 +124,31 @@ typedef enum { MIME_PRUNE, } mime_action; -typedef mime_action (*mime_callback)(int, char *, char *, size_t); +typedef mime_action (*mime_callback)(int, struct message *, char *, size_t); + +char * +mime_filename(struct message *msg) +{ + char *filename = 0, *fn, *fne, *v; + + if ((v = blaze822_hdr(msg, "content-disposition"))) { + if (blaze822_mime_parameter(v, "filename", &fn, &fne)) + filename = strndup(fn, fne-fn); + } else if ((v = blaze822_hdr(msg, "content-type"))) { + if (blaze822_mime_parameter(v, "name", &fn, &fne)) + filename = strndup(fn, fne-fn); + } + + return filename; +} mime_action -render_mime(int depth, char *ct, char *body, size_t bodylen) +render_mime(int depth, struct message *msg, char *body, size_t bodylen) { + char *ct = blaze822_hdr(msg, "content-type"); char *mt = mimetype(ct); char *tlmt = tlmimetype(ct); - - char *filename = 0, *fn, *fne; - if (blaze822_mime_parameter(ct, "name", &fn, &fne)) - filename = strndup(fn, fne-fn); + char *filename = mime_filename(msg); mimecount++; @@ -137,7 +157,7 @@ render_mime(int depth, char *ct, char *body, size_t bodylen) printf("--- "); printf("%d: %s size=%zd", mimecount, mt, bodylen); if (filename) { - printf(" name=%s", filename); + printf(" name=\"%s\"", filename); free(filename); } @@ -206,10 +226,11 @@ nofilter: } mime_action -reply_mime(int depth, char *ct, char *body, size_t bodylen) +reply_mime(int depth, struct message *msg, char *body, size_t bodylen) { (void) depth; + char *ct = blaze822_hdr(msg, "Content-Type"); char *mt = mimetype(ct); char *tlmt = tlmimetype(ct); @@ -234,17 +255,18 @@ reply_mime(int depth, char *ct, char *body, size_t bodylen) } mime_action -list_mime(int depth, char *ct, char *body, size_t bodylen) +list_mime(int depth, struct message *msg, char *body, size_t bodylen) { (void) body; + char *ct = blaze822_hdr(msg, "content-type"); char *mt = mimetype(ct); - char *fn, *fne; + char *filename = mime_filename(msg); printf("%*.s%d: %s size=%zd", depth*2, "", ++mimecount, mt, bodylen); - if (blaze822_mime_parameter(ct, "name", &fn, &fne)) { - printf(" name="); - fwrite(fn, 1, fne-fn, stdout); + if (filename) { + printf(" name=\"%s\"", filename); + free(filename); } printf("\n"); @@ -261,7 +283,7 @@ walk_mime(struct message *msg, int depth, mime_callback visit) if (blaze822_mime_body(msg, &ct, &body, &bodylen, &bodychunk)) { - mime_action r = visit(depth, ct, body, bodylen); + mime_action r = visit(depth, msg, body, bodylen); if (r == MIME_CONTINUE) { if (strncmp(ct, "multipart/", 10) == 0) { @@ -334,14 +356,12 @@ writefile(char *name, char *buf, ssize_t len) } mime_action -extract_mime(int depth, char *ct, char *body, size_t bodylen) +extract_mime(int depth, struct message *msg, char *body, size_t bodylen) { (void) body; (void) depth; - char *filename = 0, *fn, *fne; - if (blaze822_mime_parameter(ct, "name", &fn, &fne)) - filename = strndup(fn, fne-fn); + char *filename = mime_filename(msg); mimecount++; diff --git a/rfc2045.c b/rfc2045.c index ef073d3..e919b28 100644 --- a/rfc2045.c +++ b/rfc2045.c @@ -64,6 +64,8 @@ blaze822_mime_body(struct message *msg, int blaze822_mime_parameter(char *s, char *name, char **starto, char **stopo) { + if (!s) + return 0; s = strchr(s, ';'); if (!s) return 0;