/*
* Copyright (c) 2005 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
* forth in the LICENSE file which can be found at the top level of
* the sendmail distribution.
*/
#include "sm/generic.h"
SM_RCSID("@(#)$Id: t-pm-mac-0.c,v 1.6 2006/10/05 04:27:38 ca Exp $")
#include "sm/error.h"
#include "sm/assert.h"
#include "sm/types.h"
#include "sm/sysexits.h"
#include "sm/fcntl.h"
#include "sm/io.h"
#include "sm/ctype.h"
#include "sm/reccom.h"
#include "sm/mta.h"
#define PMILTER_DEBUG_DEFINE 1
#include "pmilter.h"
#include "sm/pmfdef.h"
#include "sm/pmfapi.h"
#include "sm/pmilter.h"
#include "util.h"
#include "sm/test.h"
#if MTA_USE_PMILTER
/*
** USAGE -- Print usage message to smioerr
**
** Parameters:
** prg -- program name
**
** Returns:
** exits
*/
static void
usage(const char *prg)
{
sm_io_fprintf(smioerr, "usage: %s [options]\n"
#if PMILTER_DEBUG
"-d n set debug level\n"
#endif
, prg
);
exit(EX_USAGE);
}
#define SM_TEST_RET(cond) \
SM_TEST(cond); \
if (!(cond)) \
return
/*
** TEST_MACROS -- test macro functions
**
** Parameters:
** argc -- number of arguments
**
** Returns:
** nothing
*/
static void
test_macros(pmg_ctx_P pmg_ctx)
{
sm_ret_T ret;
int i;
pmss_ctx_P pmss_ctx;
pmse_ctx_P pmse_ctx;
char *value;
sm_str_P macs[PM_MAX_MACROS + 1];
ret = sm_pmss_new(pmg_ctx, &pmss_ctx);
SM_TEST_RET(ret == SM_SUCCESS);
ret = sm_pmse_new(pmg_ctx, pmss_ctx, &pmse_ctx);
SM_TEST_RET(ret == SM_SUCCESS);
for (i = 0; i <= PM_MAX_MACROS; i++)
{
macs[i] = sm_str_new(NULL, 16, 64);
SM_TEST_RET(macs[i] != NULL);
}
ret = sm_pmfi_setmaclist(pmss_ctx, PM_SMST_CONNECT, PMM_SEID, PMM_END);
SM_TEST_RET(ret == SM_SUCCESS);
ret = sm_pmfi_setmaclist(pmss_ctx, PM_SMST_CONNECT, PMM_SEID, PMM_END);
SM_TEST_RET(ret != SM_SUCCESS);
ret = sm_pmfi_setmaclist(pmss_ctx, PM_SMST_EHLO, PMM_CLIENT_RESOLVE,
PMM_END);
SM_TEST_RET(ret == SM_SUCCESS);
ret = sm_pmfi_setmaclist(pmss_ctx, PM_SMST_MAIL, PMM_AUTH_TYPE,
PMM_END);
SM_TEST_RET(ret == SM_SUCCESS);
ret = sm_pmfi_setmaclist(pmss_ctx, PM_SMST_DOT, PMM_DOT_MSGID,
PMM_END);
SM_TEST_RET(ret == SM_SUCCESS);
ret = sm_pmfi_setmaclist(pmss_ctx, PM_SMST_MAX + 1, PMM_SEID, PMM_END);
SM_TEST_RET(ret != SM_SUCCESS);
ret = sm_pmfi_setmaclist(pmss_ctx, PM_SMST_RCPT,
PMM_MAIL_TAID,
PMM_MAIL_TAID,
PMM_MAIL_TAID,
PMM_MAIL_TAID,
PMM_MAIL_TAID,
PMM_MAIL_TAID,
PMM_MAIL_TAID,
PMM_MAIL_TAID,
PMM_END);
SM_TEST_RET(ret != SM_SUCCESS);
ret = sm_pmfi_getmac(pmse_ctx, PMM_SRVHOSTNAME, &value);
SM_TEST(ret != SM_SUCCESS);
ret = sm_pmfi_getmac(pmse_ctx, PMM_AUTH_TYPE, &value);
SM_TEST(ret == SM_SUCCESS);
SM_TEST(value == NULL);
#define MAC_0 "mac_0"
ret = sm_str_scat(macs[0], MAC_0);
SM_TEST_RET(ret == SM_SUCCESS);
#define MAC_1 "mac_1"
ret = sm_str_scat(macs[1], MAC_1);
SM_TEST_RET(ret == SM_SUCCESS);
ret = sm_pmilt_setmacro(pmse_ctx, PM_SMST_MAIL, PMM_AUTH_TYPE, macs[0]);
SM_TEST_RET(ret == SM_SUCCESS);
ret = sm_pmilt_setmacro(pmse_ctx, PM_SMST_MAIL, PMM_SRVHOSTNAME, macs[1]);
SM_TEST(ret != SM_SUCCESS);
ret = sm_pmfi_getmac(pmse_ctx, PMM_SRVHOSTNAME, &value);
SM_TEST(ret != SM_SUCCESS);
ret = sm_pmfi_getmac(pmse_ctx, PMM_AUTH_TYPE, &value);
SM_TEST(ret == SM_SUCCESS);
SM_TEST_RET(value != NULL);
SM_TEST(strcmp(value, MAC_0) == 0);
ret = sm_pmse_free(pmss_ctx, pmse_ctx);
SM_TEST(ret == SM_SUCCESS);
ret = sm_pmss_free(pmss_ctx);
SM_TEST(ret == SM_SUCCESS);
return;
}
/*
** MAIN -- PMILTER test server
**
** Parameters:
** argc -- number of arguments
** argv -- vector of arguments
**
** Returns:
** exit code
*/
int
main(int argc, char *argv[])
{
sm_ret_T ret;
int c;
pmg_ctx_P pmg_ctx;
char *prg;
prg = argv[0];
pmg_ctx = NULL;
if (getuid() == 0 || geteuid() == 0)
{
sm_io_fprintf(smioerr,
"%s: ERROR: do not run this as super-user!\n",
prg);
exit(EX_USAGE);
}
while ((c = getopt(argc, argv, "d:f:r:")) != -1)
{
switch (c)
{
case 'd':
#if PMILTER_DEBUG
pm_debug = atoi(optarg);
#endif
break;
default:
usage(prg);
break;
}
}
ret = sm_pmfi_init(&pmg_ctx);
if (sm_is_err(ret))
{
sm_io_fprintf(smioerr, "sev=ERROR, sm_pmfi_init=%x\n", ret);
goto error;
}
sm_test_begin(argc, argv, "test pm mac 0");
argc -= optind;
argv += optind;
test_macros(pmg_ctx);
return sm_test_end();
error:
/* select an appropriate error here... */
return sm_error_value(ret);
}
#else /* MTA_USE_PMILTER */
int
main(int argc, char *argv[])
{
return 0;
}
#endif /* MTA_USE_PMILTER */
syntax highlighted by Code2HTML, v. 0.9.1