diff --git a/en/cgi/man.cgi b/en/cgi/man.cgi index 2d053d46c3..ef227d6596 100755 --- a/en/cgi/man.cgi +++ b/en/cgi/man.cgi @@ -1,1397 +1,1397 @@ #!/usr/bin/perl -T # # Copyright (c) 1996-2007 Wolfram Schneider # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # man.cgi - HTML hypertext FreeBSD man page interface # # based on bsdi-man.pl,v 2.17 1995/10/05 16:48:58 sanders Exp # bsdi-man -- HTML hypertext BSDI man page interface # based on bsdi-man.pl,v 2.10 1993/10/02 06:13:23 sanders Exp # by polk@BSDI.COM 1/10/95 # BSDI Id: bsdi-man,v 1.2 1995/01/11 02:30:01 polk Exp # Dual CGI/Plexus mode and new interface by sanders@bsdi.com 9/22/1995 # -# $Id: man.cgi,v 1.196 2008-01-17 16:44:52 hrs Exp $ -# $FreeBSD: www/en/cgi/man.cgi,v 1.195 2007/12/02 21:21:18 wosch Exp $ +# $Id: man.cgi,v 1.197 2008-02-02 00:18:58 danger Exp $ +# $FreeBSD: www/en/cgi/man.cgi,v 1.196 2008/01/17 16:44:52 hrs Exp $ ############################################################################ # !!! man.cgi is stale perl4 code !!! ############################################################################ # Use standard FreeBSD CGI Style if available. Otherwise # print simple HTML design. package cgi_style; use constant HAS_FREEBSD_CGI_STYLE => eval { require "./cgi-style.pl"; }; package main; $www{'title'} = 'FreeBSD Hypertext Man Pages'; $www{'home'} = 'http://www.FreeBSD.org'; $www{'head'} = $www{'title'}; $command{'man'} = '/usr/bin/man'; # 8Bit clean man # Config Options # map sections to their man command argument(s) %sections = ( '', '', 'All', '', '0', '', '1', '-S1', '1c', '-S1', '1C', '-S1', '1g', '-S1', '1m', '-S1', '2', '-S2', '2j', '-S2', '3', '-S3', '3S', '-S3', '3f', '-S3', '3j', '-S3', '3m', '-S3', '3n', '-S3', '3r', '-S3', '3s', '-S3', '3x', '-S3', '4', '-S4', '5', '-S5', '6', '-S6', '7', '-S7', '8', '-S8', '8c', '-S8', '9', '-S9', 'l', '-Sl', 'n', '-Sn', ); $sectionpath = { 'HP-UX 11.22' => { 'path' => '1:1m:2:3:4:5:7:9' }, 'HP-UX 11.20' => { 'path' => '1:1m:2:3:4:5:7:9' }, 'HP-UX 11.11' => { 'path' => '1:1m:2:3:4:5:7:9' }, 'HP-UX 11.00' => { 'path' => '1:1m:2:3:4:5:7:9' }, 'HP-UX 10.20' => { 'path' => '1:1m:2:3:4:5:7:9' }, 'HP-UX 10.10' => { 'path' => '1:1m:2:3:4:5:7:9' }, 'HP-UX 10.01' => { 'path' => '1:1m:2:3:4:5:7:9' }, 'SunOS 5.10' => { 'path' => '1:1m:1s:1as:2:3:3c:3malloc:3nsl:3socket:3ldap:3nisdb:3rac:3resolv:3rpc:3slp:3proc:3rt:3c_db:3elf:3kvm:3kstat:3m:3mp:3mvec:3pam:3aio:3bsm:3tsol:3contract:3cpc:3sec:3secdb:3smartcard:3cfgadm:3crypt:3devid:3devinfo:3door:3lib:3libucb:3head:3nvpair:3rsm:7:7d:7fs:7i:7ipp:7m:7p:9:9e:9f:9p:9s:4:5:4b:3gen:3exacct:3sysevent:3uuid:3wsreg:3dmi:3snmp:3tnf:3volmgt:3mail:3layout:3ext:3picl:3picltree:3pool:3project:3perl:3lgrp:3sasl:3scf:3dat:3hbaapi:3tecla:1b:1c:1f:3ucb:3xnet:3curses:3plot:3xcurses:3gss:6:3tiff:3fontconfig:3mlib:l:n', }, 'SunOS 5.9' => { 'path' => '1:1m:1s:2:3:3c:3malloc:3dl:3nsl:3socket:3ldap:3nisdb:3rac:3resolv:3rpc:3slp:3xfn:3proc:3rt:3thr:3elf:3kvm:3kstat:3m:3mp:3pam:3sched:3aio:3bsm:3cpc:3sec:3secdb:3cfgadm:3crypt:3devid:3devinfo:3door:3lib:3libucb:3head:3nvpair:3rsm:7:7d:7fs:7i:7m:7p:9:9e:9f:9p:9s:4:5:4b:3gen:3exacct:3sysevent:3wsreg:3dmi:3snmp:3tnf:3volmgt:3mail:3layout:3ext:3picl:3picltree:3pool:3project:1b:1c:1f:3ucb:3xnet:3curses:3plot:3xcurses:3gss:6:l:n', }, 'SunOS 5.8' => { 'path' => '1:1m:1s:2:3:3c:3malloc:3dl:3nsl:3socket:3ldap:3krb:3nisdb:3rac:3resolv:3rpc:3slp:3xfn:3proc:3rt:3thr:3elf:3kvm:3kstat:3m:3mp:3pam:3sched:3aio:3bsm:3cpc:3sec:3secdb:3cfgadm:3crypt:3devid:3devinfo:3door:3lib:3libucb:3head:7:7d:7fs:7i:7m:7p:9:9e:9f:9s:4:5:4b:3gen:3dmi:3snmp:3tnf:3volmgt:3mail:3layout:3ext:1b:1c:1f:3ucb:3xnet:3curses:3plot:3xcurses:6:l:n', }, 'SunOS 5.7' => { 'path' => '1:1m:1c:1f:1s:1b:2:3:3c:3s:3x:3xc:3n:3r:3t:3xn:3m:3k:3g:3e:3b:9f:9s:9e:9:4:5:7:7d:7i:7m:7p:7fs:4b:6:l:n', }, 'SunOS 5.6' => { 'path' => '1:1m:1c:1f:1s:1b:2:3:3c:3s:3x:3xc:3xn:3r:3t:3n:3m:3k:3g:3e:3b:9f:9s:9e:9:4:5:7:7d:7i:7m:7p:7fs:4b:6:l:n', }, 'SunOS 5.5.1' => { 'path' => '1:1m:1c:1f:1s:1b:2:3:3c:3s:3x:3xc:3xn:3r:3t:3n:3m:3k:3g:3e:3b:9f:9s:9e:9:4:5:7:7d:7i:7m:7p:7fs:4b:6:l:n', }, 'OpenBSD 3.0' => { 'path' => '1:2:3:3p:4:5:6:7:8:9', }, 'OpenBSD 3.1' => { 'path' => '1:2:3:3p:4:5:6:7:8:9', }, 'OpenBSD 3.2' => { 'path' => '1:2:3:3p:4:5:6:7:8:9', }, 'OpenBSD 3.3' => { 'path' => '1:2:3:3p:4:5:6:7:8:9', }, 'OpenBSD 3.4' => { 'path' => '1:2:3:3p:4:5:6:7:8:9', }, 'OpenBSD 3.5' => { 'path' => '1:2:3:3p:4:5:6:7:8:9', }, 'OpenBSD 3.6' => { 'path' => '1:2:3:3p:4:5:6:7:8:9', }, 'OpenBSD 3.7' => { 'path' => '1:2:3:3p:4:5:6:7:8:9', }, 'OpenBSD 3.8' => { 'path' => '1:2:3:3p:4:5:6:7:8:9', }, 'OpenBSD 3.9' => { 'path' => '1:2:3:3p:4:5:6:7:8:9', }, 'OpenBSD 4.0' => { 'path' => '1:2:3:3p:4:5:6:7:8:9', }, 'OpenBSD 4.1' => { 'path' => '1:2:3:3p:4:5:6:7:8:9', }, }; foreach my $os ( keys %$sectionpath ) { foreach my $section ( split( /:/, $sectionpath->{$os}{'path'} ) ) { $section =~ /(.)(.*)/; $sectionpath->{$os}{$1} .= ( $sectionpath->{$os}{$1} ? ':' : '' ) . $section; } } %sectionName = ( '0', 'All Sections', '1', '1 - General Commands', '2', '2 - System Calls', '3', '3 - Subroutines', '4', '4 - Special Files', '5', '5 - File Formats', '6', '6 - Games', '7', '7 - Macros and Conventions', '8', '8 - Maintenance Commands', '9', '9 - Kernel Interface', 'n', 'n - New Commands', ); $manLocalDir = '/usr/local/www/bsddoc/man'; -$manPathDefault = 'FreeBSD 6.2-RELEASE'; +$manPathDefault = 'FreeBSD 6.3-RELEASE'; %manPath = ( 'FreeBSD 7.0-RELEASE and Ports', "$manLocalDir/FreeBSD-7.0-RELEASE/man:$manLocalDir/FreeBSD-7.0-RELEASE/openssl/man:$manLocalDir/FreeBSD-ports", 'FreeBSD 6.3-RELEASE and Ports', "$manLocalDir/FreeBSD-6.3-RELEASE/man:$manLocalDir/FreeBSD-6.3-RELEASE/openssl/man:$manLocalDir/FreeBSD-ports", 'FreeBSD 6.2-RELEASE and Ports', "$manLocalDir/FreeBSD-6.2-RELEASE/man:$manLocalDir/FreeBSD-6.2-RELEASE/openssl/man:$manLocalDir/FreeBSD-ports", 'FreeBSD 8-current', "$manLocalDir/FreeBSD-8-current/man:$manLocalDir/FreeBSD-8-current/openssl/man", 'FreeBSD 7.0-stable', "$manLocalDir/FreeBSD-7.0-stable/man:$manLocalDir/FreeBSD-7.0-stable/openssl/man", 'FreeBSD 7.0-RELEASE', "$manLocalDir/FreeBSD-7.0-RELEASE/man:$manLocalDir/FreeBSD-7.0-RELEASE/openssl/man", 'FreeBSD Ports 7.0-RELEASE', "$manLocalDir/FreeBSD-ports-7.0-RELEASE", 'FreeBSD 6.3-stable', "$manLocalDir/FreeBSD-6.3-stable/man:$manLocalDir/FreeBSD-6.3-stable/openssl/man", 'FreeBSD 6.3-RELEASE', "$manLocalDir/FreeBSD-6.3-RELEASE/man:$manLocalDir/FreeBSD-6.3-RELEASE/openssl/man", 'FreeBSD Ports 6.3-RELEASE', "$manLocalDir/FreeBSD-ports-6.3-RELEASE", 'FreeBSD 6.2-stable', "$manLocalDir/FreeBSD-6.2-stable/man:$manLocalDir/FreeBSD-6.2-stable/openssl/man", 'FreeBSD 6.2-RELEASE', "$manLocalDir/FreeBSD-6.2-RELEASE/man:$manLocalDir/FreeBSD-6.2-RELEASE/openssl/man", 'FreeBSD Ports 6.2-RELEASE', "$manLocalDir/FreeBSD-ports-6.2-RELEASE", 'FreeBSD 6.1-RELEASE', "$manLocalDir/FreeBSD-6.1-RELEASE/man:$manLocalDir/FreeBSD-6.1-RELEASE/openssl/man", 'FreeBSD 6.0-RELEASE', "$manLocalDir/FreeBSD-6.0-RELEASE/man:$manLocalDir/FreeBSD-6.0-RELEASE/openssl/man", 'FreeBSD 5.5-stable', "$manLocalDir/FreeBSD-5.5-stable", 'FreeBSD 5.5-RELEASE', "$manLocalDir/FreeBSD-5.5-RELEASE/man:$manLocalDir/FreeBSD-5.5-RELEASE/openssl/man", 'FreeBSD Ports 5.5-RELEASE', "$manLocalDir/FreeBSD-ports-5.4-RELEASE", 'FreeBSD 5.4-RELEASE', "$manLocalDir/FreeBSD-5.4-RELEASE/man:$manLocalDir/FreeBSD-5.4-RELEASE/openssl/man", 'FreeBSD 5.3-RELEASE', "$manLocalDir/FreeBSD-5.3-RELEASE/man:$manLocalDir/FreeBSD-5.3-RELEASE/openssl/man", 'FreeBSD 5.2.1-RELEASE', "$manLocalDir/FreeBSD-5.2-RELEASE/man:$manLocalDir/FreeBSD-5.2-RELEASE/openssl/man", 'FreeBSD 5.2-RELEASE', "$manLocalDir/FreeBSD-5.2-RELEASE/man:$manLocalDir/FreeBSD-5.2-RELEASE/openssl/man", 'FreeBSD 5.1-RELEASE', "$manLocalDir/FreeBSD-5.1-RELEASE/man:$manLocalDir/FreeBSD-5.1-RELEASE/openssl/man", 'FreeBSD 5.0-RELEASE', "$manLocalDir/FreeBSD-5.0-RELEASE", 'FreeBSD 4.11-stable', "$manLocalDir/FreeBSD-4.11-stable", 'FreeBSD 4.11-RELEASE', "$manLocalDir/FreeBSD-4.11-RELEASE/man:$manLocalDir/FreeBSD-4.11-RELEASE/openssl/man:$manLocalDir/FreeBSD-4.11-RELEASE/perl/man", 'FreeBSD Ports 4.11-RELEASE', "$manLocalDir/FreeBSD-ports-4.11-RELEASE", 'FreeBSD 4.10-RELEASE', "$manLocalDir/FreeBSD-4.10-RELEASE/man:$manLocalDir/FreeBSD-4.10-RELEASE/openssl/man:$manLocalDir/FreeBSD-4.10-RELEASE/perl/man", 'FreeBSD 4.9-RELEASE', "$manLocalDir/FreeBSD-4.9-RELEASE", 'FreeBSD 4.8-RELEASE', "$manLocalDir/FreeBSD-4.8-RELEASE", 'FreeBSD 4.7-RELEASE', "$manLocalDir/FreeBSD-4.7-RELEASE", 'FreeBSD 4.6.2-RELEASE', "$manLocalDir/FreeBSD-4.6.2-RELEASE", 'FreeBSD 4.6-RELEASE', "$manLocalDir/FreeBSD-4.6-RELEASE", 'FreeBSD 4.5-RELEASE', "$manLocalDir/FreeBSD-4.5-RELEASE", 'FreeBSD 4.4-RELEASE', "$manLocalDir/FreeBSD-4.4-RELEASE", 'FreeBSD 4.3-RELEASE', "$manLocalDir/FreeBSD-4.3-RELEASE", 'FreeBSD 4.2-RELEASE', "$manLocalDir/FreeBSD-4.2-RELEASE", 'FreeBSD 4.1.1-RELEASE', "$manLocalDir/FreeBSD-4.1.1-RELEASE", 'FreeBSD 4.1-RELEASE', "$manLocalDir/FreeBSD-4.1-RELEASE", 'FreeBSD 4.0-RELEASE', "$manLocalDir/FreeBSD-4.0-RELEASE", 'FreeBSD 3.5.1-RELEASE', "$manLocalDir/FreeBSD-3.5.1-RELEASE", 'FreeBSD 3.4-RELEASE', "$manLocalDir/FreeBSD-3.4-RELEASE", 'FreeBSD 3.3-RELEASE', "$manLocalDir/FreeBSD-3.3-RELEASE", 'FreeBSD 3.2-RELEASE', "$manLocalDir/FreeBSD-3.2-RELEASE", 'FreeBSD 3.1-RELEASE', "$manLocalDir/FreeBSD-3.1-RELEASE", 'FreeBSD 3.0-RELEASE', "$manLocalDir/FreeBSD-3.0-RELEASE", 'FreeBSD 2.2.5-RELEASE', "$manLocalDir/FreeBSD-2.2.5-RELEASE", 'FreeBSD 2.2.6-RELEASE', "$manLocalDir/FreeBSD-2.2.6-RELEASE", 'FreeBSD 2.2.7-RELEASE', "$manLocalDir/FreeBSD-2.2.7-RELEASE", 'FreeBSD 2.2.8-RELEASE', "$manLocalDir/FreeBSD-2.2.8-RELEASE", 'FreeBSD 2.2.2-RELEASE', "$manLocalDir/FreeBSD-2.2.2-RELEASE", 'FreeBSD 2.2.1-RELEASE', "$manLocalDir/FreeBSD-2.2.1-RELEASE", 'FreeBSD 2.1.7.1-RELEASE', "$manLocalDir/FreeBSD-2.1.7.1-RELEASE", 'FreeBSD 2.1.6.1-RELEASE', "$manLocalDir/FreeBSD-2.1.6.1-RELEASE", 'FreeBSD 2.1.5-RELEASE', "$manLocalDir/FreeBSD-2.1.5-RELEASE", 'FreeBSD 2.1.0-RELEASE', "$manLocalDir/FreeBSD-2.1.0-RELEASE", 'FreeBSD 2.0.5-RELEASE', "$manLocalDir/FreeBSD-2.0.5-RELEASE", 'FreeBSD 2.0-RELEASE', "$manLocalDir/FreeBSD-2.0-RELEASE", 'FreeBSD 1.1.5.1-RELEASE', "$manLocalDir/FreeBSD-1.1.5.1-RELEASE", 'FreeBSD 1.1-RELEASE', "$manLocalDir/FreeBSD-1.1-RELEASE", 'FreeBSD 1.0-RELEASE', "$manLocalDir/FreeBSD-1.0-RELEASE", 'OpenBSD 2.0', "$manLocalDir/OpenBSD-2.0", 'OpenBSD 2.1', "$manLocalDir/OpenBSD-2.1", 'OpenBSD 2.2', "$manLocalDir/OpenBSD-2.2", 'OpenBSD 2.3', "$manLocalDir/OpenBSD-2.3", 'OpenBSD 2.4', "$manLocalDir/OpenBSD-2.4", 'OpenBSD 2.5', "$manLocalDir/OpenBSD-2.5", 'OpenBSD 2.6', "$manLocalDir/OpenBSD-2.6", 'OpenBSD 2.7', "$manLocalDir/OpenBSD-2.7", 'OpenBSD 2.8', "$manLocalDir/OpenBSD-2.8", 'OpenBSD 2.9', "$manLocalDir/OpenBSD-2.9", 'OpenBSD 3.0', "$manLocalDir/OpenBSD-3.0", 'OpenBSD 3.1', "$manLocalDir/OpenBSD-3.1", 'OpenBSD 3.2', "$manLocalDir/OpenBSD-3.2", 'OpenBSD 3.3', "$manLocalDir/OpenBSD-3.3", 'OpenBSD 3.4', "$manLocalDir/OpenBSD-3.4/share/man:$manLocalDir/OpenBSD-3.4/X11R6/man", 'OpenBSD 3.5', "$manLocalDir/OpenBSD-3.5/share/man:$manLocalDir/OpenBSD-3.5/X11R6/man", 'OpenBSD 3.6', "$manLocalDir/OpenBSD-3.6/share/man:$manLocalDir/OpenBSD-3.6/X11R6/man", 'OpenBSD 3.7', "$manLocalDir/OpenBSD-3.7", 'OpenBSD 3.8', "$manLocalDir/OpenBSD-3.8", 'OpenBSD 3.9', "$manLocalDir/OpenBSD-3.9", 'OpenBSD 4.0', "$manLocalDir/OpenBSD-4.0", 'OpenBSD 4.1', "$manLocalDir/OpenBSD-4.1", #'NetBSD 0.9', "$manLocalDir/NetBSD-0.9", 'NetBSD 1.0', "$manLocalDir/NetBSD-1.0", 'NetBSD 1.1', "$manLocalDir/NetBSD-1.1", 'NetBSD 1.2', "$manLocalDir/NetBSD-1.2", 'NetBSD 1.2.1', "$manLocalDir/NetBSD-1.2.1", 'NetBSD 1.3', "$manLocalDir/NetBSD-1.3", 'NetBSD 1.3.1', "$manLocalDir/NetBSD-1.3.1", 'NetBSD 1.3.2', "$manLocalDir/NetBSD-1.3.2", 'NetBSD 1.3.3', "$manLocalDir/NetBSD-1.3.3", 'NetBSD 1.4', "$manLocalDir/NetBSD-1.4", 'NetBSD 1.4.1', "$manLocalDir/NetBSD-1.4.1", 'NetBSD 1.4.2', "$manLocalDir/NetBSD-1.4.2", 'NetBSD 1.4.3', "$manLocalDir/NetBSD-1.4.3", 'NetBSD 1.5', "$manLocalDir/NetBSD-1.5", 'NetBSD 1.5.1', "$manLocalDir/NetBSD-1.5.1", 'NetBSD 1.5.2', "$manLocalDir/NetBSD-1.5.2", 'NetBSD 1.5.3', "$manLocalDir/NetBSD-1.5.3", 'NetBSD 1.6', "$manLocalDir/NetBSD-1.6", 'NetBSD 1.6.1', "$manLocalDir/NetBSD-1.6.1", 'NetBSD 1.6.2', "$manLocalDir/NetBSD-1.6.2", 'NetBSD 2.0', "$manLocalDir/NetBSD-2.0", 'NetBSD 2.0.2', "$manLocalDir/NetBSD-2.0.2", 'NetBSD 2.1', "$manLocalDir/NetBSD-2.1", 'NetBSD 3.0', "$manLocalDir/NetBSD-3.0", 'NetBSD 4.0', "$manLocalDir/NetBSD-4.0", '2.8 BSD', "$manLocalDir/2.8BSD", '2.9.1 BSD', "$manLocalDir/2.9.1BSD", '2.10 BSD', "$manLocalDir/2.10BSD", '2.11 BSD', "$manLocalDir/2.11BSD", '386BSD 0.0', "$manLocalDir/386BSD-0.0", '386BSD 0.1', "$manLocalDir/386BSD-0.1", '4.3BSD Reno', "$manLocalDir/4.3BSD-Reno", '4.3BSD NET/2', "$manLocalDir/net2", '4.4BSD Lite2', "$manLocalDir/4.4BSD-Lite2", 'Linux Slackware 3.1', "$manLocalDir/Slackware-3.1", 'Red Hat Linux/i386 4.2', "$manLocalDir/RedHat-4.2", 'Red Hat Linux/i386 5.0', "$manLocalDir/RedHat-5.0", 'Red Hat Linux/i386 5.2', "$manLocalDir/RedHat-5.2-i386", 'Red Hat Linux/i386 6.1', "$manLocalDir/RedHat-6.1-i386", 'Red Hat Linux/i386 6.2', "$manLocalDir/RedHat-6.2-i386", 'Red Hat Linux/i386 7.0', "$manLocalDir/RedHat-7.0-i386", 'Red Hat Linux/i386 7.1', "$manLocalDir/RedHat-7.1-i386", 'Red Hat Linux/i386 7.2', "$manLocalDir/RedHat-7.2-i386", 'Red Hat Linux/i386 7.3', "$manLocalDir/RedHat-7.3-i386", 'Red Hat Linux/i386 8.0', "$manLocalDir/RedHat-8.0-i386", 'Red Hat Linux/i386 9', "$manLocalDir/RedHat-9-i386", 'SuSE Linux/i386 4.3', "$manLocalDir/SuSE-4.3-i386", 'SuSE Linux/i386 5.0', "$manLocalDir/SuSE-5.0-i386", 'SuSE Linux/i386 5.2', "$manLocalDir/SuSE-5.2-i386", 'SuSE Linux/i386 5.3', "$manLocalDir/SuSE-5.3-i386", 'SuSE Linux/i386 6.0', "$manLocalDir/SuSE-6.0-i386", 'SuSE Linux/i386 6.1', "$manLocalDir/SuSE-6.1-i386", 'SuSE Linux/i386 6.3', "$manLocalDir/SuSE-6.3-i386", 'SuSE Linux/i386 6.4', "$manLocalDir/SuSE-6.4-i386", 'SuSE Linux/i386 7.0', "$manLocalDir/SuSE-7.0-i386", 'SuSE Linux/i386 7.1', "$manLocalDir/SuSE-7.1-i386", 'SuSE Linux/i386 7.2', "$manLocalDir/SuSE-7.2-i386", 'SuSE Linux/i386 7.3', "$manLocalDir/SuSE-7.3-i386", 'SuSE Linux/i386 8.0', "$manLocalDir/SuSE-8.0-i386", 'SuSE Linux/i386 8.1', "$manLocalDir/SuSE-8.1-i386", 'SuSE Linux/i386 8.2', "$manLocalDir/SuSE-8.2-i386", 'HP-UX 11.22', "$manLocalDir/HP-UX-11.22", 'HP-UX 11.20', "$manLocalDir/HP-UX-11.20", 'HP-UX 11.11', "$manLocalDir/HP-UX-11.11", 'HP-UX 11.00', "$manLocalDir/HP-UX-11.00", 'HP-UX 10.20', "$manLocalDir/HP-UX-10.20", 'HP-UX 10.10', "$manLocalDir/HP-UX-10.10", 'HP-UX 10.01', "$manLocalDir/HP-UX-10.01", 'SunOS 5.10', "$manLocalDir/SunOS-5.10", 'SunOS 5.9', "$manLocalDir/SunOS-5.9", 'SunOS 5.8', "$manLocalDir/SunOS-5.8", 'SunOS 5.7', "$manLocalDir/SunOS-5.7", 'SunOS 5.6', "$manLocalDir/SunOS-5.6", 'SunOS 5.5.1', "$manLocalDir/SunOS-5.5.1", 'SunOS 4.1.3', "$manLocalDir/SunOS-4.1.3", 'XFree86 3.2', "$manLocalDir/XFree86-3.2", 'XFree86 3.3', "$manLocalDir/XFree86-3.3", 'XFree86 3.3.6', "$manLocalDir/XFree86-3.3.6", 'XFree86 4.0', "$manLocalDir/XFree86-4.0", 'XFree86 4.0.1', "$manLocalDir/XFree86-4.0.1", 'XFree86 4.0.2', "$manLocalDir/XFree86-4.0.2", 'XFree86 4.1.0', "$manLocalDir/XFree86-4.1.0", 'XFree86 4.2.0', "$manLocalDir/XFree86-4.2.0", 'XFree86 4.2.99.3', "$manLocalDir/XFree86-4.2.99.3", 'XFree86 4.3.0', "$manLocalDir/XFree86-4.3.0", 'XFree86 4.4.0', "$manLocalDir/XFree86-4.4.0", 'XFree86 4.5.0', "$manLocalDir/XFree86-4.5.0", 'X11R6.7.0', "$manLocalDir/X11R6.7.0", 'X11R6.8.2', "$manLocalDir/X11R6.8.2", 'X11R6.9.0', "$manLocalDir/X11R6.9.0", 'X11R7.2', "$manLocalDir/X11R7.2", 'ULTRIX 4.2', "$manLocalDir/ULTRIX-4.2", 'OSF1 V4.0/alpha', "$manLocalDir/OSF1-V4.0-alpha", 'OSF1 V5.1/alpha', "$manLocalDir/OSF1-V5.1-alpha", 'Plan 9', "$manLocalDir/plan9", 'Minix 2.0', "$manLocalDir/Minix-2.0", 'Unix Seventh Edition', "$manLocalDir/v7man", 'deutsch - Linux/GNU', "$manLocalDir/linux-de-0.4", "Darwin 1.3.1/x86", "$manLocalDir/Darwin-1.3.1-x86", "Darwin 1.4.1/x86", "$manLocalDir/Darwin-1.4.1-x86", "Darwin 6.0.2/x86", "$manLocalDir/Darwin-6.0.2-x86", "Darwin 7.0.1", "$manLocalDir/Darwin-7.0.1", "Darwin 8.0.1/ppc", "$manLocalDir/Darwin-8.0.1-ppc", "OpenDarwin 20030208pre4/ppc", "$manLocalDir/OpenDarwin-20030208pre4-ppc", "OpenDarwin 6.6.1/x86", "$manLocalDir/OpenDarwin-6.6.1-x86", "OpenDarwin 6.6.2/x86", "$manLocalDir/OpenDarwin-6.6.2-x86", "OpenDarwin 7.2.1", "$manLocalDir/OpenDarwin-7.2.1", ); # delete not existing releases while ( ( $key, $val ) = each %manPath ) { my $counter = 0; # if the manpath contains colons, at least one directory must exists foreach ( split( /:/, $val ) ) { $counter++ if -d; } # give up and delete release delete $manPath{"$key"} if !$counter && $key ne $manPathDefault; } # keywords must be in lower cases. %manPathAliases = ( 'freebsd', 'FreeBSD 6.2-RELEASE', 'freebsd-release', 'FreeBSD 6.2-RELEASE', 'freebsd-stable', 'FreeBSD 6.2-stable', 'freebsd-stable4', 'FreeBSD 4.11-stable', 'freebsd-stable5', 'FreeBSD 5.5-stable', 'freebsd-stable6', 'FreeBSD 6.2-stable', 'freebsd-stable7', 'FreeBSD 7.0-stable', 'freebsd-current', 'FreeBSD 8-current', 'freebsd-release-ports', 'FreeBSD 6.2-RELEASE and Ports', 'slackware', 'Linux Slackware 3.1', 'linux-de', 'deutsch - Linux/GNU', 'redhat', 'Red Hat Linux/i386 9', 'suse', 'SuSE Linux/i386 8.2', 'linux', 'Red Hat Linux/i386 9', 'darwin', 'Darwin 8.0.1/ppc', 'opendarwin', 'OpenDarwin 7.2.1', 'macosx', 'Darwin 8.0.1/ppc', 'netbsd', 'NetBSD 4.0', 'openbsd', 'OpenBSD 4.1', 'v7', 'Unix Seventh Edition', 'v7man', 'Unix Seventh Edition', 'x11', 'X11R7.2', 'xfree86', 'XFree86 4.5.0', 'ultrix', 'ULTRIX 4.2', 'hpux', 'HP-UX 11.22', 'solaris', 'SunOS 5.10', 'sunos5', 'SunOS 5.10', 'sunos4', 'SunOS 4.1.3', 'sunos', 'SunOS 4.1.3', 'freebsd ports', 'FreeBSD Ports 6.2-RELEASE', 'ports', 'FreeBSD Ports 6.2-RELEASE', 'plan9', 'Plan 9', 'osf1', 'OSF1 V5.1/alpha', 'true64', 'OSF1 V5.1/alpha', ); foreach ( sort keys %manPathAliases ) { # delete non-existing aliases if ( !defined( $manPath{ $manPathAliases{$_} } ) ) { undef $manPathAliases{$_}; next; } # add aliases, replases spaces with dashes if (/\s/) { local ($key) = $_; $key =~ s/\s+/-/g; $manPathAliases{$key} = $manPathAliases{$_}; } } @sections = keys %sections; shift @sections; # all but the "" entry $sections = join( "|", @sections ); # sections regexp # mailto - Author # webmaster - who run this service $mailto = 'wosch@FreeBSD.org'; $mailtoURL = 'http://wolfram.schneider.org'; $mailtoURL = "mailto:$mailto" if !$mailtoURL; #$webmaster = $mailto; #$webmasterURL = $mailtoURL; #$manstat = 'http://www.de.freebsd.org/de/stat/man'; &secure_env; # CGI Interface -- runs at load time &do_man( &env('SCRIPT_NAME'), &env('PATH_INFO'), &env('QUERY_STRING') ) unless defined($main'plexus_configured); $enable_include_links = 0; $enable_mailto_links = 0; # # end of config ####################################################################################### sub html_footer { if (cgi_style::HAS_FREEBSD_CGI_STYLE) { print q{
}; print &cgi_style::html_footer; } else { print "\n\n"; } } sub html_header { my ( $title, $base ) = @_; my $html_meta = q| |; return &html_header2( $title, $html_meta ) if !cgi_style::HAS_FREEBSD_CGI_STYLE; ( my $header = &cgi_style::short_html_header( $title, 1 ) ) =~ s,,\n$html_meta,s; $header =~ s,^Content-type:\s+\S+\s+,,s; $header =~ s,,\n,s if $base; return $header; } # Plexus Native Interface sub do_man { local ( $BASE, $path, $form ) = @_; local ( $_, %form, $query, $name, $section, $apropos ); local ($u) = $BASE; return &faq_output($u) if ( $path =~ /\/(faq|help)\.html$/ ); return &get_the_sources if ( $path =~ /source$/ ); return &include_output($path) if ( $enable_include_links && $path =~ m%^/usr/include/% && -f $path ); return &indexpage if ( $form eq "" ); &decode_form( $form, *form, 0 ); $format = $form{'format'}; $format = 'html' if $format !~ /^(ps|pdf|ascii|latin1|dvi|troff)$/; local ($fform) = &dec($form); if ( $fform =~ m%^([a-zA-Z_\-\.]+)$% ) { return &man( $1, '' ); } elsif ( $fform =~ m%^([a-zA-Z_\-\.]+)\(([0-9a-zA-Z]+)\)$% ) { return &man( $1, $2 ); } # remove trailing spaces for dumb users $form{'query'} =~ s/\s+$//; $form{'query'} =~ s/^\s+//; $name = $query = $form{'query'}; $section = $form{'sektion'}; $apropos = $form{'apropos'}; $alttitle = $form{'title'}; $manpath = $form{'manpath'}; if ( $manpath =~ /^([0-9A-Za-z \.\-\/]+)$/ ) { $manpath = $1; } else { $manpath = ''; } if ( !$manpath ) { $manpath = $manPathDefault; } elsif ( !$manPath{$manpath} ) { local ($m) = ( $manpath =~ y/A-Z/a-z/ ); if ( $manPath{ $manPathAliases{$manpath} } ) { $manpath = $manPathAliases{$manpath}; } else { $manpath = $manPathDefault; } } # download a man hierarchie as gzip'd tar file return &download if ( $apropos > 1 ); # empty query return &indexpage if ( $manpath && $form !~ /query=/ ); $section = "" if $section eq "ALL" || $section eq ''; if ( !$apropos && $query =~ m/^(.*)\(([^\)]*)\)/ ) { $name = $1; $section = $2; } if ( $name =~ /^([\w\-:\.]+)$/ ) { $name = $1; } else { $name = ''; } if ( $section =~ /^([\w\-\.]+)$/ ) { $section = $1; } else { $section = ''; } $apropos ? &apropos($query) : &man( $name, $section ); } # --------------------- support routines ------------------------ sub debug { &http_header("text/plain"); print @_, "\n----------\n\n\n"; } sub get_the_sources { local ($file) = $0; open( R, $file ) || &mydie("open $file: $!\n"); print "Content-type: text/plain\n\n"; while () { print } close R; exit; } # download a manual directory as gzip'd tar archive sub download { $| = 1; my $filename = $manpath; $filename =~ s/\s+/_/; $filename = &encode_url($filename); $filename .= '.tar.gz'; print qq{Content-type: application/x-tar\n} . qq{Content-encoding: x-gzip\n} . qq{Content-disposition: inline; filename="$filename"\n} . "\n"; local (@m); local ($m) = $manPath{"$manpath"}; foreach ( split( /:/, $m ) ) { push( @m, $_ ) if s%^$manLocalDir/?%%; } chdir($manLocalDir) || do { print "chdir: $!\n"; exit(0); }; $m = join( " ", @m ); #warn "find $m -print | cpio -o -H tar 2>/dev/null | gzip -cqf"; sleep 1; system("find $m -print | cpio -o -H tar 2>/dev/null | gzip -cqf"); exit(0); } sub http_header { local ($content_type) = @_; if ( defined($main'plexus_configured) ) { &main'MIME_header( 'ok', $content_type ); } else { print "Content-type: $content_type\n\n"; } } sub env { defined( $main'ENV{ $_[0] } ) ? $main'ENV{ $_[0] } : undef; } sub apropos { local ($query) = @_; local ( $_, $title, $head, *APROPOS ); local ( $names, $section, $msg, $key ); local ($prefix); $prefix = "Apropos "; if ($alttitle) { $prefix = ""; $title = &encode_title($alttitle); $head = &encode_data($alttitle); } else { $title = &encode_title($query); $head = &encode_data($query); } &http_header("text/html"); print &html_header("Apropos $title"); print "

", $www{'head'}, "

\n\n"; &formquery; local ($mpath) = $manPath{$manpath}; open( APROPOS, "env MANPATH=$mpath $command{'man'} -k . |" ) || do { warn "$0: Cannot open whatis database for `$mpath'\n"; print "Cannot open whatis database for `$mpath'\n"; print "\n\n\n"; return; }; local ($q) = $query; $q =~ s/(\W)/\\W/g; local ($acounter) = 0; print qq{
\n}; while () { next if !/$q/oi; $acounter++; # matches whatis.db lines: name[, name ...] (sect) - msg $names = $section = $msg = $key = undef; ( $key, $section ) = m/^([^()]+)\(([^)]*)\)/; $key =~ s/\s+$//; $key =~ s/.*\s+//; ( $names, $msg ) = m/^(.*\))\s+-\s+(.*)/; print "
", &encode_data("$names"), "\n
\n
", &encode_data($msg), "
\n"; } print qq{
\n}; close(APROPOS); if ( !$acounter ) { print "Sorry, no data found for `$query'.\n"; print qq{You may look for other } . qq{FreeBSD Search Services.\n}; } &html_footer; } sub man { local ( $name, $section ) = @_; local ( $_, $title, $head, *MAN ); local ( $html_name, $html_section, $prefix ); local (@manargs); local ($query) = $name; # $section =~ s/^([0-9ln]).*$/$1/; $section =~ tr/A-Z/a-z/; $prefix = "Man "; if ($alttitle) { $prefix = ""; $title = &encode_title($alttitle); $head = &encode_data($alttitle); } elsif ($section) { $title = &encode_title("${name}($section)"); $head = &encode_data("${name}($section)"); } else { $title = &encode_title("${name}"); $head = &encode_data("${name}"); } if ( $format eq "html" ) { &http_header("text/html"); print &html_header("$title"); print "

", $www{'head'}, "

\n\n"; &formquery; print "
\n";
     }
     else {
 
         #$format =~ /^(ps|ascii|latin1|dvi|troff)$/')
         $ENV{'NROFF_FORMAT'} = $format;
 
         # Content-encoding: x-gzip
         if ( $format eq "ps" ) {
             &http_header("application/postscript");
         }
         elsif ( $format eq "pdf" ) {
             &http_header("application/pdf");
         }
         elsif ( $format eq "dvi" ) {
             &http_header("application/x-dvi");
         }
         elsif ( $format eq "troff" ) {
             &http_header("application/x-troff-mandoc");
         }
         else {
             &http_header("text/plain");
         }
     }
 
     $html_name    = &encode_data($name);
     $html_section = &encode_data($section);
 
     #print Dumper($sectionpath);
     #print "yy $section yy $manpath\n";
     if ( $name =~ /^\s*$/ ) {
         print "Empty input, no man page given.\n";
         return;
     }
 
     if ( index( $name, '*' ) != -1 ) {
         print "Invalid character input '*': $name\n";
         return;
     }
 
     if ( $section !~ /^[0-9ln]\w*$/ && $section ne '' ) {
         print "Sorry, section `$section' is not valid\n";
         return;
     }
 
     if ( !$section ) {
         if ( $sectionpath->{$manpath} ) {
             $section = "-S " . $sectionpath->{$manpath}{'path'};
         }
         else {
             $section = '';
         }
     }
     else {
         if ( $sectionpath->{$manpath}{$section} ) {
             $section = "-S " . $sectionpath->{$manpath}{$section};
         }
         else {
             $section = "-S $section";
         }
     }
 
     @manargs = split( / /, $section );
     if ($manpath) {
         if ( $manPath{$manpath} ) {
             unshift( @manargs, ( '-M', $manPath{$manpath} ) );
             &groff_path( $manPath{$manpath} );
         }
         elsif ( $manpath{ &dec($manpath) } ) {
             unshift( @manargs, ( '-M', $manPath{ &dec($manpath) } ) );
             &groff_path( $manPath{ &dec($manpath) } );
         }
         else {
 
             # unset invalid manpath
             print "x $manpath x\n";
             print "x " . &dec($manpath) . "x\n";
             undef $manpath;
         }
     }
 
     if ( $format =~ /^(ps|pdf)$/ ) {
         push( @manargs, '-t' );
     }
 
     # warn "X $command{'man'} @manargs -- x $name x\n";
     &proc( *MAN, $command{'man'}, @manargs, "--", $name )
       || &mydie("$0: open of $command{'man'} command failed: $!\n");
     if ( eof(MAN) ) {
 
         # print "X $command{'man'} @manargs -- x $name x\n";
         print qq{
\n}; print "Sorry, no data found for `$html_name" . ( $html_section ? "($html_section)" : '' ) . "'.\n"; print qq{Please try a keyword search.\n}; print qq{

You may look for other } . qq{FreeBSD Search Services.

\n}; &html_footer; return; } if ( $format ne "html" ) { if ( $format eq "latin1" || $format eq "ascii" ) { while () { s/.//g; print; } } elsif ( $format eq "pdf" ) { # # run a PostScript to PDF converter # local (@args) = ( 'mktemp', '/tmp/_man.cgi-ps2pdf-XXXXXXXXXXXX' ); open( TMP, "-|" ) or exec(@args) or die "open @args: $!\n"; local ($tempfile) = ; close TMP; # chomp, avoid security warnings using -T switch #chop($tempfile); if ( $tempfile =~ /(\S+)/ ) { $tempfile = $1; } if ( !$tempfile || !-f $tempfile ) { die "Cannot create tempfile: $tempfile\n"; } #warn $tempfile; #$tempfile = '/tmp/bla2'; open( TMP, "> $tempfile" ) or die "open $tempfile: $!\n"; while () { print TMP $_; } close TMP; local ( $ENV{'PATH'} ) = '/bin:/usr/bin:/usr/local/bin'; open( PDF, "-|" ) or exec( '/usr/local/bin/ps2pdf', $tempfile, '/dev/stdout' ) or die "open ps2pdf: $!\n"; # sleep and delete the temp file #select(undef, undef, undef, 0.8); #unlink($tempfile); while () { print; } close PDF; unlink($tempfile); } else { while () { print; } } close(MAN); exit(0); } local ($space) = 1; local (@sect); local ( $i, $j ); while () { # remove tailing white space if (/^\s+$/) { next if $space; $space = 1; } else { $space = 0; } $_ = &encode_data($_); if ( $enable_include_links && m,()?\#include()?\s+()?\<\;(.*\.h)\>\;()?, ) { $match = $4; ( $regexp = $match ) =~ s/\./\\\./; s,$regexp,\$match\,; } /^\s/ && # skip headers s,((<[IB]>)?[\w\_\.\-]+\s*()?\s*\(([1-9ln][a-zA-Z]*)\)),&mlnk($1),oige; # detect E-Mail Addreses in manpages if ( $enable_mailto_links && /\@/ ) { s/([a-z0-9_\-\.]+\@[a-z0-9\-\.]+\.[a-z]+)/$1<\/A>/gi; } # detect URLs in manpages if (m%tp://%) { s,((ftp|http)://[^\s<>\)]+),$1,gi; } if (s%^(.*?)+\n?$% ($str = $1) =~ s,(|),,g; $str%ge) { $i = $_; $j = &encode_url($i); $j =~ s/\+/_/g; $_ = qq{$i\n}; push( @sect, $i ); } print; } close(MAN); print qq{\n\n
\n}; for ( $i = 0 ; $i <= $#sect ; $i++ ) { $j = &encode_url( $sect[$i] ); $j =~ s/\+/_/g; print qq{
$sect[$i]} . ( $i < $#sect ? " |\n" : "\n" ); } &html_footer; # Sleep 0.35 seconds to avoid DoS attacs select undef, undef, undef, 0.35; } # # You may need to precreate some mdoc.local files for every system you # support (every collection of man pages), maybe like: # # $manLocalDir/NetBSD-1.4.2/tmac # # and then in your cgi script itself set the GROFF_TMAC_PATH as appropriate # like: # # GROFF_TMAC_PATH=$manLocalDir/NetBSD-1.4.2/tmac:/usr/share/tmac/ # sub groff_path { local $manpath = shift; local @groff_path; foreach ( split( /:/, $manpath ) ) { push( @groff_path, $_ . '/tmac' ); } $ENV{'GROFF_TMAC_PATH'} = join( ':', @groff_path, '/usr/share/tmac' ); } sub mlnk { local ($matched) = @_; local ( $link, $section ); ( $link = $matched ) =~ s/[\s]+//g; $link =~ s/<\/?[IB]>//ig; ( $link, $section ) = ( $link =~ m/^([^\(]*)\((.*)\)/ ); $link = &encode_url($link); $section = &encode_url($section); local ($manpath) = &encode_url($manpath); return qq{$matched}; } sub proc { local ( *FH, $prog, @args ) = @_; local ($pid) = open( FH, "-|" ); return undef unless defined($pid); if ( $pid == 0 ) { exec( $prog, @args ) or &mydie("exec $prog failed\n"); } 1; } # $indent is a bit of optional data processing I put in for # formatting the data nicely when you are emailing it. # This is derived from code by Denis Howe # and Thomas A Fine sub decode_form { local ( $form, *data, $indent, $key, $_ ) = @_; foreach $_ ( split( /&/, $form ) ) { ( $key, $_ ) = split( /=/, $_, 2 ); $_ =~ s/\+/ /g; # + -> space $key =~ s/\+/ /g; # + -> space $_ =~ s/%([\da-f]{1,2})/pack(C,hex($1))/eig; # undo % escapes $key =~ s/%([\da-f]{1,2})/pack(C,hex($1))/eig; # undo % escapes $_ =~ s/[\r\n]+/\n\t/g if defined($indent); # indent data after \n $data{$key} = &escape($_); } } # block cross-site scripting attacks (css) sub escape($) { $_ = $_[0]; s/&/&/g; s//>/g; $_; } sub dec { local ($_) = @_; s/\+/ /g; # '+' -> space s/%(..)/pack("c",hex($1))/ge; # '%ab' -> char ab return ($_); } # # Splits up a query request, returns an array of items. # usage: @items = &main'splitquery($query); # sub splitquery { local ($query) = @_; grep( ( s/%([\da-f]{1,2})/pack(C,hex($1))/eig, 1 ), split( /\+/, $query ) ); } # encode unknown data for use in a URL sub encode_url { local ($_) = @_; # rfc1738 says that ";"|"/"|"?"|":"|"@"|"&"|"=" may be reserved. # And % is the escape character so we escape it along with # single-quote('), double-quote("), grave accent(`), less than(<), # greater than(>), and non-US-ASCII characters (binary data), # and white space. Whew. s/([\000-\032\;\/\?\:\@\&\=\%\'\"\`\<\>\177-\377 ])/sprintf('%%%02x',ord($1))/eg; s/%20/+/g; $_; } # encode unknown data for use in ...</TITILE> sub encode_title { # like encode_url but less strict (I couldn't find docs on this) local ($_) = @_; s/([\000-\031\%\&\<\>\177-\377])/sprintf('%%%02x',ord($1))/eg; $_; } # encode unknown data for use inside markup attributes <MARKUP ATTR="..."> sub encode_attribute { # rfc1738 says to use entity references here local ($_) = @_; s/([\000-\031\"\'\`\%\&\<\>\177-\377])/sprintf('\&#%03d;',ord($1))/eg; $_; } # encode unknown text data for using as HTML, # treats ^H as overstrike ala nroff. sub encode_data { local ($_) = @_; local ($str); # Escape &, < and > s,\010[><&],,g; s/\&/\&\;/g; s/\</\<\;/g; s/\>/\>\;/g; s,((_\010[^_])+),($str = $1) =~ s/.\010//g; "<i>$str</i>";,ge; s,((.\010.)+),($str = $1) =~ s/.\010//g; "<b>$str</b>";,ge; #s,((_\010.)+),($str = $1) =~ s/.\010//g; "<i>$str</i>";,ge; #s,(.\010)+,$1,g; #if (!s,((.\010.)+\s+(.\010.)+),($str = $1) =~ s/.\010//g; "<b>$str</b>";,ge) { # s,(([^_]\010.)+),($str = $1) =~ s/[^_]\010//g; "<b>$str</b>";,ge; # s,(([_]\010.)+),($str = $1) =~ s/[_]\010//g; "<i>$str</i>";,ge; #} # Escape binary data except for ^H which we process below # \375 gets turned into the & for the entity reference #s/([^\010\012\015\032-\176])/sprintf('\375#%03d;',ord($1))/eg; # Process ^H sequences, we use \376 and \377 (already escaped # above) to stand in for < and > until those characters can # be properly escaped below. #s,\376[IB]\377_\376/[IB]\377,,g; #s/.[\b]//g; # just do an erase for anything else # Now convert our magic chars into our tag markers #s/\375/\&/g; s/\376/</g; s/\377/>/g; # cleanup all the rest s,.\010,,g; $_; } sub indexpage { &http_header("text/html"); print &html_header("$www{'title'}: Index Page") . "<h1>", $www{'head'}, "</h1>\n\n" . &intro; &formquery; local ($m) = ( $manpath ? $manpath : $manPathDefault ); $m = &encode_url($m); print "<b><i>Section Indexes</i></b>:\n"; foreach ( '1', '2', '3', '4', '5', '6', '7', '8', '9', 'n' ) { print qq{¤ } if $_ ne '1'; print qq{<a href="$BASE?query=($_)&sektion=&apropos=1&manpath=$m&title=Section%20$_Index">$_</a>\n}; } print "<br /><b><i>Explanations of Man Sections:</i></b>\n"; foreach ( '1', '2', '3', '4', '5', '6', '7', '8', '9' ) { print qq{¤ } if $_ ne '1'; print qq{<a href="$BASE?query=intro&sektion=$_&apropos=0&manpath=$m&title=Introduction%20Section%20$_">intro($_)</a>\n}; } if (0) { print "<br />\n<b><i>Quick Reference Categories:</i></b>\n"; foreach ( 'database', 'disk', 'driver', 'ethernet', 'mail', 'net', 'nfs', 'nis', 'protocol', 'ppp', 'roff', 'string', 'scsi', 'statistic', 'tcl', 'tcp', 'time' ) { print qq{¤ <a href="$BASE?query=$_&sektion=&apropos=1&manpath=$m&title=Quick%20Ref%20$_">$_</a>\n}; } } print <<ETX if 0 && $mailto; URL: <a href="$BASE" target="_parent">$www{'home'}$BASE</a><br /> ETX print "<br />\n"; &html_footer; } sub formquery { local ( $astring, $bstring ); if ( !$apropos ) { $astring = q{ checked="checked"}; } else { $bstring = q{ checked="checked"}; } print <<ETX; <form method="get" action="$BASE"> Man Page or Keyword Search: <input value="$query" name="query" /> <input type="submit" value="Submit" /> <input type="reset" value="Reset" /> <br /> <input name="apropos" value="0" type="radio"$astring /> <a href="$BASE?query=man&sektion=1&apropos=0">Man</a> <select name="sektion"> ETX foreach $key ( sort keys %sectionName ) { print "<option" . ( ( $key eq $section ) ? ' selected="selected" ' : ' ' ) . qq{value="$key">$sectionName{$key}</option>\n}; } print qq{</select>\n<select name="manpath">\n}; local ($l) = ( $manpath ? $manpath : $manPathDefault ); foreach ( sort keys %manPath ) { $key = $_; print "<option" . ( ( $key eq $l ) ? ' selected="selected" ' : ' ' ) . qq{value="$key">$key</option>\n}; } local ($m) = &encode_url($l); print <<ETX; </select> <br /> <input name="apropos" value="1" type="radio"$bstring /> <a href="$BASE?query=apropos&sektion=1&apropos=0">Apropos</a> Keyword Search (all sections) <select name="format"> ETX foreach ( 'html', 'ps', 'pdf', # 'dvi', # you need a 8 bit clean man, e.g. jp-man 'ascii', 'latin1' ) { print qq{<option value="$_">$_</option>\n}; } print <<ETX; </select> Output format </form> <a href="$BASE?manpath=$m">home</a> | <a href="$BASE/help.html">help</a> <hr /> ETX 0; } sub faq { local ( @list, @list2 ); local ($url); foreach ( sort keys %manPath ) { $url = &encode_url($_); push( @list, qq{<li><a href="$BASE?apropos=2&manpath=$url">[download]} . qq{</a> "$_" -> $BASE?manpath=$url} . qq{</li>\n} ); } foreach ( sort keys %manPathAliases ) { push( @list2, qq[<li>"$_" -> "$manPathAliases{$_}" -> ] . qq{<a href="$BASE?manpath=} . &encode_url($_) . qq{">$BASE?manpath=} . &encode_url($_) . "</a></li>\n" ) if $manPathAliases{$_}; } - local $id = '$FreeBSD: www/en/cgi/man.cgi,v 1.195 2007/12/02 21:21:18 wosch Exp $'; + local $id = '$FreeBSD: www/en/cgi/man.cgi,v 1.196 2008/01/17 16:44:52 hrs Exp $'; return qq{\ <pre> Copyright (c) 1996-2007 <a href="$mailtoURL">Wolfram Schneider</a> Copyright (c) 1993-1995 Berkeley Software Design, Inc. This data is part of a licensed program from BERKELEY SOFTWARE DESIGN, INC. Portions are copyrighted by BSDI, The Regents of the University of California, Massachusetts Institute of Technology, Free Software Foundation, FreeBSD Inc., and others. </pre>\n This script has the revsion: $id <p /> Copyright (c) for man pages by OS vendors. <p/> <a href="ftp://ftp.2bsd.com">2.11 BSD</a>, <a href="http://www.hp.com">HP</a>, <a href="http://www.freebsd.org">FreeBSD</a>, <a href="http://www.cs.vu.nl/~ast/minix.html">Minix</a>, <a href="http://slackware.com">Linux Slackware</a>, <a href="http://www.linux.de">Linux/de</a>, <a href="http://www.netbsd.org">NetBSD</a>, <a href="http://www.openbsd.org">OpenBSD</a>, <a href="http://plan9.bell-labs.com/plan9/">Plan 9</a>, <a href="http://www.sun.com">SunOS</a>, <a href="http://www.digital.com">ULTRIX</a>, <a href="ftp://elib.zib.de/pub/netlib/att/cs/v7man">Unix Seventh Edition</a>, <a href="http://www.xfree86.org">XFree86</a>, <a href="http://www.x.org">X11R6</a> <h2>FAQ</h2> <ul> <li>Get the <a href="$BASE/source">source</a> of the man.cgi script</li> <li>Troff macros works only if defined in FreeBSD/groff. OS specific macros like `appeared in NetBSD version 1.2' are not supported.</li> <li>Netscape is buggy, you may press twice the link 'Index Page and Help'</li> <li>Some OSs provide only formated manual pages (catpages), e.g. NetBSD and OpenBSD. In this case it is not possible to create Postscript and troff output.</li> <li>The <a href="http://cvsweb.freebsd.org/src/share/misc/bsd-family-tree"> Unix family tree, BSD part</a>.</li> <li>The <a href="http://www.freebsd.org/cgi/ports.cgi"> FreeBSD Ports Changes</a> script.</li> <li>Copyright (c) and download for man pages by OS vendors</li> </ul> <h2>Releases</h2> Releases and Releases Aliases are information how to make a link to this script to the right OS version. <p /> You may download the manpages as gzip'd tar archive for private use. A tarball is usually 5MB big. <p /> <ul> @list </ul> <h2>Releases Aliases</h2> Release aliases are for lazy people. Plus, they have a longer lifetime, eg. 'openbsd' points always to the latest OpenBSD release. <ul> @list2 </ul> }; } sub intro { return qq{\ <p /> <i>Man Page Lookup</i> searches for man pages name and section as given in the selection menu and the query dialog. <i>Apropos Keyword Search</i> searches the database for the string given in the query dialog. There are also several hypertext links provided as short-cuts to various queries: <i>Section Indexes</i> is apropos listings of all man pages by section. <i>Explanations of Man Sections</i> contains pointers to the intro pages for various man sections. <p /> }; } sub faq_output { my $base = $BASE; $base =~ s,[^/]*$,,; $base = 'http://www.freebsd.org/cgi/'; # XXX &http_header("text/html"); print &html_header( "HTML hypertext FreeBSD man page interface", $base ) . "<h1>", $www{'head'}, "</h1>\n" . &faq . qq{\ <hr /> <a href="$_[0]">home</a> }; &html_footer; } sub html_header2 { my ( $title, $head ) = @_; return qq{<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"> <head> <title>$title $head }; } sub secure_env { $main'ENV{'PATH'} = '/bin:/usr/bin'; $main'ENV{'MANPATH'} = $manPath{$manPathDefault}; $main'ENV{'IFS'} = " \t\n"; $main'ENV{'PAGER'} = 'cat'; $main'ENV{'SHELL'} = '/bin/sh'; $main'ENV{'LANG'} = 'C'; undef $main'ENV{'DISPLAY'}; } sub include_output { local ($inc) = @_; &http_header("text/plain"); open( I, "$inc" ) || do { print "open $inc: $!\n"; exit(1) }; while () { print } close(I); } # CGI script must die with error status 0 sub mydie { local ($message) = @_; &http_header("text/html"); print &html_header("Error"); print $message; print qq{

home }; &html_footer; exit(0); } 1;