From 8c19b754f9ff8b87a69c6536083ebed3ec81e311 Mon Sep 17 00:00:00 2001 From: Harald Radi Date: Sun, 1 Dec 2002 16:37:59 +0000 Subject: [PATCH] first working version --- sapi/milter/php_milter.c | 213 +++++++++++++++++++-------------------- 1 file changed, 106 insertions(+), 107 deletions(-) diff --git a/sapi/milter/php_milter.c b/sapi/milter/php_milter.c index 12d6b7c52f..df207b5d7a 100644 --- a/sapi/milter/php_milter.c +++ b/sapi/milter/php_milter.c @@ -73,7 +73,7 @@ extern int ap_php_optind; * globals */ static int flag_debug=0; -static zend_file_handle file_handle; +static char *filename; /* per thread */ ZEND_BEGIN_MODULE_GLOBALS(milter) @@ -89,7 +89,8 @@ ZEND_DECLARE_MODULE_GLOBALS(milter) /* connection info filter */ static sfsistat mlfi_connect(SMFICTX *ctx, char *hostname, _SOCK_ADDR *hostaddr) { - zval *function_name, *retval, *param[1]; + zend_file_handle file_handle; + zval function_name, retval, *param[1]; TSRMLS_FETCH(); /* set the milter context for possible use in API functions */ @@ -106,19 +107,26 @@ static sfsistat mlfi_connect(SMFICTX *ctx, char *hostname, _SOCK_ADDR *hostaddr) SG(headers_sent) = 1; SG(request_info).no_headers = 1; - php_execute_script(&file_handle TSRMLS_CC); + file_handle.type = ZEND_HANDLE_FILENAME; + file_handle.filename = filename; + file_handle.free_filename = 0; + file_handle.opened_path = NULL; + php_execute_script(&file_handle TSRMLS_CC); + /* call userland */ - INIT_PZVAL(function_name); + INIT_ZVAL(function_name); + + ALLOC_ZVAL(param[0]); INIT_PZVAL(param[0]); - ZVAL_STRING(function_name, "milter_connect", 1); + ZVAL_STRING(&function_name, "milter_connect", 0); ZVAL_STRING(param[0], hostname, 1); - call_user_function(CG(function_table), NULL, function_name, retval, 1, param TSRMLS_CC); + call_user_function(CG(function_table), NULL, &function_name, &retval, 1, param TSRMLS_CC); - if (Z_TYPE_P(retval) == IS_LONG) { - return Z_LVAL_P(retval); + if (Z_TYPE(retval) == IS_LONG) { + return Z_LVAL(retval); } else { return SMFIS_CONTINUE; } @@ -127,23 +135,27 @@ static sfsistat mlfi_connect(SMFICTX *ctx, char *hostname, _SOCK_ADDR *hostaddr) /* SMTP HELO command filter */ static sfsistat mlfi_helo(SMFICTX *ctx, char *helohost) { - zval *function_name, *retval, *param[1]; + zval function_name, retval, *param[1]; TSRMLS_FETCH(); /* set the milter context for possible use in API functions */ MG(ctx) = ctx; /* call userland */ - INIT_PZVAL(function_name); + INIT_ZVAL(function_name); + + ALLOC_ZVAL(param[0]); INIT_PZVAL(param[0]); - ZVAL_STRING(function_name, "milter_helo", 1); + ZVAL_STRING(&function_name, "milter_helo", 0); ZVAL_STRING(param[0], helohost, 1); - call_user_function(CG(function_table), NULL, function_name, retval, 1, param TSRMLS_CC); + call_user_function(CG(function_table), NULL, &function_name, &retval, 1, param TSRMLS_CC); + + FREE_ZVAL(param[0]); - if (Z_TYPE_P(retval) == IS_LONG) { - return Z_LVAL_P(retval); + if (Z_TYPE(retval) == IS_LONG) { + return Z_LVAL(retval); } else { return SMFIS_CONTINUE; } @@ -152,17 +164,19 @@ static sfsistat mlfi_helo(SMFICTX *ctx, char *helohost) /* envelope sender filter */ static sfsistat mlfi_envfrom(SMFICTX *ctx, char **argv) { - zval *function_name, *retval, *param[1]; + zval function_name, retval, *param[1]; TSRMLS_FETCH(); /* set the milter context for possible use in API functions */ MG(ctx) = ctx; /* call userland */ - INIT_PZVAL(function_name); + INIT_ZVAL(function_name); + + ALLOC_ZVAL(param[0]); INIT_PZVAL(param[0]); - ZVAL_STRING(function_name, "milter_envelope_from", 1); + ZVAL_STRING(&function_name, "milter_envelope_from", 0); array_init(param[0]); while (*argv) { @@ -170,10 +184,12 @@ static sfsistat mlfi_envfrom(SMFICTX *ctx, char **argv) argv++; } - call_user_function(CG(function_table), NULL, function_name, retval, 1, param TSRMLS_CC); + call_user_function(CG(function_table), NULL, &function_name, &retval, 1, param TSRMLS_CC); - if (Z_TYPE_P(retval) == IS_LONG) { - return Z_LVAL_P(retval); + FREE_ZVAL(param[0]); + + if (Z_TYPE(retval) == IS_LONG) { + return Z_LVAL(retval); } else { return SMFIS_CONTINUE; } @@ -182,17 +198,19 @@ static sfsistat mlfi_envfrom(SMFICTX *ctx, char **argv) /* envelope recipient filter */ static sfsistat mlfi_envrcpt(SMFICTX *ctx, char **argv) { - zval *function_name, *retval, *param[1]; + zval function_name, retval, *param[1]; TSRMLS_FETCH(); /* set the milter context for possible use in API functions */ MG(ctx) = ctx; /* call userland */ - INIT_PZVAL(function_name); + INIT_ZVAL(function_name); + + ALLOC_ZVAL(param[0]); INIT_PZVAL(param[0]); - ZVAL_STRING(function_name, "milter_envelope_recipient", 1); + ZVAL_STRING(&function_name, "milter_envelope_recipient", 0); array_init(param[0]); while (*argv) { @@ -200,10 +218,12 @@ static sfsistat mlfi_envrcpt(SMFICTX *ctx, char **argv) argv++; } - call_user_function(CG(function_table), NULL, function_name, retval, 1, param TSRMLS_CC); + call_user_function(CG(function_table), NULL, &function_name, &retval, 1, param TSRMLS_CC); - if (Z_TYPE_P(retval) == IS_LONG) { - return Z_LVAL_P(retval); + FREE_ZVAL(param[0]); + + if (Z_TYPE(retval) == IS_LONG) { + return Z_LVAL(retval); } else { return SMFIS_CONTINUE; } @@ -212,25 +232,31 @@ static sfsistat mlfi_envrcpt(SMFICTX *ctx, char **argv) /* header filter */ static sfsistat mlfi_header(SMFICTX *ctx, char *headerf, char *headerv) { - zval *function_name, *retval, *param[2]; + zval function_name, retval, *param[2]; TSRMLS_FETCH(); /* set the milter context for possible use in API functions */ MG(ctx) = ctx; /* call userland */ - INIT_PZVAL(function_name); + INIT_ZVAL(function_name); + + ALLOC_ZVAL(param[0]); + ALLOC_ZVAL(param[1]); INIT_PZVAL(param[0]); INIT_PZVAL(param[1]); - ZVAL_STRING(function_name, "milter_header", 1); + ZVAL_STRING(&function_name, "milter_header", 0); ZVAL_STRING(param[0], headerf, 1); ZVAL_STRING(param[1], headerv, 1); - call_user_function(CG(function_table), NULL, function_name, retval, 2, param TSRMLS_CC); + call_user_function(CG(function_table), NULL, &function_name, &retval, 2, param TSRMLS_CC); - if (Z_TYPE_P(retval) == IS_LONG) { - return Z_LVAL_P(retval); + FREE_ZVAL(param[0]); + FREE_ZVAL(param[1]); + + if (Z_TYPE(retval) == IS_LONG) { + return Z_LVAL(retval); } else { return SMFIS_CONTINUE; } @@ -239,19 +265,20 @@ static sfsistat mlfi_header(SMFICTX *ctx, char *headerf, char *headerv) /* end of header */ static sfsistat mlfi_eoh(SMFICTX *ctx) { - zval *function_name, *retval; + zval function_name, retval; TSRMLS_FETCH(); /* set the milter context for possible use in API functions */ MG(ctx) = ctx; /* call userland */ - INIT_PZVAL(function_name); - ZVAL_STRING(function_name, "milter_eoh", 1); - call_user_function(CG(function_table), NULL, function_name, retval, 0, NULL TSRMLS_CC); + INIT_ZVAL(function_name); + ZVAL_STRING(&function_name, "milter_eoh", 0); - if (Z_TYPE_P(retval) == IS_LONG) { - return Z_LVAL_P(retval); + call_user_function(CG(function_table), NULL, &function_name, &retval, 0, NULL TSRMLS_CC); + + if (Z_TYPE(retval) == IS_LONG) { + return Z_LVAL(retval); } else { return SMFIS_CONTINUE; } @@ -260,23 +287,27 @@ static sfsistat mlfi_eoh(SMFICTX *ctx) /* body block */ static sfsistat mlfi_body(SMFICTX *ctx, u_char *bodyp, size_t len) { - zval *function_name, *retval, *param[1];; + zval function_name, retval, *param[1]; TSRMLS_FETCH(); /* set the milter context for possible use in API functions */ MG(ctx) = ctx; /* call userland */ - INIT_PZVAL(function_name); + INIT_ZVAL(function_name); + + ALLOC_ZVAL(param[0]); INIT_PZVAL(param[0]); - ZVAL_STRING(function_name, "milter_body", 1); + ZVAL_STRING(&function_name, "milter_body", 0); ZVAL_STRINGL(param[0], bodyp, len, 1); - call_user_function(CG(function_table), NULL, function_name, retval, 1, param TSRMLS_CC); + call_user_function(CG(function_table), NULL, &function_name, &retval, 1, param TSRMLS_CC); - if (Z_TYPE_P(retval) == IS_LONG) { - return Z_LVAL_P(retval); + FREE_ZVAL(param[0]); + + if (Z_TYPE(retval) == IS_LONG) { + return Z_LVAL(retval); } else { return SMFIS_CONTINUE; } @@ -285,19 +316,19 @@ static sfsistat mlfi_body(SMFICTX *ctx, u_char *bodyp, size_t len) /* end of message */ static sfsistat mlfi_eom(SMFICTX *ctx) { - zval *function_name, *retval; + zval function_name, retval; TSRMLS_FETCH(); /* set the milter context for possible use in API functions */ MG(ctx) = ctx; - + /* call userland */ - INIT_PZVAL(function_name); - ZVAL_STRING(function_name, "milter_eom", 1); - call_user_function(CG(function_table), NULL, function_name, retval, 0, NULL TSRMLS_CC); + INIT_ZVAL(function_name); + ZVAL_STRING(&function_name, "milter_eom", 0); + call_user_function(CG(function_table), NULL, &function_name, &retval, 0, NULL TSRMLS_CC); - if (Z_TYPE_P(retval) == IS_LONG) { - return Z_LVAL_P(retval); + if (Z_TYPE(retval) == IS_LONG) { + return Z_LVAL(retval); } else { return SMFIS_CONTINUE; } @@ -306,19 +337,20 @@ static sfsistat mlfi_eom(SMFICTX *ctx) /* message aborted */ static sfsistat mlfi_abort(SMFICTX *ctx) { - zval *function_name, *retval; + zval function_name, retval; TSRMLS_FETCH(); /* set the milter context for possible use in API functions */ MG(ctx) = ctx; /* call userland */ - INIT_PZVAL(function_name); - ZVAL_STRING(function_name, "milter_abort", 1); - call_user_function(CG(function_table), NULL, function_name, retval, 0, NULL TSRMLS_CC); + INIT_ZVAL(function_name); + ZVAL_STRING(&function_name, "milter_abort", 0); + + call_user_function(CG(function_table), NULL, &function_name, &retval, 0, NULL TSRMLS_CC); - if (Z_TYPE_P(retval) == IS_LONG) { - return Z_LVAL_P(retval); + if (Z_TYPE(retval) == IS_LONG) { + return Z_LVAL(retval); } else { return SMFIS_CONTINUE; } @@ -328,22 +360,24 @@ static sfsistat mlfi_abort(SMFICTX *ctx) static sfsistat mlfi_close(SMFICTX *ctx) { int ret = SMFIS_CONTINUE; - zval *function_name, *retval; + zval function_name, retval; TSRMLS_FETCH(); /* set the milter context for possible use in API functions */ MG(ctx) = ctx; /* call userland */ - INIT_PZVAL(function_name); - ZVAL_STRING(function_name, "milter_close", 1); - call_user_function(CG(function_table), NULL, function_name, retval, 0, NULL TSRMLS_CC); + INIT_ZVAL(function_name); + ZVAL_STRING(&function_name, "milter_close", 0); + + call_user_function(CG(function_table), NULL, &function_name, &retval, 0, NULL TSRMLS_CC); - if (Z_TYPE_P(retval) == IS_LONG) { - ret = Z_LVAL_P(retval); + if (Z_TYPE(retval) == IS_LONG) { + ret = Z_LVAL(retval); } php_request_shutdown((void *) 0); + return ret; } @@ -603,6 +637,10 @@ static sapi_module_struct milter_sapi_module = { }; /* }}} */ +/**** +* ripped from cli, has to be cleaned up ! +*/ + /* {{{ php_milter_usage */ static void php_milter_usage(char *argv0) @@ -665,7 +703,6 @@ int main(int argc, char *argv[]) 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; @@ -761,7 +798,7 @@ int main(int argc, char *argv[]) break; case 'f': /* parse file */ - script_file = ap_php_optarg; + filename = ap_php_optarg; break; case 'h': /* help & quit */ @@ -817,51 +854,13 @@ int main(int argc, char *argv[]) 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]; + if (argc > ap_php_optind && !filename) { + filename=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; + // check if file exists, exit else + if (dofork) { switch(fork()) { case -1: /* Uh-oh, we have a problem forking. */ -- 2.40.0