X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=cm.c;h=e56b4637127bd853721ea3c60de1ca1fd7701c1c;hb=0422b56950c7f1bb6bb542ce79547c1fff1201ef;hp=a112a005c74556e349889c50286616b4dadc7814;hpb=bb2cb98ea13678e1f409e6ebdeee266a0b93fa8e;p=checkmail.git 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