602
static int remove_from_rx_list (RX_LIST **l, const char *str)
604
RX_LIST *p, *last = NULL;
607
if (mutt_strcmp ("*", str) == 0)
609
mutt_free_rx_list (l); /* ``unCMD *'' means delete all current entries */
618
if (ascii_strcasecmp (str, p->rx->pattern) == 0)
620
mutt_free_regexp (&p->rx);
622
last->next = p->next;
638
604
static int parse_unignore (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
700
666
if (parse_group_context (&gc, buf, s, data, err) == -1)
703
remove_from_rx_list (&UnAlternates, buf->data);
669
mutt_remove_from_rx_list (&UnAlternates, buf->data);
705
671
if (mutt_add_to_rx_list (&Alternates, buf->data, REG_ICASE, err) != 0)
726
692
mutt_extract_token (buf, s, 0);
727
remove_from_rx_list (&Alternates, buf->data);
693
mutt_remove_from_rx_list (&Alternates, buf->data);
729
695
if (mutt_strcmp (buf->data, "*") &&
730
696
mutt_add_to_rx_list (&UnAlternates, buf->data, REG_ICASE, err) != 0)
841
807
if (parse_group_context (&gc, buf, s, data, err) == -1)
844
remove_from_rx_list (&UnMailLists, buf->data);
810
mutt_remove_from_rx_list (&UnMailLists, buf->data);
846
812
if (mutt_add_to_rx_list (&MailLists, buf->data, REG_ICASE, err) != 0)
869
835
group_state_t state = NONE;
870
836
ADDRESS *addr = NULL;
871
837
char *estr = NULL;
875
841
mutt_extract_token (buf, s, 0);
876
842
if (parse_group_context (&gc, buf, s, data, err) == -1)
845
if (data == M_UNGROUP && !mutt_strcasecmp (buf->data, "*"))
847
if (mutt_group_context_clear (&gc) < 0)
879
852
if (!mutt_strcasecmp (buf->data, "-rx"))
881
854
else if (!mutt_strcasecmp (buf->data, "-addr"))
888
strfcpy (err->data, _("Missing -rx or -addr."), err->dsize);
861
snprintf (err->data, err->dsize, _("%sgroup: missing -rx or -addr."),
862
data == M_UNGROUP ? "un" : "");
892
if (mutt_group_context_add_rx (gc, buf->data, REG_ICASE, err) != 0)
866
if (data == M_GROUP &&
867
mutt_group_context_add_rx (gc, buf->data, REG_ICASE, err) != 0)
869
else if (data == M_UNGROUP &&
870
mutt_group_context_remove_rx (gc, buf->data) < 0)
897
875
if ((addr = mutt_parse_adrlist (NULL, buf->data)) == NULL)
899
if (mutt_addrlist_to_idna (addr, &estr))
901
snprintf (err->data, err->dsize, _("Warning: Bad IDN '%s'.\n"),
877
if (mutt_addrlist_to_idna (addr, &estr))
879
snprintf (err->data, err->dsize, _("%sgroup: warning: bad IDN '%s'.\n"),
880
data == 1 ? "un" : "", estr);
905
mutt_group_context_add_adrlist (gc, addr);
884
mutt_group_context_add_adrlist (gc, addr);
885
else if (data == M_UNGROUP)
886
mutt_group_context_remove_adrlist (gc, addr);
906
887
rfc822_free_address (&addr);
910
891
} while (MoreArgs (s));
912
894
mutt_group_context_destroy (&gc);
916
898
mutt_group_context_destroy (&gc);
920
static int parse_ungroup (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
922
strfcpy (err->data, "not implemented", err->dsize);
926
902
/* always wise to do what someone else did before */
927
903
static void _attachments_clean (void)
990
967
tmpminor[len+2] = '\0';
992
969
a->major_int = mutt_check_mime_type(a->major);
993
regcomp(&a->minor_rx, tmpminor, REG_ICASE|REG_EXTENDED);
970
ret = REGCOMP(&a->minor_rx, tmpminor, REG_ICASE);
976
regerror(ret, &a->minor_rx, err->data, err->dsize);
997
982
dprint(5, (debugfile, "parse_attach_list: added %s/%s [%d]\n",
998
983
a->major, a->minor, a->major_int));
1195
1180
mutt_extract_token (buf, s, 0);
1196
remove_from_rx_list (&SubscribedLists, buf->data);
1197
remove_from_rx_list (&MailLists, buf->data);
1181
mutt_remove_from_rx_list (&SubscribedLists, buf->data);
1182
mutt_remove_from_rx_list (&MailLists, buf->data);
1199
1184
if (mutt_strcmp (buf->data, "*") &&
1200
1185
mutt_add_to_rx_list (&UnMailLists, buf->data, REG_ICASE, err) != 0)
1216
1201
if (parse_group_context (&gc, buf, s, data, err) == -1)
1219
remove_from_rx_list (&UnMailLists, buf->data);
1220
remove_from_rx_list (&UnSubscribedLists, buf->data);
1204
mutt_remove_from_rx_list (&UnMailLists, buf->data);
1205
mutt_remove_from_rx_list (&UnSubscribedLists, buf->data);
1222
1207
if (mutt_add_to_rx_list (&MailLists, buf->data, REG_ICASE, err) != 0)
1243
1228
mutt_extract_token (buf, s, 0);
1244
remove_from_rx_list (&SubscribedLists, buf->data);
1229
mutt_remove_from_rx_list (&SubscribedLists, buf->data);
1246
1231
if (mutt_strcmp (buf->data, "*") &&
1247
1232
mutt_add_to_rx_list (&UnSubscribedLists, buf->data, REG_ICASE, err) != 0)
1546
1531
switch (p->type & DT_MASK)
1550
mutt_str_replace ((char **) p->data, (char *) p->init);
1534
mutt_str_replace ((char **) p->data, (char *) p->init);
1537
FREE((char **) p->data); /* __FREE_CHECKED__ */
1555
1540
char path[_POSIX_PATH_MAX];
1557
1541
strfcpy (path, (char *) p->init, sizeof (path));
1558
1542
mutt_expand_path (path, sizeof (path));
1559
mutt_str_replace ((char **) p->data, path);
1543
*((char **) p->data) = safe_strdup (path);
1547
rfc822_free_address ((ADDRESS **) p->data);
1565
rfc822_free_address ((ADDRESS **) p->data);
1566
1549
*((ADDRESS **) p->data) = rfc822_parse_adrlist (NULL, (char *) p->init);
1921
1902
else if (DTYPE (MuttVars[idx].type) == DT_STR)
1923
if (strstr (MuttVars[idx].option, "charset") &&
1924
check_charset (&MuttVars[idx], tmp->data) < 0)
1904
if ((strstr (MuttVars[idx].option, "charset") &&
1905
check_charset (&MuttVars[idx], tmp->data) < 0) |
1906
/* $charset can't be empty, others can */
1907
(strcmp(MuttVars[idx].option, "charset") == 0 && ! *tmp->data))
1926
1909
snprintf (err->data, err->dsize, _("Invalid value for option %s: \"%s\""),
1927
1910
MuttVars[idx].option, tmp->data);
2848
2830
setbuf (debugfile, NULL); /* don't buffer the debugging output! */
2849
fprintf (debugfile, "Mutt %s started at %s.\nDebugging at level %d.\n\n",
2850
MUTT_VERSION, asctime (localtime (&t)), debuglevel);
2831
dprint(1,(debugfile,"Mutt/%s (%s) debugging at level %d\n",
2832
MUTT_VERSION, ReleaseDate, debuglevel));
2859
static void mutt_srandom (void)
2864
gettimeofday(&tv, NULL);
2865
/* POSIX.1-2008 states that seed is 'unsigned' without specifying its width.
2866
* Use as many of the lower order bits from the current time of day as the seed.
2867
* If the upper bound is truncated, that is fine.
2869
* tv_sec is integral of type integer or float. Cast to 'long long' before
2870
* bitshift in case it is a float.
2872
seed = ((LONGLONG) tv.tv_sec << 20) | tv.tv_usec;
2877
2876
void mutt_init (int skip_sys_rc, LIST *commands)
2879
2878
struct passwd *pw;