summaryrefslogtreecommitdiff
path: root/sapi/milter
diff options
context:
space:
mode:
authorHarald Radi <phanto@php.net>2002-12-01 03:37:49 +0000
committerHarald Radi <phanto@php.net>2002-12-01 03:37:49 +0000
commit0244ca1d9795fef6b2f0ad62029ca37b466d1f10 (patch)
tree2bd35fd480799d46a50ca69d96e983c037249ad7 /sapi/milter
parent2b95b3c83ba2ab5c695b9bfef1054ec73b7b4ccc (diff)
downloadphp-git-0244ca1d9795fef6b2f0ad62029ca37b466d1f10.tar.gz
it finally compiles now
tests will follow tomorrow
Diffstat (limited to 'sapi/milter')
-rw-r--r--sapi/milter/Makefile.frag7
-rw-r--r--sapi/milter/TODO2
-rw-r--r--sapi/milter/config.m453
-rw-r--r--sapi/milter/getopt.c173
-rw-r--r--sapi/milter/php_milter.c66
5 files changed, 232 insertions, 69 deletions
diff --git a/sapi/milter/Makefile.frag b/sapi/milter/Makefile.frag
index efef1e9f85..8dbdf7a8fd 100644
--- a/sapi/milter/Makefile.frag
+++ b/sapi/milter/Makefile.frag
@@ -1,7 +1,2 @@
-$(SAPI_MILTER_PATH): $(PHP_GLOBAL_OBJS) $(PHP_MILTER_OBJS)
+$(SAPI_MILTER_PATH): $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS)
$(BUILD_MILTER)
-
-install-milter: $(SAPI_MILTER_PATH)
- @echo "Installing PHP Milter binary: $(INSTALL_ROOT)$(bindir)/"
- @$(INSTALL_CLI)
-
diff --git a/sapi/milter/TODO b/sapi/milter/TODO
index cd90239270..705a1b5903 100644
--- a/sapi/milter/TODO
+++ b/sapi/milter/TODO
@@ -1,5 +1,7 @@
add ini setting for smfi_settimeout()
set xxfi_flags via ini, SMFIF_CHGBODY can have a significant performance impact if set
+parse the file only once instead of per request
+search for libmilter
stdout to syslog
testing
documentation \ No newline at end of file
diff --git a/sapi/milter/config.m4 b/sapi/milter/config.m4
index 37f065153a..0e4c01c114 100644
--- a/sapi/milter/config.m4
+++ b/sapi/milter/config.m4
@@ -2,38 +2,31 @@ dnl
dnl $Id$
dnl
-AC_MSG_CHECKING(for milter support)
+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
+[ --with-milter=DIR Build PHP as Milter application],[
+ if test "$withval" = "yes"; then
+ MILTERPATH=/usr
+ else
+ MILTERPATH=$withval
+ fi
+
SAPI_MILTER_PATH=sapi/milter/php-milter
PHP_SUBST(SAPI_MILTER_PATH)
-
- PHP_SELECT_SAPI(php-milter, program, php_milter.c,,'$(SAPI_MILTER_PATH)')
+ PHP_BUILD_THREAD_SAFE
+ PHP_ADD_MAKEFILE_FRAGMENT($abs_srcdir/sapi/milter/Makefile.frag)
- 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
+ PHP_SELECT_SAPI(milter, program, php_milter.c getopt.c,,'$(SAPI_MILTER_PATH)')
+ PHP_ADD_LIBRARY_WITH_PATH(milter, "$MILTERPATH/lib",)
+
+ BUILD_MILTER="\$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS) \$(LDFLAGS) \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_SAPI_OBJS) \$(EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_MILTER_PATH)"
-dnl ## Local Variables:
-dnl ## tab-width: 4
-dnl ## End:
+ INSTALL_IT="\$(INSTALL) -m 0755 \$(SAPI_MILTER_PATH) \$(bindir)/php-milter"
+ RESULT=yes
+ PHP_SUBST(BUILD_MILTER)
+ PHP_SUBST(FASTCGI_LIBADD)
+ PHP_SUBST(EXT_PROGRAM_LDADD)
+],[
+ RESULT=no
+])
+AC_MSG_RESULT($RES \ No newline at end of file
diff --git a/sapi/milter/getopt.c b/sapi/milter/getopt.c
new file mode 100644
index 0000000000..f5874d577e
--- /dev/null
+++ b/sapi/milter/getopt.c
@@ -0,0 +1,173 @@
+/* Borrowed from Apache NT Port */
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <stdlib.h>
+#include "php_getopt.h"
+#define OPTERRCOLON (1)
+#define OPTERRNF (2)
+#define OPTERRARG (3)
+
+
+char *ap_php_optarg;
+int ap_php_optind = 1;
+static int ap_php_opterr = 1;
+
+static int
+ap_php_optiserr(int argc, char * const *argv, int oint, const char *optstr,
+ int optchr, int err)
+{
+ if (ap_php_opterr)
+ {
+ fprintf(stderr, "Error in argument %d, char %d: ", oint, optchr+1);
+ switch(err)
+ {
+ case OPTERRCOLON:
+ fprintf(stderr, ": in flags\n");
+ break;
+ case OPTERRNF:
+ fprintf(stderr, "option not found %c\n", argv[oint][optchr]);
+ break;
+ case OPTERRARG:
+ fprintf(stderr, "no argument for option %c\n", argv[oint][optchr]);
+ break;
+ default:
+ fprintf(stderr, "unknown\n");
+ break;
+ }
+ }
+ return('?');
+}
+
+int ap_php_getopt(int argc, char* const *argv, const char *optstr)
+{
+ static int optchr = 0;
+ static int dash = 0; /* have already seen the - */
+
+ char *cp;
+
+ if (ap_php_optind >= argc)
+ return(EOF);
+ if (!dash && (argv[ap_php_optind][0] != '-'))
+ return(EOF);
+ if (!dash && (argv[ap_php_optind][0] == '-') && !argv[ap_php_optind][1])
+ {
+ /*
+ * use to specify stdin. Need to let pgm process this and
+ * the following args
+ */
+ return(EOF);
+ }
+ if ((argv[ap_php_optind][0] == '-') && (argv[ap_php_optind][1] == '-'))
+ {
+ /* -- indicates end of args */
+ ap_php_optind++;
+ return(EOF);
+ }
+ if (!dash)
+ {
+ assert((argv[ap_php_optind][0] == '-') && argv[ap_php_optind][1]);
+ dash = 1;
+ optchr = 1;
+ }
+
+ /* Check if the guy tries to do a -: kind of flag */
+ assert(dash);
+ if (argv[ap_php_optind][optchr] == ':')
+ {
+ dash = 0;
+ ap_php_optind++;
+ return(ap_php_optiserr(argc, argv, ap_php_optind-1, optstr, optchr, OPTERRCOLON));
+ }
+ if (!(cp = strchr(optstr, argv[ap_php_optind][optchr])))
+ {
+ int errind = ap_php_optind;
+ int errchr = optchr;
+
+ if (!argv[ap_php_optind][optchr+1])
+ {
+ dash = 0;
+ ap_php_optind++;
+ }
+ else
+ optchr++;
+ return(ap_php_optiserr(argc, argv, errind, optstr, errchr, OPTERRNF));
+ }
+ if (cp[1] == ':')
+ {
+ /* Check for cases where the value of the argument
+ is in the form -<arg> <val> or in the form -<arg><val> */
+ dash = 0;
+ if(!argv[ap_php_optind][2]) {
+ ap_php_optind++;
+ if (ap_php_optind == argc)
+ return(ap_php_optiserr(argc, argv, ap_php_optind-1, optstr, optchr, OPTERRARG));
+ ap_php_optarg = argv[ap_php_optind++];
+ }
+ else
+ {
+ ap_php_optarg = &argv[ap_php_optind][2];
+ ap_php_optind++;
+ }
+ return(*cp);
+ }
+ else
+ {
+ if (!argv[ap_php_optind][optchr+1])
+ {
+ dash = 0;
+ ap_php_optind++;
+ }
+ else
+ optchr++;
+ return(*cp);
+ }
+ assert(0);
+ return(0); /* never reached */
+}
+
+#ifdef TESTGETOPT
+int
+ main (int argc, char **argv)
+ {
+ int c;
+ extern char *ap_php_optarg;
+ extern int ap_php_optind;
+ int aflg = 0;
+ int bflg = 0;
+ int errflg = 0;
+ char *ofile = NULL;
+
+ while ((c = ap_php_getopt(argc, argv, "abo:")) != EOF)
+ switch (c) {
+ case 'a':
+ if (bflg)
+ errflg++;
+ else
+ aflg++;
+ break;
+ case 'b':
+ if (aflg)
+ errflg++;
+ else
+ bflg++;
+ break;
+ case 'o':
+ ofile = ap_php_optarg;
+ (void)printf("ofile = %s\n", ofile);
+ break;
+ case '?':
+ errflg++;
+ }
+ if (errflg) {
+ (void)fprintf(stderr,
+ "usage: cmd [-a|-b] [-o <filename>] files...\n");
+ exit (2);
+ }
+ for ( ; ap_php_optind < argc; ap_php_optind++)
+ (void)printf("%s\n", argv[ap_php_optind]);
+ return 0;
+ }
+
+#endif /* TESTGETOPT */
diff --git a/sapi/milter/php_milter.c b/sapi/milter/php_milter.c
index 152407e861..12d6b7c52f 100644
--- a/sapi/milter/php_milter.c
+++ b/sapi/milter/php_milter.c
@@ -109,8 +109,8 @@ static sfsistat mlfi_connect(SMFICTX *ctx, char *hostname, _SOCK_ADDR *hostaddr)
php_execute_script(&file_handle TSRMLS_CC);
/* call userland */
- ZVAL_INIT(function_name);
- ZVAL_INIT(param[0]);
+ INIT_PZVAL(function_name);
+ INIT_PZVAL(param[0]);
ZVAL_STRING(function_name, "milter_connect", 1);
ZVAL_STRING(param[0], hostname, 1);
@@ -118,7 +118,7 @@ static sfsistat mlfi_connect(SMFICTX *ctx, char *hostname, _SOCK_ADDR *hostaddr)
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);
+ return Z_LVAL_P(retval);
} else {
return SMFIS_CONTINUE;
}
@@ -134,8 +134,8 @@ static sfsistat mlfi_helo(SMFICTX *ctx, char *helohost)
MG(ctx) = ctx;
/* call userland */
- ZVAL_INIT(function_name);
- ZVAL_INIT(param[0]);
+ INIT_PZVAL(function_name);
+ INIT_PZVAL(param[0]);
ZVAL_STRING(function_name, "milter_helo", 1);
ZVAL_STRING(param[0], helohost, 1);
@@ -143,7 +143,7 @@ static sfsistat mlfi_helo(SMFICTX *ctx, char *helohost)
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);
+ return Z_LVAL_P(retval);
} else {
return SMFIS_CONTINUE;
}
@@ -159,8 +159,8 @@ static sfsistat mlfi_envfrom(SMFICTX *ctx, char **argv)
MG(ctx) = ctx;
/* call userland */
- ZVAL_INIT(function_name);
- ZVAL_INIT(param[0]);
+ INIT_PZVAL(function_name);
+ INIT_PZVAL(param[0]);
ZVAL_STRING(function_name, "milter_envelope_from", 1);
array_init(param[0]);
@@ -173,7 +173,7 @@ static sfsistat mlfi_envfrom(SMFICTX *ctx, char **argv)
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);
+ return Z_LVAL_P(retval);
} else {
return SMFIS_CONTINUE;
}
@@ -189,8 +189,8 @@ static sfsistat mlfi_envrcpt(SMFICTX *ctx, char **argv)
MG(ctx) = ctx;
/* call userland */
- ZVAL_INIT(function_name);
- ZVAL_INIT(param[0]);
+ INIT_PZVAL(function_name);
+ INIT_PZVAL(param[0]);
ZVAL_STRING(function_name, "milter_envelope_recipient", 1);
array_init(param[0]);
@@ -203,7 +203,7 @@ static sfsistat mlfi_envrcpt(SMFICTX *ctx, char **argv)
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);
+ return Z_LVAL_P(retval);
} else {
return SMFIS_CONTINUE;
}
@@ -219,9 +219,9 @@ static sfsistat mlfi_header(SMFICTX *ctx, char *headerf, char *headerv)
MG(ctx) = ctx;
/* call userland */
- ZVAL_INIT(function_name);
- ZVAL_INIT(param[0]);
- ZVAL_INIT(param[1]);
+ INIT_PZVAL(function_name);
+ INIT_PZVAL(param[0]);
+ INIT_PZVAL(param[1]);
ZVAL_STRING(function_name, "milter_header", 1);
ZVAL_STRING(param[0], headerf, 1);
@@ -230,7 +230,7 @@ static sfsistat mlfi_header(SMFICTX *ctx, char *headerf, char *headerv)
call_user_function(CG(function_table), NULL, function_name, retval, 2, param TSRMLS_CC);
if (Z_TYPE_P(retval) == IS_LONG) {
- return Z_LONG_P(retval);
+ return Z_LVAL_P(retval);
} else {
return SMFIS_CONTINUE;
}
@@ -246,12 +246,12 @@ static sfsistat mlfi_eoh(SMFICTX *ctx)
MG(ctx) = ctx;
/* call userland */
- ZVAL_INIT(function_name);
+ 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);
if (Z_TYPE_P(retval) == IS_LONG) {
- return Z_LONG_P(retval);
+ return Z_LVAL_P(retval);
} else {
return SMFIS_CONTINUE;
}
@@ -267,8 +267,8 @@ static sfsistat mlfi_body(SMFICTX *ctx, u_char *bodyp, size_t len)
MG(ctx) = ctx;
/* call userland */
- ZVAL_INIT(function_name);
- ZVAL_INIT(param[0]);
+ INIT_PZVAL(function_name);
+ INIT_PZVAL(param[0]);
ZVAL_STRING(function_name, "milter_body", 1);
ZVAL_STRINGL(param[0], bodyp, len, 1);
@@ -276,7 +276,7 @@ static sfsistat mlfi_body(SMFICTX *ctx, u_char *bodyp, size_t len)
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);
+ return Z_LVAL_P(retval);
} else {
return SMFIS_CONTINUE;
}
@@ -292,12 +292,12 @@ static sfsistat mlfi_eom(SMFICTX *ctx)
MG(ctx) = ctx;
/* call userland */
- ZVAL_INIT(function_name);
+ 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);
if (Z_TYPE_P(retval) == IS_LONG) {
- return Z_LONG_P(retval);
+ return Z_LVAL_P(retval);
} else {
return SMFIS_CONTINUE;
}
@@ -313,12 +313,12 @@ static sfsistat mlfi_abort(SMFICTX *ctx)
MG(ctx) = ctx;
/* call userland */
- ZVAL_INIT(function_name);
+ 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);
if (Z_TYPE_P(retval) == IS_LONG) {
- return Z_LONG_P(retval);
+ return Z_LVAL_P(retval);
} else {
return SMFIS_CONTINUE;
}
@@ -335,12 +335,12 @@ static sfsistat mlfi_close(SMFICTX *ctx)
MG(ctx) = ctx;
/* call userland */
- ZVAL_INIT(function_name);
+ 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);
if (Z_TYPE_P(retval) == IS_LONG) {
- ret = Z_LONG_P(retval);
+ ret = Z_LVAL_P(retval);
}
php_request_shutdown((void *) 0);
@@ -627,7 +627,7 @@ static void php_milter_usage(char *argv0)
" -e Generate extended information for debugger/profiler\n"
" -f <file> Parse <file>.\n"
" -h This help\n"
- " -p path to create socket\n"
+ " -p <socket> 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"
@@ -671,8 +671,7 @@ int main(int argc, char *argv[])
char *param_error=NULL;
/* end of temporary locals */
- TSRMLS_FETCH();
-
+ void ***tsrm_ls;
#ifdef HAVE_SIGNAL_H
#if defined(SIGPIPE) && defined(SIG_IGN)
@@ -704,6 +703,8 @@ int main(int argc, char *argv[])
milter_sapi_module.executable_location = argv[0];
+ tsrm_ls = ts_resource(0);
+
sapi_module.startup(&milter_sapi_module);
zend_first_try {
@@ -774,7 +775,7 @@ int main(int argc, char *argv[])
break;
case 'p': /* socket */
- sock = strdup(optarg);
+ sock = strdup(ap_php_optarg);
break;
case 'v': /* show php version & quit */
@@ -794,7 +795,7 @@ int main(int argc, char *argv[])
break;
case 'V': /* verbose */
- flag_debug = atoi(optarg);
+ flag_debug = atoi(ap_php_optarg);
break;
case 'z': /* load extension file */
@@ -886,7 +887,6 @@ int main(int argc, char *argv[])
fprintf(stderr, "smfi_register failed\n");
// exit_status = EX_UNAVAILABLE;
} else {
- debug(1, "smfi_register succeeded");
exit_status = smfi_main();
}