Clear DayI tired to run the script below on my host server and it would not run. The server cannot find Taintcheck or Timefuncs. I uploaded these pm file to the server. What did I do wrong? Is Apache the problem?
SERVER INFORMATION: Path to Perl: /usr/local/bin/perl Path to Sendmail: /usr/sbin/sendmail Path to home directory: /home/horace-f Path to Date: /bin/date What Operating System are we using? RedHat Linux What Web Server Software is running on the server? Apache 1.3 SCRIPT: #!/usr/bin/perl -wT ##################### # guestbook.cgi # ##################### $ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin'; ## $ENV{'SHELL'} = '/bin/sh'; $ENV{'ENV'} = ''; $ENV{'IFS'} = ''; use lib '/home/horace-f/perl_lib'; use Taintcheck; use Timefuncs; use CGI; use strict; use vars qw($__START__ $CGI $GUESTBOOK); #################################### # Paths Guestbook CGI & HTML files # #################################### $CGI = "guestbook.cgi"; $GUESTBOOK= "/home/horace-f/public_html/guestbook.txt"; eval { main() }; $__START__ = __LINE__; if ($@) { chomp($@); $@ =~ s/\(eval\) line (\d+)/${CGI} . " line " . ($__START__-$1-1)/e; $@ =~ s/( at ).*( line )/$1${CGI}$2/; my $error_message = $@; print <<ERR Content-type: text/html <html> <head><title>Error</title></head> <body> <h1>Error</h1><br>\n <code>$error_message</code> </body> </html> ERR } exit(0); ############ # MAIN # ############ sub main { my $q = new CGI; if ($q->param()) { add_entry($q); } else { display_guestbook($q); } } ##################################################### # subroutines # # in: CGI object # # out: # # Description: # # Reads the guestbook file & prints it as html # ##################################################### sub display_guestbook { my $q = shift; my ($html,$e,$num_entries,$entries,$cookie,$thanks); $html = $q->header . $q->start_html("My Guestbook"); $html .= $q->h1("Guestbook"); open (GB, "<$GUESTBOOK") || die "Unable to read guestbook file " . "'$GUESTBOOK' (error: $!). " . "Please try again later, or contact " . "the webmaster of this site for assistance"; ######################################## # get a read lock on the guestbook # ######################################## lock_filehandle(\*GB, 'R'); #################################### # read and process the entries # #################################### while (!eof(GB)) { my $e = new CGI(\*GB); $num_entries++; $entries .= draw_guestbook_entry($e); ############################################### # Here's where things get 'spooky': If the user has signed # # the guestbook, she'll have a cookie set that will tell us # # when she signed it. # ############################################### if ($e->param('cookie') == $q->cookie('sg_signed_at')) { $thanks = "<p>Hello, <b>" . $e->param('name') . "</b>! Thanks for signing my guestbook on " . date_string($e->param('cookie')) . "</p>\n"; } } close (GB); ################################################ # Insert the count of entries, and the entries themselves, into # # the html page # ################################################# if ($num_entries) { $html .= "<p>Signed $num_entries time" . (($num_entries > 1) && ("s")); $html .= " · Last signed " . date_string( (file_stats( $GUESTBOOK ))[0] ); $html .= $thanks if $thanks; $html .= $entries . "</p>; } else { $html .= "<h3>No entries!</h3><hr>"; } $html .= &entry_form($q); $html .= $q->end_html; print $html; } ############################################### # in: CGI object # # out: # # Description: # # Adds entry to guestbook file, then prints guestbook html # # Also sets a cookie with the current time # ############################################### sub add_entry { my $q = shift; my ($name,$email,$homepage,$msg,$entry,$url,$cookie); $url = $q->url; ########################################### # it's often easier to access parameters than cookies, # # so save the value here first # ########################################### $q->param('cookie', time); ################################################ # then create a cookie, which we'll put in the outgoing # # http header # ################################################ $cookie = $q->cookie( -name=>'sg_signed_at', -value=>$q->param('cookie') ); untaint_params($q); ############################################# # write the submission to the guestbook # ############################################# open (GB, ">>$GUESTBOOK") || die "Unable to write to guestbook (error: $!). " . "Please try again later, or contact the webmaster " . "of this site for assistance"; ######################################### # get a write lock on the guestbook # ######################################### lock_filehandle(\*GB, 'W'); $q->save(\*GB); ################################################### # closing automatically removes the file lock # ################################################### close GB; ######################################################## # say thanks, with a link back to the questbook # # here's where the cookie actually gets set on the # # user's computer # ######################################################## print $q->header( -cookie=>$cookie ), $q->start_html("Thanks"), $q->h1("Thanks!"), $q->h3("Your message has been added to my guestbook."), $q->p, $q->a({href=>$q->url}, "Go back to the guestbook"), $q->end_html; } ########################################### # in: guestbook entry # # out: guestbook entry in html format # # description: # # Format a guestbook entry as html # ########################################### sub draw_guestbook_entry { my $entry = shift; my $author; ################################################## # import the params into a namespace, for easy # # interpolation below. # ################################################## $entry->import_names('E'); ################################################## # include email & homepage links, if present # ################################################## $author = $E::name; if ($E::email =~ /(.*?)@((.*?)\.)+.*/) { $author = qq|<a href="mailto:$E::email">$E::name</a>|; } if ($E::homepage) { ###################################################### # make sure the homepage url begins with http:// # ###################################################### $E::homepage =~ s|^(http://)*(.*)$|http://$2|; $author .= qq| (<a href="$E::homepage">$E::homepage</a>)|; } return <<ENTRY; <p><b>$author</b> <br/>$E::message</p> <hr/> ENTRY } sub entry_form { my $q = shift; my $url = $q->url; my $form = <<E_FORM; <h3>Sign My Guestbook:</h3> <form action="$url" method="post"> <p><b>Name</b>: <input type="text" name="name"/></p> <p><b>E-mail</b>: <input type="text" name="email"/></p> <p><b>Homepage</b>: <input type="text" name="homepage"/></p> <p><b>Message</b>:</p> <p><textarea cols="30" rows="6" wrap="virtual" name="message"></p> <p>Type your message here. </textarea> <input type="submit"></p> </form> E_FORM $form; } ####################################################################### # lock_filehandle # # in: filehandle # # out: # # description: flock()s a filehandle, for concurrency-safe access # ####################################################################### sub lock_filehandle { my $fh = shift; my $lock = shift; use Fcntl qw(:flock); my $lock_code; if ($lock =~ /^r/i) { $lock_code = LOCK_SH; } elsif ($lock =~ /^w/i) { $lock_code = LOCK_EX; } else { $lock_code = LOCK_UN; } ######################### # give it two tries # ######################### unless (flock ($fh, $lock_code | LOCK_NB)) { unless (flock($fh, $lock_code)) { die "flock: could not get $lock lock on $GUESTBOOK"; } } return 1; }