> 
> 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 
You don't simply upload the pm files they have to be instsalled
On the server.

Perl -MCPAN -e shell

CPAN> Install Whatever


I'd recommend visiting cpan.org to learn about how this is done. It really quite 
simple and fast.

Dmuey

> 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 .= " &#183; 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;
> }
> 
> 
> 
> 

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to