--- mutt-1.5.6/PATCHES~ never +++ mutt-1.5.6/PATCHES Mon Feb 9 22:50:04 CST 2004 @@ -1,0 +1 @@ +patch-1.5.6.dgc.setenv.1 diff -Pur mutt-1.5.6-base/init.c mutt-1.5.6-dgc.setenv.1/init.c --- mutt-1.5.6-base/init.c Sun Feb 1 12:21:00 2004 +++ mutt-1.5.6-dgc.setenv.1/init.c Mon Feb 9 22:48:51 2004 @@ -45,6 +45,8 @@ #include #include +extern char **envlist; + void toggle_quadoption (int opt) { int n = opt/4; @@ -899,6 +901,91 @@ set_option (OPTRESORTINIT); if (p->flags & R_TREE) set_option (OPTREDRAWTREE); +} + +static int parse_setenv(BUFFER *tmp, BUFFER *s, unsigned long data, BUFFER *err) +{ + int query, unset, len; + char *env, work[LONG_STRING]; + char **save, **envp = envlist; + + query = 0; + unset = data & M_SET_UNSET; + + if (MoreArgs (s)) + { + if (*s->dptr == '?') + { + query = 1; + s->dptr++; + } + + /* get variable name */ + mutt_extract_token (tmp, s, M_TOKEN_EQUAL); + len = strlen(tmp->data); + + if (query) + { + while (envp && *envp) + { + if (!strncmp(tmp->data, *envp, len)) + { + snprintf(err->data, err->dsize, "%s", *envp); + return 0; + } + envp++; + } + snprintf (err->data, err->dsize, _("%s is unset"), tmp->data); + return -1; + } + + if (unset) + { + while (envp && *envp) + { + if (!strncmp(tmp->data, *envp, len) && (*envp)[len] == '=') + { + /* shuffle down */ + save = envp++; + while (*envp) + *save++ = *envp++; + *save = NULL; + return 0; + } + envp++; + } + return -1; + } + + while (envp && *envp) + { + if (!strncmp(tmp->data, *envp, len) && (*envp)[len] == '=') + { + /* shuffle down */ + save = envp++; + while (*envp) + *save++ = *envp++; + *save = NULL; + envp = save; + break; + } + envp++; + } + + strncpy(work, tmp->data, sizeof(work)); + len = strlen(work); + + mutt_extract_token (tmp, s, 0); + + strncpy(&work[len], tmp->data, sizeof(work)-len); + + *envp++ = strdup(work); + *envp = NULL; + + return 0; + } + + return -1; } static int parse_set (BUFFER *tmp, BUFFER *s, unsigned long data, BUFFER *err) diff -Pur mutt-1.5.6-base/init.h mutt-1.5.6-dgc.setenv.1/init.h --- mutt-1.5.6-base/init.h Sun Feb 1 11:15:17 2004 +++ mutt-1.5.6-dgc.setenv.1/init.h Mon Feb 9 22:49:53 2004 @@ -2738,6 +2738,7 @@ static int parse_unignore (BUFFER *, BUFFER *, unsigned long, BUFFER *); static int parse_source (BUFFER *, BUFFER *, unsigned long, BUFFER *); static int parse_set (BUFFER *, BUFFER *, unsigned long, BUFFER *); +static int parse_setenv (BUFFER *, BUFFER *, unsigned long, BUFFER *); static int parse_my_hdr (BUFFER *, BUFFER *, unsigned long, BUFFER *); static int parse_unmy_hdr (BUFFER *, BUFFER *, unsigned long, BUFFER *); static int parse_subscribe (BUFFER *, BUFFER *, unsigned long, BUFFER *); @@ -2792,6 +2793,7 @@ { "score", mutt_parse_score, 0 }, { "send-hook", mutt_parse_hook, M_SENDHOOK }, { "set", parse_set, 0 }, + { "setenv", parse_setenv, 0 }, { "source", parse_source, 0 }, { "subscribe", parse_subscribe, 0 }, { "toggle", parse_set, M_SET_INV }, @@ -2806,6 +2808,7 @@ { "unmy_hdr", parse_unmy_hdr, 0 }, { "unscore", mutt_parse_unscore, 0 }, { "unset", parse_set, M_SET_UNSET }, + { "unsetenv", parse_setenv, M_SET_UNSET }, { "unsubscribe", parse_rx_unlist, UL &SubscribedLists }, { NULL } }; diff -Pur mutt-1.5.6-base/main.c mutt-1.5.6-dgc.setenv.1/main.c --- mutt-1.5.6-base/main.c Tue Mar 4 01:49:48 2003 +++ mutt-1.5.6-dgc.setenv.1/main.c Mon Feb 9 22:48:51 2004 @@ -80,6 +80,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.\n\ "); +char **envlist; + void mutt_exit (int code) { mutt_endwin (NULL); @@ -476,7 +478,7 @@ #define M_RO (1<<3) /* -R */ #define M_SELECT (1<<4) /* -y */ -int main (int argc, char **argv) +int main (int argc, char **argv, char **env) { char folder[_POSIX_PATH_MAX] = ""; char *subject = NULL; @@ -495,6 +497,8 @@ int explicit_folder = 0; extern char *optarg; extern int optind; + + envlist = env; /* sanity check against stupid administrators */