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