* please see the file GPL in the top level source directory.
*/
-#include <lib-lib/mem.h>
-#include <lib-lib/str.h>
-#include <lib-lib/macros.h>
+#include <lib-lib/lib-lib.h>
-#include "mutt.h"
+#include <lib-sys/mutt_signal.h>
+#include <lib-sys/unix.h>
+
+#include <lib-ui/curses.h>
-#ifdef USE_COMPRESSED
+#include "mutt.h"
#include "mx.h"
#include "mbox.h"
-#include "mutt_curses.h"
-
-#include "lib/debug.h"
-
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/stat.h>
+#include "compress.h"
-typedef struct {
+struct compress_info {
const char *close; /* close-hook command */
const char *open; /* open-hook command */
const char *append; /* append-hook command */
off_t size; /* size of real folder */
-} COMPRESS_INFO;
+};
char echo_cmd[HUGE_STRING];
* excl - exclusive lock?
* retry - should retry if unable to lock?
*/
-int mbox_lock_compressed (CONTEXT * ctx, FILE * fp, int excl, int retry)
+static int mbox_lock_compressed (CONTEXT * ctx, FILE * fp, int excl, int retry)
{
int r;
return (r);
}
-void mbox_unlock_compressed (CONTEXT * ctx, FILE * fp)
+static void mbox_unlock_compressed (CONTEXT * ctx, FILE * fp)
{
if (ctx->locked) {
fflush (fp);
*/
static const char *get_append_command (const char *path, const CONTEXT * ctx)
{
- COMPRESS_INFO *ci = (COMPRESS_INFO *) ctx->compressinfo;
-
- return (is_new (path)) ? ci->close : ci->append;
+ return is_new(path) ? ctx->cinfo->close : ctx->cinfo->append;
}
int mutt_can_append_compressed (const char *path)
}
/* open a compressed mailbox */
-static COMPRESS_INFO *set_compress_info (CONTEXT * ctx)
+static compress_info *set_compress_info (CONTEXT * ctx)
{
- COMPRESS_INFO *ci;
+ compress_info *ci = p_new(compress_info, 1);
/* Now lets uncompress this thing */
- ci = p_new(COMPRESS_INFO, 1);
- ctx->compressinfo = (void *) ci;
ci->append = find_compress_hook (M_APPENDHOOK, ctx->path);
ci->open = find_compress_hook (M_OPENHOOK, ctx->path);
ci->close = find_compress_hook (M_CLOSEHOOK, ctx->path);
- return ci;
+
+ return (ctx->cinfo = ci);
}
static void set_path (CONTEXT * ctx)
return (sb.st_size);
}
-static void store_size (CONTEXT * ctx)
-{
- COMPRESS_INFO *ci = (COMPRESS_INFO *) ctx->compressinfo;
-
- ci->size = get_size (ctx->realpath);
-}
-
-static const char *compresshook_format_str (char *dest, size_t destlen,
+static const char *compresshook_format_str (char *dest, ssize_t destlen,
char op, const char *src,
const char *fmt,
- const char *ifstring,
- const char *elsestring,
+ const char *ifstring __attribute__ ((unused)),
+ const char *elsestring __attribute__ ((unused)),
unsigned long data,
- format_flag flags)
+ format_flag flags __attribute__ ((unused)))
{
char tmp[SHORT_STRING];
int mutt_check_mailbox_compressed (CONTEXT * ctx)
{
- COMPRESS_INFO *ci = (COMPRESS_INFO *) ctx->compressinfo;
-
- if (ci->size != get_size (ctx->realpath)) {
- p_delete(&ctx->compressinfo);
+ if (ctx->cinfo->size != get_size (ctx->realpath)) {
+ p_delete(&ctx->cinfo);
p_delete(&ctx->realpath);
mutt_error _("Mailbox was corrupted!");
FILE *fp;
int rc;
- COMPRESS_INFO *ci = set_compress_info (ctx);
+ compress_info *ci = set_compress_info (ctx);
if (!ci->open) {
ctx->magic = 0;
- p_delete(&ctx->compressinfo);
+ p_delete(&ctx->cinfo);
return (-1);
}
if (!ci->close || access (ctx->path, W_OK) != 0)
ctx->readonly = 1;
set_path (ctx);
- store_size (ctx);
+ ctx->cinfo->size = get_size(ctx->realpath);
if (!ctx->quiet)
mutt_message (_("Decompressing %s..."), ctx->realpath);
cmd = get_compression_cmd (ci->open, ctx);
if (cmd == NULL)
return (-1);
- debug_print (2, ("DecompressCmd: '%s'\n", cmd));
if ((fp = fopen (ctx->realpath, "r")) == NULL) {
mutt_perror (ctx->realpath);
if (rc) {
mutt_any_key_to_continue (NULL);
ctx->magic = 0;
- p_delete(&ctx->compressinfo);
- mutt_error (_("Error executing: %s : unable to open the mailbox!\n"),
- cmd);
+ p_delete(&ctx->cinfo);
+ mutt_error(_("Error executing: %s : unable to open the mailbox!\n"), cmd);
}
p_delete(&cmd);
if (rc)
return (0);
}
-void restore_path (CONTEXT * ctx)
+static void restore_path (CONTEXT * ctx)
{
p_delete(&ctx->path);
ctx->path = ctx->realpath;
}
/* remove the temporary mailbox */
-void remove_file (CONTEXT * ctx)
+static void remove_file (CONTEXT * ctx)
{
if (ctx->magic == M_MBOX || ctx->magic == M_MMDF)
remove (ctx->path);
int mutt_open_append_compressed (CONTEXT * ctx)
{
FILE *fh;
- COMPRESS_INFO *ci = set_compress_info (ctx);
+ compress_info *ci = set_compress_info (ctx);
if (!get_append_command (ctx->path, ctx)) {
if (ci->open && ci->close)
return (mutt_open_read_compressed (ctx));
ctx->magic = 0;
- p_delete(&ctx->compressinfo);
+ p_delete(&ctx->cinfo);
return (-1);
}
/* close a compressed mailbox */
void mutt_fast_close_compressed (CONTEXT * ctx)
{
- debug_print (2, ("called on '%s'\n", ctx->path));
-
- if (ctx->compressinfo) {
+ if (ctx->cinfo) {
if (ctx->fp)
fclose (ctx->fp);
ctx->fp = NULL;
remove_file (ctx);
restore_path (ctx);
- p_delete(&ctx->compressinfo);
+ p_delete(&ctx->cinfo);
}
}
char *cmd;
int rc = 0;
FILE *fp;
- COMPRESS_INFO *ci = (COMPRESS_INFO *) ctx->compressinfo;
if (!ctx->quiet)
mutt_message (_("Compressing %s..."), ctx->realpath);
- cmd = get_compression_cmd (ci->close, ctx);
+ cmd = get_compression_cmd (ctx->cinfo->close, ctx);
if (cmd == NULL)
return (-1);
mutt_unblock_signals ();
mutt_error _("Unable to lock mailbox!");
- store_size (ctx);
+ ctx->cinfo->size = get_size(ctx->realpath);
p_delete(&cmd);
return (-1);
}
- debug_print (2, ("CompressCommand: '%s'\n", cmd));
-
endwin ();
fflush (stdout);
sprintf (echo_cmd, _("echo Compressing %s..."), ctx->realpath);
p_delete(&cmd);
- store_size (ctx);
+ ctx->cinfo->size = get_size(ctx->realpath);
return (rc);
}
FILE *fp;
const char *append;
char *cmd;
- COMPRESS_INFO *ci = (COMPRESS_INFO *) ctx->compressinfo;
-
- debug_print (2, ("called on '%s'\n", ctx->path));
+ compress_info *ci = ctx->cinfo;
if (!(ctx->append && ((append = get_append_command (ctx->realpath, ctx))
- || (append = ci->close)))) { /* if we can not or should not append,
- * we only have to remove the compressed info, because sync was already
- * called
- */
+ || (append = ci->close)))) {
+ /* if we can not or should not append, we only have to remove the
+ compressed info, because sync was already called */
mutt_fast_close_compressed (ctx);
return (0);
}
return (-1);
}
- debug_print (2, ("CompressCmd: '%s'\n", cmd));
-
endwin ();
fflush (stdout);
if (mutt_system (cmd)) {
mutt_any_key_to_continue (NULL);
- mutt_error (_
- (" %s: Error compressing mailbox! Uncompressed one kept!\n"),
+ mutt_error (_(" %s: Error compressing mailbox! Uncompressed one kept!\n"),
ctx->path);
p_delete(&cmd);
mbox_unlock_compressed (ctx, fp);
remove_file (ctx);
restore_path (ctx);
p_delete(&cmd);
- p_delete(&ctx->compressinfo);
+ p_delete(&ctx->cinfo);
return (0);
}
-mx_t* compress_reg_mx (void) {
- mx_t* fmt = p_new(mx_t, 1);
- fmt->type = M_COMPRESSED;
- fmt->local = 1;
- fmt->mx_is_magic = mbox_is_magic;
- fmt->mx_check_empty = mbox_check_empty;
- fmt->mx_access = access;
- fmt->mx_open_mailbox = mutt_open_read_compressed;
- return (fmt);
-}
-
-#endif /* USE_COMPRESSED */
+mx_t const compress_mx = {
+ M_COMPRESSED,
+ 1,
+ mbox_is_magic,
+ mbox_check_empty,
+ access,
+ mutt_open_read_compressed,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+};