http://www.perlmonks.org?node_id=354838


in reply to gopher server in < 1024B

Does this code actually work? I've been looking at golfing it and found a few oddities. Here's the code as run through B::Deparse:
BEGIN { $^W = 1; } use IO::Socket; use strict 'refs'; local $/ = "\r\n"; my $port = '7070'; my $root = '/home/beth/gopher/gopher'; die "can't chroot: $!\n" unless chroot $root; local $SIG{'HUP'} = 'IGNORE'; exit if my $pid = fork; die "Couldn't create socket: $!\n" unless my $sock = 'IO::Socket::INET +'->new('LocalPort', $port, 'Type', SOCK_STREAM(), 'Listen', 1, 'Reuse +', 1); my $s = $sock->accept; while (defined(my $req = <$s>)) { chomp(my $req = shift @ARGV); $req = '/' . $req; &error unless -r $req; $req .= '/.cache' if -d _; printfile($req); close $sock; } sub printfile { use strict 'refs'; open FILE, shift @_; binmode FILE; print $s <FILE>; close FILE; } sub error { use strict 'refs'; my $req = shift @_; print $s "iBad Request: $! \tfake\t(NULL)\t0" . $/; }

Please note the following: (line#'s from your code)

  1. Lines 31 and 33 both assign to my $req. On 33, it's assigning to shift @ARGV.
  2. You assign $req to shift on line 51, but don't use it and don't pass anything in to error(), either.
  3. You don't use $pid from line 17. So, essentially, you're forking to create a child, then exiting the child immediately ... ?
  4. Unless I'm mistaken, you'll only ever serve one request for one client, then leave ... ?

I'm not trying to rip it apart, but I couldn't understand it to golf it. :-(

------
We are the carpenters and bricklayers of the Information Age.

Then there are Damian modules.... *sigh* ... that's not about being less-lazy -- that's about being on some really good drugs -- you know, there is no spoon. - flyingmoose

I shouldn't have to say this, but any code, unless otherwise stated, is untested