| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- #!@l_prefix@/bin/perl
- ##
- ## ircii.pl -- ircII command line wrapper (for optional SSL support)
- ##
- require 5.008;
- use strict;
- use warnings;
- use IO::File;
- use Getopt::Long;
- use File::Temp qw(tempfile tempdir);
- # external programs
- my $irc = '@l_prefix@/libexec/ircii/irc';
- my $stunnel = '@l_prefix@/sbin/stunnel';
- # define command line options
- my $opt = {};
- my %options = (
- # standard ircII options
- 'c=s' => \$opt->{-c},
- 'p=s' => \$opt->{-p},
- 'P=s' => \$opt->{-P},
- 'f' => \$opt->{-f},
- 'F' => \$opt->{-F},
- 'r' => \$opt->{-r},
- 's' => \$opt->{-s},
- 'S' => \$opt->{-S},
- 'h=s' => \$opt->{-h},
- 'H=s' => \$opt->{-H},
- 'd' => \$opt->{-d},
- 'q' => \$opt->{-q},
- 'a' => \$opt->{-a},
- 'b' => \$opt->{-b},
- 'l=s' => \$opt->{-l},
- 'I=s' => \$opt->{-I},
- 't' => \$opt->{-t},
- 'T' => \$opt->{-T},
- 'i=s' => \$opt->{-i},
- 'help' => \$opt->{-help},
- # add-on wrapper options
- 'ssl' => \$opt->{-ssl},
- );
- # parse command line options
- {
- local @ARGV = @ARGV;
- my $p = new Getopt::Long::Parser;
- $p->configure("bundling");
- $p->getoptions(%options) || die "option parsing failed";
- }
- # remove add-on option
- if (defined($opt->{-ssl})) {
- for (my $i = 0; $i < @ARGV; $i++) {
- if ($ARGV[$i] eq '--ssl') {
- splice(@ARGV, $i, 1);
- last;
- }
- }
- }
- if (defined($opt->{-ssl})) {
- # encrypted IRC-over-SSL connection
- if (not -x $stunnel) {
- print STDERR "irc:ERROR: stunnel(1) required -- please install \"stunnel\" package.\n";
- exit(1);
- }
- # determine parameters
- srand(time() ^ $$);
- my $lhost = $opt->{-h};
- my $lport = 60000 + int(rand() * 1000);
- my $rhost = ((defined($ARGV[-1]) and $ARGV[-1] !~ m|^-|) ? $ARGV[-1] : "irc");
- my $rport = ($opt->{-p} || 994);
- # start an SSL tunnel
- my $tmpdir = tempdir("/tmp/ircII-XXXXXX", CLEANUP => 1);
- my $pidfile = "$tmpdir/stunnel.pid";
- my $logfile = "$tmpdir/stunnel.log";
- my $cfgfile = "$tmpdir/stunnel.cfg";
- my $io = new IO::File ">$cfgfile" || die;
- $io->print(
- "client = yes\n" .
- "pid = $pidfile\n" .
- "output = $logfile\n" .
- "[ircs]\n" .
- (defined($lhost) ?
- "local = $lhost\n" : "") .
- "accept = localhost:$lport\n" .
- "connect = $rhost:$rport\n"
- );
- $io->close();
- system $stunnel, $cfgfile;
- sleep(1);
- # manipulate ircII command line arguments
- splice(@ARGV, -2, 0, "-p", $lport);
- $ARGV[-1] = "localhost";
- # start ircII through SSL tunnel
- my $rc = system $irc, @ARGV;
- # shutdown SSL tunnel
- system("kill `cat $pidfile 2>/dev/null`");
- undef $tmpdir;
- # exit with ircII return code
- exit($rc);
- }
- else {
- # unencrypted IRC connection
- exec $irc, @ARGV;
- }
|