Project state: No longer maintained.
[www.jankratochvil.net.git] / project / captive / Index.html.pl
index 09142d1..48b5c6b 100755 (executable)
@@ -31,6 +31,10 @@ Wuse 'My::Project';
 Wuse 'project::captive::ListItem';
 
 
+my $lang="";
+# do { $lang="de" if $_ && /^de/i; } for ($ENV{"HTTP_ACCEPT_LANGUAGE"});
+
+
 my $W=My::Project->init_project(
                "__PACKAGE__"=>__PACKAGE__,
                "ListItem"=>\@project::captive::ListItem::ListItem,
@@ -41,270 +45,209 @@ my $W=My::Project->init_project(
 .re     { font-style: italic; }
 table.mailman > * /* FIXME: What is it? */ > tr > th,
 table.mailman > * /* FIXME: What is it? */ > tr > td { padding: 1ex; text-align: center; }
+table.download td { padding: 8px; }
+table.navigate td { padding-bottom: 1ex; padding-left: 15px; padding-right: 15px; }
 ",
+               "project_text_after_title"=>""
+                               .($lang ne "de" ? "" : "<h1>Captive:"
+                                               ." Das erste kostenlose Programm um auf ein NTFS Dateisystem unter GNU/Linux zu lesen und zu schreiben</h1>")
+                               .'<table border="0" width="100%"><tr><td align="center">'
+                                       .'<table border="0" class="navigate"><tr>'
+                                               .'<td>&bull;&nbsp;'.a_href('#download','Download').'</td>'
+                                               .'<td>&bull;&nbsp;'.a_href('#news','NEWS').'</td>'
+                                               .'<td>&bull;&nbsp;'.a_href('#testimonials','Testimonials').'</td>'
+                                               .'<td>&bull;&nbsp;'.a_href('#press','Internet Press').'</td>'
+                                               .'<td>&bull;&nbsp;'.a_href('#notes','Installation Notes').'</td>'
+                                               .'<td>&bull;&nbsp;'.a_href('#lists','Mailing Lists').'</td>'
+                                               .'<td>&bull;&nbsp;'.a_href('#seealso','See Also').'</td>'
+                                       .'</tr></table>'
+                               .'</td></tr></table>',
+               ($lang eq "" ? () : ("force_charset"=>"utf-8")),
                );
 
 
-print <<"HERE";
-<h1>The First free Read/Write NTFS for Free Operating Systems</h1>
-<h1>The First Open Source MS-Windows Kernel API for Free OS</h1>
-HERE
-
-my @stuff=(
-               "A lot of people claim to be Windows Programmers.\n"
-                               ." Now, I can join them at last - I have also written my own Microsoft Windows.",
-               "Why do they need ".a_href('http://www.winsupersite.com/reviews/winserver2k3_gold2.asp','5,000 developers')
-                               ." to write Microsoft Windows when it can be just a One Man Show?",
-               "My first Microsoft Windows program ever written? Some 'helloworld'?"
-                               ." <span class=\"quote\">hal.dll</span>.",
-               );
-
-print rightimg((map("<p class=\"stuff\">$_</p>\n",($stuff[int rand @stuff])))[0],
-               'captive-install-acquire-small','[ Captive Microsoft Windows Drivers Acquire Illustration ]',
-                               "a_href_img"=>'captive-install-acquire');
-
-
 print <<"HERE" if !$WebConfig::WebConfig{"no_job"};
 @{[ vskip "3ex" ]}
 
 <table border="0" width="100%"><tr><td align="center">
-       <table border="0" style="margin: 4ex; padding: 2ex; background: #552222;">
+       <table border="0" style="margin: 3ex; padding: 2ex; background: #bb8888;">
                <tr><td style="font-size: larger;">
-                       Why did I install Microsoft Windows and write such a disgusting piece of code?<br />
-                       Expecting @{[ a_href $W->{"resume_url"},"yet another challenging task" ]}!
+                       Looking for a challenging job: @{[ a_href $W->{"resume_url"},"My resume" ]}
                </td></tr>
        </table>
 </table>
 HERE
 
+my %version=(
+               map(($_=>["1.1.5","0"]),qw(captive captive-lufs captive-install)),
+               "lufs"=>["0.9.7","1captive8"],
+               );
 
 print <<"HERE";
-@{[ vskip "3ex" ]}
+<a name="download"><h2>Download</h2></a>
+
+<h3>Choose the one preferred installation format:</h3>
+
+<table border="0" align="center" width="100%"><tr><td align="center">
+<table border="1" frame="border" rules="rows" align="center" style="text-align: center;" class="download">
+       <tr>
+               <td>
+HERE
+       if ($lang eq "") {
+               print "RPM i386 binary<br />tested for distributions:";
+               }
+       if ($lang eq "de") {
+               print "RPM i386 Binärcode<br />getestet für den Betrieb unter:";
+               }
+print <<"HERE";
+                                       <table border="0"><tr><td align="left"><ul>
+                                               <li>Red&nbsp;Hat&nbsp;9&nbsp;Shrike</li>
+                                               <li>Red&nbsp;Hat&nbsp;8&nbsp;Psyche</li>
+                                               <li>SuSE&nbsp;9.0</li>
+                                               <li>SuSE&nbsp;9.1</li>
+                                               <li>Mandrake&nbsp;9.1&nbsp;Bamboo</li>
+                                       </ul></td></tr></table>
+               </td>
+               <td>@{[ a_href 'dist/captive-static-'.$version{"captive"}[0].'-'.$version{"captive"}[1].'.i386.rpm',
+                               undef(),"size"=>1,"basename"=>1 ]}</td>
+       </tr>
+       <tr>
+               <td>
+HERE
+       if ($lang eq "") {
+               print ".tar.gz i386 binary<br />(for non-RPM distributions)";
+               }
+       if ($lang eq "de") {
+               print ".tar.gz i386 Binärcode<br />(für Linux Versionen ohne RPM z.B. Knoppix)";
+               }
+print <<"HERE";
+                               </td>
+               <td>@{[ a_href 'dist/captive-static-'.$version{"captive"}[0].'.tar.gz',undef(),"size"=>1,"basename"=>1 ]}</td>
+       </tr>
+       <tr>
+               <td>Source archives</td>
+               <td>@{[ a_href 'CVS.html.pl#source','download link' ]}</td>
+       </tr>
+</table>
+</td></tr></table>
+
+<h4>Development Status</h4>
+
+<p>Project is no longer developed. The key functionality is reached
+by the latest released version. All its resources are available
+@{[ a_href 'CVS.html.pl#source','here' ]} for download.</p>
+
+<h4>Known Issue</h4>
 
+<p>Captive was written to interface with the Linux kernel via
+@{[ a_href 'http://lufs.sourceforge.net/lufs/','LUFS' ]}.
+Unfortunately, this project is no longer being maintained by its author.
+Mounting of NTFS devices usually works, but is no longer supported by the
+author of Captive. Always unmount the device by umount(8) command before shutting
+down your GNU/Linux system.</p>
 
-<h2>NEWS</h2>
+<p>A port of Captive to the newer
+@{[ a_href 'http://fuse.sourceforge.net/','FUSE' ]}
+interface has not yet been implemented.
+There is an experimental LUFS-FUSE bridge called
+@{[ a_href 'http://sourceforge.net/project/showfiles.php?group_id=121684','lufis' ]}
+that can be used in the meanwhile.
+Also, the captive-cmdline(1) interface will get around any kernel compatibility
+problems.</p>
+
+@{[ vskip "3ex" ]}
+
+<a name="news"><h2>NEWS</h2></a>
 
 <dl>
-       <dt>captive-1.0.2 (2003-11-06) [@{[ a_href $W->{"project_viewcvs"}.'/*checkout*/captive/NEWS?rev=HEAD','archive' ]}]</dt>
+       <dt>captive-1.1.5 (2004-01-18) [@{[ a_href $W->{"project_viewcvs"}.'/*checkout*/captive/NEWS?rev=HEAD','archive' ]}]</dt>
        <dd>
                <ul>
-                       <li>Fixed sandbox chroot(2) compatibility bug</li>
-                       <li>Fixed serious sandbox-server spawn memory leak for big files copying to NTFS</li>
-                       <li>Improved performance - 1GHz CPU: read 1.5MB/s, write 500KB/s, 20MB of RAM</li>
-                       <li>Various GNU/Linux distributions compatibility fixes</li>
+                       <li>Fixed ignorance of the file truncate operation via LUFS (Matthias R.)</li>
+                       <li>Support for reading of HIDDEN SYSTEM NTFS files via LUFS</li>
+                       <li>Fixed refusal to mount some NT4.0 NTFSes (Nerijus Baliunas, Scott Chevalley)</li>
+                       <li>Support <code>/dev/ataraid</code> devices (Ivan Tonov)</li>
                </ul>
        </dd>
+       <dt>lufs-0.9.7captive8 (2003-12-06) [@{[ a_href $W->{"project_viewcvs"}.'/*checkout*/lufs/NEWS.captive?rev=1.1.2.11','archive' ]}]</dt>
 </dl>
 
+@{[ vskip "3ex" ]}
 
-@{[ vskip "1ex" ]}
-
-
-<table border="1" align="center" style="text-align: center;" width="100%"><tr><th>Distribution</th>
-               <th>Installation Case #1<br />Filesystem and installer<br />(recommended)</th>
-               <th>Installation Case #2<br />Manual installation<br />(filesystem, expert user)</th>
-               <th>Installation Case #3<br />Command-line client<br />(no filesystem access)</th></tr>
-HERE
-my %pkg=(
-               1=>[qw(captive captive-lufs captive-install lufs gnome-vfs-httpcaptive ntfsprogs ntfsprogs-gnomevfs)],
-               2=>[qw(captive captive-lufs                 lufs)],
-               3=>[qw(captive)],
-               );
-my %reqpkg=(
-               1 =>[qw(glib2 gnome-vfs2 ORBit2 libxml2 openssl popt readline libgnomeui)],
-               23=>[qw(glib2 gnome-vfs2 ORBit2 libxml2 openssl popt readline)],
-               );
-my %version=(
-               map(($_=>["1.0.2","0"]),qw(captive captive-lufs captive-install)),
-               "lufs"=>["0.9.6","1captive6"],
-               "gnome-vfs-httpcaptive"=>["2.3.8captive2","0"],
-               "ntfsprogs"=>["200309071734","1captive1"],
-               "ntfsprogs-gnomevfs"=>["1.0.2","0"],
-               );
-my %has_rh8=(map(($_=>1),qw(
-               gnome-vfs-httpcaptive
-               captive
-               captive-lufs
-               captive-install
-               )));
-my %has_mdk91=(map(($_=>1),qw(
-               gnome-vfs-httpcaptive
-               lufs
-               captive
-               captive-lufs
-               captive-install
-               )));
-my %has_mdk92=(map(($_=>1),qw(
-               captive
-               captive-lufs
-               captive-install
-               )));
-my %has_devel=(map(($_=>1),qw(
-               ntfsprogs
-               )));
-my %pkg_nosrc=(map(($_=>1),qw(
-               captive-lufs
-               captive-install
-               )));
-
-my $case;
-my $a_href_arch=sub ($$%)
-{
-my($file_base,$text,%args)=@_;
-
-       $text=~s/[._]\D.*$// if $case!=1 && $text!~/^[.]/;
-       return a_href $file_base,$text,"size"=>($case==1),%args;
-};
-
-my @libxml2_rh8_pkgs=qw(libxml2-2.5.4-1.i386.rpm libxml2-python-2.5.4-1.i386.rpm libxml2-devel-2.5.4-1.i386.rpm);
-
-my $ntfsprogs_after=sub ($) {
-       my($format)=@_;
-               return () if $case!=1;
-               return '<hr width="80%" />requirement: '
-                               .a_href('http://linux-ntfs.sourceforge.net/downloads.html#downloads','ntfsprogs')
-                               .' '.$format.' &ge; 1.8.0';
-       };
-
-my @dist=(
-               {
-                       "name"=>"Red Hat 9<br />Shrike i386",
-                       "out"=>sub {
-                               my($pkg,$version_base,$version_ext)=@_;
-                                       return () if $pkg eq "ntfsprogs";
-                                       my $file="$pkg-$version_base-$version_ext.i386.rpm";
-                                       my $r=&$a_href_arch("dist/$file",$file);
-                                       (my $filedev=$file)=~s/^\Q$pkg\E-/${pkg}-devel-/;
-                                       $r.="<br />".&$a_href_arch("dist/$filedev",$filedev) if $has_devel{$pkg};
-                                       return $r;
-                               },
-                       "after"=>sub { return &{$ntfsprogs_after}(".i386.rpm"); },
-                       },
-               {
-                       "name"=>"Red Hat 8<br />Psyche i386<br />"
-                                       ."(".a_href("#libxml2_rh8","libxml2 upgrade note").")",
-                       "out"=>sub {
-                               my($pkg,$version_base,$version_ext)=@_;
-                                       return () if $pkg eq "ntfsprogs";
-                                       my $file="$pkg-$version_base-$version_ext".(!$has_rh8{$pkg} ? "" : "rh8").".i386.rpm";
-                                       my $r=&$a_href_arch("dist/$file",$file);
-                                       (my $filedev=$file)=~s/^\Q$pkg\E-/${pkg}-devel-/;
-                                       $r.="<br />".&$a_href_arch("dist/$filedev",$filedev) if $has_devel{$pkg};
-                                       if ($pkg eq "captive-install") {
-                                               for (@libxml2_rh8_pkgs) {
-                                                       $r.="<br />".&$a_href_arch('ftp://ftp.redhat.com/pub/redhat/linux/9/en/os/i386/RedHat/RPMS/'.$_,$_)." of Red Hat 9";
-                                                       }
-                                               }
-                                       return $r;
-                               },
-                       "after"=>sub { return &{$ntfsprogs_after}(".i386.rpm"); },
-                       },
-               {
-                       "name"=>"Mandrake 9.2<br />TBA i586",
-                       "out"=>sub {
-                               my($pkg,$version_base,$version_ext)=@_;
-                                       return () if $pkg eq "ntfsprogs";
-                                       my $file="$pkg-$version_base-$version_ext"
-                                                       .($has_mdk92{$pkg} ? "mdk92.i586.rpm" : ($has_mdk91{$pkg} ? "mdk91.i586.rpm" : ".i386.rpm"));
-                                       my $r=&$a_href_arch("dist/$file",$file);
-                                       (my $filedev=$file)=~s/^\Q$pkg\E-/${pkg}-devel-/;
-                                       $r.="<br />".&$a_href_arch("dist/$filedev",$filedev) if $has_devel{$pkg};
-                                       return $r;
-                               },
-                       "after"=>sub { return &{$ntfsprogs_after}(".i386.rpm"); },
-                       },
-               {
-                       "name"=>"Mandrake 9.1<br />Bamboo i586",
-                       "out"=>sub {
-                               my($pkg,$version_base,$version_ext)=@_;
-                                       return () if $pkg eq "ntfsprogs";
-                                       my $file="$pkg-$version_base-$version_ext".($has_mdk91{$pkg} ? "mdk91.i586.rpm" : ".i386.rpm");
-                                       my $r=&$a_href_arch("dist/$file",$file);
-                                       (my $filedev=$file)=~s/^\Q$pkg\E-/${pkg}-devel-/;
-                                       $r.="<br />".&$a_href_arch("dist/$filedev",$filedev) if $has_devel{$pkg};
-                                       return $r;
-                               },
-                       "after"=>sub { return &{$ntfsprogs_after}(".i386.rpm"); },
-                       },
-               {
-                       "name"=>"Debian GNU/Linux<br />'unstable' i386",
-                       "out"=>sub {
-                               my($pkg,$version_base,$version_ext)=@_;
-                                       $version_ext=~s/^\d+//;
-                                       my $file="${pkg}_$version_base".($version_ext=~/^\d+$/ ? "" : $version_ext)."_i386.deb";
-                                       my $r=&$a_href_arch("dist/$file",$file);
-                                       (my $filedev=$file)=~s/^\Q$pkg\E_/${pkg}-dev_/;
-                                       $r.="<br />".&$a_href_arch("dist/$filedev",$filedev) if $has_devel{$pkg};
-                                       return $r;
-                               },
-                       },
-               {
-                       "name"=>"Sources (.tar.gz)",
-                       "out"=>sub {
-                               my($pkg,$version_base,$version_ext)=@_;
-                                       return () if $pkg_nosrc{$pkg};
-                                       $version_ext=~s/^\d+//;
-                                       my $file="$pkg-$version_base".($version_ext=~/^\d+$/ ? "" : $version_ext).".tar.gz";
-                                       return $file,$file;
-                               },
-                       "after"=>sub { return &{$ntfsprogs_after}(".tar.gz"); },
-                       },
-               {
-                       "name"=>"Sources (.src.rpm)<br />(Red Hat 9 - Shrike)",
-                       "out"=>sub {
-                               my($pkg,$version_base,$version_ext)=@_;
-                                       return () if $pkg eq "ntfsprogs";
-                                       return () if $pkg_nosrc{$pkg};
-                                       my $file="$pkg-$version_base-$version_ext.src.rpm";
-                                       return $file,$file;
-                               },
-                       "after"=>sub { return &{$ntfsprogs_after}(".i386.rpm (incl. -devel)"); },
-                       },
-               );
+<a name="testimonials"><h2>Captive NTFS Testimonials</h2></a>
 
-for my $dist (@dist) {
-       print "<tr>";
-               print "<td>".$dist->{"name"}."</td>";
-               for my $casel (1,2,3) {
-                       $case=$casel;
-                       print "<td>";
-                       print join("<br />",map({ my $pkg=$_;
-                               my($file,$text)=&{$dist->{"out"}}($pkg,@{$version{$pkg}});
-                               (!defined $text ? ($file) || () : (&$a_href_arch("dist/$file",$text)));
-                               } @{$pkg{$case}}),map({ (!$_ ? () : (&{$_}())); } $dist->{"after"}));
-                       print "</td>";
-                       }
-       print "</tr>\n";
-       }
-print "<tr style=\"height: 2ex;\"></tr>\n";
-print "<tr>";
-       print "<td>Package Requirements</td>";
-       for my $case (1,23) {
-               print "<td".($case==23 ? ' colspan="2"' : '').">";
-               print join(", ",map("<span class=\"reqpkg\">$_</span>",@{$reqpkg{$case}}));
-               print "</td>";
-               }
-print "</tr>\n";
-print <<"HERE";
-</table>
+<ul>
+       <li>Hospital of Castelo Branco - Bruno Santos
+               <p>we are preparing the machines to install another system that will allow
+               the digitalization of medical images - PACS (picture archive and
+               communication system).</p>
+
+               <p>since the computers that are need are about 100 and we need to install
+               windows in all of them (even we have an almost automated instalation - but
+               requires some administrator interaction). So, we want to install
+               windows2000 without pressing a key.</p>
+
+               <p>@{[ a_href 'TestimonialBrunoSantos.html.pl','<span style="font-style: italic;">[ more ]</span>' ]}</p>
+       </li>
+       <li>@{[ a_href 'http://www.amunra.co.uk/','Dave &quot;AmunRa&quot; Rigby' ]}
+               <p>Ok, I'm impressed (@{[ a_href 'http://www.amunra.co.uk/archives/000028.php','Captive Review' ]})</p>
+               <p>Linux software generally has a reputation for having some great, novell
+               ideas, but often lacking in the general 'spit and polish' - difficult to
+               install, unreliable, and so on. However the latest program I have tried out
+               - Captive, is a breath of fresh air - simple to install and set up, and It
+               Just WorksTM. And not only that, it's probably one of the most useful and
+               technically impressive projects I've seen in a long time ...</p>
+               <p><span style="font-style: italic;">[ snip ]</span></p>
+       </li>
+       <li>Derek J Witt
+               <p>I commend you for this project. I am currently using this on my XP NTFS
+               partitions and I am impressed that I can actually move, edit, and remove files
+               and directories with no apparent ill effects. This is very nice indeed.</p>
+               <p>I initially was skeptical because it uses wine and parts of ReactOS
+                (I have messed with this OS a few times), but you have proved me wrong. I have
+               noticed no lag on my system.  I do notice the initial mounting process does
+               take slightly longer than the Linux-NTFS project. But, once I'm past that, it's
+               quite transparent.</p>
+               <p><span style="font-style: italic;">[ technical question cut ]</span></p>
+       </li>
+       <li>James Van't Slot
+               <p>Just wanted to drop you a note and say &quot;Excellent work!&quot;</p>
+               <p>I just installed captive and it worked as advertized right out of the
+               rpm.  Thanks, I've been holding off recompiling my kernel until NTFS is
+               supported out of the box for Redhat.  Now I don't have to bother.</p>
+               <p>Thanks again and keep up the great work.</p>
+       </li>
+</ul>
 
-<blockquote>
-       <p><a name="libxml2_rh8"><b><i>Red Hat 8 Psyche</i> upgrade of <i>libxml2</i> package:</b></a>
-       Upgrade only the packages already installed on your system to prevent
-       many dependency requirements - do not use &quot;<code>rpm -U</code>&quot;,
-       use &quot;<code>rpm -F</code>&quot; instead:</p>
-       <blockquote><p class="quote">
-               <code>rpm -F @{[ join(" ",@libxml2_rh8_pkgs) ]}</code>
-       </p></blockquote>
-</blockquote>
+<a name="press"><h2>@{[ a_href 'Press.html.pl','Internet Press' ]}</h2></a>
 
 @{[ vskip "3ex" ]}
 
 
-<h1>Installation Notes</h1>
-
+<a name="notes"><h1>
+HERE
+       if ($lang eq "") {
+               print "Installation Notes";
+               }
+       if ($lang eq "de") {
+               print "Installationsanleitung";
+               }
+print <<"HERE";
+</h1></a>
+HERE
+       if ($lang eq "") {
+               print <<"EOF";
 <p>You should first run <b>captive-install-acquire</b> command to check your
 available Microsoft Windows drivers versions. Now you can execute:</p>
+EOF
+               }
+       if ($lang eq "de") {
+               print <<"EOF";
+<p>Sie sollten als erstes den Befehl <b>captive-install-acquire</b>
+ausführen um ihre Windows Treiber Version zu überprüfen. Nun können sie folgenden Befehl ausführen:</p>
+EOF
+               }
+print <<"HERE";
 
 <blockquote>
        <p class="quote">
@@ -314,29 +257,28 @@ available Microsoft Windows drivers versions. Now you can execute:</p>
 </blockquote>
 
 
+HERE
+       if ($lang eq "") {
+               print <<"EOF";
 <h2>Overview</h2>
 
-<p>'<b>captive</b>' is the base package. It contains debugging '<b>captive-cmdline</b>' client.<br />
-'<b>captive-lufs</b>' permits mounting NTFS as regular filesystem. It needs '<b>lufs</b>'.<br />
-'<b>lufs</b>' is a daemon to enable userland process to provide filesystem functions.</p>
-
 <p>Any errors from '<b>captive-lufs</b>' are written to '<b>/var/log/messages</b>'.</p>
-
 <p>Needed drivers (at least ntoskrnl.exe+ntfs.sys) must be in '<b>/var/lib/captive</b>'.</p>
-
 <p>'<b>captive</b>' package creates '<b>captive</b>' user and '<b>captive</b>' group on your system.</p>
-
-
-<h2>Package Version Conflicts</h2>
-
-<dl>
-
-<dt>@{[ a_href 'http://lufs.sourceforge.net/lufs/','lufs' ]}</dt>
-<dd><p><b>'captive' version required</b>: Although you may already have the
-original package installed you must replace it by the local 'captive'-marked
-version containing some 'captive'-essential fixes and extensions.</p></dd>
-
-</dl>
+EOF
+               }
+       if ($lang eq "de") {
+               print <<"EOF";
+<h2>Übersicht</h2>
+
+<p>Jegliche Fehler des '<b>captive-lufs</b>' werden im Ordner '<b>/var/log/messages</b>' aufgelistet.</p>
+<p>Die Dateien ntoskrnl.exe und ntfs.sys müssen in den '<b>/var/lib/captive</b>'-Ordner kopiert werden.
+(Empfehlendswert über ein Wechseldatenträger [CD-ROM, Diskette].)</p>
+<p>Das '<b>captive</b>' Packet erstellt einen '<b>captive</b>' Benutzer und eine '<b>captive</b>' Gruppe auf Ihrem System.</p>
+<p align="right" style="font-size: smaller;">Übersetzung von Botond Beres.</p>
+EOF
+               }
+print <<"HERE";
 
 
 <h2>LUFS Kernel Driver Module</h2>
@@ -395,8 +337,8 @@ print <<"HERE";
                                <td>User support,<br />bug reports</td>
                                <td>Development</td>
                                </tr>
-               <tr>@{[ map({ "<td>".a_href(&{$W->{"mailman_url_sub"}}()."/listinfo/$_",'Mailman Infopage')."</td>"; } @lists) ]}</tr>
-               <tr>@{[ map({ "<td>".a_href(&{$W->{"pipermail_url_sub"}}()."/$_",'Archive')."</td>"; } @lists) ]}</tr>
+               <tr>@{[ map({ "<td>".a_href(&{$W->{"mailman_url_sub"}}()."listinfo/$_",'Mailman Infopage')."</td>"; } @lists) ]}</tr>
+               <tr>@{[ map({ "<td>".a_href(&{$W->{"pipermail_url_sub"}}()."$_",'Archive')."</td>"; } @lists) ]}</tr>
                <tr>@{[
                        map(('<td><input type="checkbox" name="list" value="'.$_.'"'
                                        .($_ ne "captive-announce-list" ? '' : ' checked="checked"')
@@ -417,10 +359,10 @@ print <<"HERE";
 
 @{[ vskip "3ex" ]}
 
-<h1>See Also</h1>
+<a name="seealso"><h1>See Also</h1></a>
 <ul>
-       <li>@{[ a_href 'Preview.html.pl','<span style="font-size: larger;">Technology Preview</span>' ]}</li>
-       <li>@{[ a_href 'CVS.html.pl','CVS Repository' ]}</li>
+       <li>@{[ a_href 'Preview.html.pl','Technology Preview' ]}</li>
+       <li>@{[ a_href 'CVS.html.pl','Download Sources, CVS Repository' ]}</li>
        <li>@{[ a_href 'doc/','Developer Documentation' ]}; highlights:<ul>
                <li>@{[ a_href 'doc/About.html.pl#versions','Microsoft Windows Versions Compatibility' ]}</li>
                <li>@{[ a_href 'doc/Architecture.html.pl#law','Laws and Licensing Conditions' ]}</li>