#!/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); } }