I determined empirically that the file descriptor of the client socket is 
always 0 in my environment.  I assume this is only true for the Prefork MPM.

For the curious, the code I developed is for a Comet/pushlet type server.  
Looks like this:

--- Handoff.pm --- 
package Handoff;

use strict;
use warnings;

use Apache::RequestRec ();
use Apache::RequestIO ();
use Apache::Const -compile => qw(:common :conn_keepalive :http);

use File::FDpasser;
use POSIX;

# 1. subserver creates a named socket (/tmp/handoff) and listens on it

# 2. browser connects to apache (thus creating client-socket) makes a request

# 3. Apache looks at the request, and decides that it should go to
# mod_handoff

# 4. mod_handoff connects to the subserver using the /tmp/handoff and
# creates a pipe-type socket (ipc-pipe).  It sends client-socket to
# the subserver over ipc-pipe, closes client-socket, sends the request
# over ipc-pipe, and then logs the result.  Note that client-socket
# only is closed from apache...  it's still open in the subserver.
#
# 5. The subserver reads the request on ipc-pipe, and responds over
# client-socket.
#
# 6. If mod_handoff cannot open the fs-based socket, then it returns an
# error code of some kind to the client.
sub handler {
    my ($r) = @_;

    my $fh = endp_connect("/tmp/handoff");
    if (not $fh) {
        $r->warn("could not connect to handoff endpoint");
        return &Apache2::Const::HTTP_SERVICE_UNAVAILABLE;
    }

    # This only works with the preform MPM, I think.
    my $client = 0;
    my $rc = send_file($fh,$client);

    # To prevent Apache from writing to the socket (which  we have handed
    # off to another process), replace the client socket with /dev/null
    POSIX::dup2(POSIX::open("/dev/null", &POSIX::O_RDWR), $client);

    # send the request to the subserver
    print $fh $r->the_request."\r\n";

    # send the headers too
    $r->headers_in->do(sub { my ($k, $v)[EMAIL PROTECTED]; print $fh "$k: 
$v\r\n"; } );
    close $fh;

    # do whatever we can to prevent apache from using the client socket again
    $r->assbackwards(1);
    $r->connection->keepalive(&Apache2::Const::CONN_CLOSE);

    return &Apache2::Const::DONE;
}

1;

------


On Fri, 19 Jan 2007 10:34:25 +0100, Torsten Foertsch <[EMAIL PROTECTED]> wrote:
> On Friday 19 January 2007 08:01, Daniel Risacher wrote:
>> From within a mod_perl request handler, fileno(STDOUT) returns -1, which
> is
>> the same thing I got from $r->FILENO.
>>
>> Any other ideas?
> 
> $r->connection->client_socket is an APR::Socket. It corresponds to an 
> apr_socket_t in C. This structure contains on UNIX an element called 
> socketdes. That is probably what you want. AFAIK there is currently no way
> to 
> access that bit from Perl level. But it's not very complicated to add such
> an 
> interface.
> 
> Torsten

Reply via email to