From d71a1fbe44093debc05d60d56ac26ef2c63aff15 Mon Sep 17 00:00:00 2001 From: Christian Neukirchen Date: Fri, 19 Aug 2016 17:53:40 +0200 Subject: add mexport --- mexport.c | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 mexport.c (limited to 'mexport.c') diff --git a/mexport.c b/mexport.c new file mode 100644 index 0000000..2e06890 --- /dev/null +++ b/mexport.c @@ -0,0 +1,139 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "blaze822.h" + +static int Sflag; + +static int status; + +void +export(char *file) +{ + struct message *msg; + + while (*file == ' ' || *file == '\t') + file++; + + msg = blaze822(file); + if (!msg) + return; + + char from[1024] = "nobody"; + + char *v; + if ((v = blaze822_hdr(msg, "return-path")) || + (v = blaze822_hdr(msg, "x-envelope-from"))) { + char *s = strchr(v, '<'); + char *e = strchr(s, '>'); + if (s && e) { + e++; + memcpy(from, s, e-s); + from[e-s] = 0; + } + } + + time_t date = -1; + if ((v = blaze822_hdr(msg, "date"))) { + date = blaze822_date(v); + } + + char *line = 0; + size_t linelen = 0; + + FILE *infile = fopen(file, "r"); + if (!infile) { + status = 1; + return; + } + + printf("From %s %s", from, ctime(&date)); + + int in_header = 1; + int final_nl = 0; + + while (1) { + errno = 0; + ssize_t rd = getline(&line, &linelen, infile); + if (rd == -1) { + if (errno == 0) + break; + // XXX print error? + status = 1; + return; + } + + if (in_header && line[0] == '\n' && !line[1]) { + if (Sflag) { + char *flags = strstr(file, ":2,"); + if (!flags) + flags = ""; + + fputs("Status: ", stdout); + if (strchr(flags, 'S')) + putchar('R'); + char *ee = strrchr(file, '/'); + if (!ee || + !(ee >= file + 3 && ee[-3] == 'n' && ee[-2] == 'e' && ee[-1] == 'w')) + putchar('O'); + putchar('\n'); + + fputs("X-Status: ", stdout); + if (strchr(flags, 'R')) putchar('A'); + if (strchr(flags, 'T')) putchar('D'); + if (strchr(flags, 'F')) putchar('F'); + putchar('\n'); + } + + in_header = 0; + } + + // MBOXRD: add first > to >>..>>From + char *s = line; + while (*s == '>') + s++; + if (strncmp("From ", s, 5) == 0) + putchar('>'); + + fputs(line, stdout); + final_nl = (line[rd-1] == '\n'); + } + + // ensure trailing newline + if (!final_nl) + putchar('\n'); + + fclose(infile); + + blaze822_free(msg); +} + +int +main(int argc, char *argv[]) +{ + int c; + while ((c = getopt(argc, argv, "S")) != -1) + switch(c) { + case 'S': Sflag = 1; break; + default: + fprintf(stderr, "Usage: mexport [-S] [msgs...]\n"); + exit(2); + } + + status = 0; + + if (argc == optind && isatty(0)) + blaze822_loop1(":", export); + else + blaze822_loop(argc-optind, argv+optind, export); + + return status; +} -- cgit 1.4.1