phanto          Sat Nov 30 19:21:10 2002 EDT

  Added files:                 
    /php4/sapi/milter   config.m4 CREDITS Makefile.frag php_milter.c 
  Log:
  Sendmail Milter SAPI
  initial version
  
  
Index: php4/sapi/milter/config.m4
+++ php4/sapi/milter/config.m4
dnl
dnl $Id: config.m4,v 1.1 2002/12/01 00:21:10 phanto Exp $
dnl

AC_MSG_CHECKING(for milter support)
AC_ARG_WITH(milter,
[  --with-milter=DIR       Build PHP as a Milter for use with Sendmail.],[
  PHP_MILTER=$withval
],[
  PHP_MILTER=no
])
AC_MSG_RESULT($PHP_MILTER)

if test "$PHP_MILTER" != "no"; then
  PHP_ADD_MAKEFILE_FRAGMENT($abs_srcdir/sapi/milter/Makefile.frag)
  PHP_BUILD_THREAD_SAFE
  SAPI_MILTER_PATH=sapi/milter/php-milter
  PHP_SUBST(SAPI_MILTER_PATH)

  PHP_SELECT_SAPI(php-milter, program, php_milter.c,,'$(SAPI_MILTER_PATH)')
  
  case $host_alias in
    *darwin*)
      BUILD_MILTER="\$(CC) \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS) 
\$(LDFLAGS) \$(NATIVE_RPATHS) \$(PHP_GLOBAL_OBJS:.lo=.o) \$(PHP_MILTER_OBJS:.lo=.o) 
\$(PHP_FRAMEWORKS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_MILTER_PATH)"
    ;;
    *)
      BUILD_MILTER="\$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) 
\$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS) \$(LDFLAGS) \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) 
\$(PHP_MILTER_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_MILTER_PATH)"
    ;;
  esac
  INSTALL_MILTER="\$(INSTALL) -m 0755 \$(SAPI_MILTER_PATH) 
\$(INSTALL_ROOT)\$(bindir)/php-milter"
  PHP_SUBST(BUILD_MILTER)
  PHP_SUBST(INSTALL_MILTER)
else
  PHP_DISABLE_MILTER
fi

dnl ## Local Variables:
dnl ## tab-width: 4
dnl ## End:

Index: php4/sapi/milter/Makefile.frag
+++ php4/sapi/milter/Makefile.frag
$(SAPI_MILTER_PATH): $(PHP_GLOBAL_OBJS) $(PHP_MILTER_OBJS)
        $(BUILD_MILTER)

install-milter: $(SAPI_MILTER_PATH)
        @echo "Installing PHP Milter binary:        $(INSTALL_ROOT)$(bindir)/"
        @$(INSTALL_CLI)


Index: php4/sapi/milter/php_milter.c
+++ php4/sapi/milter/php_milter.c
/*
   +----------------------------------------------------------------------+
   | PHP Version 4                                                        |
   +----------------------------------------------------------------------+
   | Copyright (c) 1997-2002 The PHP Group                                |
   +----------------------------------------------------------------------+
   | This source file is subject to version 2.02 of the PHP license,      |
   | that is bundled with this package in the file LICENSE, and is        |
   | available at through the world-wide-web at                           |
   | http://www.php.net/license/2_02.txt.                                 |
   | If you did not receive a copy of the PHP license and are unable to   |
   | obtain it through the world-wide-web, please send a note to          |
   | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
   +----------------------------------------------------------------------+
   | Author: Harald Radi <[EMAIL PROTECTED]                                  |
   |         Parts based on CGI SAPI Module by                            |
   |         Rasmus Lerdorf, Stig Bakken and Zeev Suraski                 |
   +----------------------------------------------------------------------+
*/


#include "php.h"
#include "php_globals.h"
#include "php_variables.h"
#include "zend_modules.h"

#include "SAPI.h"

#include <stdio.h>
#include "php.h"
#if HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#if HAVE_SIGNAL_H
#include <signal.h>
#endif
#if HAVE_SETLOCALE
#include <locale.h>
#endif
#include "zend.h"
#include "zend_extensions.h"
#include "php_ini.h"
#include "php_globals.h"
#include "php_main.h"
#include "fopen_wrappers.h"
#include "ext/standard/php_standard.h"

#ifdef __riscos__
#include <unixlib/local.h>
#endif

#include "zend_compile.h"
#include "zend_execute.h"
#include "zend_highlight.h"
#include "zend_indent.h"

#include "libmilter/mfapi.h"

#define OPTSTRING "ac:d:Def:hnp:vVz:?"
#define MG(v) TSRMG(milter_globals_id, milter_globals *, v)

extern char *ap_php_optarg;
extern int ap_php_optind;

/*********************
 * globals
 */
static int milter_globals_id;
static int flag_debug=0;
static zend_file_handle file_handle;

/* per thread */
typedef struct _milter_globals {
        SMFICTX *ctx;
} milter_globals;

/*********************
 * Milter callbacks
 */

/* connection info filter */
static sfsistat mlfi_connect(SMFICTX *ctx, char *hostname, _SOCK_ADDR *hostaddr)
{
        zval *function_name, *retval, *host, **params[1];
        TSRMLS_FETCH();

        /* set the milter context for possible use in API functions */
        MG(ctx) = ctx;

        if (php_request_startup(TSRMLS_C)==FAILURE) {
                SG(headers_sent) = 1;
                SG(request_info).no_headers = 1;
                php_request_shutdown((void *) 0);

                return SMFIS_TEMPFAIL;
        }
        
        SG(headers_sent) = 1;
        SG(request_info).no_headers = 1;
                
        php_execute_script(&file_handle TSRMLS_CC);

        /* call userland */
        ZVAL_INIT(function_name);
        ZVAL_INIT(host);

        ZVAL_STRING(function_name, "milter_connect", 1);
        ZVAL_STRING(host, hostname, 1);

        params[0] = &host;

        call_user_function(CG(function_table), NULL, function_name, retval, 1, params 
TSRMLS_CC);

        if (Z_TYPE_P(retval) == IS_LONG) {
                return Z_LONG_P(retval);
        } else {
                return SMFIS_CONTINUE;
        }
}

/* SMTP HELO command filter */
static sfsistat mlfi_helo(SMFICTX *ctx, char *helohost)
{
        zval *function_name, *retval, *host, **params[1];
        TSRMLS_FETCH();

        /* set the milter context for possible use in API functions */
        MG(ctx) = ctx;
        
        /* call userland */
        ZVAL_INIT(function_name);
        ZVAL_INIT(host);

        ZVAL_STRING(function_name, "milter_helo", 1);
        ZVAL_STRING(host, helohost, 1);

        params[0] = &host;
        
        call_user_function(CG(function_table), NULL, function_name, retval, 1, param 
TSRMLS_CC);

        if (Z_TYPE_P(retval) == IS_LONG) {
                return Z_LONG_P(retval);
        } else {
                return SMFIS_CONTINUE;
        }
}
        
/* envelope sender filter */
static sfsistat mlfi_envfrom(SMFICTX *ctx, char **argv)
{
        zval *function_name, *retval;
        TSRMLS_FETCH();

        /* set the milter context for possible use in API functions */
        MG(ctx) = ctx;
        
        /* call userland */
        ZVAL_INIT(function_name);
        ZVAL_STRING(function_name, "milter_envelope_from", 1);
        call_user_function(CG(function_table), NULL, function_name, retval, 0, NULL 
TSRMLS_CC);

        if (Z_TYPE_P(retval) == IS_LONG) {
                return Z_LONG_P(retval);
        } else {
                return SMFIS_CONTINUE;
        }
}

/* envelope recipient filter */
static sfsistat mlfi_envrcpt(SMFICTX *ctx, char **argv)
{
        zval *function_name, *retval;
        TSRMLS_FETCH();

        /* set the milter context for possible use in API functions */
        MG(ctx) = ctx;
        
        /* call userland */
        ZVAL_INIT(function_name);
        ZVAL_STRING(function_name, "milter_envelope_recipient", 1);
        call_user_function(CG(function_table), NULL, function_name, retval, 0, NULL 
TSRMLS_CC);

        if (Z_TYPE_P(retval) == IS_LONG) {
                return Z_LONG_P(retval);
        } else {
                return SMFIS_CONTINUE;
        }
}

/* header filter */
static sfsistat mlfi_header(SMFICTX *ctx, char *headerf, char *headerv)
{
        zval *function_name, *retval;
        TSRMLS_FETCH();

        /* set the milter context for possible use in API functions */
        MG(ctx) = ctx;
        
        /* call userland */
        ZVAL_INIT(function_name);
        ZVAL_STRING(function_name, "milter_header", 1);
        call_user_function(CG(function_table), NULL, function_name, retval, 0, NULL 
TSRMLS_CC);

        if (Z_TYPE_P(retval) == IS_LONG) {
                return Z_LONG_P(retval);
        } else {
                return SMFIS_CONTINUE;
        }
}

/* end of header */
static sfsistat mlfi_eoh(SMFICTX *ctx)
{
        zval *function_name, *retval;
        TSRMLS_FETCH();

        /* set the milter context for possible use in API functions */
        MG(ctx) = ctx;
        
        /* call userland */
        ZVAL_INIT(function_name);
        ZVAL_STRING(function_name, "milter_eoh", 1);
        call_user_function(CG(function_table), NULL, function_name, retval, 0, NULL 
TSRMLS_CC);

        if (Z_TYPE_P(retval) == IS_LONG) {
                return Z_LONG_P(retval);
        } else {
                return SMFIS_CONTINUE;
        }
}

/* body block */
static sfsistat mlfi_body(SMFICTX *ctx, u_char *bodyp, size_t len)
{
        zval *function_name, *retval;
        TSRMLS_FETCH();

        /* set the milter context for possible use in API functions */
        MG(ctx) = ctx;
        
        /* call userland */
        ZVAL_INIT(function_name);
        ZVAL_STRING(function_name, "milter_body", 1);
        call_user_function(CG(function_table), NULL, function_name, retval, 0, NULL 
TSRMLS_CC);

        if (Z_TYPE_P(retval) == IS_LONG) {
                return Z_LONG_P(retval);
        } else {
                return SMFIS_CONTINUE;
        }
}

/* end of message */
static sfsistat mlfi_eom(SMFICTX *ctx)
{
        zval *function_name, *retval;
        TSRMLS_FETCH();

        /* set the milter context for possible use in API functions */
        MG(ctx) = ctx;
        
        /* call userland */
        ZVAL_INIT(function_name);
        ZVAL_STRING(function_name, "milter_eom", 1);
        call_user_function(CG(function_table), NULL, function_name, retval, 0, NULL 
TSRMLS_CC);

        if (Z_TYPE_P(retval) == IS_LONG) {
                return Z_LONG_P(retval);
        } else {
                return SMFIS_CONTINUE;
        }
}

/* message aborted */
static sfsistat mlfi_abort(SMFICTX *ctx)
{
        zval *function_name, *retval;
        TSRMLS_FETCH();

        /* set the milter context for possible use in API functions */
        MG(ctx) = ctx;
        
        /* call userland */
        ZVAL_INIT(function_name);
        ZVAL_STRING(function_name, "milter_abort", 1);
        call_user_function(CG(function_table), NULL, function_name, retval, 0, NULL 
TSRMLS_CC);

        if (Z_TYPE_P(retval) == IS_LONG) {
                return Z_LONG_P(retval);
        } else {
                return SMFIS_CONTINUE;
        }
}

/* connection cleanup */
static sfsistat mlfi_close(SMFICTX *ctx)
{
        int ret = SMFIS_CONTINUE;
        zval *function_name, *retval;
        TSRMLS_FETCH();

        /* set the milter context for possible use in API functions */
        MG(ctx) = ctx;
        
        /* call userland */
        ZVAL_INIT(function_name);
        ZVAL_STRING(function_name, "milter_close", 1);
        call_user_function(CG(function_table), NULL, function_name, retval, 0, NULL 
TSRMLS_CC);

        if (Z_TYPE_P(retval) == IS_LONG) {
                ret = Z_LONG_P(retval);
        }
        
        php_request_shutdown((void *) 0);
        return ret;
}

/*********************
 * Milter entry struct
 */
struct smfiDesc smfilter = {
    "php-milter",       /* filter name */
    SMFI_VERSION,   /* version code -- leave untouched */
    SMFIF_ADDHDRS|SMFIF_CHGHDRS|SMFIF_CHGBODY|SMFIF_ADDRCPT|SMFIF_DELRCPT,  /* flags */
    mlfi_connect,       /* info filter callback */
    mlfi_helo,          /* HELO filter callback */
    mlfi_envfrom,       /* envelope filter callback */
    mlfi_envrcpt,       /* envelope recipient filter callback */
    mlfi_header,        /* header filter callback */
    mlfi_eoh,           /* end of header callback */
    mlfi_body,          /* body filter callback */
    mlfi_eom,           /* end of message callback */
    mlfi_abort,         /* message aborted callback */
    mlfi_close,         /* connection cleanup callback */
};

/*********************
 * PHP Milter API
 */
PHP_FUNCTION(smfi_getsymval)
{
        // smfi_getsymval();
}

PHP_FUNCTION(smfi_setreply)
{
        // smfi_setreply();
}

PHP_FUNCTION(smfi_addheader)
{
        // smfi_addheader();
}

PHP_FUNCTION(smfi_chgheader)
{
        // smfi_chgheader();
}

PHP_FUNCTION(smfi_addrcpt)
{
        // smfi_addrcpt();
}

PHP_FUNCTION(smfi_delrcpt)
{
        // smfi_delrcpt();
}

PHP_FUNCTION(smfi_replacebody)
{
        // smfi_replacebody();
}

PHP_MINIT_FUNCTION(milter)
{
        REGISTER_LONG_CONSTANT("SMFIS_CONTINUE",        SMFIS_CONTINUE, CONST_CS | 
CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("SMFIS_REJECT",          SMFIS_REJECT,   CONST_CS | 
CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("SMFIS_DISCARD",         SMFIS_DISCARD,  CONST_CS | 
CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("SMFIS_ACCEPT",          SMFIS_ACCEPT,   CONST_CS | 
CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("SMFIS_TEMPFAIL",        SMFIS_TEMPFAIL, CONST_CS | 
CONST_PERSISTENT);
}

PHP_MINFO_FUNCTION(milter)
{
        DISPLAY_INI_ENTRIES();
}


/**

/*********************
 * Milter function entry
 */
/* {{{ function_entry */
static function_entry milter_functions[] = {
        PHP_FE(smfi_getsymval, NULL)
        PHP_FE(smfi_setreply, NULL)
        PHP_FE(smfi_addheader, NULL)
        PHP_FE(smfi_chgheader, NULL)
        PHP_FE(smfi_addrcpt, NULL)
        PHP_FE(smfi_delrcpt, NULL)
        PHP_FE(smfi_replacebody, NULL)
        { NULL, NULL, NULL }
};
/* }}} */

/*********************
 * Milter module entry
 */
/* {{{ zend_module_entry */
static zend_module_entry php_milter_module = {
        STANDARD_MODULE_HEADER,
        "Milter",
        milter_functions,
        PHP_MINIT(milter),
        NULL,
        NULL,
        NULL,
        PHP_MINFO(milter),
        "0.1.0",
        STANDARD_MODULE_PROPERTIES
};

/*********************
 * Milter SAPI
 */

static int sapi_milter_ub_write(const char *str, uint str_length TSRMLS_DC)
{
        return str_length;
}

static void sapi_milter_flush(void *server_context)
{
}

static void sapi_milter_register_variables(zval *track_vars_array TSRMLS_DC)
{
        php_register_variable ("SERVER_SOFTWARE", "Sendmail Milter", track_vars_array 
TSRMLS_CC);
}

static int sapi_milter_post_read(char *buf, uint count_bytes TSRMLS_DC)
{
        return 0;
}

static char* sapi_milter_read_cookies(TSRMLS_D)
{
        return NULL;
}

static int sapi_milter_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC)
{
        return SAPI_HEADER_SENT_SUCCESSFULLY;
}


static int php_milter_startup(sapi_module_struct *sapi_module)
{
        if (php_module_startup(sapi_module, &php_milter_module, 1) == FAILURE) {
                return FAILURE;
        }
        return SUCCESS;
}


/* {{{ sapi_module_struct milter_sapi_module
 */
static sapi_module_struct milter_sapi_module = {
        "milter",                                               /* name */
        "Sendmail Milter SAPI",                 /* pretty name */

        php_milter_startup,                             /* startup */
        php_module_shutdown_wrapper,    /* shutdown */

        NULL,                                                   /* activate */
        NULL,                                                   /* deactivate */

        sapi_milter_ub_write,                   /* unbuffered write */
        sapi_milter_flush,                              /* flush */
        NULL,                                                   /* get uid */
        NULL,                                                   /* getenv */

        php_error,                                              /* error handler */

        NULL,                                                   /* header handler */
        sapi_milter_send_headers,               /* send headers handler */
        NULL,                                                   /* send header handler 
*/

        sapi_milter_post_read,                  /* read POST data */
        sapi_milter_read_cookies,               /* read Cookies */

        sapi_milter_register_variables, /* register server variables */
        NULL,                                                   /* Log message */

        NULL,                                                   /* Block interruptions 
*/
        NULL,                                                   /* Unblock 
interruptions */

        STANDARD_SAPI_MODULE_PROPERTIES
};
/* }}} */

/* {{{ php_milter_usage
 */
static void php_milter_usage(char *argv0)
{
        char *prog;

        prog = strrchr(argv0, '/');
        if (prog) {
                prog++;
        } else {
                prog = "php-milter";
        }

        printf(     "Usage: %s [options] [-f] <file> [args...]\n"
                    "       %s [options] -r <code> [args...]\n"
                    "       %s [options] [-- args...]\n"
                                "  -a               Run interactively\n"
                                "  -c <path>|<file> Look for php.ini file in this 
directory\n"
                                "  -n               No php.ini file will be used\n"
                                "  -d foo[=bar]     Define INI entry foo with value 
'bar'\n"
                                "  -D               run as daemon\n"
                                "  -e               Generate extended information for 
debugger/profiler\n"
                                "  -f <file>        Parse <file>.\n"
                                "  -h               This help\n"
                                "  -p               path to create socket\n"
                                "  -v               Version number\n"
                                "  -V <n>           set debug level to n (1 or 2).\n"
                                "  -z <file>        Load Zend extension <file>.\n"
                                "  args...          Arguments passed to script. Use -- 
args when first argument \n"
                                "                   starts with - or script is read 
from stdin\n"
                                , prog, prog, prog);
}
/* }}} */

static void define_command_line_ini_entry(char *arg)
{
        char *name, *value;

        name = arg;
        value = strchr(arg, '=');
        if (value) {
                *value = 0;
                value++;
        } else {
                value = "1";
        }
        zend_alter_ini_entry(name, strlen(name)+1, value, strlen(value), 
PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE);
}

/* {{{ main
 */
int main(int argc, char *argv[])
{
    char *sock = NULL;
        int dofork = 0;

        int exit_status = SUCCESS;
        int c;
/* temporary locals */
        int orig_optind=ap_php_optind;
        char *orig_optarg=ap_php_optarg;
        char *arg_free=NULL, **arg_excp=&arg_free;
        char *script_file=NULL;
        int interactive=0;
        char *exec_direct=NULL;
        char *param_error=NULL;
/* end of temporary locals */

        void ***tsrm_ls;


#ifdef HAVE_SIGNAL_H
#if defined(SIGPIPE) && defined(SIG_IGN)
        signal(SIGPIPE, SIG_IGN); /* ignore SIGPIPE in standalone mode so
                                                                that sockets created 
via fsockopen()
                                                                don't kill PHP if the 
remote site
                                                                closes it.  in 
apache|apxs mode apache
                                                                does that for us!  
[EMAIL PROTECTED]
                                                                20000419 */
#endif
#endif


        tsrm_startup(1, 1, 0, NULL);
        sapi_startup(&milter_sapi_module);
        
        while ((c=ap_php_getopt(argc, argv, OPTSTRING))!=-1) {
                switch (c) {
                case 'c':
                        milter_sapi_module.php_ini_path_override = 
strdup(ap_php_optarg);
                        break;
                case 'n':
                        milter_sapi_module.php_ini_ignore = 1;
                        break;
                }
        }
        ap_php_optind = orig_optind;
        ap_php_optarg = orig_optarg;

        milter_sapi_module.executable_location = argv[0];

        sapi_module.startup(&milter_sapi_module);

        tsrm_ls = ts_resource(0);

        zend_first_try {
                while ((c=ap_php_getopt(argc, argv, OPTSTRING))!=-1) {
                        switch (c) {
                        case '?':
                                php_output_startup();
                                php_output_activate(TSRMLS_C);
                                SG(headers_sent) = 1;
                                php_milter_usage(argv[0]);
                                php_end_ob_buffers(1 TSRMLS_CC);
                                exit(1);
                                break;
                        }
                }
                ap_php_optind = orig_optind;
                ap_php_optarg = orig_optarg;

        /* Set some CLI defaults */
                SG(options) |= SAPI_OPTION_NO_CHDIR;
                zend_alter_ini_entry("html_errors", 12, "0", 1, PHP_INI_SYSTEM, 
PHP_INI_STAGE_ACTIVATE);
                zend_alter_ini_entry("max_execution_time", 19, "0", 1, PHP_INI_SYSTEM, 
PHP_INI_STAGE_ACTIVATE);

                zend_uv.html_errors = 0; /* tell the engine we're in non-html mode */

                if (milter_sapi_module.php_ini_path_override && 
milter_sapi_module.php_ini_ignore) {
                        SG(headers_sent) = 1;
                        SG(request_info).no_headers = 1;
                        PUTS("You cannot use both -n and -c switch. Use -h for 
help.\n");
                        exit(1);
                }
        
                while ((c = ap_php_getopt(argc, argv, OPTSTRING)) != -1) {
                        switch (c) {

                        case 'a':       /* interactive mode */
                                printf("Interactive mode enabled\n\n");
                                interactive=1;
                                break;

                        case 'C': /* don't chdir to the script directory */
                                /* This is default so NOP */
                                break;
                        case 'd': /* define ini entries on command line */
                                define_command_line_ini_entry(ap_php_optarg);
                                break;

                        case 'D': /* daemon */
                                dofork = 1;
                                break;

                        case 'e': /* enable extended info output */
                                CG(extended_info) = 1;
                                break;

                        case 'f': /* parse file */
                                script_file = ap_php_optarg;
                                break;

                        case 'h': /* help & quit */
                        case '?':
                                php_output_startup();
                                php_output_activate(TSRMLS_C);
                                SG(headers_sent) = 1;
                                php_milter_usage(argv[0]);
                                php_end_ob_buffers(1 TSRMLS_CC);
                                exit(1);
                                break;

                        case 'p': /* socket */
                                sock = strdup(optarg);
                                break;

                        case 'v': /* show php version & quit */
                                if (php_request_startup(TSRMLS_C)==FAILURE) {
                                        zend_ini_deactivate(TSRMLS_C);
                                        php_module_shutdown(TSRMLS_C);
                                        sapi_shutdown();
                                        tsrm_shutdown();

                                        exit(1);
                                }
                                SG(headers_sent) = 1;
                                SG(request_info).no_headers = 1;
                                php_printf("PHP %s (%s) (built: %s %s)\nCopyright (c) 
1997-2002 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, 
get_zend_version());
                                php_end_ob_buffers(1 TSRMLS_CC);
                                exit(1);
                                break;

                        case 'V': /* verbose */
                                flag_debug = atoi(optarg);
                                break;

                        case 'z': /* load extension file */
                                zend_load_extension(ap_php_optarg);
                                break;

                        default:
                                break;
                        }
                }

                if (param_error) {
                        SG(headers_sent) = 1;
                        SG(request_info).no_headers = 1;
                        PUTS(param_error);
                        exit(1);
                }

                CG(interactive) = interactive;

                /* only set script_file if not set already and not in direct mode and 
not at end of parameter list */
                if (argc > ap_php_optind && !script_file && 
strcmp(argv[ap_php_optind-1],"--")) {
                        script_file=argv[ap_php_optind];
                        ap_php_optind++;
                }
                if (script_file) {
                        if (!(file_handle.handle.fp = VCWD_FOPEN(script_file, "rb"))) {
                                SG(headers_sent) = 1;
                                SG(request_info).no_headers = 1;
                                php_printf("Could not open input file: %s.\n", 
script_file);
                                
                                zend_ini_deactivate(TSRMLS_C);
                                php_module_shutdown(TSRMLS_C);
                                sapi_shutdown();
                                tsrm_shutdown();

                                exit(1);
                        }
                        file_handle.filename = script_file;
                        /* #!php support */
                        c = fgetc(file_handle.handle.fp);
                        if (c == '#') {
                                while (c != 10 && c != 13) {
                                        c = fgetc(file_handle.handle.fp);       /* 
skip to end of line */
                                }
                                CG(zend_lineno) = -2;
                        } else {
                                rewind(file_handle.handle.fp);
                        }
                } else {
                        file_handle.filename = "-";
                        file_handle.handle.fp = stdin;
                }
                file_handle.type = ZEND_HANDLE_FP;
                file_handle.opened_path = NULL;
                file_handle.free_filename = 0;

                /* before registering argv to modulule exchange the *new* argv[0] */
                /* we can achieve this without allocating more memory */
                SG(request_info).argc=argc-ap_php_optind+1;
                arg_excp = argv+ap_php_optind-1;
                arg_free = argv[ap_php_optind-1];
                SG(request_info).path_translated = file_handle.filename;
                argv[ap_php_optind-1] = file_handle.filename;
                SG(request_info).argv=argv+ap_php_optind-1;

                /* TSRM is used to allocate a per-thread structure */
                ts_allocate_id (&milter_globals_id, sizeof(milter_globals), NULL, 
NULL);

                if (dofork) {
                        switch(fork()) {
                                case -1: /* Uh-oh, we have a problem forking. */
                                        fprintf(stderr, "Uh-oh, couldn't fork!\n");
                                        exit(errno);
                                        break;
                                case 0: /* Child */
                                        break;
                                default: /* Parent */
                                        exit(0);
                        }
                }
                        
                {
                        struct stat junk;
                        if (stat(sock,&junk) == 0) unlink(sock);
                }

                openlog("php-milter", LOG_PID, LOG_MAIL);

                (void) smfi_setconn(sock);
                if (smfi_register(smfilter) == MI_FAILURE) {
                        fprintf(stderr, "smfi_register failed\n");
//                              exit_status = EX_UNAVAILABLE;
                } else {
                        debug(1, "smfi_register succeeded");
                        exit_status = smfi_main();
                }                       

                if (milter_sapi_module.php_ini_path_override) {
                        free(milter_sapi_module.php_ini_path_override);
                }

        } zend_catch {
                exit_status = EG(exit_status);
        } zend_end_try();

        php_module_shutdown(TSRMLS_C);
        sapi_shutdown();
        tsrm_shutdown();

        exit(exit_status);
}
/* }}} */

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim600: sw=4 ts=4 fdm=marker
 * vim<600: sw=4 ts=4
 */

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to