#!/usr/bin/env perl use Cwd 'abs_path'; use Sys::Syslog; use Socket qw(:addrinfo getnameinfo); $|=1; alarm(10); my $request=<>; alarm(0); $request =~ s/[\r\n]//g; chdir("/var/gopher"); my $path=abs_path("./$request"); $path="/var/gopher/" if $path eq "/var/gopher"; my $peer = getpeername(STDIN); my ($err, $rhost, $rport) = getnameinfo($peer, NI_NUMERICHOST); syslog("info|daemon","god: connection from $rhost.$rport requesting '$request'"); if(!($path =~ /^\/var\/gopher\//)) { syslog("err|daemon","god: $rhost tried directory traversal '$request' '$path'"); print "3cut it out.\t.\t.\t.\r\n"; exit 1; } $path.="/map" if -d $path; if(!open(FILE, "<$path")){ syslog("err|daemon","god: $rhost request could not be found '$request' '$path'"); print "3not found.\t.\t.\t.\r\n"; exit 2; } print ; close(FILE);