home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-11-18 | 2.8 KB | 149 lines | [TEXT/McPL] |
- # Net::DummyInetd.pm
- #
- # Copyright (c) 1995-1997 Graham Barr <gbarr@ti.com>. All rights reserved.
- # This program is free software; you can redistribute it and/or
- # modify it under the same terms as Perl itself.
-
- package Net::DummyInetd;
-
- require 5.002;
-
- use IO::Handle;
- use IO::Socket;
- use strict;
- use vars qw($VERSION);
- use Carp;
-
- $VERSION = do { my @r=(q$Revision: 1.1 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r};
-
-
- sub _process
- {
- my $listen = shift;
- my @cmd = @_;
- my $vec = '';
- my $r;
-
- vec($vec,fileno($listen),1) = 1;
-
- while(select($r=$vec,undef,undef,undef))
- {
- my $sock = $listen->accept;
- my $pid;
-
- if($pid = fork())
- {
- sleep 1;
- close($sock);
- }
- elsif(defined $pid)
- {
- my $x = IO::Handle->new_from_fd($sock,"r");
- open(STDIN,"<&=".fileno($x)) || die "$! $@";
- close($x);
-
- my $y = IO::Handle->new_from_fd($sock,"w");
- open(STDOUT,">&=".fileno($y)) || die "$! $@";
- close($y);
-
- close($sock);
- exec(@cmd) || carp "$! $@";
- }
- else
- {
- close($sock);
- carp $!;
- }
- }
- exit -1;
- }
-
- sub new
- {
- my $self = shift;
- my $type = ref($self) || $self;
-
- my $listen = IO::Socket::INET->new(Listen => 5, Proto => 'tcp');
- my $pid;
-
- return bless [ $listen->sockport, $pid ]
- if($pid = fork());
-
- _process($listen,@_);
- }
-
- sub port
- {
- my $self = shift;
- $self->[0];
- }
-
- sub DESTROY
- {
- my $self = shift;
- kill 9, $self->[1];
- }
-
- 1;
-
- __END__
-
- =head1 NAME
-
- Net::DummyInetd - A dummy Inetd server
-
- =head1 SYNOPSIS
-
- use Net::DummyInetd;
- use Net::SMTP;
-
- $inetd = new Net::DummyInetd qw(/usr/lib/sendmail -ba -bs);
-
- $smtp = Net::SMTP->new('localhost', Port => $inetd->port);
-
- =head1 DESCRIPTION
-
- C<Net::DummyInetd> is just what it's name says, it is a dummy inetd server.
- Creation of a C<Net::DummyInetd> will cause a child process to be spawned off
- which will listen to a socket. When a connection arrives on this socket
- the specified command is fork'd and exec'd with STDIN and STDOUT file
- descriptors duplicated to the new socket.
-
- This package was added as an example of how to use C<Net::SMTP> to connect
- to a C<sendmail> process, which is not the default, via SIDIN and STDOUT.
- A C<Net::Inetd> package will be available in the next release of C<libnet>
-
- =head1 CONSTRUCTOR
-
- =over 4
-
- =item new ( CMD )
-
- Creates a new object and spawns a child process which listens to a socket.
- C<CMD> is a list, which will be passed to C<exec> when a new process needs
- to be created.
-
- =back
-
- =head1 METHODS
-
- =over 4
-
- =item port
-
- Returns the port number on which the I<DummyInetd> object is listening
-
- =back
-
- =head1 AUTHOR
-
- Graham Barr <gbarr@ti.com>
-
- =head1 COPYRIGHT
-
- Copyright (c) 1995-1997 Graham Barr. All rights reserved.
- This program is free software; you can redistribute it and/or modify
- it under the same terms as Perl itself.
-
- =cut
-