# -*- perl -*-
#
#   This example implements a very simple server, let's call it
#   multiplier. When a client connects, it waits for decimal numbers
#   as input. These numbers are written back, multiplied by 2.
#

require 5.004;
require Net::Daemon;
require IO::Socket;

package Multiplier;

use vars qw($VERSION @ISA);

$VERSION = '0.01';
@ISA = qw(Net::Daemon);


#   We add an additional command line option "--forking"
sub Options ($) {
    my($self) = @_;
    my($options) = $self->SUPER::Options();
    $options->{'forking'} = { 'template' => 'forking',
			      'description' => '--forking               '
				  . 'Uses fork() instead of Threads'
			      };
    $options;
}

sub Version ($) {
    return "Multiplier - A simple network calculator; 1998, Jochen Wiedmann";
}

sub new ($$;$) {
    my($class, $attr, $args) = @_;
    my($self) = $class->SUPER::new($attr, $args);
    if ($self  &&  $self->{'options'}->{'forking'}) {
	$self->{'forking'} = 1;
    }
    $self;
}


sub Run ($) {
    my($self) = @_;
    my($line, $sock);
    $sock = $self->{'socket'};
    while (1) {
	if (!defined($line = $sock->getline())) {
	    if ($sock->error()) {
		$self->Log('err', "Client connection error %s",
			   $sock->error());
	    }
	    $sock->close();
	    return;
	}
	if ($line =~ /(\d+)/) {
	    my($num) = $1*2;
	    if (!$sock->print("$num\n")) {
		$self->Log('err', "Client connection error %s",
			   $sock->error());
		$sock->close();
		return;
	    }
	}
    }
}


package main;

my($server) = Multiplier->new({ 'localport' => 37112,
				'pidfile' => 'none'
				}, \@ARGV);
if (!$server->{'forking'}) {
    $@ = ''; eval { require Thread; };
    if ($@) {
	$server->{'forking'} = 1;
    }
}
if ($server->{'forking'}) {
    $SIG{'CHLD'} = \&Net::Daemon::_Reaper;
}
$server->Bind();
