]>
Commit | Line | Data |
---|---|---|
f870a5ba | 1 | diff -urN mutt-1.5.15/compress.c mutt-1.5.15-ro/compress.c |
2 | --- mutt-1.5.15/compress.c 1970-01-01 01:00:00.000000000 +0100 | |
3 | +++ mutt-1.5.15-ro/compress.c 2007-05-27 14:20:23.000000000 +0200 | |
4 | @@ -0,0 +1,499 @@ | |
643a7814 JB |
5 | +/* |
6 | + * Copyright (C) 1997 Alain Penders <Alain@Finale-Dev.com> | |
7 | + * | |
8 | + * This program is free software; you can redistribute it and/or modify | |
9 | + * it under the terms of the GNU General Public License as published by | |
10 | + * the Free Software Foundation; either version 2 of the License, or | |
11 | + * (at your option) any later version. | |
12 | + * | |
13 | + * This program is distributed in the hope that it will be useful, | |
14 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | + * GNU General Public License for more details. | |
17 | + * | |
18 | + * You should have received a copy of the GNU General Public License | |
19 | + * along with this program; if not, write to the Free Software | |
20 | + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
21 | + */ | |
22 | + | |
68eeb855 | 23 | +#if HAVE_CONFIG_H |
24 | +# include "config.h" | |
25 | +#endif | |
26 | + | |
643a7814 JB |
27 | +#include "mutt.h" |
28 | + | |
29 | +#ifdef USE_COMPRESSED | |
30 | + | |
31 | +#include "mx.h" | |
32 | +#include "mailbox.h" | |
33 | +#include "mutt_curses.h" | |
34 | + | |
35 | +#include <errno.h> | |
36 | +#include <string.h> | |
37 | +#include <unistd.h> | |
38 | +#include <sys/stat.h> | |
39 | + | |
40 | +typedef struct | |
41 | +{ | |
42 | + const char *close; /* close-hook command */ | |
43 | + const char *open; /* open-hook command */ | |
44 | + const char *append; /* append-hook command */ | |
45 | + off_t size; /* size of real folder */ | |
46 | +} COMPRESS_INFO; | |
47 | + | |
48 | + | |
49 | +/* | |
50 | + * ctx - context to lock | |
51 | + * excl - exclusive lock? | |
52 | + * retry - should retry if unable to lock? | |
53 | + */ | |
54 | +int mbox_lock_compressed (CONTEXT *ctx, FILE *fp, int excl, int retry) | |
55 | +{ | |
56 | + int r; | |
57 | + | |
58 | + if ((r = mx_lock_file (ctx->realpath, fileno (fp), excl, 1, retry)) == 0) | |
59 | + ctx->locked = 1; | |
60 | + else if (retry && !excl) | |
61 | + { | |
62 | + ctx->readonly = 1; | |
63 | + return 0; | |
64 | + } | |
65 | + | |
66 | + return (r); | |
67 | +} | |
68 | + | |
69 | +void mbox_unlock_compressed (CONTEXT *ctx, FILE *fp) | |
70 | +{ | |
71 | + if (ctx->locked) | |
72 | + { | |
73 | + fflush (fp); | |
74 | + | |
75 | + mx_unlock_file (ctx->realpath, fileno (fp), 1); | |
76 | + ctx->locked = 0; | |
77 | + } | |
78 | +} | |
79 | + | |
80 | +static int is_new (const char *path) | |
81 | +{ | |
82 | + return (access (path, W_OK) != 0 && errno == ENOENT) ? 1 : 0; | |
83 | +} | |
84 | + | |
85 | +static const char* find_compress_hook (int type, const char *path) | |
86 | +{ | |
87 | + const char* c = mutt_find_hook (type, path); | |
88 | + return (!c || !*c) ? NULL : c; | |
89 | +} | |
90 | + | |
91 | +int mutt_can_read_compressed (const char *path) | |
92 | +{ | |
93 | + return find_compress_hook (M_OPENHOOK, path) ? 1 : 0; | |
94 | +} | |
95 | + | |
96 | +/* | |
97 | + * if the file is new, we really do not append, but create, and so use | |
98 | + * close-hook, and not append-hook | |
99 | + */ | |
100 | +static const char* get_append_command (const char *path, const CONTEXT* ctx) | |
101 | +{ | |
102 | + COMPRESS_INFO *ci = (COMPRESS_INFO *) ctx->compressinfo; | |
103 | + return (is_new (path)) ? ci->close : ci->append; | |
104 | +} | |
105 | + | |
106 | +int mutt_can_append_compressed (const char *path) | |
107 | +{ | |
108 | + int magic; | |
109 | + | |
110 | + if (is_new (path)) | |
f870a5ba | 111 | + { |
112 | + char *dir_path = safe_strdup(path); | |
113 | + char *aux = strrchr(dir_path, '/'); | |
114 | + int dir_valid = 1; | |
115 | + if (aux) | |
116 | + { | |
117 | + *aux='\0'; | |
118 | + if (access(dir_path, W_OK|X_OK)) | |
119 | + dir_valid = 0; | |
120 | + } | |
121 | + safe_free((void**)&dir_path); | |
122 | + return dir_valid && (find_compress_hook (M_CLOSEHOOK, path) ? 1 : 0); | |
123 | + } | |
643a7814 JB |
124 | + |
125 | + magic = mx_get_magic (path); | |
126 | + | |
127 | + if (magic != 0 && magic != M_COMPRESSED) | |
128 | + return 0; | |
129 | + | |
130 | + return (find_compress_hook (M_APPENDHOOK, path) | |
131 | + || (find_compress_hook (M_OPENHOOK, path) | |
132 | + && find_compress_hook (M_CLOSEHOOK, path))) ? 1 : 0; | |
133 | +} | |
134 | + | |
135 | +/* open a compressed mailbox */ | |
136 | +static COMPRESS_INFO *set_compress_info (CONTEXT *ctx) | |
137 | +{ | |
138 | + COMPRESS_INFO *ci; | |
139 | + | |
140 | + /* Now lets uncompress this thing */ | |
141 | + ci = safe_malloc (sizeof (COMPRESS_INFO)); | |
142 | + ctx->compressinfo = (void*) ci; | |
143 | + ci->append = find_compress_hook (M_APPENDHOOK, ctx->path); | |
144 | + ci->open = find_compress_hook (M_OPENHOOK, ctx->path); | |
145 | + ci->close = find_compress_hook (M_CLOSEHOOK, ctx->path); | |
146 | + return ci; | |
147 | +} | |
148 | + | |
149 | +static void set_path (CONTEXT* ctx) | |
150 | +{ | |
151 | + char tmppath[_POSIX_PATH_MAX]; | |
152 | + | |
153 | + /* Setup the right paths */ | |
154 | + ctx->realpath = ctx->path; | |
155 | + | |
156 | + /* Uncompress to /tmp */ | |
157 | + mutt_mktemp (tmppath); | |
158 | + ctx->path = safe_malloc (strlen (tmppath) + 1); | |
159 | + strcpy (ctx->path, tmppath); | |
160 | +} | |
161 | + | |
162 | +static int get_size (const char* path) | |
163 | +{ | |
164 | + struct stat sb; | |
165 | + if (stat (path, &sb) != 0) | |
166 | + return 0; | |
167 | + return (sb.st_size); | |
168 | +} | |
169 | + | |
170 | +static void store_size (CONTEXT* ctx) | |
171 | +{ | |
172 | + COMPRESS_INFO *ci = (COMPRESS_INFO *) ctx->compressinfo; | |
173 | + ci->size = get_size (ctx->realpath); | |
174 | +} | |
175 | + | |
176 | +static const char * | |
177 | +compresshook_format_str (char *dest, size_t destlen, char op, const char *src, | |
178 | + const char *fmt, const char *ifstring, | |
179 | + const char *elsestring, unsigned long data, | |
180 | + format_flag flags) | |
181 | +{ | |
182 | + char tmp[SHORT_STRING]; | |
183 | + | |
184 | + CONTEXT *ctx = (CONTEXT *) data; | |
185 | + switch (op) | |
186 | + { | |
187 | + case 'f': | |
188 | + snprintf (tmp, sizeof (tmp), "%%%ss", fmt); | |
189 | + snprintf (dest, destlen, tmp, ctx->realpath); | |
190 | + break; | |
191 | + case 't': | |
192 | + snprintf (tmp, sizeof (tmp), "%%%ss", fmt); | |
193 | + snprintf (dest, destlen, tmp, ctx->path); | |
194 | + break; | |
195 | + } | |
196 | + return (src); | |
197 | +} | |
198 | + | |
199 | +/* | |
200 | + * check that the command has both %f and %t | |
201 | + * 0 means OK, -1 means error | |
202 | + */ | |
203 | +int mutt_test_compress_command (const char* cmd) | |
204 | +{ | |
205 | + return (strstr (cmd, "%f") && strstr (cmd, "%t")) ? 0 : -1; | |
206 | +} | |
207 | + | |
208 | +static char *get_compression_cmd (const char* cmd, const CONTEXT* ctx) | |
209 | +{ | |
210 | + char expanded[_POSIX_PATH_MAX]; | |
211 | + mutt_FormatString (expanded, sizeof (expanded), cmd, compresshook_format_str, | |
212 | + (unsigned long) ctx, 0); | |
213 | + return safe_strdup (expanded); | |
214 | +} | |
215 | + | |
216 | +int mutt_check_mailbox_compressed (CONTEXT* ctx) | |
217 | +{ | |
218 | + COMPRESS_INFO *ci = (COMPRESS_INFO *) ctx->compressinfo; | |
219 | + if (ci->size != get_size (ctx->realpath)) | |
220 | + { | |
68eeb855 | 221 | + FREE (&ctx->compressinfo); |
222 | + FREE (&ctx->realpath); | |
643a7814 JB |
223 | + mutt_error _("Mailbox was corrupted!"); |
224 | + return (-1); | |
225 | + } | |
226 | + return (0); | |
227 | +} | |
228 | + | |
229 | +int mutt_open_read_compressed (CONTEXT *ctx) | |
230 | +{ | |
231 | + char *cmd; | |
232 | + FILE *fp; | |
233 | + int rc; | |
234 | + | |
235 | + COMPRESS_INFO *ci = set_compress_info (ctx); | |
236 | + if (!ci->open) { | |
237 | + ctx->magic = 0; | |
f870a5ba | 238 | + FREE (&ctx->compressinfo); |
643a7814 JB |
239 | + return (-1); |
240 | + } | |
241 | + if (!ci->close || access (ctx->path, W_OK) != 0) | |
242 | + ctx->readonly = 1; | |
243 | + | |
244 | + set_path (ctx); | |
245 | + store_size (ctx); | |
246 | + | |
247 | + if (!ctx->quiet) | |
248 | + mutt_message (_("Decompressing %s..."), ctx->realpath); | |
249 | + | |
250 | + cmd = get_compression_cmd (ci->open, ctx); | |
251 | + if (cmd == NULL) | |
252 | + return (-1); | |
253 | + dprint (2, (debugfile, "DecompressCmd: '%s'\n", cmd)); | |
254 | + | |
255 | + if ((fp = fopen (ctx->realpath, "r")) == NULL) | |
256 | + { | |
257 | + mutt_perror (ctx->realpath); | |
68eeb855 | 258 | + FREE (&cmd); |
643a7814 JB |
259 | + return (-1); |
260 | + } | |
261 | + mutt_block_signals (); | |
262 | + if (mbox_lock_compressed (ctx, fp, 0, 1) == -1) | |
263 | + { | |
264 | + fclose (fp); | |
265 | + mutt_unblock_signals (); | |
266 | + mutt_error _("Unable to lock mailbox!"); | |
68eeb855 | 267 | + FREE (&cmd); |
643a7814 JB |
268 | + return (-1); |
269 | + } | |
270 | + | |
271 | + endwin (); | |
272 | + fflush (stdout); | |
273 | + fprintf (stderr, _("Decompressing %s...\n"),ctx->realpath); | |
274 | + rc = mutt_system (cmd); | |
275 | + mbox_unlock_compressed (ctx, fp); | |
276 | + mutt_unblock_signals (); | |
277 | + fclose (fp); | |
278 | + | |
279 | + if (rc) | |
280 | + { | |
281 | + mutt_any_key_to_continue (NULL); | |
282 | + ctx->magic = 0; | |
f870a5ba | 283 | + FREE (&ctx->compressinfo); |
643a7814 JB |
284 | + mutt_error (_("Error executing: %s : unable to open the mailbox!\n"), cmd); |
285 | + } | |
68eeb855 | 286 | + FREE (&cmd); |
643a7814 JB |
287 | + if (rc) |
288 | + return (-1); | |
289 | + | |
290 | + if (mutt_check_mailbox_compressed (ctx)) | |
291 | + return (-1); | |
292 | + | |
293 | + ctx->magic = mx_get_magic (ctx->path); | |
294 | + | |
295 | + return (0); | |
296 | +} | |
297 | + | |
298 | +void restore_path (CONTEXT* ctx) | |
299 | +{ | |
68eeb855 | 300 | + FREE (&ctx->path); |
643a7814 JB |
301 | + ctx->path = ctx->realpath; |
302 | +} | |
303 | + | |
304 | +/* remove the temporary mailbox */ | |
305 | +void remove_file (CONTEXT* ctx) | |
306 | +{ | |
307 | + if (ctx->magic == M_MBOX || ctx->magic == M_MMDF) | |
308 | + remove (ctx->path); | |
309 | +} | |
310 | + | |
311 | +int mutt_open_append_compressed (CONTEXT *ctx) | |
312 | +{ | |
313 | + FILE *fh; | |
314 | + COMPRESS_INFO *ci = set_compress_info (ctx); | |
315 | + | |
316 | + if (!get_append_command (ctx->path, ctx)) | |
317 | + { | |
318 | + if (ci->open && ci->close) | |
319 | + return (mutt_open_read_compressed (ctx)); | |
320 | + | |
321 | + ctx->magic = 0; | |
68eeb855 | 322 | + FREE (&ctx->compressinfo); |
643a7814 JB |
323 | + return (-1); |
324 | + } | |
325 | + | |
326 | + set_path (ctx); | |
327 | + | |
328 | + ctx->magic = DefaultMagic; | |
329 | + | |
330 | + if (!is_new (ctx->realpath)) | |
331 | + if (ctx->magic == M_MBOX || ctx->magic == M_MMDF) | |
332 | + if ((fh = fopen (ctx->path, "w"))) | |
333 | + fclose (fh); | |
334 | + /* No error checking - the parent function will catch it */ | |
335 | + | |
336 | + return (0); | |
337 | +} | |
338 | + | |
339 | +/* close a compressed mailbox */ | |
340 | +void mutt_fast_close_compressed (CONTEXT *ctx) | |
341 | +{ | |
342 | + dprint (2, (debugfile, "mutt_fast_close_compressed called on '%s'\n", | |
343 | + ctx->path)); | |
344 | + | |
345 | + if (ctx->compressinfo) | |
346 | + { | |
347 | + if (ctx->fp) | |
348 | + fclose (ctx->fp); | |
349 | + ctx->fp = NULL; | |
350 | + /* if the folder was removed, remove the gzipped folder too */ | |
351 | + if ((ctx->magic > 0) | |
352 | + && (access (ctx->path, F_OK) != 0) | |
353 | + && ! option (OPTSAVEEMPTY)) | |
354 | + remove (ctx->realpath); | |
355 | + else | |
356 | + remove_file (ctx); | |
357 | + | |
358 | + restore_path (ctx); | |
68eeb855 | 359 | + FREE (&ctx->compressinfo); |
643a7814 JB |
360 | + } |
361 | +} | |
362 | + | |
363 | +/* return 0 on success, -1 on failure */ | |
364 | +int mutt_sync_compressed (CONTEXT* ctx) | |
365 | +{ | |
366 | + char *cmd; | |
367 | + int rc = 0; | |
368 | + FILE *fp; | |
369 | + COMPRESS_INFO *ci = (COMPRESS_INFO *) ctx->compressinfo; | |
370 | + | |
371 | + if (!ctx->quiet) | |
372 | + mutt_message (_("Compressing %s..."), ctx->realpath); | |
373 | + | |
374 | + cmd = get_compression_cmd (ci->close, ctx); | |
375 | + if (cmd == NULL) | |
376 | + return (-1); | |
377 | + | |
378 | + if ((fp = fopen (ctx->realpath, "a")) == NULL) | |
379 | + { | |
380 | + mutt_perror (ctx->realpath); | |
68eeb855 | 381 | + FREE (&cmd); |
643a7814 JB |
382 | + return (-1); |
383 | + } | |
384 | + mutt_block_signals (); | |
385 | + if (mbox_lock_compressed (ctx, fp, 1, 1) == -1) | |
386 | + { | |
387 | + fclose (fp); | |
388 | + mutt_unblock_signals (); | |
389 | + mutt_error _("Unable to lock mailbox!"); | |
390 | + store_size (ctx); | |
68eeb855 | 391 | + FREE (&cmd); |
643a7814 JB |
392 | + return (-1); |
393 | + } | |
394 | + | |
395 | + dprint (2, (debugfile, "CompressCommand: '%s'\n", cmd)); | |
396 | + | |
397 | + endwin (); | |
398 | + fflush (stdout); | |
399 | + fprintf (stderr, _("Compressing %s...\n"), ctx->realpath); | |
400 | + if (mutt_system (cmd)) | |
401 | + { | |
402 | + mutt_any_key_to_continue (NULL); | |
403 | + mutt_error (_("%s: Error compressing mailbox! Original mailbox deleted, uncompressed one kept!\n"), ctx->path); | |
404 | + rc = -1; | |
405 | + } | |
406 | + | |
407 | + mbox_unlock_compressed (ctx, fp); | |
408 | + mutt_unblock_signals (); | |
409 | + fclose (fp); | |
410 | + | |
68eeb855 | 411 | + FREE (&cmd); |
643a7814 JB |
412 | + |
413 | + store_size (ctx); | |
414 | + | |
415 | + return (rc); | |
416 | +} | |
417 | + | |
418 | +int mutt_slow_close_compressed (CONTEXT *ctx) | |
419 | +{ | |
420 | + FILE *fp; | |
421 | + const char *append; | |
422 | + char *cmd; | |
423 | + COMPRESS_INFO *ci = (COMPRESS_INFO *) ctx->compressinfo; | |
424 | + | |
425 | + dprint (2, (debugfile, "mutt_slow_close_compressed called on '%s'\n", | |
426 | + ctx->path)); | |
427 | + | |
428 | + if (! (ctx->append | |
429 | + && ((append = get_append_command (ctx->realpath, ctx)) | |
430 | + || (append = ci->close)))) | |
431 | + { | |
432 | + /* if we can not or should not append, we only have to remove the */ | |
433 | + /* compressed info, because sync was already called */ | |
434 | + mutt_fast_close_compressed (ctx); | |
435 | + return (0); | |
436 | + } | |
437 | + | |
438 | + if (ctx->fp) | |
439 | + fclose (ctx->fp); | |
440 | + ctx->fp = NULL; | |
441 | + | |
442 | + if (!ctx->quiet) | |
443 | + { | |
444 | + if (append == ci->close) | |
445 | + mutt_message (_("Compressing %s..."), ctx->realpath); | |
446 | + else | |
447 | + mutt_message (_("Compressed-appending to %s..."), ctx->realpath); | |
448 | + } | |
449 | + | |
450 | + cmd = get_compression_cmd (append, ctx); | |
451 | + if (cmd == NULL) | |
452 | + return (-1); | |
453 | + | |
454 | + if ((fp = fopen (ctx->realpath, "a")) == NULL) | |
455 | + { | |
456 | + mutt_perror (ctx->realpath); | |
68eeb855 | 457 | + FREE (&cmd); |
643a7814 JB |
458 | + return (-1); |
459 | + } | |
460 | + mutt_block_signals (); | |
461 | + if (mbox_lock_compressed (ctx, fp, 1, 1) == -1) | |
462 | + { | |
463 | + fclose (fp); | |
464 | + mutt_unblock_signals (); | |
465 | + mutt_error _("Unable to lock mailbox!"); | |
68eeb855 | 466 | + FREE (&cmd); |
643a7814 JB |
467 | + return (-1); |
468 | + } | |
469 | + | |
470 | + dprint (2, (debugfile, "CompressCmd: '%s'\n", cmd)); | |
471 | + | |
472 | + endwin (); | |
473 | + fflush (stdout); | |
474 | + | |
475 | + if (append == ci->close) | |
476 | + fprintf (stderr, _("Compressing %s...\n"), ctx->realpath); | |
477 | + else | |
478 | + fprintf (stderr, _("Compressed-appending to %s...\n"), ctx->realpath); | |
479 | + | |
480 | + if (mutt_system (cmd)) | |
481 | + { | |
482 | + mutt_any_key_to_continue (NULL); | |
483 | + mutt_error (_(" %s: Error compressing mailbox! Uncompressed one kept!\n"), | |
484 | + ctx->path); | |
68eeb855 | 485 | + FREE (&cmd); |
643a7814 JB |
486 | + mbox_unlock_compressed (ctx, fp); |
487 | + mutt_unblock_signals (); | |
488 | + fclose (fp); | |
489 | + return (-1); | |
490 | + } | |
491 | + | |
492 | + mbox_unlock_compressed (ctx, fp); | |
493 | + mutt_unblock_signals (); | |
494 | + fclose (fp); | |
495 | + remove_file (ctx); | |
496 | + restore_path (ctx); | |
68eeb855 | 497 | + FREE (&cmd); |
498 | + FREE (&ctx->compressinfo); | |
643a7814 JB |
499 | + |
500 | + return (0); | |
501 | +} | |
502 | + | |
503 | +#endif /* USE_COMPRESSED */ | |
f870a5ba | 504 | diff -urN mutt-1.5.15/compress.h mutt-1.5.15-ro/compress.h |
505 | --- mutt-1.5.15/compress.h 1970-01-01 01:00:00.000000000 +0100 | |
506 | +++ mutt-1.5.15-ro/compress.h 2007-05-27 14:20:23.000000000 +0200 | |
643a7814 JB |
507 | @@ -0,0 +1,27 @@ |
508 | +/* | |
509 | + * Copyright (C) 1997 Alain Penders <Alain@Finale-Dev.com> | |
510 | + * | |
511 | + * This program is free software; you can redistribute it and/or modify | |
512 | + * it under the terms of the GNU General Public License as published by | |
513 | + * the Free Software Foundation; either version 2 of the License, or | |
514 | + * (at your option) any later version. | |
515 | + * | |
516 | + * This program is distributed in the hope that it will be useful, | |
517 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
518 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
519 | + * GNU General Public License for more details. | |
520 | + * | |
521 | + * You should have received a copy of the GNU General Public License | |
522 | + * along with this program; if not, write to the Free Software | |
523 | + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
524 | + */ | |
525 | + | |
526 | +int mutt_can_read_compressed (const char *); | |
527 | +int mutt_can_append_compressed (const char *); | |
528 | +int mutt_open_read_compressed (CONTEXT *); | |
529 | +int mutt_open_append_compressed (CONTEXT *); | |
530 | +int mutt_slow_close_compressed (CONTEXT *); | |
531 | +int mutt_sync_compressed (CONTEXT *); | |
532 | +int mutt_test_compress_command (const char *); | |
533 | +int mutt_check_mailbox_compressed (CONTEXT *); | |
534 | +void mutt_fast_close_compressed (CONTEXT *); | |
f870a5ba | 535 | diff -urN mutt-1.5.15/config.h.in mutt-1.5.15-ro/config.h.in |
536 | --- mutt-1.5.15/config.h.in 2007-04-06 09:18:47.000000000 +0200 | |
537 | +++ mutt-1.5.15-ro/config.h.in 2007-05-27 14:20:23.000000000 +0200 | |
538 | @@ -513,6 +513,9 @@ | |
68eeb855 | 539 | /* Define to enable Sun mailtool attachments support. */ |
540 | #undef SUN_ATTACHMENT | |
541 | ||
542 | +/* Define to enable compressed mailboxes support */ | |
543 | +#undef USE_COMPRESSED | |
544 | + | |
545 | /* Define to use dotlocking for mailboxes. */ | |
546 | #undef USE_DOTLOCK | |
547 | ||
f870a5ba | 548 | diff -urN mutt-1.5.15/configure mutt-1.5.15-ro/configure |
549 | --- mutt-1.5.15/configure 2007-04-06 09:17:16.000000000 +0200 | |
550 | +++ mutt-1.5.15-ro/configure 2007-05-27 14:20:23.000000000 +0200 | |
551 | @@ -1354,6 +1354,7 @@ | |
68eeb855 | 552 | --enable-hcache Enable header caching |
553 | --disable-iconv Disable iconv support | |
554 | --disable-nls Do not use Native Language Support | |
555 | + --enable-compressed Enable compressed folders support | |
556 | ||
557 | Optional Packages: | |
558 | --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] | |
f870a5ba | 559 | @@ -17502,6 +17503,17 @@ |
68eeb855 | 560 | fi |
561 | ||
562 | ||
563 | +# Check whether --enable-compressed or --disable-compressed was given. | |
564 | +if test "${enable_compressed+set}" = set; then | |
f870a5ba | 565 | + enableval="$enable_compressed"; if test x$enableval = xyes; then |
566 | + | |
567 | +cat >>confdefs.h <<\_ACEOF | |
68eeb855 | 568 | +#define USE_COMPRESSED 1 |
f870a5ba | 569 | +_ACEOF |
68eeb855 | 570 | + |
571 | + fi | |
572 | +fi | |
573 | + | |
574 | ||
575 | # Check whether --with-exec-shell was given. | |
576 | if test "${with_exec_shell+set}" = set; then | |
f870a5ba | 577 | diff -urN mutt-1.5.15/configure.ac mutt-1.5.15-ro/configure.ac |
578 | --- mutt-1.5.15/configure.ac 2007-04-06 09:11:53.000000000 +0200 | |
579 | +++ mutt-1.5.15-ro/configure.ac 2007-05-27 14:33:52.000000000 +0200 | |
580 | @@ -803,6 +803,11 @@ | |
643a7814 JB |
581 | AC_DEFINE(LOCALES_HACK,1,[ Define if the result of isprint() is unreliable. ]) |
582 | fi]) | |
583 | ||
68eeb855 | 584 | +AC_ARG_ENABLE(compressed, AC_HELP_STRING([--enable-compressed], [Enable compressed folders support]), |
643a7814 JB |
585 | + [if test x$enableval = xyes; then |
586 | + AC_DEFINE(USE_COMPRESSED,1, [ Define to support compressed folders. ]) | |
587 | + fi]) | |
588 | + | |
68eeb855 | 589 | AC_ARG_WITH(exec-shell, AC_HELP_STRING([--with-exec-shell=SHELL], [Specify alternate shell (ONLY if /bin/sh is broken)]), |
643a7814 | 590 | [if test $withval != yes; then |
68eeb855 | 591 | AC_DEFINE_UNQUOTED(EXECSHELL, "$withval", |
f870a5ba | 592 | diff -urN mutt-1.5.15/curs_main.c mutt-1.5.15-ro/curs_main.c |
593 | --- mutt-1.5.15/curs_main.c 2007-04-03 19:41:14.000000000 +0200 | |
594 | +++ mutt-1.5.15-ro/curs_main.c 2007-05-27 14:20:26.000000000 +0200 | |
68eeb855 | 595 | @@ -1096,6 +1096,11 @@ |
643a7814 JB |
596 | { |
597 | int check; | |
598 | ||
599 | +#ifdef USE_COMPRESSED | |
600 | + if (Context->compressinfo && Context->realpath) | |
601 | + mutt_str_replace (&LastFolder, Context->realpath); | |
602 | + else | |
603 | +#endif | |
604 | mutt_str_replace (&LastFolder, Context->path); | |
605 | oldcount = Context ? Context->msgcount : 0; | |
606 | ||
f870a5ba | 607 | diff -urN mutt-1.5.15/doc/manual.xml.head mutt-1.5.15-ro/doc/manual.xml.head |
608 | --- mutt-1.5.15/doc/manual.xml.head 2007-04-04 07:37:13.000000000 +0200 | |
609 | +++ mutt-1.5.15-ro/doc/manual.xml.head 2007-05-27 14:20:26.000000000 +0200 | |
610 | @@ -4910,6 +4910,205 @@ | |
643a7814 | 611 | |
68eeb855 | 612 | </chapter> |
613 | ||
614 | +<sect1 id="compressedfolders"> | |
615 | +<title>Compressed folders Support (OPTIONAL)</title> | |
643a7814 | 616 | + |
68eeb855 | 617 | +<para> |
643a7814 | 618 | +If Mutt was compiled with compressed folders support (by running the |
68eeb855 | 619 | +<emphasis>configure</emphasis> script with the |
620 | +<emphasis>--enable-compressed</emphasis> flag), Mutt can open folders | |
621 | +stored in an arbitrary format, provided that the user has a script to | |
622 | +convert from/to this format to one of the accepted. | |
643a7814 JB |
623 | + |
624 | +The most common use is to open compressed archived folders e.g. with | |
625 | +gzip. | |
626 | + | |
627 | +In addition, the user can provide a script that gets a folder in an | |
628 | +accepted format and appends its context to the folder in the | |
629 | +user-defined format, which may be faster than converting the entire | |
630 | +folder to the accepted format, appending to it and converting back to | |
631 | +the user-defined format. | |
632 | + | |
68eeb855 | 633 | +There are three hooks defined (<link |
634 | +linkend="open-hook">open-hook</link>, <link | |
635 | +linkend="close-hook">close-hook</link> and <link | |
636 | +linkend="append-hook">append-hook</link>) which define commands to | |
637 | +uncompress and compress a folder and to append messages to an existing | |
638 | +compressed folder respectively. | |
643a7814 JB |
639 | + |
640 | +For example: | |
641 | + | |
68eeb855 | 642 | +<screen> |
643a7814 JB |
643 | +open-hook \\.gz$ "gzip -cd %f > %t" |
644 | +close-hook \\.gz$ "gzip -c %t > %f" | |
645 | +append-hook \\.gz$ "gzip -c %t >> %f" | |
68eeb855 | 646 | +</screen> |
643a7814 | 647 | + |
68eeb855 | 648 | +You do not have to specify all of the commands. If you omit <link |
649 | +linkend="append-hook">append-hook</link>, the folder will be open and | |
650 | +closed again each time you will add to it. If you omit <link | |
651 | +linkend="close-hook">close-hook</link> (or give empty command) , the | |
652 | +folder will be open in the mode. If you specify <link | |
653 | +linkend="append-hook">append-hook</link> though you'll be able to | |
654 | +append to the folder. | |
643a7814 JB |
655 | + |
656 | +Note that Mutt will only try to use hooks if the file is not in one of | |
657 | +the accepted formats. In particular, if the file is empty, mutt | |
658 | +supposes it is not compressed. This is important because it allows the | |
659 | +use of programs that do not have well defined extensions. Just use | |
68eeb855 | 660 | +"." as a regexp. But this may be surprising if your |
661 | +compressing script produces empty files. In this situation, unset | |
662 | +<link linkend="save-empty">$save_empty</link>, so that | |
663 | +the compressed file will be removed if you delete all of the messages. | |
664 | +</para> | |
665 | + | |
666 | +<sect2 id="open-hook"> | |
667 | +<title>Open a compressed mailbox for reading</title> | |
643a7814 | 668 | + |
68eeb855 | 669 | +<para> |
670 | +Usage: <literal>open-hook</literal> <emphasis>regexp</emphasis> "<emphasis>command</emphasis>" | |
643a7814 | 671 | + |
68eeb855 | 672 | +The <emphasis>command</emphasis> is the command that can be used for |
673 | +opening the folders whose names match <emphasis>regexp</emphasis>. | |
643a7814 | 674 | + |
68eeb855 | 675 | +The <emphasis>command</emphasis> string is the printf-like format |
676 | +string, and it should accept two parameters: %f, which is | |
677 | +replaced with the (compressed) folder name, and %t which is | |
678 | +replaced with the name of the temporary folder to which to write. | |
643a7814 JB |
679 | + |
680 | +%f and %t can be repeated any number of times in the | |
681 | +command string, and all of the entries are replaced with the | |
682 | +appropriate folder name. In addition, %% is replaced by | |
683 | +%, as in printf, and any other %anything is left as is. | |
684 | + | |
68eeb855 | 685 | +The <emphasis>command</emphasis> should <emphasis |
686 | +role="bold">not</emphasis> remove the original compressed file. The | |
687 | +<emphasis>command</emphasis> should return non-zero exit status if it | |
688 | +fails, so mutt knows something's wrong. | |
643a7814 JB |
689 | + |
690 | +Example: | |
691 | + | |
68eeb855 | 692 | +<screen> |
643a7814 | 693 | +open-hook \\.gz$ "gzip -cd %f > %t" |
68eeb855 | 694 | +</screen> |
643a7814 | 695 | + |
68eeb855 | 696 | +If the <emphasis>command</emphasis> is empty, this operation is |
697 | +disabled for this file type. | |
698 | +</para> | |
699 | +</sect2> | |
643a7814 | 700 | + |
68eeb855 | 701 | +<sect2 id="close-hook"> |
702 | +<title>Write a compressed mailbox</title> | |
643a7814 | 703 | + |
68eeb855 | 704 | +<para> |
705 | +Usage: <literal>close-hook</literal> <emphasis>regexp</emphasis> "<emphasis>command</emphasis>" | |
643a7814 | 706 | + |
68eeb855 | 707 | +This is used to close the folder that was open with the <link |
708 | +linkend="open-hook">open-hook</link> command after some changes were | |
709 | +made to it. | |
643a7814 | 710 | + |
68eeb855 | 711 | +The <emphasis>command</emphasis> string is the command that can be |
712 | +used for closing the folders whose names match | |
713 | +<emphasis>regexp</emphasis>. It has the same format as in the <link | |
714 | +linkend="open-hook">open-hook</link> command. Temporary folder in this | |
715 | +case is the folder previously produced by the <link | |
716 | +linkend="open-hook">open-hook</link> command. | |
643a7814 | 717 | + |
68eeb855 | 718 | +The <emphasis>command</emphasis> should <emphasis |
719 | +role="bold">not</emphasis> remove the decompressed file. The | |
720 | +<emphasis>command</emphasis> should return non-zero exit status if it | |
721 | +fails, so mutt knows something's wrong. | |
643a7814 JB |
722 | + |
723 | +Example: | |
724 | + | |
68eeb855 | 725 | +<screen> |
643a7814 | 726 | +close-hook \\.gz$ "gzip -c %t > %f" |
68eeb855 | 727 | +</screen> |
643a7814 | 728 | + |
68eeb855 | 729 | +If the <emphasis>command</emphasis> is empty, this operation is |
730 | +disabled for this file type, and the file can only be open in the | |
731 | +read-only mode. | |
643a7814 | 732 | + |
68eeb855 | 733 | +<link linkend="close-hook">close-hook</link> is not called when you |
734 | +exit from the folder if the folder was not changed. | |
735 | +</para> | |
736 | +</sect2> | |
643a7814 | 737 | + |
68eeb855 | 738 | +<sect2 id="append-hook"> |
739 | +<title>Append a message to a compressed mailbox</title> | |
643a7814 | 740 | + |
68eeb855 | 741 | +<para> |
742 | +Usage: <literal>append-hook</literal> <emphasis>regexp</emphasis> "<emphasis>command</emphasis>" | |
643a7814 | 743 | + |
68eeb855 | 744 | +This command is used for saving to an existing compressed folder. The |
745 | +<emphasis>command</emphasis> is the command that can be used for | |
746 | +appending to the folders whose names match | |
747 | +<emphasis>regexp</emphasis>. It has the same format as in the <link | |
748 | +linkend="open-hook">open-hook</link> command. The temporary folder in | |
749 | +this case contains the messages that are being appended. | |
643a7814 | 750 | + |
68eeb855 | 751 | +The <emphasis>command</emphasis> should <emphasis |
752 | +role="bold">not</emphasis> remove the decompressed file. The | |
753 | +<emphasis>command</emphasis> should return non-zero exit status if it | |
754 | +fails, so mutt knows something's wrong. | |
643a7814 JB |
755 | + |
756 | +Example: | |
757 | + | |
68eeb855 | 758 | +<screen> |
643a7814 | 759 | +append-hook \\.gz$ "gzip -c %t >> %f" |
68eeb855 | 760 | +</screen> |
761 | + | |
762 | +When <link linkend="append-hook">append-hook</link> is used, the folder | |
763 | +is not opened, which saves time, but this means that we can not find | |
764 | +out what the folder type is. Thus the default (<link | |
765 | +linkend="mbox-type">$mbox_type</link>) type is always | |
766 | +supposed (i.e. this is the format used for the temporary folder). | |
767 | + | |
768 | +If the file does not exist when you save to it, <link | |
769 | +linkend="close-hook">close-hook</link> is called, and not <link | |
770 | +linkend="append-hook">append-hook</link>. <link | |
771 | +linkend="append-hook">append-hook</link> is only for appending to | |
772 | +existing folders. | |
773 | + | |
774 | +If the <emphasis>command</emphasis> is empty, this operation is | |
775 | +disabled for this file type. In this case, the folder will be open and | |
776 | +closed again (using <link linkend="open-hook">open-hook</link> and | |
777 | +<link linkend="close-hook">close-hook</link>respectively) each time you | |
778 | +will add to it. | |
779 | +</para> | |
780 | +</sect2> | |
781 | + | |
782 | +<sect2> | |
783 | +<title>Encrypted folders</title> | |
784 | + | |
785 | +<para> | |
643a7814 JB |
786 | +The compressed folders support can also be used to handle encrypted |
787 | +folders. If you want to encrypt a folder with PGP, you may want to use | |
788 | +the following hooks: | |
789 | + | |
68eeb855 | 790 | +<screen> |
643a7814 JB |
791 | +open-hook \\.pgp$ "pgp -f < %f > %t" |
792 | +close-hook \\.pgp$ "pgp -fe YourPgpUserIdOrKeyId < %t > %f" | |
68eeb855 | 793 | +</screen> |
643a7814 JB |
794 | + |
795 | +Please note, that PGP does not support appending to an encrypted | |
796 | +folder, so there is no append-hook defined. | |
797 | + | |
798 | +If you are using GnuPG instead of PGP, you may use the following hooks | |
799 | +instead: | |
800 | + | |
68eeb855 | 801 | +<screen> |
643a7814 JB |
802 | +open-hook \\.gpg$ "gpg --decrypt < %f > %t" |
803 | +close-hook \\.gpg$ "gpg --encrypt --recipient YourGpgUserIdOrKeyId < %t > %f" | |
68eeb855 | 804 | +</screen> |
805 | + | |
806 | +<emphasis role="bold">Note:</emphasis> the folder is temporary stored | |
807 | +decrypted in the /tmp directory, where it can be read by your system | |
808 | +administrator. So think about the security aspects of this. | |
809 | +</para> | |
810 | +</sect2> | |
811 | +</sect1> | |
812 | + | |
813 | <chapter id="mimesupport"> | |
814 | <title>Mutt's MIME Support</title> | |
815 | ||
f870a5ba | 816 | diff -urN mutt-1.5.15/doc/muttrc.man.head mutt-1.5.15-ro/doc/muttrc.man.head |
817 | --- mutt-1.5.15/doc/muttrc.man.head 2007-04-01 23:58:55.000000000 +0200 | |
818 | +++ mutt-1.5.15-ro/doc/muttrc.man.head 2007-05-27 14:20:26.000000000 +0200 | |
819 | @@ -345,6 +345,24 @@ | |
68eeb855 | 820 | to a certain recipient. The meaning of "key ID" is to be taken |
821 | broadly: This can be a different e-mail address, a numerical key ID, | |
822 | or even just an arbitrary search string. | |
643a7814 JB |
823 | +.PP |
824 | +.nf | |
825 | +\fBopen-hook\fP \fIregexp\fP "\fIcommand\fP" | |
826 | +\fBclose-hook\fP \fIregexp\fP "\fIcommand\fP" | |
827 | +\fBappend-hook\fP \fIregexp\fP "\fIcommand\fP" | |
828 | +.fi | |
829 | +.IP | |
830 | +These commands provide a way to handle compressed folders. The given | |
831 | +\fBregexp\fP specifies which folders are taken as compressed (e.g. | |
832 | +"\fI\\\\.gz$\fP"). The commands tell Mutt how to uncompress a folder | |
833 | +(\fBopen-hook\fP), compress a folder (\fBclose-hook\fP) or append a | |
834 | +compressed mail to a compressed folder (\fBappend-hook\fP). The | |
835 | +\fIcommand\fP string is the | |
836 | +.BR printf (3) | |
837 | +like format string, and it should accept two parameters: \fB%f\fP, | |
838 | +which is replaced with the (compressed) folder name, and \fB%t\fP | |
839 | +which is replaced with the name of the temporary folder to which to | |
840 | +write. | |
841 | .TP | |
842 | \fBpush\fP \fIstring\fP | |
843 | This command adds the named \fIstring\fP to the keyboard buffer. | |
f870a5ba | 844 | diff -urN mutt-1.5.15/hook.c mutt-1.5.15-ro/hook.c |
845 | --- mutt-1.5.15/hook.c 2007-04-01 23:58:56.000000000 +0200 | |
846 | +++ mutt-1.5.15-ro/hook.c 2007-05-27 14:23:46.000000000 +0200 | |
68eeb855 | 847 | @@ -24,6 +24,10 @@ |
643a7814 | 848 | #include "mailbox.h" |
68eeb855 | 849 | #include "mutt_crypt.h" |
643a7814 JB |
850 | |
851 | +#ifdef USE_COMPRESSED | |
852 | +#include "compress.h" | |
853 | +#endif | |
854 | + | |
855 | #include <limits.h> | |
856 | #include <string.h> | |
857 | #include <stdlib.h> | |
68eeb855 | 858 | @@ -92,6 +96,16 @@ |
643a7814 JB |
859 | memset (&pattern, 0, sizeof (pattern)); |
860 | pattern.data = safe_strdup (path); | |
861 | } | |
862 | +#ifdef USE_COMPRESSED | |
863 | + else if (data & (M_APPENDHOOK | M_OPENHOOK | M_CLOSEHOOK)) | |
864 | + { | |
865 | + if (mutt_test_compress_command (command.data)) | |
866 | + { | |
867 | + strfcpy (err->data, _("bad formatted command string"), err->dsize); | |
868 | + return (-1); | |
869 | + } | |
870 | + } | |
871 | +#endif | |
f870a5ba | 872 | else if (DefaultHook && !(data & (M_CHARSETHOOK | M_ICONVHOOK | M_ACCOUNTHOOK)) |
68eeb855 | 873 | && (!WithCrypto || !(data & M_CRYPTHOOK)) |
874 | ) | |
f870a5ba | 875 | diff -urN mutt-1.5.15/init.h mutt-1.5.15-ro/init.h |
876 | --- mutt-1.5.15/init.h 2007-04-05 18:03:55.000000000 +0200 | |
877 | +++ mutt-1.5.15-ro/init.h 2007-05-27 14:20:26.000000000 +0200 | |
878 | @@ -3111,6 +3111,11 @@ | |
643a7814 JB |
879 | { "fcc-hook", mutt_parse_hook, M_FCCHOOK }, |
880 | { "fcc-save-hook", mutt_parse_hook, M_FCCHOOK | M_SAVEHOOK }, | |
881 | { "folder-hook", mutt_parse_hook, M_FOLDERHOOK }, | |
882 | +#ifdef USE_COMPRESSED | |
883 | + { "open-hook", mutt_parse_hook, M_OPENHOOK }, | |
884 | + { "close-hook", mutt_parse_hook, M_CLOSEHOOK }, | |
885 | + { "append-hook", mutt_parse_hook, M_APPENDHOOK }, | |
886 | +#endif | |
68eeb855 | 887 | { "group", parse_group, 0 }, |
888 | { "ungroup", parse_ungroup, 0 }, | |
643a7814 | 889 | { "hdr_order", parse_list, UL &HeaderOrderList }, |
f870a5ba | 890 | diff -urN mutt-1.5.15/main.c mutt-1.5.15-ro/main.c |
891 | --- mutt-1.5.15/main.c 2007-04-04 07:37:13.000000000 +0200 | |
892 | +++ mutt-1.5.15-ro/main.c 2007-05-27 14:20:26.000000000 +0200 | |
893 | @@ -401,6 +401,12 @@ | |
643a7814 JB |
894 | #else |
895 | "-LOCALES_HACK " | |
896 | #endif | |
897 | + | |
898 | +#ifdef USE_COMPRESSED | |
899 | + "+COMPRESSED " | |
900 | +#else | |
901 | + "-COMPRESSED " | |
902 | +#endif | |
903 | ||
904 | #ifdef HAVE_WC_FUNCS | |
905 | "+HAVE_WC_FUNCS " | |
f870a5ba | 906 | diff -urN mutt-1.5.15/Makefile.am mutt-1.5.15-ro/Makefile.am |
907 | --- mutt-1.5.15/Makefile.am 2007-04-06 22:04:45.000000000 +0200 | |
908 | +++ mutt-1.5.15-ro/Makefile.am 2007-05-27 14:20:26.000000000 +0200 | |
68eeb855 | 909 | @@ -18,7 +18,7 @@ |
910 | bin_PROGRAMS = mutt @DOTLOCK_TARGET@ @PGPAUX_TARGET@ | |
911 | mutt_SOURCES = $(BUILT_SOURCES) \ | |
912 | addrbook.c alias.c attach.c base64.c browser.c buffy.c color.c \ | |
913 | - crypt.c cryptglue.c \ | |
914 | + crypt.c cryptglue.c compress.c \ | |
915 | commands.c complete.c compose.c copy.c curs_lib.c curs_main.c date.c \ | |
916 | edit.c enter.c flags.c init.c filter.c from.c \ | |
917 | getdomain.c group.c \ | |
918 | @@ -66,7 +66,7 @@ | |
f870a5ba | 919 | utf8.c wcwidth.c |
68eeb855 | 920 | |
921 | EXTRA_DIST = COPYRIGHT GPL OPS OPS.PGP OPS.CRYPT OPS.SMIME TODO UPDATING \ | |
922 | - configure account.h \ | |
923 | + configure account.h compress.h \ | |
924 | attach.h buffy.h charset.h copy.h crypthash.h dotlock.h functions.h gen_defs \ | |
925 | globals.h hash.h history.h init.h keymap.h mutt_crypt.h \ | |
926 | mailbox.h mapping.h md5.h mime.h mutt.h mutt_curses.h mutt_menu.h \ | |
f870a5ba | 927 | diff -urN mutt-1.5.15/Makefile.in mutt-1.5.15-ro/Makefile.in |
928 | --- mutt-1.5.15/Makefile.in 2007-04-06 22:05:40.000000000 +0200 | |
929 | +++ mutt-1.5.15-ro/Makefile.in 2007-05-27 14:20:26.000000000 +0200 | |
930 | @@ -74,7 +74,7 @@ | |
931 | attach.$(OBJEXT) base64.$(OBJEXT) browser.$(OBJEXT) \ | |
932 | buffy.$(OBJEXT) color.$(OBJEXT) crypt.$(OBJEXT) \ | |
933 | cryptglue.$(OBJEXT) commands.$(OBJEXT) complete.$(OBJEXT) \ | |
934 | - compose.$(OBJEXT) copy.$(OBJEXT) curs_lib.$(OBJEXT) \ | |
935 | + compose.$(OBJEXT) compress.$(OBJEXT) copy.$(OBJEXT) curs_lib.$(OBJEXT) \ | |
936 | curs_main.$(OBJEXT) date.$(OBJEXT) edit.$(OBJEXT) \ | |
937 | enter.$(OBJEXT) flags.$(OBJEXT) init.$(OBJEXT) \ | |
938 | filter.$(OBJEXT) from.$(OBJEXT) getdomain.$(OBJEXT) \ | |
939 | @@ -301,7 +301,7 @@ | |
940 | BUILT_SOURCES = keymap_defs.h patchlist.c reldate.h hcversion.h | |
941 | mutt_SOURCES = $(BUILT_SOURCES) \ | |
942 | addrbook.c alias.c attach.c base64.c browser.c buffy.c color.c \ | |
943 | - crypt.c cryptglue.c \ | |
944 | + crypt.c cryptglue.c compress.c \ | |
945 | commands.c complete.c compose.c copy.c curs_lib.c curs_main.c date.c \ | |
946 | edit.c enter.c flags.c init.c filter.c from.c \ | |
947 | getdomain.c group.c \ | |
948 | @@ -334,7 +334,7 @@ | |
949 | utf8.c wcwidth.c | |
950 | ||
951 | EXTRA_DIST = COPYRIGHT GPL OPS OPS.PGP OPS.CRYPT OPS.SMIME TODO UPDATING \ | |
952 | - configure account.h \ | |
953 | + configure account.h compress.h \ | |
954 | attach.h buffy.h charset.h copy.h crypthash.h dotlock.h functions.h gen_defs \ | |
955 | globals.h hash.h history.h init.h keymap.h mutt_crypt.h \ | |
956 | mailbox.h mapping.h md5.h mime.h mutt.h mutt_curses.h mutt_menu.h \ | |
957 | @@ -504,6 +504,7 @@ | |
958 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commands.Po@am__quote@ | |
959 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complete.Po@am__quote@ | |
960 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compose.Po@am__quote@ | |
961 | +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compress.Po@am__quote@ | |
962 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Po@am__quote@ | |
963 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypt-gpgme.Po@am__quote@ | |
964 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypt-mod-pgp-classic.Po@am__quote@ | |
965 | diff -urN mutt-1.5.15/mbox.c mutt-1.5.15-ro/mbox.c | |
966 | --- mutt-1.5.15/mbox.c 2007-04-01 23:58:56.000000000 +0200 | |
967 | +++ mutt-1.5.15-ro/mbox.c 2007-05-27 14:20:26.000000000 +0200 | |
968 | @@ -29,6 +29,10 @@ | |
643a7814 | 969 | #include "copy.h" |
f870a5ba | 970 | #include "mutt_curses.h" |
643a7814 JB |
971 | |
972 | +#ifdef USE_COMPRESSED | |
973 | +#include "compress.h" | |
974 | +#endif | |
975 | + | |
976 | #include <sys/stat.h> | |
977 | #include <dirent.h> | |
978 | #include <string.h> | |
f870a5ba | 979 | @@ -1026,6 +1030,12 @@ |
643a7814 JB |
980 | int mbox_close_mailbox (CONTEXT *ctx) |
981 | { | |
982 | mx_unlock_file (ctx->path, fileno (ctx->fp), 1); | |
983 | + | |
984 | +#ifdef USE_COMPRESSED | |
985 | + if (ctx->compressinfo) | |
986 | + mutt_slow_close_compressed (ctx); | |
987 | +#endif | |
988 | + | |
989 | mutt_unblock_signals (); | |
990 | mx_fastclose_mailbox (ctx); | |
991 | return 0; | |
f870a5ba | 992 | diff -urN mutt-1.5.15/mutt.h mutt-1.5.15-ro/mutt.h |
993 | --- mutt-1.5.15/mutt.h 2007-04-02 20:04:35.000000000 +0200 | |
994 | +++ mutt-1.5.15-ro/mutt.h 2007-05-27 14:20:26.000000000 +0200 | |
995 | @@ -160,6 +160,11 @@ | |
643a7814 | 996 | #define M_ACCOUNTHOOK (1<<9) |
68eeb855 | 997 | #define M_REPLYHOOK (1<<10) |
998 | #define M_SEND2HOOK (1<<11) | |
643a7814 | 999 | +#ifdef USE_COMPRESSED |
68eeb855 | 1000 | +#define M_OPENHOOK (1<<12) |
1001 | +#define M_APPENDHOOK (1<<13) | |
1002 | +#define M_CLOSEHOOK (1<<14) | |
643a7814 JB |
1003 | +#endif |
1004 | ||
1005 | /* tree characters for linearize_tree and print_enriched_string */ | |
1006 | #define M_TREE_LLCORNER 1 | |
f870a5ba | 1007 | @@ -882,6 +887,11 @@ |
1008 | int flagged; /* how many flagged messages */ | |
1009 | int msgnotreadyet; /* which msg "new" in pager, -1 if none */ | |
643a7814 JB |
1010 | |
1011 | +#ifdef USE_COMPRESSED | |
1012 | + void *compressinfo; /* compressed mbox module private data */ | |
1013 | + char *realpath; /* path to compressed mailbox */ | |
1014 | +#endif /* USE_COMPRESSED */ | |
1015 | + | |
1016 | short magic; /* mailbox type */ | |
1017 | ||
f870a5ba | 1018 | unsigned char rights[(RIGHTSMAX + 7)/8]; /* ACL bits */ |
1019 | diff -urN mutt-1.5.15/Muttrc mutt-1.5.15-ro/Muttrc | |
1020 | --- mutt-1.5.15/Muttrc 2007-04-06 22:34:36.000000000 +0200 | |
1021 | +++ mutt-1.5.15-ro/Muttrc 2007-05-27 14:20:26.000000000 +0200 | |
1022 | @@ -21,6 +21,11 @@ | |
68eeb855 | 1023 | macro index,pager y "<change-folder>?<toggle-mailboxes>" "show incoming mailboxes list" |
1024 | bind browser y exit | |
1025 | ||
1026 | +# Use folders which match on \\.gz$ as gzipped folders: | |
1027 | +# open-hook \\.gz$ "gzip -cd %f > %t" | |
1028 | +# close-hook \\.gz$ "gzip -c %t > %f" | |
1029 | +# append-hook \\.gz$ "gzip -c %t >> %f" | |
1030 | + | |
1031 | # If Mutt is unable to determine your site's domain name correctly, you can | |
1032 | # set the default here. | |
1033 | # | |
f870a5ba | 1034 | diff -urN mutt-1.5.15/Muttrc.head mutt-1.5.15-ro/Muttrc.head |
1035 | --- mutt-1.5.15/Muttrc.head 2007-04-01 23:58:55.000000000 +0200 | |
1036 | +++ mutt-1.5.15-ro/Muttrc.head 2007-05-27 14:20:26.000000000 +0200 | |
1037 | @@ -21,6 +21,11 @@ | |
68eeb855 | 1038 | macro index,pager y "<change-folder>?<toggle-mailboxes>" "show incoming mailboxes list" |
1039 | bind browser y exit | |
1040 | ||
1041 | +# Use folders which match on \\.gz$ as gzipped folders: | |
1042 | +# open-hook \\.gz$ "gzip -cd %f > %t" | |
1043 | +# close-hook \\.gz$ "gzip -c %t > %f" | |
1044 | +# append-hook \\.gz$ "gzip -c %t >> %f" | |
1045 | + | |
1046 | # If Mutt is unable to determine your site's domain name correctly, you can | |
1047 | # set the default here. | |
1048 | # | |
f870a5ba | 1049 | diff -urN mutt-1.5.15/mx.c mutt-1.5.15-ro/mx.c |
1050 | --- mutt-1.5.15/mx.c 2007-04-03 19:41:14.000000000 +0200 | |
1051 | +++ mutt-1.5.15-ro/mx.c 2007-05-27 14:24:41.000000000 +0200 | |
68eeb855 | 1052 | @@ -30,6 +30,10 @@ |
643a7814 JB |
1053 | #include "keymap.h" |
1054 | #include "url.h" | |
c9dd7ba8 | 1055 | |
643a7814 JB |
1056 | +#ifdef USE_COMPRESSED |
1057 | +#include "compress.h" | |
1058 | +#endif | |
1059 | + | |
68eeb855 | 1060 | #ifdef USE_IMAP |
1061 | #include "imap.h" | |
643a7814 | 1062 | #endif |
f870a5ba | 1063 | @@ -450,6 +454,10 @@ |
643a7814 JB |
1064 | return (-1); |
1065 | } | |
c9dd7ba8 | 1066 | |
643a7814 JB |
1067 | +#ifdef USE_COMPRESSED |
1068 | + if (magic == 0 && mutt_can_read_compressed (path)) | |
1069 | + return M_COMPRESSED; | |
1070 | +#endif | |
1071 | return (magic); | |
1072 | } | |
c9dd7ba8 | 1073 | |
f870a5ba | 1074 | @@ -489,6 +497,13 @@ |
643a7814 JB |
1075 | { |
1076 | struct stat sb; | |
c9dd7ba8 | 1077 | |
643a7814 JB |
1078 | +#ifdef USE_COMPRESSED |
1079 | + /* special case for appending to compressed folders - | |
1080 | + * even if we can not open them for reading */ | |
1081 | + if (mutt_can_append_compressed (ctx->path)) | |
1082 | + mutt_open_append_compressed (ctx); | |
1083 | +#endif | |
1084 | + | |
1085 | ctx->append = 1; | |
1086 | ||
1087 | #ifdef USE_IMAP | |
f870a5ba | 1088 | @@ -652,7 +667,12 @@ |
643a7814 JB |
1089 | } |
1090 | ||
1091 | ctx->magic = mx_get_magic (path); | |
1092 | - | |
1093 | + | |
1094 | +#ifdef USE_COMPRESSED | |
1095 | + if (ctx->magic == M_COMPRESSED) | |
1096 | + mutt_open_read_compressed (ctx); | |
1097 | +#endif | |
1098 | + | |
1099 | if(ctx->magic == 0) | |
1100 | mutt_error (_("%s is not a mailbox."), path); | |
1101 | ||
f870a5ba | 1102 | @@ -753,6 +773,10 @@ |
643a7814 | 1103 | mutt_free_header (&ctx->hdrs[i]); |
68eeb855 | 1104 | FREE (&ctx->hdrs); |
1105 | FREE (&ctx->v2r); | |
643a7814 JB |
1106 | +#ifdef USE_COMPRESSED |
1107 | + if (ctx->compressinfo) | |
1108 | + mutt_fast_close_compressed (ctx); | |
1109 | +#endif | |
68eeb855 | 1110 | FREE (&ctx->path); |
1111 | FREE (&ctx->pattern); | |
643a7814 | 1112 | if (ctx->limit_pattern) |
f870a5ba | 1113 | @@ -805,6 +829,12 @@ |
1114 | ||
643a7814 JB |
1115 | if (tmp && tmp->new == 0) |
1116 | mutt_update_mailbox (tmp); | |
643a7814 JB |
1117 | + |
1118 | +#ifdef USE_COMPRESSED | |
1119 | + if (rc == 0 && ctx->compressinfo) | |
1120 | + return mutt_sync_compressed (ctx); | |
1121 | +#endif | |
1122 | + | |
1123 | return rc; | |
1124 | } | |
1125 | ||
f870a5ba | 1126 | @@ -1006,6 +1036,11 @@ |
643a7814 JB |
1127 | !mutt_is_spool(ctx->path) && !option (OPTSAVEEMPTY)) |
1128 | mx_unlink_empty (ctx->path); | |
1129 | ||
1130 | +#ifdef USE_COMPRESSED | |
1131 | + if (ctx->compressinfo && mutt_slow_close_compressed (ctx)) | |
1132 | + return (-1); | |
1133 | +#endif | |
1134 | + | |
1135 | mx_fastclose_mailbox (ctx); | |
1136 | ||
1137 | return 0; | |
f870a5ba | 1138 | @@ -1315,6 +1350,11 @@ |
643a7814 JB |
1139 | { |
1140 | int rc; | |
1141 | ||
1142 | +#ifdef USE_COMPRESSED | |
1143 | + if (ctx->compressinfo) | |
1144 | + return mutt_check_mailbox_compressed (ctx); | |
1145 | +#endif | |
1146 | + | |
1147 | if (ctx) | |
1148 | { | |
1149 | if (ctx->locked) lock = 0; | |
f870a5ba | 1150 | diff -urN mutt-1.5.15/mx.h mutt-1.5.15-ro/mx.h |
1151 | --- mutt-1.5.15/mx.h 2007-04-01 23:58:56.000000000 +0200 | |
1152 | +++ mutt-1.5.15-ro/mx.h 2007-05-27 14:20:29.000000000 +0200 | |
68eeb855 | 1153 | @@ -40,6 +40,9 @@ |
643a7814 JB |
1154 | #ifdef USE_POP |
1155 | , M_POP | |
1156 | #endif | |
1157 | +#ifdef USE_COMPRESSED | |
1158 | + , M_COMPRESSED | |
1159 | +#endif | |
1160 | }; | |
1161 | ||
1162 | WHERE short DefaultMagic INITVAL (M_MBOX); | |
f870a5ba | 1163 | diff -urN mutt-1.5.15/PATCHES mutt-1.5.15-ro/PATCHES |
1164 | --- mutt-1.5.15/PATCHES 2007-03-15 16:49:37.000000000 +0100 | |
1165 | +++ mutt-1.5.15-ro/PATCHES 2007-05-27 14:38:02.000000000 +0200 | |
68eeb855 | 1166 | @@ -0,0 +1 @@ |
f870a5ba | 1167 | +patch-1.5.15.rr.compressed.2 |
1168 | diff -urN mutt-1.5.15/po/de.po mutt-1.5.15-ro/po/de.po | |
1169 | --- mutt-1.5.15/po/de.po 2007-04-06 22:35:40.000000000 +0200 | |
1170 | +++ mutt-1.5.15-ro/po/de.po 2007-05-27 14:22:49.000000000 +0200 | |
1171 | @@ -1280,6 +1280,48 @@ | |
68eeb855 | 1172 | msgid "Failed to figure out sender" |
1173 | msgstr "Kann Absender nicht ermitteln" | |
643a7814 JB |
1174 | |
1175 | +#: compress.c:203 mbox.c:661 | |
1176 | +msgid "Mailbox was corrupted!" | |
1177 |