#!/usr/bin/perl
use Socket;
#$OS = "Win32";
$OS = "UNIX";
if($OS eq "Win32") {
$DOC_ROOT = "C:\\Inetpub\\wwwroot";
}
elsif($OS eq "UNIX") {
$DOC_ROOT = "/home/mcoan/public_html";
}
#
# Read a line of text from a socket.
#
sub readline {
my($buffer) = "";
my($ch) = "";
do {
$ch = "";
read(SOCKET, $ch, 1) or die "readline: $!";
$buffer .= $ch;
}
while($ch ne "\n" && $ch ne "");
return $buffer;
}
sub fileNotFound {
my($res) = "HTTP/1.0 OK\r\nContent-type: text/html\r\n\r\n";
send(SOCKET, $res, 0);
my($page) = "
404 File Not Found\n";
$page .= "404 File Not Found
\n";
send(SOCKET, $page, 0);
close SOCKET;
exit(0);
}
sub processRequest {
my($line)="";
my($first) = 1;
my($data,$file);
while(($line = &readline()) ne "\r\n") {
if($first == 1) {
@data = split(/ /, $line);
$file = $data[1];
$first = 0;
}
}
if($file eq "/") {
$file = "/index.html";
}
if($OS eq "Win32") {
$file =~ s/\\/\//g;
}
open(IN, "$DOC_ROOT$file") or &fileNotFound($SOCKET);
my($res) = "HTTP/1.0 OK\r\nContent-type: text/html\r\n\r\n";
send(SOCKET, $res, 0);
while() {
send(SOCKET, $_, 0);
}
close SOCKET;
exit(0);
}
my($port) = 8080;
my($proto) = getprotobyname('tcp');
socket(Server, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
setsockopt(Server, SOL_SOCKET, SO_REUSEADDR,
pack("l", 1)) || die "setsockopt: $!";
bind(Server, sockaddr_in($port, INADDR_ANY)) || die "bind: $!";
listen(Server,SOMAXCONN) || die "listen: $!";
my($paddr);
my($waitedpid) = 0;
sub REAPER {
$waitedpid = wait;
$SIG{CHLD} = \&REAPER; # loathe sysV
print "waitedpid = $waitedpid\n";
}
$SIG{CHLD} = \&REAPER;
print "Server Starting...\n";
while($paddr = accept(SOCKET,Server)) {
if(fork() == 0) {
&processRequest();
}
else {
close(SOCKET);
}
}