* Mixmaster support for Mutt
*/
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include <lib-lib/lib-lib.h>
+
+#include <lib-sys/unix.h>
+#include <lib-ui/curses.h>
+#include <lib-ui/menu.h>
#include "mutt.h"
-#include "mutt_curses.h"
-#include "mutt_menu.h"
-#include "mutt_regex.h"
-#include "mapping.h"
+#include "recvattach.h"
#include "remailer.h"
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include <sys/types.h>
-#include <sys/file.h>
-#include <fcntl.h>
+#define SW (option(OPTMBOXPANE)?SidebarWidth:0)
#ifdef MIXMASTER
short r, c;
};
-static REMAILER **mix_type2_list (size_t * l);
+static REMAILER **mix_type2_list (ssize_t * l);
static REMAILER *mix_new_remailer (void);
static const char *mix_format_caps (REMAILER * r);
static int mix_chain_add (MIXCHAIN * chain, const char *s,
REMAILER ** type2_list);
static int mix_get_caps (const char *capstr);
-static void mix_add_entry (REMAILER ***, REMAILER *, size_t *, size_t *);
-static void mix_entry (char *b, size_t blen, MUTTMENU * menu, int num);
+static void mix_add_entry (REMAILER ***, REMAILER *, ssize_t *, ssize_t *);
+static void mix_entry (char *b, ssize_t blen, MUTTMENU * menu, int num);
static void mix_free_remailer (REMAILER ** r);
static void mix_free_type2_list (REMAILER *** ttlp);
static void mix_redraw_ce (REMAILER ** type2_list, struct coord *coords,
}
static void mix_add_entry (REMAILER *** type2_list, REMAILER * entry,
- size_t * slots, size_t * used)
+ ssize_t * slots, ssize_t * used)
{
if (*used == *slots) {
*slots += 5;
- safe_realloc (type2_list, sizeof (REMAILER *) * (*slots));
+ p_realloc(type2_list, *slots);
}
(*type2_list)[(*used)++] = entry;
static REMAILER *mix_new_remailer (void)
{
- return safe_calloc (1, sizeof (REMAILER));
+ return p_new(REMAILER, 1);
}
static void mix_free_remailer (REMAILER ** r)
{
- FREE (&(*r)->shortname);
- FREE (&(*r)->addr);
- FREE (&(*r)->ver);
+ p_delete(&(*r)->shortname);
+ p_delete(&(*r)->addr);
+ p_delete(&(*r)->ver);
- FREE (r);
+ p_delete(r);
}
/* parse the type2.list as given by mixmaster -T */
-static REMAILER **mix_type2_list (size_t * l)
+static REMAILER **mix_type2_list (ssize_t * l)
{
FILE *fp;
pid_t mm_pid;
char *t;
REMAILER **type2_list = NULL, *p;
- size_t slots = 0, used = 0;
+ ssize_t slots = 0, used = 0;
if (!l)
return NULL;
/* first, generate the "random" remailer */
p = mix_new_remailer ();
- p->shortname = safe_strdup ("<random>");
+ p->shortname = m_strdup("<random>");
mix_add_entry (&type2_list, p, &slots, &used);
while (fgets (line, sizeof (line), fp)) {
if (!(t = strtok (line, " \t\n")))
goto problem;
- p->shortname = safe_strdup (t);
+ p->shortname = m_strdup(t);
if (!(t = strtok (NULL, " \t\n")))
goto problem;
- p->addr = safe_strdup (t);
+ p->addr = m_strdup(t);
if (!(t = strtok (NULL, " \t\n")))
goto problem;
if (!(t = strtok (NULL, " \t\n")))
goto problem;
- p->ver = safe_strdup (t);
+ p->ver = m_strdup(t);
if (!(t = strtok (NULL, " \t\n")))
goto problem;
for (i = 0; type2_list[i]; i++)
mix_free_remailer (&type2_list[i]);
- FREE (type2_list);
+ p_delete(type2_list);
}
if (!chain->cl)
return;
- safe_realloc (coordsp, sizeof (struct coord) * chain->cl);
+ p_realloc(coordsp, chain->cl);
coords = *coordsp;
if (i) {
c =
- coords[i - 1].c + mutt_strlen (type2_list[chain->ch[i - 1]]->shortname) + 2;
+ coords[i - 1].c + m_strlen(type2_list[chain->ch[i - 1]]->shortname) + 2;
r = coords[i - 1].r;
}
else {
for (; i < chain->cl; i++) {
oc = c;
- c += mutt_strlen (type2_list[chain->ch[i]]->shortname) + 2;
+ c += m_strlen(type2_list[chain->ch[i]]->shortname) + 2;
if (c >= COLS) {
oc = c = MIX_HOFFSET;
*/
static const char *mix_entry_fmt (char *dest,
- size_t destlen,
+ ssize_t destlen,
char op,
const char *src,
const char *prefix,
-static void mix_entry (char *b, size_t blen, MUTTMENU * menu, int num)
+static void mix_entry (char *b, ssize_t blen, MUTTMENU * menu, int num)
{
REMAILER **type2_list = (REMAILER **) menu->data;
+ int w = (COLS-SW) > blen ? blen : (COLS-SW);
- mutt_FormatString (b, blen, NONULL (MixEntryFormat), mix_entry_fmt,
+ mutt_FormatString (b, w, NONULL (MixEntryFormat), mix_entry_fmt,
(unsigned long) type2_list[num], M_FORMAT_ARROWCURSOR);
}
if (chain->cl >= MAXMIXES)
return -1;
- if (!mutt_strcmp (s, "0") || !ascii_strcasecmp (s, "<random>")) {
+ if (!m_strcmp(s, "0") || !ascii_strcasecmp (s, "<random>")) {
chain->ch[chain->cl++] = 0;
return 0;
}
{N_("Delete"), OP_MIX_DELETE},
{N_("Abort"), OP_EXIT},
{N_("OK"), OP_MIX_USE},
- {NULL}
+ {NULL, OP_NULL}
};
-void mix_make_chain (LIST ** chainp, int *redraw)
+void mix_make_chain (string_list_t ** chainp, int *redraw)
{
- LIST *p;
+ string_list_t *p;
MIXCHAIN *chain;
int c_cur = 0, c_old = 0;
int m_len;
short c_redraw = 1;
REMAILER **type2_list = NULL;
- size_t ttll = 0;
+ ssize_t ttll = 0;
struct coord *coords = NULL;
int op;
int i, j;
- char *t;
+ const char *t;
if (!(type2_list = mix_type2_list (&ttll))) {
mutt_error _("Can't get mixmaster's type2.list!");
*redraw = REDRAW_FULL;
- chain = safe_calloc (sizeof (MIXCHAIN), 1);
+ chain = p_new(MIXCHAIN, 1);
for (p = *chainp; p; p = p->next)
mix_chain_add (chain, (char *) p->data, type2_list);
- mutt_free_list (chainp);
+ string_list_wipe(chainp);
/* safety check */
for (i = 0; i < chain->cl; i++) {
}
mix_free_type2_list (&type2_list);
- FREE (&coords);
- FREE (&chain);
+ p_delete(&coords);
+ p_delete(&chain);
}
/* some safety checks before piping the message to mixmaster */
{
const char *fqdn;
short need_hostname = 0;
- ADDRESS *p;
+ address_t *p;
if (msg->env->cc || msg->env->bcc) {
mutt_error _("Mixmaster doesn't accept Cc or Bcc headers.");
return 0;
}
-int mix_send_message (LIST * chain, const char *tempfile)
+int mix_send_message (string_list_t * chain, const char *tempfile)
{
char cmd[HUGE_STRING];
char tmp[HUGE_STRING];
snprintf (cmd, sizeof (cmd), "cat %s | %s -m ", tempfile, Mixmaster);
for (i = 0; chain; chain = chain->next, i = 1) {
- strfcpy (tmp, cmd, sizeof (tmp));
+ m_strcpy(tmp, sizeof(tmp), cmd);
mutt_quote_filename (cd_quoted, sizeof (cd_quoted), (char *) chain->data);
snprintf (cmd, sizeof (cmd), "%s%s%s", tmp, i ? "," : " -l ", cd_quoted);
}