X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/6c42153ad9362cc676ea66563bf400d7511b3b68..63621a81d16ab743de6b57d47578a9a2c670ad22:/uip/mhmisc.c diff --git a/uip/mhmisc.c b/uip/mhmisc.c index 2a1672e6..acaae82a 100644 --- a/uip/mhmisc.c +++ b/uip/mhmisc.c @@ -1,8 +1,4 @@ - -/* - * mhparse.c -- misc routines to process MIME messages - * - * $Id$ +/* mhmisc.c -- misc routines to process MIME messages * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for @@ -10,11 +6,12 @@ */ #include -#include #include #include +#include +#include "sbr/makedir.h" +#include "mhmisc.h" -extern int errno; extern int debugsw; /* @@ -25,34 +22,53 @@ int ntype = 0; char *parts[NPARTS + 1]; char *types[NTYPES + 1]; -int endian = 0; /* little or big endian */ int userrs = 0; static char *errs = NULL; -/* - * prototypes - */ -int part_ok (CT, int); -int type_ok (CT, int); -void set_endian (void); -int make_intermediates (char *); -void content_error (char *, CT, char *, ...); -void flush_errors (void); +int +part_ok (CT ct) +{ + char **ap; + int len; + /* a part is "ok", i.e., should be processed, if: + - there were no -part arguments + - this part is a multipart + */ + if (npart == 0 || ct->c_type == CT_MULTIPART) { + return 1; + } + + /* or if: + - this part is a an exact match for any -part option + - this part is a sub-part of any -part option + */ + for (ap = parts; *ap; ap++) { + len = strlen(*ap); + if (!strncmp (*ap, ct->c_partno, len) && + (!ct->c_partno[len] || ct->c_partno[len] == '.' )) { + return 1; + } + } + + return 0; +} int -part_ok (CT ct, int sP) +part_exact(CT ct) { char **ap; - if (npart == 0 || (ct->c_type == CT_MULTIPART && (sP || ct->c_subtype))) - return 1; + if (!ct->c_partno) + return 0; - for (ap = parts; *ap; ap++) - if (!strcmp (*ap, ct->c_partno)) - return 1; + for (ap = parts; *ap; ap++) { + if (!strcmp (*ap, ct->c_partno)) { + return 1; + } + } return 0; } @@ -77,21 +93,27 @@ type_ok (CT ct, int sP) } -void -set_endian (void) +/* + * Returns true if the content has a disposition of "inline". + * + * Technically we should check parent content to see if they have + * disposition to use as a default, but we don't right now. Maybe + * later .... + */ + +int +is_inline(CT ct) { - union { - long l; - char c[sizeof(long)]; - } un; - - un.l = 1; - endian = un.c[0] ? -1 : 1; - if (debugsw) - fprintf (stderr, "%s endian architecture\n", - endian > 0 ? "big" : "little"); -} + /* + * If there isn't any disposition at all, it's "inline". Obviously + * if it's "inline", then it's inline. RFC 2183 says if it's an unknown + * disposition, treat it as 'attachment'. + */ + if (! ct->c_dispo_type || strcasecmp(ct->c_dispo_type, "inline") == 0) + return 1; + return 0; +} int make_intermediates (char *file) @@ -113,13 +135,13 @@ losing_directory: } ep = concat ("Create directory \"", file, "\"? ", NULL); - answer = getanswer (ep); + answer = read_yes_or_no_if_tty (ep); free (ep); if (!answer) goto losing_directory; if (!makedir (file)) { - advise (NULL, "unable to create directory %s", file); + inform("unable to create directory %s", file); goto losing_directory; } } @@ -139,7 +161,7 @@ void content_error (char *what, CT ct, char *fmt, ...) { va_list arglist; - int i, len, buflen; + int len, buflen; char *bp, buffer[BUFSIZ]; CI ci; @@ -182,10 +204,8 @@ content_error (char *what, CT ct, char *fmt, ...) buflen -= len; } - i = strlen (invo_name) + 2; - /* Now add content type and subtype */ - snprintf (bp, buflen, "\n%*.*s(content %s/%s", i, i, "", + snprintf (bp, buflen, "\n (content %s/%s", ci->ci_type, ci->ci_subtype); len = strlen (bp); bp += len; @@ -218,8 +238,10 @@ content_error (char *what, CT ct, char *fmt, ...) errs = add (buffer, errs); } else { - advise (NULL, "%s", buffer); + inform("%s", buffer); } + + va_end(arglist); } @@ -228,7 +250,7 @@ flush_errors (void) { if (errs) { fflush (stdout); - fprintf (stderr, "%s", errs); + fputs(errs, stderr); free (errs); errs = NULL; }