<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.6000.16705" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY>
<DIV><FONT face=Arial size=2>&gt; how can I write perl raw code to get all the 
HTTP post params as </FONT></DIV>
<DIV><FONT face=Arial size=2>&gt; a whole string on Apache (mod_perl 1.29)? Any 
%ENV?<BR></DIV>
<DIV><FONT face=Arial size=2>See example script below.&nbsp; It makes use 
of&nbsp;cgi-lib which is in the listing below.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV>Sorry for the long post.</DIV>
<DIV></FONT><FONT face=Arial size=2></FONT><BR><FONT face=Arial size=2>Indy 
Singh<BR>IndigoSTAR Software -- </FONT><A href="http://www.indigostar.com"><FONT 
face=Arial size=2>www.indigostar.com</FONT></A></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>#!/usr/bin/perl</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2># Test cgi script, using cgi-lib<BR># prints out 
the date, and environment variables</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>$| = 1;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>print PrintHeader();<BR>print HtmlTop("Test CGI 
output");<BR>print "&lt;HR&gt;\n";<BR>$date = localtime(time());<BR>print 
"Testcgi.pl 1.1 at $date&lt;BR&gt;\n";<BR>print "ARGS = ", join(" ", @ARGV), 
"&lt;BR&gt;\n";<BR>$cwd = $^O eq "MSWin32" ? Win32::GetCwd() . "\n" : 
`pwd`;<BR>chop $cwd;<BR>print "Current directory: $cwd&lt;BR&gt;\n";<BR>print 
"&lt;HR&gt;\n";</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2>print "&lt;H2&gt;Environment 
variables&lt;/H2&gt;\n";<BR>#print PrintEnv();<BR>print 
"&lt;pre&gt;";<BR>foreach (sort keys %ENV) {&nbsp;&nbsp; # conver form vars to 
$variables<BR>&nbsp;&nbsp;&nbsp; print "set $_=$ENV{$_}\n";<BR>}<BR>print 
"&lt;/pre&gt;";<BR>print "&lt;HR&gt;\n";</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2># cgi-lib hangs on multipart/form-data<BR>if 
($ENV{'CONTENT_TYPE'} =~ m|^multipart/form-data|) {<BR>&nbsp;&nbsp;&nbsp; print 
"&lt;H2&gt;Multipart/form-data not supported&lt;br&gt;Raw 
Data:&lt;/H2&gt;\n";<BR>&nbsp;&nbsp;&nbsp; if ($ENV{CONTENT_LENGTH}) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $length = 
$ENV{CONTENT_LENGTH};<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; read(STDIN, 
$data, $length);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #$data .= $_ 
while (&lt;STDIN&gt;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print 
"&lt;pre&gt;data=\n$data\n&lt;/pre&gt;";<BR>&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp;&nbsp;&nbsp; print "&lt;HR&gt;\n";<BR>}<BR>else 
{<BR>&nbsp;&nbsp;&nbsp; ReadParse();<BR>&nbsp;&nbsp;&nbsp; print "&lt;H2&gt;Form 
Fields&lt;/H2&gt;\n";<BR>&nbsp;&nbsp;&nbsp; print 
PrintVariables();<BR>&nbsp;&nbsp;&nbsp; print "&lt;HR&gt;\n";<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>print HtmlBot();<BR>exit;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2># Perl Routines to Manipulate CGI input<BR># 
</FONT><A href="mailto:S.E.Brenner@bioc.cam.ac.uk"><FONT face=Arial 
size=2>S.E.Brenner@bioc.cam.ac.uk</FONT></A><BR><FONT face=Arial size=2># $Id: 
cgi-lib.pl,v 2.8 1996/03/30 01:36:33 brenner Rel $<BR>#<BR># Copyright (c) 1996 
Steven E. Brenner&nbsp; <BR># Unpublished work.<BR># Permission granted to use 
and modify this library so long as the<BR># copyright above is maintained, 
modifications are documented, and<BR># credit is given for any use of the 
library.<BR>#<BR># Thanks are due to many people for reporting bugs and 
suggestions<BR># especially Meng Weng Wong, Maki Watanabe, Bo Frese 
Rasmussen,<BR># Andrew Dalke, Mark-Jason Dominus, Dave Dittrich, Jason 
Mathews</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2># For more information, 
see:<BR>#&nbsp;&nbsp;&nbsp;&nbsp; </FONT><A 
href="http://www.bio.cam.ac.uk/cgi-lib/"><FONT face=Arial 
size=2>http://www.bio.cam.ac.uk/cgi-lib/</FONT></A></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>BEGIN {<BR>($cgi_lib'version = '$Revision: 2.8 $') 
=~ s/[^.\d]//g;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2># Parameters affecting cgi-lib behavior<BR># 
User-configurable parameters affecting file 
upload.<BR>$cgi_lib'maxdata&nbsp;&nbsp;&nbsp; = 1500000;&nbsp;&nbsp;&nbsp; # 
maximum bytes to accept via POST - 2^17<BR>$cgi_lib'writefiles 
=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0;&nbsp;&nbsp;&nbsp; # directory to which 
to write files, 
or<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
# 0 if files should not be written<BR>$cgi_lib'filepre&nbsp;&nbsp;&nbsp; = 
"cgi-lib"; # Prefix of file names, in directory above</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2># Do not change the following parameters unless you 
have special reasons<BR>$cgi_lib'bufsize&nbsp; =&nbsp; 8192;&nbsp;&nbsp;&nbsp; # 
default buffer size when reading multipart<BR>$cgi_lib'maxbound =&nbsp;&nbsp; 
100;&nbsp;&nbsp;&nbsp; # maximum boundary length to be 
encounterd<BR>$cgi_lib'headerout =&nbsp;&nbsp;&nbsp; 0;&nbsp;&nbsp;&nbsp; # 
indicates whether the header has been printed<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2># ReadParse<BR># Reads in GET or POST data, 
converts it to unescaped text, and puts<BR># key/value pairs in %in, using "\0" 
to separate multiple selections</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2># Returns &gt;0 if there was input, 0 if there was 
no input <BR># undef indicates some failure.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2># Now that cgi scripts can be put in the normal 
file space, it is useful<BR># to combine both the form and the script in one 
place.&nbsp; If no parameters<BR># are given (i.e., ReadParse returns FALSE), 
then a form could be output.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2># If a reference to a hash is given, then the data 
will be stored in that<BR># hash, but the data from $in and @in will become 
inaccessable.<BR># If a variable-glob (e.g., *cgi_input) is the first parameter 
to ReadParse,<BR># information is stored there, rather than in $in, @in, and 
%in.<BR># Second, third, and fourth parameters fill associative arrays analagous 
to<BR># %in with data relevant to file uploads. </FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2># If no method is given, the script will process 
both command-line arguments<BR># of the form: name=value and any text that is in 
$ENV{'QUERY_STRING'}<BR># This is intended to aid debugging and may be changed 
in future releases</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>sub ReadParse {<BR>&nbsp; local (*in) = shift if 
@_;&nbsp;&nbsp;&nbsp; # CGI input<BR>&nbsp; local 
(*incfn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
# Client's filename (may not be provided)<BR>&nbsp; 
*inct,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
# Client's content-type (may not be provided)<BR>&nbsp; *insfn) = 
@_;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Server's filename 
(for spooled files)<BR>&nbsp; local ($len, $type, $meth, $errflag, $cmdflag, 
$perlwarn);<BR>&nbsp;<BR>&nbsp; # Disable warnings as this code deliberately 
uses local and environment<BR>&nbsp; # variables which are preset to undef 
(i.e., not explicitly initialized)<BR>&nbsp; $perlwarn = $^W;<BR>&nbsp; $^W = 
0;<BR>&nbsp;<BR>&nbsp; # Get several useful env variables<BR>&nbsp; $type = 
$ENV{'CONTENT_TYPE'};<BR>&nbsp; $len&nbsp; = $ENV{'CONTENT_LENGTH'};<BR>&nbsp; 
$meth = $ENV{'REQUEST_METHOD'};<BR>&nbsp; <BR>&nbsp; if ($len &gt; 
$cgi_lib'maxdata) { #'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&amp;CgiDie("cgi-lib.pl: Request to receive too much data: $len 
bytes\n");<BR>&nbsp; }<BR>&nbsp; <BR>&nbsp; if (!defined $meth || $meth eq '' || 
$meth eq 'GET' || <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $type eq 
'application/x-www-form-urlencoded') {<BR>&nbsp;&nbsp;&nbsp; local ($key, $val, 
$i);<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; # Read in text<BR>&nbsp;&nbsp;&nbsp; if 
(!defined $meth || $meth eq '') {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $in = 
$ENV{'QUERY_STRING'};<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $cmdflag = 1;&nbsp; # 
also use command-line options<BR>&nbsp;&nbsp;&nbsp; } elsif($meth eq 'GET' || 
$meth eq 'HEAD') {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $in = 
$ENV{'QUERY_STRING'};<BR>&nbsp;&nbsp;&nbsp; } elsif ($meth eq 'POST') 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $errflag = (read(STDIN, $in, 
$len) != $len);<BR>&nbsp;&nbsp;&nbsp; } else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&amp;CgiDie("cgi-lib.pl: Unknown request method: 
$meth\n");<BR>&nbsp;&nbsp;&nbsp; }</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; @in = split(/[&amp;;]/,$in); 
<BR>&nbsp;&nbsp;&nbsp; push(@in, @ARGV) if $cmdflag; # add command-line 
parameters</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; foreach $i (0 .. $#in) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Convert plus to 
space<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $in[$i] =~ s/\+/ /g;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Split into key and 
value.&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($key, $val) = 
split(/=/,$in[$i],2); # splits on the first =.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Convert %XX from 
hex numbers to alphanumeric<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $key =~ 
s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $val 
=~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Associate key and 
value<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $in{$key} .= "\0" if 
(defined($in{$key})); # \0 is the multiple 
separator<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $in{$key} .= 
$val;<BR>&nbsp;&nbsp;&nbsp; }</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp; } elsif ($ENV{'CONTENT_TYPE'} =~ 
m#^multipart/form-data#) {<BR>&nbsp;&nbsp;&nbsp; # for efficiency, compile 
multipart code only if needed<BR>########################$errflag = !(eval 
&lt;&lt;'END_MULTIPART');</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; local ($buf, $boundary, $head, 
@heads, $cd, $ct, $fname, $ctype, $blen);<BR>&nbsp;&nbsp;&nbsp; local ($bpos, 
$lpos, $left, $amt, $fn, $ser);<BR>&nbsp;&nbsp;&nbsp; local ($bufsize, 
$maxbound, $writefiles) = <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($cgi_lib'bufsize, 
$cgi_lib'maxbound, $cgi_lib'writefiles);</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; # The following lines exist 
solely to eliminate spurious warning messages<BR>&nbsp;&nbsp;&nbsp; $buf = ''; 
</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; ($boundary) = $type =~ 
/boundary="([^"]+)"/; #";&nbsp;&nbsp; # find boundary<BR>&nbsp;&nbsp;&nbsp; 
($boundary) = $type =~ /boundary=(\S+)/ unless $boundary;<BR>&nbsp;&nbsp;&nbsp; 
&amp;CgiDie ("Boundary not provided") unless $boundary;<BR>&nbsp;&nbsp;&nbsp; 
$boundary =&nbsp; "--" . $boundary;<BR>&nbsp;&nbsp;&nbsp; $blen = length 
($boundary);</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; if ($ENV{'REQUEST_METHOD'} ne 
'POST') {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;CgiDie("Invalid request method 
for&nbsp; multipart/form-data: $meth\n");<BR>&nbsp;&nbsp;&nbsp; }</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; if ($writefiles) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
local($me);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stat 
($writefiles);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $writefiles = "/tmp" 
unless&nbsp; -d _ &amp;&amp; -r _ &amp;&amp; -w 
_;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # ($me) = $0 =~ 
m#([^/]*)$#;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $writefiles .= 
"/$cgi_lib'filepre"; <BR>&nbsp;&nbsp;&nbsp; }</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; # read in the data and split 
into parts:<BR>&nbsp;&nbsp;&nbsp; # put headers in @in and data in 
%in<BR>&nbsp;&nbsp;&nbsp; # General algorithm:<BR>&nbsp;&nbsp;&nbsp; 
#&nbsp;&nbsp; There are two dividers: the border and the '\r\n\r\n' 
between<BR>&nbsp;&nbsp;&nbsp; # header and body.&nbsp; Iterate between searching 
for these<BR>&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp; Retain a buffer of 
size(bufsize+maxbound); the latter part is<BR>&nbsp;&nbsp;&nbsp; # to ensure 
that dividers don't get lost by wrapping between two bufs<BR>&nbsp;&nbsp;&nbsp; 
#&nbsp;&nbsp; Look for a divider in the current batch.&nbsp; If not found, 
then<BR>&nbsp;&nbsp;&nbsp; # save all of bufsize, move the maxbound extra buffer 
to the front of<BR>&nbsp;&nbsp;&nbsp; # the buffer, and read in a new bufsize 
bytes.&nbsp; If a divider is found,<BR>&nbsp;&nbsp;&nbsp; # save everything up 
to the divider.&nbsp; Then empty the buffer of everything<BR>&nbsp;&nbsp;&nbsp; 
# up to the end of the divider.&nbsp; Refill buffer to 
bufsize+maxbound<BR>&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp; Note slightly odd 
organization.&nbsp; Code before BODY: really goes with<BR>&nbsp;&nbsp;&nbsp; # 
code following HEAD:, but is put first to 'pre-fill' buffers.&nbsp; 
BODY:<BR>&nbsp;&nbsp;&nbsp; # is placed before HEAD: because we first need to 
discard any 'preface,'<BR>&nbsp;&nbsp;&nbsp; # which would be analagous to a 
body without a preceeding head.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; $left = $len;<BR>&nbsp;&nbsp; 
PART: # find each part of the multi-part while reading 
data<BR>&nbsp;&nbsp;&nbsp; while (1) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; last 
PART if $errflag;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $amt = ($left &gt; 
$bufsize+$maxbound-length($buf) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?&nbsp; 
$bufsize+$maxbound-length($buf): $left);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
$errflag = (read(STDIN, $buf, $amt, length($buf)) != 
$amt);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $left -= $amt;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $in{$name} .= "\0" 
if defined $in{$name}; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $in{$name} .= $fn if 
$fn;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
$name=~/([-\w]+)/;&nbsp; # This allows $insfn{$name} to be 
untainted<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (defined $1) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $insfn{$1} .= "\0" if defined 
$insfn{$1}; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $insfn{$1} .= $fn if 
$fn;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
BODY: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (($bpos = index($buf, $boundary)) 
== -1) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($name) {&nbsp; # if 
no $name, then it's the prologue -- 
discard<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($fn) { 
print FILE substr($buf, 0, $bufsize); 
}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
else&nbsp;&nbsp;&nbsp;&nbsp; { $in{$name} .= substr($buf, 0, $bufsize); 
}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $buf = substr($buf, 
$bufsize);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $amt = ($left &gt; 
$bufsize ? $bufsize : $left); 
#$maxbound==length($buf);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $errflag 
= (read(STDIN, $buf, $amt, $maxbound) != $amt);&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $left -= 
$amt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if 
(defined $name) {&nbsp; # if no $name, then it's the prologue -- 
discard<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($fn) { print FILE 
substr($buf, 0, $bpos-2); }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
else&nbsp;&nbsp;&nbsp;&nbsp; { $in {$name} .= substr($buf, 0, $bpos-2); } # kill 
last \r\n<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
close (FILE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; last PART if substr($buf, $bpos 
+ $blen, 4) eq "--\r\n";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; substr($buf, 0, 
$bpos+$blen+2) = '';<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $amt = ($left &gt; 
$bufsize+$maxbound-length($buf) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ? 
$bufsize+$maxbound-length($buf) : $left);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
$errflag = (read(STDIN, $buf, $amt, length($buf)) != 
$amt);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $left -= $amt;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; undef 
$head;&nbsp; undef $fn;<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
HEAD:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (($lpos = index($buf, "\r\n\r\n")) 
== -1) { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $head .= substr($buf, 0, 
$bufsize);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $buf = substr($buf, 
$bufsize);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $amt = ($left &gt; 
$bufsize ? $bufsize : $left); 
#$maxbound==length($buf);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $errflag 
= (read(STDIN, $buf, $amt, $maxbound) != $amt);&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $left -= 
$amt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
$head .= substr($buf, 0, $lpos+2);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push (@in, 
$head);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @heads = split("\r\n", 
$head);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($cd) = grep 
(/^\s*Content-Disposition:/i, @heads);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($ct) = 
grep (/^\s*Content-Type:/i, @heads);</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($name) = $cd =~ 
/\bname="([^"]+)"/i; #"; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($name) = $cd =~ 
/\bname=([^\s:;]+)/i unless defined $name;&nbsp; </FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($fname) = $cd =~ 
/\bfilename="([^"]*)"/i; #"; # filename can be 
null-str<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($fname) = $cd =~ 
/\bfilename=([^\s:;]+)/i unless defined 
$fname;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $incfn{$name} .= (defined $in{$name} ? 
"\0" : "") . $fname;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($ctype) = $ct =~ 
/^\s*Content-type:\s*"([^"]+)"/i;&nbsp; #";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
($ctype) = $ct =~ /^\s*Content-Type:\s*([^\s:;]+)/i unless defined 
$ctype;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $inct{$name} .= (defined $in{$name} ? 
"\0" : "") . $ctype;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($writefiles 
&amp;&amp; defined $fname) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
$ser++;<BR>&nbsp;$fn = $writefiles . ".$$.$ser";<BR>&nbsp;open (FILE, "&gt;$fn") 
|| &amp;CgiDie("Couldn't open $fn\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; substr($buf, 0, $lpos+4) = 
'';<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; undef 
$fname;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; undef $ctype;<BR>&nbsp;&nbsp;&nbsp; 
}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial 
size=2>#################1;<BR>#################END_MULTIPART<BR>&nbsp; 
&amp;CgiDie($@) if $errflag;<BR>&nbsp; } else {<BR>&nbsp;&nbsp;&nbsp; 
&amp;CgiDie("cgi-lib.pl: Unknown Content-type: 
$ENV{'CONTENT_TYPE'}\n");<BR>&nbsp; }</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2>&nbsp; $^W = $perlwarn;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp; return ($errflag ? undef :&nbsp; 
scalar(@in)); <BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2># PrintHeader<BR># Returns the magic line which 
tells WWW that we're an HTML document</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>sub PrintHeader {<BR>&nbsp; return "Content-type: 
text/html\n\n";<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2># HtmlTop<BR># Returns the &lt;head&gt; of a 
document and the beginning of the body<BR># with the title and a body &lt;h1&gt; 
header as specified by the parameter</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>sub HtmlTop<BR>{<BR>&nbsp; local ($title) = 
@_;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp; return 
&lt;&lt;END_OF_TEXT;<BR>&lt;html&gt;<BR>&lt;head&gt;<BR>&lt;title&gt;$title&lt;/title&gt;<BR>&lt;/head&gt;<BR>&lt;body&gt;<BR>&lt;h1&gt;$title&lt;/h1&gt;<BR>END_OF_TEXT<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2># HtmlBot<BR># Returns the &lt;/body&gt;, 
&lt;/html&gt; codes for the bottom of every HTML page</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>sub HtmlBot<BR>{<BR>&nbsp; return 
"&lt;/body&gt;\n&lt;/html&gt;\n";<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2># SplitParam<BR># Splits a multi-valued 
parameter into a list of the constituent parameters</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>sub SplitParam<BR>{<BR>&nbsp; local ($param) = 
@_;<BR>&nbsp; local (@params) = split ("\0", $param);<BR>&nbsp; return 
(wantarray ? @params : $params[0]);<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2># MethGet<BR># Return true if this cgi call was 
using the GET request, false otherwise</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>sub MethGet {<BR>&nbsp; return (defined 
$ENV{'REQUEST_METHOD'} &amp;&amp; $ENV{'REQUEST_METHOD'} eq 
"GET");<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2># MethPost<BR># Return true if this cgi call 
was using the POST request, false otherwise</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>sub MethPost {<BR>&nbsp; return (defined 
$ENV{'REQUEST_METHOD'} &amp;&amp; $ENV{'REQUEST_METHOD'} eq 
"POST");<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2># MyBaseUrl<BR># Returns the base URL to the 
script (i.e., no extra path or query string)<BR>sub MyBaseUrl {<BR>&nbsp; local 
($ret, $perlwarn);<BR>&nbsp; $perlwarn = $^W; $^W = 0;<BR>&nbsp; $ret = 
'http://' . $ENV{'SERVER_NAME'} .&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($ENV{'SERVER_PORT'} != 80 
? ":$ENV{'SERVER_PORT'}" : '') 
.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
$ENV{'SCRIPT_NAME'};<BR>&nbsp; $^W = $perlwarn;<BR>&nbsp; return 
$ret;<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2># MyFullUrl<BR># Returns the full URL to the 
script (i.e., with extra path or query string)<BR>sub MyFullUrl {<BR>&nbsp; 
local ($ret, $perlwarn);<BR>&nbsp; $perlwarn = $^W; $^W = 0;<BR>&nbsp; $ret = 
'http://' . $ENV{'SERVER_NAME'} .&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($ENV{'SERVER_PORT'} != 80 
? ":$ENV{'SERVER_PORT'}" : '') 
.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ENV{'SCRIPT_NAME'} . 
$ENV{'PATH_INFO'} .<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (length 
($ENV{'QUERY_STRING'}) ? "?$ENV{'QUERY_STRING'}" : '');<BR>&nbsp; $^W = 
$perlwarn;<BR>&nbsp; return $ret;<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2># MyURL<BR># Returns the base URL to the script 
(i.e., no extra path or query string)<BR># This is obsolete and will be removed 
in later versions<BR>sub MyURL&nbsp; {<BR>&nbsp; return 
&amp;MyBaseUrl;<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2># CgiError<BR># Prints out an error message 
which which containes appropriate headers,<BR># markup, etcetera.<BR># 
Parameters:<BR>#&nbsp; If no parameters, gives a generic error 
message<BR>#&nbsp; Otherwise, the first parameter will be the title and the rest 
will <BR>#&nbsp; be given as different paragraphs of the body</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>sub CgiError {<BR>&nbsp; local (@msg) = 
@_;<BR>&nbsp; local ($i,$name);</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp; if (</FONT><A href="mailto:!@msg"><FONT 
face=Arial size=2>!@msg</FONT></A><FONT face=Arial size=2>) 
{<BR>&nbsp;&nbsp;&nbsp; $name = &amp;MyFullUrl;<BR>&nbsp;&nbsp;&nbsp; @msg = 
("Error: script $name encountered fatal error\n");<BR>&nbsp; };</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp; if (!$cgi_lib'headerout) { 
#')<BR>&nbsp;&nbsp;&nbsp; print &amp;PrintHeader;&nbsp;<BR>&nbsp;&nbsp;&nbsp; 
print 
"&lt;html&gt;\n&lt;head&gt;\n&lt;title&gt;$msg[0]&lt;/title&gt;\n&lt;/head&gt;\n&lt;body&gt;\n";<BR>&nbsp; 
}<BR>&nbsp; print "&lt;h1&gt;$msg[0]&lt;/h1&gt;\n";<BR>&nbsp; foreach $i (1 .. 
$#msg) {<BR>&nbsp;&nbsp;&nbsp; print "&lt;p&gt;$msg[$i]&lt;/p&gt;\n";<BR>&nbsp; 
}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp; $cgi_lib'headerout++;<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2># CgiDie<BR># Identical to CgiError, but also 
quits with the passed error message.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>sub CgiDie {<BR>&nbsp; local (@msg) = @_;<BR>&nbsp; 
&amp;CgiError (@msg);<BR>&nbsp; die @msg;<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2># PrintVariables<BR># Nicely formats 
variables.&nbsp; Three calling options:<BR># A non-null associative array - 
prints the items in that array<BR># A type-glob - prints the items in the 
associated assoc array<BR># nothing - defaults to use %in<BR># Typical use: 
&amp;PrintVariables()</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>sub PrintVariables {<BR>&nbsp; local (*in) = @_ if 
@_ == 1;<BR>&nbsp; local (%in) = @_ if @_ &gt; 1;<BR>&nbsp; local ($out, $key, 
$output);</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp; $output =&nbsp; "\n&lt;dl 
compact&gt;\n";<BR>&nbsp; foreach $key (sort keys(%in)) {<BR>&nbsp;&nbsp;&nbsp; 
foreach (split("\0", $in{$key})) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($out = $_) 
=~ s/\n/&lt;br&gt;\n/g;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $output .=&nbsp; 
"&lt;dt&gt;&lt;b&gt;$key&lt;/b&gt;\n 
&lt;dd&gt;:&lt;i&gt;$out&lt;/i&gt;:&lt;br&gt;\n";<BR>&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp; }<BR>&nbsp; $output .=&nbsp; "&lt;/dl&gt;\n";</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp; return $output;<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2># PrintEnv<BR># Nicely formats all environment 
variables and returns HTML string<BR>sub PrintEnv {<BR>&nbsp; 
&amp;PrintVariables(*ENV);<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2># The following lines exist only to avoid 
warning messages<BR>$cgi_lib'writefiles =&nbsp; 
$cgi_lib'writefiles;<BR>$cgi_lib'bufsize&nbsp;&nbsp;&nbsp; =&nbsp; 
$cgi_lib'bufsize ;<BR>$cgi_lib'maxbound&nbsp;&nbsp; =&nbsp; 
$cgi_lib'maxbound;<BR>$cgi_lib'version&nbsp;&nbsp;&nbsp; =&nbsp; 
$cgi_lib'version;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial><BR><FONT size=2></FONT></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>----- Original Message ----- </FONT>
<DIV><FONT face=Arial size=2>From: "YueSong Xu" &lt;</FONT><A 
href="mailto:desert_camelry@yahoo.com"><FONT face=Arial 
size=2>desert_camelry@yahoo.com</FONT></A><FONT face=Arial 
size=2>&gt;</FONT></DIV>
<DIV><FONT face=Arial size=2>To: &lt;</FONT><A 
href="mailto:toronto-pm@pm.org"><FONT face=Arial 
size=2>toronto-pm@pm.org</FONT></A><FONT face=Arial size=2>&gt;</FONT></DIV>
<DIV><FONT face=Arial size=2>Sent: Wednesday, August 27, 2008 7:41 
PM</FONT></DIV>
<DIV><FONT face=Arial size=2>Subject: [tpm] How to retrieve 
post</FONT></DIV></DIV>
<DIV><FONT face=Arial><BR><FONT size=2></FONT></FONT></DIV><FONT face=Arial 
size=2>&gt; Hello everyone,<BR>&gt; <BR>&gt; Instead of using CGI.pm, how can I 
write perl raw code to get all the HTTP post params as a whole string on Apache 
(mod_perl 1.29)? Any %ENV?<BR>&gt; Thanks a lot.<BR>&gt; <BR>&gt; <BR>&gt; 
<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&gt; 
_______________________________________________<BR>&gt; toronto-pm mailing 
list<BR>&gt; </FONT><A href="mailto:toronto-pm@pm.org"><FONT face=Arial 
size=2>toronto-pm@pm.org</FONT></A><BR><FONT face=Arial size=2>&gt; </FONT><A 
href="http://mail.pm.org/mailman/listinfo/toronto-pm"><FONT face=Arial 
size=2>http://mail.pm.org/mailman/listinfo/toronto-pm</FONT></A></BODY></HTML>