xref: /openbsd/regress/usr.sbin/syslogd/Server.pm (revision 1f53c19f)
1*1f53c19fSbluhm#	$OpenBSD: Server.pm,v 1.1.1.1 2014/08/20 20:52:14 bluhm Exp $
2*1f53c19fSbluhm
3*1f53c19fSbluhm# Copyright (c) 2010-2014 Alexander Bluhm <bluhm@openbsd.org>
4*1f53c19fSbluhm#
5*1f53c19fSbluhm# Permission to use, copy, modify, and distribute this software for any
6*1f53c19fSbluhm# purpose with or without fee is hereby granted, provided that the above
7*1f53c19fSbluhm# copyright notice and this permission notice appear in all copies.
8*1f53c19fSbluhm#
9*1f53c19fSbluhm# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*1f53c19fSbluhm# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*1f53c19fSbluhm# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*1f53c19fSbluhm# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*1f53c19fSbluhm# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*1f53c19fSbluhm# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*1f53c19fSbluhm# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*1f53c19fSbluhm
17*1f53c19fSbluhmuse strict;
18*1f53c19fSbluhmuse warnings;
19*1f53c19fSbluhm
20*1f53c19fSbluhmpackage Server;
21*1f53c19fSbluhmuse parent 'Proc';
22*1f53c19fSbluhmuse Carp;
23*1f53c19fSbluhmuse Socket;
24*1f53c19fSbluhmuse Socket6;
25*1f53c19fSbluhmuse IO::Socket;
26*1f53c19fSbluhmuse IO::Socket::INET6;
27*1f53c19fSbluhmuse IO::Socket::SSL;
28*1f53c19fSbluhm
29*1f53c19fSbluhmsub new {
30*1f53c19fSbluhm	my $class = shift;
31*1f53c19fSbluhm	my %args = @_;
32*1f53c19fSbluhm	$args{ktracefile} ||= "server.ktrace";
33*1f53c19fSbluhm	$args{logfile} ||= "server.log";
34*1f53c19fSbluhm	$args{up} ||= "Accepted";
35*1f53c19fSbluhm	my $self = Proc::new($class, %args);
36*1f53c19fSbluhm	$self->{listenprotocol} ||= "udp";
37*1f53c19fSbluhm	$self->{listendomain}
38*1f53c19fSbluhm	    or croak "$class listen domain not given";
39*1f53c19fSbluhm	$SSL_ERROR = "";
40*1f53c19fSbluhm	my $iosocket = $self->{listenprotocol} eq "tls" ?
41*1f53c19fSbluhm	    "IO::Socket::SSL" : "IO::Socket::INET6";
42*1f53c19fSbluhm	my $proto = $self->{listenprotocol};
43*1f53c19fSbluhm	$proto = "tcp" if $proto eq "tls";
44*1f53c19fSbluhm	my $ls = $iosocket->new(
45*1f53c19fSbluhm	    Proto		=> $proto,
46*1f53c19fSbluhm	    ReuseAddr		=> 1,
47*1f53c19fSbluhm	    Domain		=> $self->{listendomain},
48*1f53c19fSbluhm	    $self->{listenaddr} ? (LocalAddr => $self->{listenaddr}) : (),
49*1f53c19fSbluhm	    $self->{listenport} ? (LocalPort => $self->{listenport}) : (),
50*1f53c19fSbluhm	    SSL_key_file	=> "server-key.pem",
51*1f53c19fSbluhm	    SSL_cert_file	=> "server-cert.pem",
52*1f53c19fSbluhm	    SSL_verify_mode	=> SSL_VERIFY_NONE,
53*1f53c19fSbluhm	) or die ref($self), " $iosocket socket listen failed: $!,$SSL_ERROR";
54*1f53c19fSbluhm	if ($self->{listenprotocol} eq "tcp") {
55*1f53c19fSbluhm		listen($ls, 1)
56*1f53c19fSbluhm		    or die ref($self), " socket failed: $!";
57*1f53c19fSbluhm	}
58*1f53c19fSbluhm	my $log = $self->{log};
59*1f53c19fSbluhm	print $log "listen sock: ",$ls->sockhost()," ",$ls->sockport(),"\n";
60*1f53c19fSbluhm	$self->{listenaddr} = $ls->sockhost() unless $self->{listenaddr};
61*1f53c19fSbluhm	$self->{listenport} = $ls->sockport() unless $self->{listenport};
62*1f53c19fSbluhm	$self->{ls} = $ls;
63*1f53c19fSbluhm	return $self;
64*1f53c19fSbluhm}
65*1f53c19fSbluhm
66*1f53c19fSbluhmsub child {
67*1f53c19fSbluhm	my $self = shift;
68*1f53c19fSbluhm
69*1f53c19fSbluhm	my $iosocket = $self->{ssl} ? "IO::Socket::SSL" : "IO::Socket::INET6";
70*1f53c19fSbluhm	my $as = $self->{ls};
71*1f53c19fSbluhm	if ($self->{listenprotocol} ne "udp") {
72*1f53c19fSbluhm		$as = $self->{ls}->accept()
73*1f53c19fSbluhm		    or die ref($self), " $iosocket socket accept failed: $!";
74*1f53c19fSbluhm		print STDERR "accept sock: ",$as->sockhost()," ",
75*1f53c19fSbluhm		    $as->sockport(),"\n";
76*1f53c19fSbluhm		print STDERR "accept peer: ",$as->peerhost()," ",
77*1f53c19fSbluhm		    $as->peerport(),"\n";
78*1f53c19fSbluhm	}
79*1f53c19fSbluhm
80*1f53c19fSbluhm	*STDIN = *STDOUT = $self->{as} = $as;
81*1f53c19fSbluhm}
82*1f53c19fSbluhm
83*1f53c19fSbluhm1;
84