#!/usr/bin/perl
# yuno5.pl - Don Yang (uguu.org)
#
# 07/31/05
use strict;
use Socket;
use CGI ':standard';
my ($x_Port, $Posts);
my ($h_rin, $x_rout);
my ($y_request, $x_data, $h_headersize, $s_rsize);
my ($s_post, $h_query);
my ($y_reply);
my ($y_entry, $s_size);
local (*SERVER, *CLIENT, *SERVER_PIPE, *CLIENT_PIPE);
$x_Port = (shift || 80);
die $!
unless socket(SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp')) &&
bind(SERVER, sockaddr_in($x_Port, INADDR_ANY)) &&
listen(SERVER, 5) &&
pipe(SERVER_PIPE, CLIENT_PIPE);
binmode SERVER;
binmode SERVER_PIPE;
binmode CLIENT_PIPE;
$Posts = $h_rin = '';
vec($h_rin, fileno(SERVER), 1) = 1;
vec($h_rin, fileno(SERVER_PIPE), 1) = 1;
print "listening on $x_Port\n";
while( select($x_rout = $h_rin, undef, undef, undef) )
{
if( vec($x_rout, fileno(SERVER), 1) )
{
accept CLIENT, SERVER;
if( fork )
{
close CLIENT;
}
else
{
close SERVER_PIPE;
binmode CLIENT;
$y_request = '';
while( defined(recv CLIENT, $x_data, 1024, 0) )
{
$y_request .= $x_data;
if( ($h_headersize = index($y_request, "\r\n\r\n")) > 0 )
{
$h_headersize += 4;
last;
}
if( ($h_headersize = index($y_request, "\n\n")) > 0 )
{
$h_headersize += 2;
last;
}
}
if( $y_request =~ /^POST / )
{
$s_rsize =
(($y_request =~ /content-length:\s*(\d+)/i) ? $1 : 0x20000)
+ $h_headersize - length $y_request;
while( $s_rsize > 0 && defined(recv CLIENT, $x_data, $s_rsize, 0) )
{
$y_request .= $x_data;
$s_rsize -= length $x_data;
}
$h_query = new CGI(substr $y_request, $h_headersize);
$s_post = $h_query->param('x');
if( $h_query->param('f') ne 'reload' )
{
$s_post =~ s/\r\n/\n/g;
if( $h_query->param('f') ne 'raw' )
{
$s_post =~ s/&/&/g;
$s_post =~ s/</g;
$s_post =~ s/>/>/g;
if( $h_query->param('f') eq 'post' )
{
$s_post =~ s/\n/
/g;
}
else
{
$s_post = "
\n$s_post"; } } $s_post .= '
' . (scalar localtime); $Posts = "\n