#!/usr/bin/perl -Tw # # fs_sessiond # # This is run REMOTELY over ssh by fs_session_server # use strict; use Socket; use vars qw( $Debug ); $Debug = 1; my $fs_sessiond_socket = "/usr/local/freeside/fs_sessiond_socket"; $ENV{'PATH'} ='/usr/local/bin:/usr/bin:/usr/ucb:/bin'; $ENV{'SHELL'} = '/bin/sh'; $ENV{'IFS'} = " \t\n"; $ENV{'CDPATH'} = ''; $ENV{'ENV'} = ''; $ENV{'BASH_ENV'} = ''; $|=1; my $me = "[fs_sessiond]"; warn "$me starting\n" if $Debug; #nothing to read from server warn "$me creating $fs_sessiond_socket\n" if $Debug; my $uaddr = sockaddr_un($fs_sessiond_socket); my $proto = getprotobyname('tcp'); socket(Server,PF_UNIX,SOCK_STREAM,0) or die "socket: $!"; unlink($fs_sessiond_socket); bind(Server, $uaddr) or die "bind: $!"; listen(Server,SOMAXCONN) or die "listen: $!"; warn "$me entering main loop\n" if $Debug; my $paddr; for ( ; $paddr = accept(Client,Server); close Client) { chomp( my $command = ); if ( $command eq 'login' || $command eq 'logout' || $command eq 'portnum' ) { warn "$me reading data from local client\n" if $Debug; my @data; my $dos = 0; push @data, scalar() until $dos++ == 99 || $data[$#data] eq "END\n"; if ( $dos == 99 ) { warn "$me WARNING: DoS attempt!" } else { warn "$me sending data to remote server\n" if $Debug; print "$command\n", @data; warn "$me reading result from remote server\n" if $Debug; my $error = ; warn "$me sending error to local client\n" if $Debug; print Client $error; } } else { warn "$me WARNING: unexpected command from client: $command"; } }