Hello, I have a simple Perl module (source code at the bottom), which sends a string to clients connecting to port 843.
It works ok, but I'd like to rewrite it in C because it seems to use 20m for this simple task at my CentOS 5.5/64 Linux with httpd-2.2.3-43 and mod_perl-2.0.4: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10697 apache 15 0 261m 20m 4480 S 0.0 0.5 0:07.19 httpd 10699 apache 15 0 261m 20m 4300 S 0.0 0.5 0:09.06 httpd ..... Unfortunately there aren't many example for the protocol handlers on the web or in Nick's book. I've come up with the following, but don't know how to get the client socket via conn_rec? #include <httpd.h> #include <http_protocol.h> #include <http_connection.h> #include <http_config.h> #include <http_log.h> #define POLICY "<?xml version=\"1.0\"?>\n" \ "<!DOCTYPE cross-domain-policy SYSTEM\n" \ "\"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd\">\n" \ "<cross-domain-policy>\n" \ "<allow-access-from domain=\"*\" to-ports=\"8080\"/>\n" \ "</cross-domain-policy>\0" static int socket_policy_handler(conn_rec *conn) { /* XXX how access socket here? */ ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, conn->base_server, "served socket policy to %s", conn->remote_ip); return OK; } static void register_hooks(apr_pool_t *pool) { ap_hook_process_connection(socket_policy_handler, NULL, NULL, APR_HOOK_MIDDLE); } module AP_MODULE_DECLARE_DATA socket_policy_module = { STANDARD20_MODULE_STUFF, NULL, NULL, NULL, NULL, NULL, register_hooks }; Thank you Alex PS: Here is my current mod_perl-module package SocketPolicy; # Run: semanage port -a -t http_port_t -p tcp 843 # And add following lines to the httpd.conf # Listen 843 # <VirtualHost _default_:843> # PerlModule SocketPolicy # PerlProcessConnectionHandler SocketPolicy # </VirtualHost> use strict; use warnings FATAL => 'all'; use APR::Const(-compile => 'SO_NONBLOCK'); use APR::Socket(); use Apache2::ServerRec(); use Apache2::Connection(); use Apache2::Const(-compile => qw(OK DECLINED)); use constant POLICY => qq{<?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> <cross-domain-policy> <allow-access-from domain="*" to-ports="8080"/> </cross-domain-policy> \0}; sub handler { my $conn = shift; my $socket = $conn->client_socket(); my $offset = 0; # set the socket to the blocking mode $socket->opt_set(APR::Const::SO_NONBLOCK => 0); do { my $nbytes = $socket->send(substr(POLICY, $offset), length(POLICY) - $offset); # client connection closed or interrupted return Apache2::Const::DECLINED unless $nbytes; $offset += $nbytes; } while ($offset < length(POLICY)); my $slog = $conn->base_server()->log(); $slog->warn('served socket policy to: ', $conn->remote_ip()); return Apache2::Const::OK; } 1;