From 0422b56950c7f1bb6bb542ce79547c1fff1201ef Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Wed, 13 Feb 2008 19:46:45 +0100 Subject: [PATCH] Added support for gzipped mailboxes. --- ChangeLog | 9 +++++++++ cm.c | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 6116ced..b7fac24 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-02-13 Martin Mares + + * Added support for gzipped mailboxes, based on a patch by + Michal Vaner. + + * Released as 1.2. + 2008-01-16 Martin Mares * Non-ASCII characters are displayed properly in UTF-8 locale. @@ -6,6 +13,8 @@ parts do not look printable. This mode is now enabled by default, tweak the Makefile if you do not have libncursesw. + * Released as 1.1. + 2007-06-25 Martin Mares * Non-ASCII characters encoded as per RFC 2047 are now deciphered diff --git a/cm.c b/cm.c index a112a00..e56b463 100644 --- a/cm.c +++ b/cm.c @@ -18,6 +18,8 @@ #include #include #include +#include +#include #ifdef CONFIG_WIDE_CURSES #include @@ -313,6 +315,7 @@ scan_mbox(struct mbox *b, struct stat *st) { char buf[1024], sender[1024], subject[1024]; int c; + int compressed = 0; const char from[] = "\nFrom "; if (!st->st_size) @@ -331,10 +334,39 @@ scan_mbox(struct mbox *b, struct stat *st) b->total = b->new = b->flagged = -1; return; } + + char signature[2]; + c = read(mb_fd, signature, 2); + lseek(mb_fd, 0, SEEK_SET); + + if (c == 2 && !memcmp(signature, "\037\213", 2)) //gzip + { + debug("[decompressing] "); + int fds[2]; + if (pipe(fds)) + die("pipe failed: %m"); + int pid = fork(); + if (pid < 0) + die("fork failed: %m"); + if (!pid) + { + if (dup2(mb_fd, 0) < 0 || dup2(fds[1], 1) < 0) + die("dup2 failed: %m"); + close(fds[0]); + close(fds[1]); + close(mb_fd); + execlp("gzip", "gzip", "-cd", NULL); + die("Cannot execute gzip: %m"); + } + close(fds[1]); + close(mb_fd); + mb_fd = fds[0]; + compressed = 1; + } mb_reset(0); int incremental = 0; - if (b->last_size && b->last_pos && st->st_size > b->last_size && !b->force_refresh) + if (b->last_size && b->last_pos && st->st_size > b->last_size && !b->force_refresh && !compressed) { mb_seek(b->last_pos); if (mb_check(from, 6)) @@ -449,6 +481,12 @@ scan_mbox(struct mbox *b, struct stat *st) done: close(mb_fd); + if (compressed) + { + int status; + if (wait(&status) < 0 || !WIFEXITED(status) || WEXITSTATUS(status)) + b->total = b->new = b->flagged = -1; + } } static void -- 2.39.2