#!/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; if( $h_query->param('f') eq 'post' ) { $s_post =~ s/\n/
/g; } else { $s_post = "
\n$s_post
"; } } $s_post .= '

' . (scalar localtime); $Posts = "\n


\n$s_post$Posts"; $s_post = (pack 'I', length $s_post) . $s_post; print CLIENT_PIPE $s_post; } } $y_reply = 'Yuno' . '' . '
' . '


' . '' . '' . '' . '' . "

$Posts\n"; send CLIENT, "HTTP/1.0 200 OK\r\n" . "Content-Type: text/html\r\n" . "Server: Yuno\r\n" . "Connection: close\r\n" . "Content-Length: " . length($y_reply) . "\r\n\r\n" . $y_reply, 0; close CLIENT; close CLIENT_PIPE; exit; } } if( vec($x_rout, fileno(SERVER_PIPE), 1) ) { $y_entry = ''; if( read(SERVER_PIPE, $x_data, length(pack 'I', 0), 0) ) { $s_size = unpack 'I', $x_data; while( read(SERVER_PIPE, $x_data, $s_size, 0) ) { $y_entry .= $x_data; last if ($s_size -= length $x_data) <= 0; } $Posts = "\n
\n$y_entry$Posts"; } } } die $!;