Deleted Added
full compact
milter.c (168515) milter.c (173340)
1/*
2 * Copyright (c) 1999-2006 Sendmail, Inc. and its suppliers.
3 * All rights reserved.
4 *
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
8 *
9 */
10
11#include <sendmail.h>
12
1/*
2 * Copyright (c) 1999-2006 Sendmail, Inc. and its suppliers.
3 * All rights reserved.
4 *
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
8 *
9 */
10
11#include <sendmail.h>
12
13SM_RCSID("@(#)$Id: milter.c,v 8.267 2007/02/27 22:21:12 ca Exp $")
13SM_RCSID("@(#)$Id: milter.c,v 8.269 2007/06/06 17:26:12 ca Exp $")
14
15#if MILTER
16# include <sm/sendmail.h>
17# include <libmilter/mfapi.h>
18# include <libmilter/mfdef.h>
19
20# include <errno.h>
21# include <sm/time.h>

--- 24 unchanged lines hidden (view full) ---

46 ENVELOPE *, char *, const char *, bool));
47static char *milter_body __P((struct milter *, ENVELOPE *, char *));
48static int milter_reopen_df __P((ENVELOPE *));
49static int milter_reset_df __P((ENVELOPE *));
50static void milter_quit_filter __P((struct milter *, ENVELOPE *));
51static void milter_abort_filter __P((struct milter *, ENVELOPE *));
52static void milter_send_macros __P((struct milter *, char **, int,
53 ENVELOPE *));
14
15#if MILTER
16# include <sm/sendmail.h>
17# include <libmilter/mfapi.h>
18# include <libmilter/mfdef.h>
19
20# include <errno.h>
21# include <sm/time.h>

--- 24 unchanged lines hidden (view full) ---

46 ENVELOPE *, char *, const char *, bool));
47static char *milter_body __P((struct milter *, ENVELOPE *, char *));
48static int milter_reopen_df __P((ENVELOPE *));
49static int milter_reset_df __P((ENVELOPE *));
50static void milter_quit_filter __P((struct milter *, ENVELOPE *));
51static void milter_abort_filter __P((struct milter *, ENVELOPE *));
52static void milter_send_macros __P((struct milter *, char **, int,
53 ENVELOPE *));
54static int milter_negotiate __P((struct milter *, ENVELOPE *));
54static int milter_negotiate __P((struct milter *, ENVELOPE *,
55 milters_T *));
55static void milter_per_connection_check __P((ENVELOPE *));
56static char *milter_headers __P((struct milter *, ENVELOPE *, char *));
57static void milter_addheader __P((struct milter *, char *, ssize_t,
58 ENVELOPE *));
59static void milter_insheader __P((struct milter *, char *, ssize_t,
60 ENVELOPE *));
61static void milter_changeheader __P((struct milter *, char *, ssize_t,
62 ENVELOPE *));

--- 1723 unchanged lines hidden (view full) ---

1786 return -1;
1787 }
1788 else
1789 e->e_flags |= EF_HAS_DF;
1790 return 0;
1791}
1792
1793/*
56static void milter_per_connection_check __P((ENVELOPE *));
57static char *milter_headers __P((struct milter *, ENVELOPE *, char *));
58static void milter_addheader __P((struct milter *, char *, ssize_t,
59 ENVELOPE *));
60static void milter_insheader __P((struct milter *, char *, ssize_t,
61 ENVELOPE *));
62static void milter_changeheader __P((struct milter *, char *, ssize_t,
63 ENVELOPE *));

--- 1723 unchanged lines hidden (view full) ---

1787 return -1;
1788 }
1789 else
1790 e->e_flags |= EF_HAS_DF;
1791 return 0;
1792}
1793
1794/*
1794** MILTER_CAN_DELRCPTS -- can any milter filters delete recipients?
1795**
1796** Parameters:
1797** none
1798**
1799** Returns:
1800** true if any filter deletes recipients, false otherwise
1801*/
1802
1803bool
1804milter_can_delrcpts()
1805{
1806 bool can = false;
1807 int i;
1808
1809 if (tTd(64, 10))
1810 sm_dprintf("milter_can_delrcpts:");
1811
1812 for (i = 0; InputFilters[i] != NULL; i++)
1813 {
1814 struct milter *m = InputFilters[i];
1815
1816 if (bitset(SMFIF_DELRCPT, m->mf_fflags))
1817 {
1818 can = true;
1819 break;
1820 }
1821 }
1822 if (tTd(64, 10))
1823 sm_dprintf("%s\n", can ? "true" : "false");
1824
1825 return can;
1826}
1827
1828/*
1829** MILTER_QUIT_FILTER -- close down a single filter
1830**
1831** Parameters:
1832** m -- milter structure of filter to close down.
1833** e -- current envelope.
1834**
1835** Returns:
1836** none

--- 564 unchanged lines hidden (view full) ---

2401}
2402
2403/*
2404** MILTER_NEGOTIATE -- get version and flags from filter
2405**
2406** Parameters:
2407** m -- milter filter structure.
2408** e -- current envelope.
1795** MILTER_QUIT_FILTER -- close down a single filter
1796**
1797** Parameters:
1798** m -- milter structure of filter to close down.
1799** e -- current envelope.
1800**
1801** Returns:
1802** none

--- 564 unchanged lines hidden (view full) ---

2367}
2368
2369/*
2370** MILTER_NEGOTIATE -- get version and flags from filter
2371**
2372** Parameters:
2373** m -- milter filter structure.
2374** e -- current envelope.
2375** milters -- milters structure.
2409**
2410** Returns:
2411** 0 on success, -1 otherwise
2412*/
2413
2414static int
2376**
2377** Returns:
2378** 0 on success, -1 otherwise
2379*/
2380
2381static int
2415milter_negotiate(m, e)
2382milter_negotiate(m, e, milters)
2416 struct milter *m;
2417 ENVELOPE *e;
2383 struct milter *m;
2384 ENVELOPE *e;
2385 milters_T *milters;
2418{
2419 char rcmd;
2420 mi_int32 fvers, fflags, pflags;
2421 mi_int32 mta_prot_vers, mta_prot_flags, mta_actions;
2422 ssize_t rlen;
2423 char *response;
2424 char data[MILTER_OPTLEN];
2425

--- 152 unchanged lines hidden (view full) ---

2578 if (m->mf_fvers <= 3)
2579 m->mf_pflags |= SMFIP_NODATA;
2580
2581 if (rlen > MILTER_OPTLEN)
2582 {
2583 milter_getsymlist(m, response, rlen, MILTER_OPTLEN);
2584 }
2585
2386{
2387 char rcmd;
2388 mi_int32 fvers, fflags, pflags;
2389 mi_int32 mta_prot_vers, mta_prot_flags, mta_actions;
2390 ssize_t rlen;
2391 char *response;
2392 char data[MILTER_OPTLEN];
2393

--- 152 unchanged lines hidden (view full) ---

2546 if (m->mf_fvers <= 3)
2547 m->mf_pflags |= SMFIP_NODATA;
2548
2549 if (rlen > MILTER_OPTLEN)
2550 {
2551 milter_getsymlist(m, response, rlen, MILTER_OPTLEN);
2552 }
2553
2554 if (bitset(SMFIF_DELRCPT, m->mf_fflags))
2555 milters->mis_flags |= MIS_FL_DEL_RCPT;
2556 if (!bitset(SMFIP_NORCPT, m->mf_pflags) &&
2557 !bitset(SMFIP_NR_RCPT, m->mf_pflags))
2558 milters->mis_flags |= MIS_FL_REJ_RCPT;
2559
2586 if (tTd(64, 5))
2587 sm_dprintf("milter_negotiate(%s): received: version %u, fflags 0x%x, pflags 0x%x\n",
2588 m->mf_name, m->mf_fvers, m->mf_fflags, m->mf_pflags);
2589 return 0;
2590
2591 error:
2592 if (response != NULL)
2593 sm_free(response); /* XXX */

--- 1185 unchanged lines hidden (view full) ---

3779*/
3780
3781/*
3782** MILTER_INIT -- open and negotiate with all of the filters
3783**
3784** Parameters:
3785** e -- current envelope.
3786** state -- return state from response.
2560 if (tTd(64, 5))
2561 sm_dprintf("milter_negotiate(%s): received: version %u, fflags 0x%x, pflags 0x%x\n",
2562 m->mf_name, m->mf_fvers, m->mf_fflags, m->mf_pflags);
2563 return 0;
2564
2565 error:
2566 if (response != NULL)
2567 sm_free(response); /* XXX */

--- 1185 unchanged lines hidden (view full) ---

3753*/
3754
3755/*
3756** MILTER_INIT -- open and negotiate with all of the filters
3757**
3758** Parameters:
3759** e -- current envelope.
3760** state -- return state from response.
3761** milters -- milters structure.
3787**
3788** Returns:
3789** true iff at least one filter is active
3790*/
3791
3792/* ARGSUSED */
3793bool
3762**
3763** Returns:
3764** true iff at least one filter is active
3765*/
3766
3767/* ARGSUSED */
3768bool
3794milter_init(e, state)
3769milter_init(e, state, milters)
3795 ENVELOPE *e;
3796 char *state;
3770 ENVELOPE *e;
3771 char *state;
3772 milters_T *milters;
3797{
3798 int i;
3799
3800 if (tTd(64, 10))
3801 sm_dprintf("milter_init\n");
3802
3773{
3774 int i;
3775
3776 if (tTd(64, 10))
3777 sm_dprintf("milter_init\n");
3778
3779 memset(milters, '\0', sizeof(*milters));
3803 *state = SMFIR_CONTINUE;
3804 if (InputFilters[0] == NULL)
3805 {
3806 if (MilterLogLevel > 10)
3807 sm_syslog(LOG_INFO, e->e_id,
3808 "Milter: no active filter");
3809 return false;
3810 }

--- 5 unchanged lines hidden (view full) ---

3816 m->mf_sock = milter_open(m, false, e);
3817 if (m->mf_state == SMFS_ERROR)
3818 {
3819 MILTER_CHECK_ERROR(true, continue);
3820 break;
3821 }
3822
3823 if (m->mf_sock < 0 ||
3780 *state = SMFIR_CONTINUE;
3781 if (InputFilters[0] == NULL)
3782 {
3783 if (MilterLogLevel > 10)
3784 sm_syslog(LOG_INFO, e->e_id,
3785 "Milter: no active filter");
3786 return false;
3787 }

--- 5 unchanged lines hidden (view full) ---

3793 m->mf_sock = milter_open(m, false, e);
3794 if (m->mf_state == SMFS_ERROR)
3795 {
3796 MILTER_CHECK_ERROR(true, continue);
3797 break;
3798 }
3799
3800 if (m->mf_sock < 0 ||
3824 milter_negotiate(m, e) < 0 ||
3801 milter_negotiate(m, e, milters) < 0 ||
3825 m->mf_state == SMFS_ERROR)
3826 {
3827 if (tTd(64, 5))
3828 sm_dprintf("milter_init(%s): failed to %s\n",
3829 m->mf_name,
3830 m->mf_sock < 0 ? "open" :
3831 "negotiate");
3832 if (MilterLogLevel > 0)

--- 927 unchanged lines hidden ---
3802 m->mf_state == SMFS_ERROR)
3803 {
3804 if (tTd(64, 5))
3805 sm_dprintf("milter_init(%s): failed to %s\n",
3806 m->mf_name,
3807 m->mf_sock < 0 ? "open" :
3808 "negotiate");
3809 if (MilterLogLevel > 0)

--- 927 unchanged lines hidden ---