# -*- 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;
use strict;

use lib qw(blib/arch blib/lib);


$| = 1;

require Net::Daemon::Test;
require IO::Socket;

package Multiplier;

use vars qw($VERSION @ISA);

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


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

sub GetLine {
    my $sock = shift;
    $sock->getline();
    
}

sub Print {
    my $sock = shift;
    $sock->print(@_) && $sock->flush();
}

sub Run ($) {
    my $self = shift;
    my($line, $sock);
    $sock = $self->{'socket'};
    while (1) {
	if (!defined($line = GetLine($sock))) {
	    if ($sock->error()) {
	        print STDERR "Client connection error ", $sock->error(), "\n";
		$self->Log('err', "Client connection error %s",
			   $sock->error());
	    }
	    $sock->close();
	    return;
	}
	my $num;
	{
	    my $lock = lock($Net::Daemon::RegExpLock)
		if ($self->{'mode'} eq 'threads');
	    if ($line =~ /(\d+)/) {
		$num = $1;
	    }
	}
	if (defined($num)) {
	    if (!Print($sock, $num*2, "\n")) {
	        print STDERR ("Client connection error ", $sock->error(),
		              " while writing\n");
		$self->Log('err', "Client connection error %s while writing",
			   $sock->error());
		$sock->close();
		return;
	    }
	} else {
	    print STDERR ("Server cannot parse input: $line\n");
	    $self->Log('err', "Cannot parse input: $line");
	    $sock->close();
	    return;
	}
    }
}


package main;

my $server = Multiplier->new({ 'pidfile' => 'none'
			       }, \@ARGV);

$server->Bind();
