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 --- |