summaryrefslogtreecommitdiff
path: root/alpine
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2019-09-01 21:39:52 +0200
committerErich Eckner <git@eckner.net>2024-05-17 21:06:43 +0200
commit007f24aafcef892459aefd5a3f2676142260df20 (patch)
tree2dc5212fa6faa00ccd78931e4074ae22fe12e1a6 /alpine
parent267cba39c8004bd5995ddcdddf365788b9e9f990 (diff)
downloadalpine-007f24aafcef892459aefd5a3f2676142260df20.tar.xz
rules.patch applied
Diffstat (limited to 'alpine')
-rw-r--r--alpine/adrbkcmd.c3
-rw-r--r--alpine/alpine.c4
-rw-r--r--alpine/confscroll.c28
-rw-r--r--alpine/dispfilt.c60
-rw-r--r--alpine/dispfilt.h2
-rw-r--r--alpine/folder.c3
-rw-r--r--alpine/mailcmd.c18
-rw-r--r--alpine/mailindx.c6
-rw-r--r--alpine/mailview.c4
-rw-r--r--alpine/osdep/termin.gen.c41
-rw-r--r--alpine/reply.c102
-rw-r--r--alpine/roleconf.c5
-rw-r--r--alpine/send.c40
13 files changed, 296 insertions, 20 deletions
diff --git a/alpine/adrbkcmd.c b/alpine/adrbkcmd.c
index f36b6956..5bd6f338 100644
--- a/alpine/adrbkcmd.c
+++ b/alpine/adrbkcmd.c
@@ -4126,6 +4126,8 @@ ab_compose_internal(BuildTo bldto, int allow_role)
* won't do anything, but will cause compose_mail to think there's
* already a role so that it won't try to confirm the default.
*/
+ if (ps_global->role)
+ fs_give((void **)&ps_global->role);
if(role)
role = copy_action(role);
else{
@@ -4133,6 +4135,7 @@ ab_compose_internal(BuildTo bldto, int allow_role)
memset((void *)role, 0, sizeof(*role));
role->nick = cpystr("Default Role");
}
+ ps_global->role = cpystr(role->nick);
}
compose_mail(addr, fcc, role, NULL, NULL);
diff --git a/alpine/alpine.c b/alpine/alpine.c
index 1b96d7b3..35381c5d 100644
--- a/alpine/alpine.c
+++ b/alpine/alpine.c
@@ -502,6 +502,7 @@ main(int argc, char **argv)
/* Set up optional for user-defined display filtering */
pine_state->tools.display_filter = dfilter;
pine_state->tools.display_filter_trigger = dfilter_trigger;
+ pine_state->tools.exec_rule = exec_function_rule;
#ifdef _WINDOWS
if(ps_global->install_flag){
@@ -3285,6 +3286,9 @@ goodnight_gracey(struct pine *pine_state, int exit_val)
extern KBESC_T *kbesc;
dprint((2, "goodnight_gracey:\n"));
+ strncpy(pine_state->cur_folder, pine_state->inbox_name,
+ sizeof(pine_state->cur_folder));
+ pine_state->cur_folder[sizeof(pine_state->cur_folder) - 1] = '\0';
/* We want to do this here before we close up the streams */
trim_remote_adrbks();
diff --git a/alpine/confscroll.c b/alpine/confscroll.c
index 1b5fb761..5307a8ea 100644
--- a/alpine/confscroll.c
+++ b/alpine/confscroll.c
@@ -48,6 +48,7 @@
#include "../pith/tempfile.h"
#include "../pith/pattern.h"
#include "../pith/charconv/utf8.h"
+#include "../pith/rules.h"
#define CONFIG_SCREEN_HELP_TITLE _("HELP FOR SETUP CONFIGURATION")
@@ -2460,6 +2461,9 @@ delete:
* Now go and set the current_val based on user_val changes
* above. Turn off command line settings...
*/
+ set_current_val((*cl)->var,
+ (strcmp((*cl)->var->name,"key-definition-rules") ? TRUE : FALSE),
+ FALSE);
set_current_val((*cl)->var, TRUE, FALSE);
fix_side_effects(ps, (*cl)->var, 0);
@@ -5224,6 +5228,30 @@ fix_side_effects(struct pine *ps, struct variable *var, int revert)
var == &ps->vars[V_ABOOK_FORMATS]){
addrbook_reset();
}
+ else if(var == &ps->vars[V_INDEX_RULES]){
+ if(ps_global->rule_list)
+ free_parsed_rule_list(&ps_global->rule_list);
+ create_rule_list(ps->vars);
+ reset_index_format();
+ clear_index_cache(ps->mail_stream, 0);
+ }
+ else if(var == &ps->vars[V_COMPOSE_RULES] ||
+ var == &ps->vars[V_FORWARD_RULES] ||
+ var == &ps->vars[V_KEY_RULES] ||
+ var == &ps->vars[V_REPLACE_RULES] ||
+ var == &ps->vars[V_REPLY_INDENT_RULES] ||
+ var == &ps->vars[V_REPLY_LEADIN_RULES] ||
+ var == &ps->vars[V_RESUB_RULES] ||
+ var == &ps->vars[V_SAVE_RULES] ||
+ var == &ps->vars[V_SMTP_RULES] ||
+ var == &ps->vars[V_SORT_RULES] ||
+ var == &ps->vars[V_STARTUP_RULES] ||
+ var == &ps->vars[V_THREAD_DISP_STYLE_RULES] ||
+ var == &ps->vars[V_THREAD_INDEX_STYLE_RULES]){
+ if(ps_global->rule_list)
+ free_parsed_rule_list(&ps_global->rule_list);
+ create_rule_list(ps->vars);
+ }
else if(var == &ps->vars[V_INDEX_FORMAT]){
reset_index_format();
clear_index_cache(ps->mail_stream, 0);
diff --git a/alpine/dispfilt.c b/alpine/dispfilt.c
index 58dc03d2..25cae59f 100644
--- a/alpine/dispfilt.c
+++ b/alpine/dispfilt.c
@@ -458,3 +458,63 @@ df_valid_test(struct mail_bodystruct *body, char *test)
return(passed);
}
+
+char *
+exec_function_rule(char *rawcmd, gf_io_t input_gc, gf_io_t output_pc)
+{
+ char *status = NULL, *cmd, *tmpfile = NULL;
+
+ if((cmd = expand_filter_tokens(rawcmd,NULL,&tmpfile,NULL,NULL,NULL,NULL,NULL)) != NULL){
+ suspend_busy_cue();
+ ps_global->mangled_screen = 1;
+ if(tmpfile){
+ PIPE_S *filter_pipe;
+ FILE *fp;
+ gf_io_t gc, pc;
+ STORE_S *tmpf_so;
+
+ /* write the tmp file */
+ if((tmpf_so = so_get(FileStar, tmpfile, WRITE_ACCESS|OWNER_ONLY|WRITE_TO_LOCALE)) != NULL){
+ /* copy input to tmp file */
+ gf_set_so_writec(&pc, tmpf_so);
+ gf_filter_init();
+ status = gf_pipe(input_gc, pc);
+ gf_clear_so_writec(tmpf_so);
+ if(so_give(&tmpf_so) != 0 && status == NULL)
+ status = error_description(errno);
+
+ /* prepare the terminal in case the filter uses it */
+ if(status == NULL){
+ if((filter_pipe = open_system_pipe(cmd, NULL, NULL,
+ PIPE_USER|PIPE_PROT|PIPE_NOSHELL|PIPE_SILENT,
+ 0, pipe_callback, NULL)) != NULL){
+ if(close_system_pipe(&filter_pipe, NULL, pipe_callback) == 0){
+ /* pull result out of tmp file */
+ if((fp = our_fopen(tmpfile, "rb")) != NULL){
+ gf_set_readc(&gc, fp, 0L, FileStar, READ_FROM_LOCALE);
+ gf_filter_init();
+ status = gf_pipe(gc, output_pc);
+ fclose(fp);
+ }
+ else
+ status = "Can't read result of EXEC command";
+ }
+ else
+ status = "EXEC command command returned error.";
+ }
+ else
+ status = "Can't open pipe for EXEC command";
+ }
+
+ our_unlink(tmpfile);
+ }
+ else
+ status = "Can't open EXEC command tmp file";
+ }
+
+ resume_busy_cue(0);
+ fs_give((void **)&cmd);
+ }
+
+ return(status);
+}
diff --git a/alpine/dispfilt.h b/alpine/dispfilt.h
index 39607518..e0e04d97 100644
--- a/alpine/dispfilt.h
+++ b/alpine/dispfilt.h
@@ -25,7 +25,7 @@ char *dfilter_trigger(BODY *, char *, size_t);
char *expand_filter_tokens(char *, ENVELOPE *, char **, char **, char **, int *, int *, int *);
char *filter_session_key(void);
char *filter_data_file(int);
-
+char *exec_function_rule(char *, gf_io_t, gf_io_t);
#endif /* PINE_DISPFILT_INCLUDED */
diff --git a/alpine/folder.c b/alpine/folder.c
index 48b6e81d..43e0b83d 100644
--- a/alpine/folder.c
+++ b/alpine/folder.c
@@ -244,7 +244,7 @@ folder_screen(struct pine *ps)
dprint((1, "=== folder_screen called ====\n"));
mailcap_free(); /* free resources we won't be using for a while */
ps->next_screen = SCREEN_FUN_NULL;
-
+ strcpy(ps->screen_name, "folder");
/* Initialize folder state and dispatches */
memset(&fs, 0, sizeof(FSTATE_S));
fs.context = cntxt;
@@ -341,6 +341,7 @@ folder_screen(struct pine *ps)
pine_mail_close(*fs.cache_streamp);
ps->prev_screen = folder_screen;
+ strcpy(ps->screen_name, "unknown");
}
diff --git a/alpine/mailcmd.c b/alpine/mailcmd.c
index a144b2d2..2a827f39 100644
--- a/alpine/mailcmd.c
+++ b/alpine/mailcmd.c
@@ -69,6 +69,7 @@
#include "../pith/tempfile.h"
#include "../pith/search.h"
#include "../pith/margin.h"
+#include "../pith/rules.h"
#ifdef _WINDOWS
#include "../pico/osdep/mswin.h"
#endif
@@ -2719,6 +2720,9 @@ role_compose(struct pine *state)
role->nick = cpystr("Default Role");
}
+ if(state->role)
+ fs_give((void **)&state->role);
+ state->role = cpystr(role->nick); /* remember the role */
state->redrawer = NULL;
switch(action){
case 'c':
@@ -2769,12 +2773,12 @@ save_prompt(struct pine *state, CONTEXT_S **cntxt, char *nfldr, size_t len_nfldr
char *nmsgs, ENVELOPE *env, long int rawmsgno, char *section,
SaveDel *dela, SavePreserveOrder *prea)
{
- int rc, ku = -1, n, flags, last_rc = 0, saveable_count = 0, done = 0;
+ int rc, ku = -1, n = 0, flags, last_rc = 0, saveable_count = 0, done = 0;
int delindex = 0, preindex = 0, r;
char prompt[6*MAX_SCREEN_COLS+1], *p, expanded[MAILTMPLEN];
char *buf = tmp_20k_buf;
char shortbuf[200];
- char *folder;
+ char *folder, folder2[MAXPATH];
HelpType help;
SaveDel del = DontAsk;
SavePreserveOrder pre = DontAskPreserve;
@@ -2782,6 +2786,7 @@ save_prompt(struct pine *state, CONTEXT_S **cntxt, char *nfldr, size_t len_nfldr
static HISTORY_S *history = NULL;
CONTEXT_S *tc;
ESCKEY_S ekey[10];
+ RULE_RESULT *rule;
if(!cntxt)
alpine_panic("no context ptr in save_prompt");
@@ -2791,6 +2796,15 @@ save_prompt(struct pine *state, CONTEXT_S **cntxt, char *nfldr, size_t len_nfldr
if(!(folder = save_get_default(state, env, rawmsgno, section, cntxt)))
return(0); /* message expunged! */
+ if (rule = get_result_rule(V_SAVE_RULES, FOR_SAVE, env)){
+ strncpy(folder2,rule->result,sizeof(folder2)-1);
+ folder2[sizeof(folder2)-1] = '\0';
+ folder = folder2;
+ if (rule->result)
+ fs_give((void **)&rule->result);
+ fs_give((void **)&rule);
+ }
+
/* how many context's can be saved to... */
for(tc = state->context_list; tc; tc = tc->next)
if(!NEWS_TEST(tc))
diff --git a/alpine/mailindx.c b/alpine/mailindx.c
index 61f6418b..d7a5c1aa 100644
--- a/alpine/mailindx.c
+++ b/alpine/mailindx.c
@@ -225,6 +225,8 @@ mail_index_screen(struct pine *state)
state->prev_screen = mail_index_screen;
state->next_screen = SCREEN_FUN_NULL;
+ setup_threading_display_style();
+
if(THRD_AUTO_VIEW()
&& sp_viewing_a_thread(state->mail_stream)
&& state->view_skipped_index
@@ -236,10 +238,14 @@ mail_index_screen(struct pine *state)
adjust_cur_to_visible(state->mail_stream, state->msgmap);
+ strcpy(state->screen_name,"index");
+
if(THRD_INDX())
thread_index_screen(state);
else
index_index_screen(state);
+
+ strcpy(state->screen_name,"unknown");
}
diff --git a/alpine/mailview.c b/alpine/mailview.c
index b4a6c0d6..2a7fd461 100644
--- a/alpine/mailview.c
+++ b/alpine/mailview.c
@@ -242,6 +242,8 @@ mail_view_screen(struct pine *ps)
ps->prev_screen = mail_view_screen;
ps->force_prefer_plain = ps->force_no_prefer_plain = 0;
+ strcpy(ps->screen_name, "text");
+
if(ps->ttyo->screen_rows - HEADER_ROWS(ps) - FOOTER_ROWS(ps) < 1){
q_status_message(SM_ORDER | SM_DING, 0, 3,
_("Screen too small to view message"));
@@ -478,6 +480,8 @@ mail_view_screen(struct pine *ps)
}
while(ps->next_screen == SCREEN_FUN_NULL);
+ strcpy(ps->screen_name, "unknown");
+
if(we_cancel)
cancel_busy_cue(-1);
diff --git a/alpine/osdep/termin.gen.c b/alpine/osdep/termin.gen.c
index c1207581..ec8c6ba3 100644
--- a/alpine/osdep/termin.gen.c
+++ b/alpine/osdep/termin.gen.c
@@ -29,6 +29,8 @@
#include "../../pith/newmail.h"
#include "../../pith/conf.h"
#include "../../pith/busy.h"
+#include "../../pith/list.h"
+#include "../../pith/rules.h"
#include "../../pico/estruct.h"
#include "../../pico/pico.h"
@@ -68,7 +70,8 @@ int pcpine_oe_cursor(int, long);
* Generic tty input routines
*/
-
+void process_init_cmds(struct pine *, char **);
+void queue_init_errors(struct pine *);
/*----------------------------------------------------------------------
Read a character from keyboard with timeout
Input: none
@@ -110,6 +113,41 @@ read_command(char **utf8str)
*utf8str = NULL;
ucs = read_char(tm);
+ if(!ps_global->initial_cmds){
+ RULE_RESULT *rule;
+ char **list = NULL, *error = NULL;
+ int commas = 0, k; /* From args.c */
+
+ ps_global->pressed_key = cpystr(pretty_command(ucs));
+ rule = (RULE_RESULT *)get_result_rule(V_KEY_RULES, FOR_KEY, NULL);
+ if(ps_global->pressed_key)
+ fs_give((void **)&ps_global->pressed_key);
+ if (rule){
+ for(k = 0; rule->result[k]; k++)
+ if(rule->result[k] == ',') commas++;
+ list = parse_list(rule->result, commas+1, 0, &error);
+ if(error)
+ sprintf(tmp_20k_buf, "Error in parsing command list: %s, %s",
+ rule->result, error);
+ if (rule->result)
+ fs_give((void **)&rule->result);
+ fs_give((void **)&rule);
+ if(error){
+ q_status_message(SM_ORDER | SM_DING, 0, 2, tmp_20k_buf);
+ return (NO_OP_COMMAND);
+ }
+ process_init_cmds(ps_global, list);
+ if(ps_global->init_errs){
+ queue_init_errors(ps_global);
+ return (NO_OP_COMMAND);
+ }
+ ucs = read_char(tm);
+ ps_global->in_init_seq = 1; /* no output please */
+ for(k = 0; k < commas; k++)
+ if(list[k]) fs_give((void **)&list[k]);
+ if (list) fs_give((void **)list);
+ }
+ }
if(ucs != NO_OP_COMMAND && ucs != NO_OP_IDLE && ucs != KEY_RESIZE)
zero_new_mail_count();
@@ -1155,6 +1193,7 @@ process_config_input(UCS *ch)
if(ps_global->initial_cmds && !*ps_global->initial_cmds && ps_global->free_initial_cmds){
fs_give((void **) &ps_global->free_initial_cmds);
ps_global->initial_cmds = NULL;
+ firsttime = (char) 1;
}
return(ret);
diff --git a/alpine/reply.c b/alpine/reply.c
index bb3a72cb..569f802c 100644
--- a/alpine/reply.c
+++ b/alpine/reply.c
@@ -58,7 +58,8 @@ The evolution continues...
#include "../pith/tempfile.h"
#include "../pith/busy.h"
#include "../pith/ablookup.h"
-
+#include "../pith/copyaddr.h"
+#include "../pith/rules.h"
/*
* Internal Prototypes
@@ -105,11 +106,12 @@ reply(struct pine *pine_state, ACTION_S *role_arg)
long msgno, j, totalm, rflags, *seq = NULL;
int i, include_text = 0, times = -1, warned = 0, rv = 0,
flags = RSF_QUERY_REPLY_ALL, reply_raw_body = 0;
- int rolemsg = 0, copytomsg = 0;
+ int rolemsg = 0, copytomsg = 0, do_role_early = 0;
gf_o_t pc;
PAT_STATE dummy;
REDRAFT_POS_S *redraft_pos = NULL;
ACTION_S *role = NULL, *nrole;
+ RULE_RESULT *rule;
#if defined(DOS) && !defined(_WINDOWS)
char *reserve;
#endif
@@ -135,6 +137,69 @@ reply(struct pine *pine_state, ACTION_S *role_arg)
&& F_ON(F_ENABLE_FULL_HDR_AND_TEXT, ps_global))
reply_raw_body = 1;
+ /* Setup possible role */
+ if(role_arg)
+ role = copy_action(role_arg);
+
+ if(!role && F_ON(F_ENABLE_EDIT_REPLY_INDENT, pine_state)){
+ for(msgno = mn_first_cur(pine_state->msgmap);
+ msgno > 0L; msgno = mn_next_cur(pine_state->msgmap)){
+
+ env = pine_mail_fetchstructure(pine_state->mail_stream,
+ mn_m2raw(pine_state->msgmap, msgno),
+ NULL);
+ if(!env) {
+ q_status_message1(SM_ORDER,3,4,
+ _("Error fetching message %s. Can't reply to it."),
+ long2string(msgno));
+ goto done_early;
+ }
+
+ if(rule = get_result_rule(V_REPLY_INDENT_RULES, FOR_COMPOSE , env)){
+ RULELIST *list = get_rulelist_from_code(V_REPLY_INDENT_RULES,
+ ps_global->rule_list);
+ RULE_S *prule = get_rule(list, rule->number);
+ if(condition_contains_token(prule->condition, ROLE_TOKEN))
+ do_role_early++;
+ if(rule->result)
+ fs_give((void **)&rule->result);
+ fs_give((void **)&rule);
+ }
+ }
+ }
+
+ if(do_role_early){
+ rflags = ROLE_REPLY;
+ if(nonempty_patterns(rflags, &dummy)){
+ /* setup default role */
+ nrole = NULL;
+ j = mn_first_cur(pine_state->msgmap);
+ do {
+ role = nrole;
+ nrole = set_role_from_msg(pine_state, rflags,
+ mn_m2raw(pine_state->msgmap, j),
+ NULL);
+ } while(nrole && (!role || nrole == role)
+ && (j=mn_next_cur(pine_state->msgmap)) > 0L);
+
+ if(!role || nrole == role)
+ role = nrole;
+ else
+ role = NULL;
+
+ if(confirm_role(rflags, &role))
+ role = combine_inherited_role(role);
+ else{ /* cancel reply */
+ role = NULL;
+ cmd_cancelled("Reply");
+ goto done_early;
+ }
+ }
+ }
+
+ if (role)
+ ps_global->role = cpystr(role->nick); /* remember the role */
+
/*
* We may have to loop through first to figure out what default
* reply-indent-string to offer...
@@ -283,8 +348,18 @@ reply(struct pine *pine_state, ACTION_S *role_arg)
outgoing->subject = cpystr("Re: several messages");
}
}
- else
- outgoing->subject = reply_subject(env->subject, NULL, 0);
+ else{
+ RULE_RESULT *rule;
+ rule = get_result_rule(V_RESUB_RULES,FOR_RESUB|FOR_TRIM , env);
+ if (rule){
+ outgoing->subject = reply_subject(rule->result, NULL, 0);
+ if (rule->result)
+ fs_give((void **)&rule->result);
+ fs_give((void **)&rule);
+ }
+ else
+ outgoing->subject = reply_subject(env->subject, NULL, 0);
+ }
}
/* fill reply header */
@@ -303,13 +378,7 @@ reply(struct pine *pine_state, ACTION_S *role_arg)
if(sp_expunge_count(pine_state->mail_stream)) /* cur msg expunged */
goto done_early;
- /* Setup possible role */
- if (ps_global->reply.role_chosen)
- role = ps_global->reply.role_chosen;
- else if(role_arg)
- role = copy_action(role_arg);
-
- if(!role){
+ if(!do_role_early){
rflags = ROLE_REPLY;
if(!ps_global->reply.role_chosen && nonempty_patterns(rflags, &dummy)){
/* setup default role */
@@ -720,6 +789,9 @@ reply(struct pine *pine_state, ACTION_S *role_arg)
if(prefix)
fs_give((void **)&prefix);
+ if (ps_global->role)
+ fs_give((void **)&ps_global->role);
+
if(fcc)
fs_give((void **) &fcc);
@@ -1591,9 +1663,14 @@ forward(struct pine *ps, ACTION_S *role_arg)
}
}
- if(role)
+ if (ps_global->role)
+ fs_give((void **)&ps_global->role);
+
+ if(role){
q_status_message1(SM_ORDER, 3, 4,
_("Forwarding using role \"%s\""), role->nick);
+ ps_global->role = cpystr(role->nick);
+ }
outgoing->message_id = generate_message_id(role);
@@ -1827,6 +1904,7 @@ forward(struct pine *ps, ACTION_S *role_arg)
#if defined(DOS) && !defined(_WINDOWS)
free((void *)reserve);
#endif
+ outgoing->sparep = env && env->from ? copyaddr(env->from) : NULL;
pine_send(outgoing, &body, "FORWARD MESSAGE",
role, NULL, &reply, redraft_pos,
NULL, NULL, 0);
diff --git a/alpine/roleconf.c b/alpine/roleconf.c
index d3cc2078..7e1cc772 100644
--- a/alpine/roleconf.c
+++ b/alpine/roleconf.c
@@ -7702,6 +7702,11 @@ role_text_tool_inick(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags)
if(apval)
*apval = (role && role->nick) ? cpystr(role->nick) : NULL;
+ if (ps_global->role)
+ fs_give((void **)&ps_global->role);
+ if (role && role->nick)
+ ps_global->role = cpystr(role->nick);
+
if((*cl)->value)
fs_give((void **)&((*cl)->value));
diff --git a/alpine/send.c b/alpine/send.c
index ad74e380..9f7c5151 100644
--- a/alpine/send.c
+++ b/alpine/send.c
@@ -59,7 +59,7 @@
#include "../pith/mimetype.h"
#include "../pith/send.h"
#include "../pith/smime.h"
-
+#include "../pith/rules.h"
typedef struct body_particulars {
unsigned short type, encoding, had_csp;
@@ -232,6 +232,11 @@ alt_compose_screen(struct pine *pine_state)
role->nick = cpystr("Default Role");
}
+ if (ps_global->role)
+ fs_give((void **)&ps_global->role);
+
+ ps_global->role = cpystr(role->nick);
+
pine_state->redrawer = NULL;
compose_mail(NULL, NULL, role, NULL, NULL);
free_action(&role);
@@ -441,8 +446,12 @@ compose_mail(char *given_to, char *fcc_arg, ACTION_S *role_arg,
ps_global->next_screen = prev_screen;
ps_global->redrawer = redraw;
- if(role)
+ if (ps_global->role)
+ fs_give((void **)&ps_global->role);
+ if(role){
role = combine_inherited_role(role);
+ ps_global->role = cpystr(role->nick);
+ }
}
break;
@@ -638,9 +647,14 @@ compose_mail(char *given_to, char *fcc_arg, ACTION_S *role_arg,
}
}
- if(role)
+ if (ps_global->role)
+ fs_give((void **)&ps_global->role);
+
+ if(role){
q_status_message1(SM_ORDER, 3, 4, _("Composing using role \"%s\""),
role->nick);
+ ps_global->role = cpystr(role->nick);
+ }
outgoing->message_id = generate_message_id(role);
/*
@@ -2480,6 +2494,26 @@ pine_send(ENVELOPE *outgoing, struct mail_bodystruct **body,
removing_trailing_white_space(pf->textbuf);
(void)removing_double_quotes(pf->textbuf);
build_address(pf->textbuf, &addr, NULL, NULL, NULL);
+ if (!strncmp(pf->name,"Lcc",3) && addr && *addr){
+ RULE_RESULT *rule;
+
+ outgoing->date = (unsigned char *) cpystr(addr);
+ ps_global->procid = cpystr("fwd-lcc");
+ rule = get_result_rule(V_FORWARD_RULES,
+ FOR_COMPOSE|FOR_TRIM, outgoing);
+ if (rule){
+ addr = cpystr(rule->result);
+ removing_trailing_white_space(addr);
+ (void)removing_extra_stuff(addr);
+ if (rule->result)
+ fs_give((void **)&rule->result);
+ fs_give((void **)&rule);
+ }
+ fs_give((void **)&ps_global->procid);
+ if (outgoing->date)
+ fs_give((void **)&outgoing->date);
+ }
+
rfc822_parse_adrlist(pf->addr, addr,
ps_global->maildomain);
fs_give((void **)&addr);