#include <h/mh.h>
#include <fcntl.h>
-#include <h/signals.h>
-#include <signal.h>
#include <h/mts.h>
#include <h/tws.h>
#include <h/mime.h>
#include <h/utils.h>
/* mhmisc.c */
-int part_ok (CT, int);
+int part_ok (CT);
int type_ok (CT, int);
void flush_errors (void);
-/*
- * prototypes
- */
-void list_all_messages (CT *, int, int, int, int);
-int list_switch (CT, int, int, int, int);
-int list_content (CT, int, int, int, int);
-
/*
* static prototypes
*/
-static void list_single_message (CT, int, int, int);
+static void list_single_message (CT, int, int, int, int);
static int list_debug (CT);
-static int list_multi (CT, int, int, int, int);
-static int list_partial (CT, int, int, int, int);
-static int list_external (CT, int, int, int, int);
-static int list_application (CT, int, int, int, int);
+static int list_multi (CT, int, int, int, int, int);
+static int list_partial (CT, int, int, int, int, int);
+static int list_external (CT, int, int, int, int, int);
+static int list_application (CT, int, int, int, int, int);
static int list_encoding (CT);
/*
* various formats for -list option
*/
-#define LSTFMT1 "%4s %-5s %-24s %5s %-36s\n"
+#define LSTFMT1 "%4s %-5s %-24s %5s %s\n"
#define LSTFMT2a "%4d "
#define LSTFMT2b "%-5s %-24.24s "
+#define LSTFMT2bv "%-5s %-24s "
#define LSTFMT2c1 "%5lu"
#define LSTFMT2c2 "%4lu%c"
#define LSTFMT2c3 "huge "
#define LSTFMT2c4 " "
-#define LSTFMT2d1 " %-36.36s"
-#define LSTFMT2d2 "\t %-65.65s\n"
+#define LSTFMT2d1 " %.36s"
+#define LSTFMT2d1v " %s"
+#define LSTFMT2d2 "\t %-65s\n"
/*
*/
void
-list_all_messages (CT *cts, int headers, int realsize, int verbose, int debug)
+list_all_messages (CT *cts, int headers, int realsize, int verbose, int debug,
+ int dispo)
{
CT ct, *ctp;
for (ctp = cts; *ctp; ctp++) {
ct = *ctp;
- list_single_message (ct, realsize, verbose, debug);
+ list_single_message (ct, realsize, verbose, debug, dispo);
}
flush_errors ();
*/
static void
-list_single_message (CT ct, int realsize, int verbose, int debug)
+list_single_message (CT ct, int realsize, int verbose, int debug, int dispo)
{
if (type_ok (ct, 1)) {
umask (ct->c_umask);
- list_switch (ct, 1, realsize, verbose, debug);
+ list_switch (ct, 1, realsize, verbose, debug, dispo);
if (ct->c_fp) {
fclose (ct->c_fp);
ct->c_fp = NULL;
*/
int
-list_switch (CT ct, int toplevel, int realsize, int verbose, int debug)
+list_switch (CT ct, int toplevel, int realsize, int verbose, int debug,
+ int dispo)
{
switch (ct->c_type) {
case CT_MULTIPART:
- return list_multi (ct, toplevel, realsize, verbose, debug);
- break;
+ return list_multi (ct, toplevel, realsize, verbose, debug, dispo);
case CT_MESSAGE:
switch (ct->c_subtype) {
case MESSAGE_PARTIAL:
- return list_partial (ct, toplevel, realsize, verbose, debug);
- break;
+ return list_partial (ct, toplevel, realsize, verbose,
+ debug, dispo);
case MESSAGE_EXTERNAL:
- return list_external (ct, toplevel, realsize, verbose, debug);
- break;
+ return list_external (ct, toplevel, realsize, verbose,
+ debug, dispo);
case MESSAGE_RFC822:
default:
- return list_content (ct, toplevel, realsize, verbose, debug);
- break;
+ return list_content (ct, toplevel, realsize, verbose,
+ debug, dispo);
}
- break;
case CT_TEXT:
case CT_AUDIO:
case CT_IMAGE:
case CT_VIDEO:
- return list_content (ct, toplevel, realsize, verbose, debug);
- break;
+ return list_content (ct, toplevel, realsize, verbose, debug, dispo);
case CT_APPLICATION:
- return list_application (ct, toplevel, realsize, verbose, debug);
- break;
-
default:
- /* list_debug (ct); */
- adios (NULL, "unknown content type %d", ct->c_type);
- break;
+ return list_application (ct, toplevel, realsize, verbose, debug,
+ dispo);
}
return 0; /* NOT REACHED */
*/
int
-list_content (CT ct, int toplevel, int realsize, int verbose, int debug)
+list_content (CT ct, int toplevel, int realsize, int verbose, int debug,
+ int dispo)
{
unsigned long size;
char *cp, buffer[BUFSIZ];
CI ci = &ct->c_ctinfo;
+ PM pm;
+
+ if (toplevel > 0)
+ printf (LSTFMT2a, atoi (r1bindex (empty (ct->c_file), '/')));
+ else
+ printf(toplevel < 0 ? "part " : " ");
- printf (toplevel > 0 ? LSTFMT2a : toplevel < 0 ? "part " : " ",
- atoi (r1bindex (empty (ct->c_file), '/')));
snprintf (buffer, sizeof(buffer), "%s/%s", empty (ci->ci_type),
empty (ci->ci_subtype));
- printf (LSTFMT2b, empty (ct->c_partno), buffer);
+ if (verbose)
+ printf (LSTFMT2bv, empty (ct->c_partno), buffer);
+ else
+ printf (LSTFMT2b, empty (ct->c_partno), buffer);
if (ct->c_cesizefnx && realsize)
size = (*ct->c_cesizefnx) (ct);
size = ct->c_end - ct->c_begin;
/* find correct scale for size (Kilo/Mega/Giga/Tera) */
- for (cp = " KMGT"; size > 9999; size >>= 10)
+ for (cp = " KMGT"; size > 9999; size /= 1000)
if (!*++cp)
break;
char *dp;
dp = cpytrim (ct->c_descr);
- printf (LSTFMT2d1, dp);
+ if (verbose)
+ printf (LSTFMT2d1v, dp);
+ else
+ printf (LSTFMT2d1, dp);
free (dp);
}
- printf ("\n");
+ putchar('\n');
if (verbose) {
- char **ap, **ep;
CI ci = &ct->c_ctinfo;
- for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++)
- printf ("\t %s=\"%s\"\n", *ap, *ep);
+ for (pm = ci->ci_first_pm; pm; pm = pm->pm_next) {
+ printf ("\t %s=\"%s\"\n", pm->pm_name,
+ get_param_value(pm, '?'));
+ }
/*
* If verbose, print any RFC-822 comments in the
}
}
+ if (dispo && ct->c_dispo_type) {
+ printf ("\t disposition \"%s\"\n", ct->c_dispo_type);
+
+ if (verbose) {
+ for (pm = ct->c_dispo_first; pm; pm = pm->pm_next) {
+ printf ("\t %s=\"%s\"\n", pm->pm_name,
+ get_param_value(pm, '?'));
+ }
+ }
+ }
+
if (debug)
list_debug (ct);
static int
list_debug (CT ct)
{
- char **ap, **ep;
CI ci = &ct->c_ctinfo;
+ PM pm;
fflush (stdout);
fprintf (stderr, " partno \"%s\"\n", empty (ct->c_partno));
/* print parsed parameters attached to content type */
fprintf (stderr, " parameters\n");
- for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++)
- fprintf (stderr, " %s=\"%s\"\n", *ap, *ep);
+ for (pm = ci->ci_first_pm; pm; pm = pm->pm_next)
+ fprintf (stderr, " %s=\"%s\"\n", pm->pm_name,
+ get_param_value(pm, '?'));
/* print internal flags for type/subtype */
fprintf (stderr, " type 0x%x subtype 0x%x params 0x%x\n",
if (ct->c_descr)
fprintf (stderr, " %s:%s", DESCR_FIELD, ct->c_descr);
+ /* print Content-Disposition */
+ if (ct->c_dispo)
+ fprintf (stderr, " %s:%s", DISPO_FIELD, ct->c_dispo);
+
+ fprintf(stderr, " disposition \"%s\"\n", empty (ct->c_dispo_type));
+ fprintf(stderr, " disposition parameters\n");
+ for (pm = ct->c_dispo_first; pm; pm = pm->pm_next)
+ fprintf (stderr, " %s=\"%s\"\n", pm->pm_name,
+ get_param_value(pm, '?'));
+
fprintf (stderr, " read fp 0x%x file \"%s\" begin %ld end %ld\n",
(unsigned int)(unsigned long) ct->c_fp, empty (ct->c_file),
ct->c_begin, ct->c_end);
*/
static int
-list_multi (CT ct, int toplevel, int realsize, int verbose, int debug)
+list_multi (CT ct, int toplevel, int realsize, int verbose, int debug,
+ int dispo)
{
struct multipart *m = (struct multipart *) ct->c_ctparams;
struct part *part;
/* list the content for toplevel of this multipart */
- list_content (ct, toplevel, realsize, verbose, debug);
+ list_content (ct, toplevel, realsize, verbose, debug, dispo);
/* now list for all the subparts */
for (part = m->mp_parts; part; part = part->mp_next) {
CT p = part->mp_part;
- if (part_ok (p, 1) && type_ok (p, 1))
- list_switch (p, 0, realsize, verbose, debug);
+ if (part_ok (p) && type_ok (p, 1))
+ list_switch (p, 0, realsize, verbose, debug, dispo);
}
return OK;
*/
static int
-list_partial (CT ct, int toplevel, int realsize, int verbose, int debug)
+list_partial (CT ct, int toplevel, int realsize, int verbose, int debug,
+ int dispo)
{
struct partial *p = (struct partial *) ct->c_ctparams;
- list_content (ct, toplevel, realsize, verbose, debug);
+ list_content (ct, toplevel, realsize, verbose, debug, dispo);
if (verbose) {
printf ("\t [message %s, part %d", p->pm_partid, p->pm_partno);
if (p->pm_maxno)
*/
static int
-list_external (CT ct, int toplevel, int realsize, int verbose, int debug)
+list_external (CT ct, int toplevel, int realsize, int verbose, int debug,
+ int dispo)
{
struct exbody *e = (struct exbody *) ct->c_ctparams;
* First list the information for the
* message/external content itself.
*/
- list_content (ct, toplevel, realsize, verbose, debug);
+ list_content (ct, toplevel, realsize, verbose, debug, dispo);
if (verbose) {
if (e->eb_name)
printf ("\t server=\"%s\"\n", e->eb_server);
if (e->eb_subject)
printf ("\t subject=\"%s\"\n", e->eb_subject);
+ if (e->eb_url)
+ printf ("\t url=\"%s\"\n", e->eb_url);
/* This must be defined */
printf ("\t access-type=\"%s\"\n", e->eb_access);
if (e->eb_flags == NOTOK)
printf ("\t [service unavailable]\n");
+
}
/*
* Now list the information for the external content
* to which this content points.
*/
- list_content (e->eb_content, 0, realsize, verbose, debug);
+ list_content (e->eb_content, 0, realsize, verbose, debug, dispo);
return OK;
}
*/
static int
-list_application (CT ct, int toplevel, int realsize, int verbose, int debug)
+list_application (CT ct, int toplevel, int realsize, int verbose, int debug,
+ int dispo)
{
- list_content (ct, toplevel, realsize, verbose, debug);
+ list_content (ct, toplevel, realsize, verbose, debug, dispo);
return OK;
}