The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!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;
}