#!perl -w
=head1 NAME
screen-server - Internet server for GNU screen
=head1 SYNOPSIS
screen-server [options]
--help
--debug
--name <screen name>
--port <port> Listens on <port> [TCP service] and accepts a
TCP/IP connection. The IP version is 4 or
environment variable
SOCAT_DEFAULT_LISTEN_IP.
Default is 53505.
--bind <sockname> Binds the socket to the given socket address
using the bind() system call.
[hostname|hostaddress][:(service|port)]
Default is (*).
--daemonize (Default)
--no-daemonize
=head1 DESCRIPTION
TODO
=cut
use strict;
# Option handling
#
use Getopt::Long ();
Getopt::Long::GetOptions(
help => \ &pod2usage,
debug => \ my $debug,
name => \ my $screen_name,
bind => \ my $bind_address,
port => \ my $tcp_port,
'daemonize!' => \ my $daemonize,
)
or pod2usage();
$daemonize = 0 if ! defined $daemonize;
$tcp_port = 53505 if ! defined $tcp_port;
# Daemonization by default
#
if ( $daemonize ) {
close *STDIN;
close *STDOUT;
close *STDERR;
fork && exit;
fork && exit;
umask 0;
chdir '/';
}
# Launch socat to listen to TCP and launch screen-server-backend
#
require FindBin;
my $listen_spec = "TCP-LISTEN:${tcp_port},fork,reuseaddr";
if ( $bind_address ) {
$listen_spec .= ",bind=$bind_address";
}
my $bindir = $FindBin::Bin;
$bindir = $FindBin::Bin;
my $backend_spec = "EXEC:$bindir/screen-server-backend";
if ( $screen_name ) {
$backend_spec .= " $screen_name";
}
$backend_spec .= ",setsid,nofork";
my @cmd = ( 'socat', $listen_spec, $backend_spec );
if ( $debug ) {
print STDERR "exec( @cmd )\n";
}
exec @cmd;
sub pod2usage {
require Pod::Usage;
goto &Pod::Usage::pod2usage;
}