#!/home/merlyn/bin/perl -Tw use strict; $| = 1; use CGI qw/:standard/; use IO::File; BEGIN { my $header_printed = 0; sub maybe_print_header { print header(@_) unless $header_printed; $header_printed = 1; } } ## return $_[0] encoded for HTML entities sub ent { local $_ = shift; s/["<&>"]/"&#".ord($&).";"/ge; # entity escape $_; } ## death handler $SIG{"__DIE__"} = $SIG{"__WARN__"} = sub { my $why = shift; chomp $why; $why = ent $why; maybe_print_header(); print "ERROR: $why\n"; exit 0; }; my $DIR = "/home/merlyn/Html/pic/results/"; my $URL = "http://www.stonehenge.com/pic/results/"; my $searchstring = param("search"); # the search item unless (defined $searchstring and length $searchstring) { maybe_print_header(); print start_html("-title" => "Simulated Search"), h1("Simulated Search"), hr, start_form("-method" => "GET"), p, "Search for: ", textfield("-name" => "search"), p, submit, end_form, hr, end_html; } else { my $session = unpack("H*", pack("Nn", time, $$)); # 12 hex chars my $session_html = "$session.html"; my $DIR_html = "$DIR$session_html"; my $DIR_html_tmp = "$DIR$session_html.tmp"; my $URL_html = "$URL$session_html"; { my $out = IO::File->new($DIR_html,"w") or die "Cannot create $DIR_html: $!"; print $out start_html("-title" => "Search in progress", "-head" => [""], ), h1("Search in progress"), p("The search is still in progress. Please reload this page."), end_html; ## implicit close } defined(my $childpid = fork) or die "Cannot fork: $!"; if ($childpid) { # parent does: print redirect($URL_html); } else { # child does: open STDIN, "/dev/null"; sleep 10; # simulate search time { my $out = IO::File->new($DIR_html_tmp,"w") or die "Cannot create $DIR_html_tmp: $!"; print $out start_html("Search results"), h1("Search results"), p("I've found the item ", ent($searchstring), ", but I can't tell you where :-)."), end_html; ## implicit close } rename $DIR_html_tmp, $DIR_html or die "Cannot rename $DIR_html_tmp to $DIR_html: $!"; } }