1 |
#!/usr/bin/perl |
2 |
use IO::Select; |
3 |
use IO::Socket::INET; |
4 |
use Net::IRC::Server; |
5 |
use Data::Dumper; |
6 |
|
7 |
my $iserv = Net::IRC::Server->new (srv_prefix => "this.de"); |
8 |
|
9 |
my $sock = IO::Socket::INET->new( |
10 |
Listen => 5, |
11 |
LocalAddr => 'localhost', |
12 |
LocalPort => 6667, |
13 |
Proto => 'tcp', |
14 |
ReuseAddr => 1); |
15 |
|
16 |
if (!$sock) { die "Couldn't get listening socket: $!\n" } |
17 |
|
18 |
$sock->listen (); |
19 |
|
20 |
$iserv->set_send_cb (sub { |
21 |
my ($cl, $data) = @_; |
22 |
$cl->{socket}->syswrite ($data); |
23 |
print "send $cl->{nickname}> $data" |
24 |
}); |
25 |
|
26 |
my $s = IO::Select->new (); |
27 |
|
28 |
my %clients; |
29 |
$s->add ($sock); |
30 |
|
31 |
while ((@ready = $s->can_read (1000))) { |
32 |
for (@ready) { |
33 |
if ($_ eq $sock) { |
34 |
my $newfh = $_->accept (); |
35 |
$s->add ($newfh); |
36 |
my $addr = $newfh->sockaddr (); |
37 |
$clients{$newfh} = { hostname => inet_ntoa ($addr), socket => $newfh }; |
38 |
|
39 |
} else { |
40 |
if (not defined $clients{$_}) { |
41 |
$s->remove ($_); |
42 |
$_->close (); |
43 |
} |
44 |
|
45 |
my $data; |
46 |
my $c = $_->sysread ($data, 2048); |
47 |
|
48 |
if ($c == 0) { |
49 |
$s->remove ($_); |
50 |
$_->close (); |
51 |
|
52 |
} else { |
53 |
print "recv $clients{$_}->{nickname}> $data"; |
54 |
$iserv->feed_irc_data ($clients{$_}, $data); |
55 |
} |
56 |
} |
57 |
} |
58 |
} |