--- mutt-1.5.8/PATCHES~ never +++ mutt-1.5.8/PATCHES Tue Mar 8 17:35:26 CST 2005 @@ -1,0 +1 @@ +patch-1.5.8.dgc.setenv.1 diff -Pur mutt-1.5.8-base/init.c mutt-1.5.8/init.c --- mutt-1.5.8-base/init.c Sat Feb 12 13:06:16 2005 +++ mutt-1.5.8/init.c Tue Mar 8 16:33:57 2005 @@ -49,6 +49,8 @@ #include #include +extern char **envlist; + void toggle_quadoption (int opt) { int n = opt/4; @@ -1189,6 +1191,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 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.8-base/init.h mutt-1.5.8/init.h --- mutt-1.5.8-base/init.h Sat Feb 12 14:01:10 2005 +++ mutt-1.5.8/init.h Tue Mar 8 17:34:39 2005 @@ -2891,6 +2891,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 *); @@ -2951,6 +2952,7 @@ { "send-hook", mutt_parse_hook, M_SENDHOOK }, { "send2-hook", mutt_parse_hook, M_SEND2HOOK }, { "set", parse_set, 0 }, + { "setenv", parse_setenv, 0 }, { "source", parse_source, 0 }, { "spam", parse_spam_list, M_SPAM }, { "nospam", parse_spam_list, M_NOSPAM }, @@ -2967,6 +2969,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_unsubscribe, 0 }, { NULL } }; diff -Pur mutt-1.5.8-base/main.c mutt-1.5.8/main.c --- mutt-1.5.8-base/main.c Sat Feb 12 13:41:32 2005 +++ mutt-1.5.8/main.c Tue Mar 8 16:33:58 2005 @@ -85,6 +85,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.\n\ "); +char **envlist; + void mutt_exit (int code) { mutt_endwin (NULL); @@ -500,7 +502,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; @@ -519,6 +521,8 @@ int explicit_folder = 0; extern char *optarg; extern int optind; + + envlist = env; /* sanity check against stupid administrators */