#!/usr/bin/perl -Tw

use strict;
use English; # long names for special variables
use CGI qw(:standard);
use CGI::Carp 'fatalsToBrowser';

$OUTPUT_AUTOFLUSH = 1;  # flush output buffer after each output statement ...
                        # ... slower but helpful for output over the network
$OUTPUT_RECORD_SEPARATOR = "\n";


print header; # to generate document-type

print XHTMLhead();
middle();
print XHTMLtail();
   
# -- subroutines follow -- #

sub middle {
   my $real_ID     = $REAL_USER_ID      || -1;
   my $effect_ID   = $EFFECTIVE_USER_ID || -1;
   my $real_name   = ($real_ID != -1)
                     ? ((getpwuid $real_ID)[0])
                     : "-- unknown --";
   my $effect_name = ($effect_ID != -1) 
                     ? ((getpwuid $effect_ID)[0])
                     : "-- unknown --";

   print  "      <h3>About this CGI program</h3>";
   print  "      <h4>How Is It Being Run?</h4>";
   print  "      <p>";
   print  "          This program is being run by the user with";
   print  "         ID&nbsp;$real_ID (", $real_name,")";
   printf "%s ", ($real_ID == $effect_ID) ?"and" :"but";
   print  "the effective user ID is $effect_ID (", $effect_name, ").";

   print "     </p><p>";
   if ($real_ID != $effect_ID) {
       print "Therefore the program is running as suid.";
   }
   elsif ($real_name =~ /^httpd?/) {
       print "It looks like the program is being run by the server.";
   }
   else {
       print "It looks like the program is being run under suexec.";
   }
   print "     </p>";

   print  "      <h4>Some Other Information About <kbd>$0</kbd></h4>";
   print "<table>";
   print "  <caption>Table of All Values</caption>";
   print "  <tr><th>Name</th><th>Value</th></tr>";
   my $name;
   my $value;
   foreach $name (qw($PROGRAM_NAME  $PROCESS_ID 
                     $REAL_GROUP_ID $EFFECTIVE_GROUP_ID  
                     $REAL_USER_ID  $EFFECTIVE_USER_ID   
                     $OSNAME)) {
       ($value = $name) =~ s/(\$\w+)/$1/ee;
       print "<tr><td><code>$name</code></td> <td>$value</td></tr>";
   }
   printf "<tr><td><code>%s</code></td> <td>%s</td></tr>\n", 
          '@ARGV', @ARGV;
   printf "<tr><td><code>%s</code></td> <td>%vd</td></tr>\n", 
          '$PERL_VERION', $PERL_VERSION;
   print "</table>";
} # middle()


sub XHTMLhead {
 return << 'EOHTML'
   <?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
             "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
     <title>
       CGI interrogation for Dal CS 4173 : Web-centric Computing 
     </title>
     <meta name="ROBOTS" content="NOINDEX" />
     <meta name="ROBOTS" content="NOFOLLOW" />
     <link rev="Made"    href="mailto:jamie@cs.dal.ca" />
     <link rel="stylesheet" type="text/css" 
           href="/~jamie/course/CS/4173/CS4173.css" />
     </head>
    <body>
     <h1><a href="/~jamie/course/CS/4173/"
            title="course homepage"
            >Web-centric Computing</a></h1>
     <h2><a href="/~jamie/course/CS/4173/examples/list.html"
            >Example Code</a></h2>
EOHTML
;
} # XHTMLhead()

sub XHTMLtail {
  return << 'EOHTML'
    <hr title="end of document proper" />
  
    <h6 title="document identification information">
     <kbd>http://www.cs.dal.ca/~jamie/cgi-bin/4173/about/about.cgi</kbd>
    </h6>
     <dl style="display:compact;float:left">
       <dt>Version:</dt>
        <dd>14 October 2001</dd>
       <dt>Source code:</dt>
        <dd><a href="/~jamie/course/CS/4173/examples/CGI/about.source"
               ><kbd>examples/CGI/about.source</kbd></a></dd>
       <dt><a href="/~jamie/course/CS/4173/"
              >CS 4173</a> Prof:</dt>
        <dd><a title="author's homepage"
               href="/%7ejamie/"
               >J. Blustein</a> <kbd>&lt;jamie@cs.dal.ca&gt;</kbd></dd>
     </dl>
     <p style="float:right">
      <a href="http://validator.w3.org/check/referer"><img
         src="/%7ejamie/image/vxhtml10.gif"
         alt="Valid XHTML 1.0!" style="height:31px;width:88px" /></a>
     </p>
   </body>
  </html>
EOHTML
} # XHTMLtail()

## End of Example ##
