1167 lines
		
	
	
	
		
			37 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			1167 lines
		
	
	
	
		
			37 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/perl -T
 | ||
| #
 | ||
| # Copyright (c) 1996-2003 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
 | ||
| # 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.104 2003-05-07 10:23:44 www Exp $
 | ||
| 
 | ||
| #use Data::Dumper;
 | ||
| #use Carp;
 | ||
| 
 | ||
| 
 | ||
| $www{'title'} = 'FreeBSD Hypertext Man Pages';
 | ||
| $www{'home'} = 'http://www.FreeBSD.org';
 | ||
| $www{'head'} = qq[<A HREF="$www{'home'}">$www{'title'}</a> ] .
 | ||
|                qq[<IMG SRC="/gifs/littlelogo.gif">] .
 | ||
|                 "";
 | ||
| 
 | ||
| $command{'man'} =     'man'; # 8Bit clean man
 | ||
| $command{'man'} =     '/home/wosch/bin/cgi-man'; # 8Bit clean man
 | ||
| $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.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', },
 | ||
| };
 | ||
| 
 | ||
| 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 4.8-RELEASE';
 | ||
| 
 | ||
| %manPath = 
 | ||
|     (
 | ||
|      'FreeBSD 5.0-current',   "$manLocalDir/FreeBSD-5.0-current",
 | ||
|      'FreeBSD 4.7-stable',    "$manLocalDir/FreeBSD-4.7-stable",
 | ||
|      'FreeBSD 5.0-RELEASE',   "$manLocalDir/FreeBSD-5.0-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",
 | ||
|      'FreeBSD Ports 5.0-RELEASE', "$manLocalDir/FreeBSD-ports-5.0-RELEASE",
 | ||
|      'FreeBSD Ports 4.7-RELEASE', "$manLocalDir/FreeBSD-ports-4.7-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",
 | ||
| 
 | ||
|     #'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",
 | ||
| 
 | ||
|      '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",
 | ||
| 
 | ||
|      '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",
 | ||
| 
 | ||
|      '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.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",
 | ||
| 
 | ||
|      '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",
 | ||
|      'Darwin 1.3 PPC',        "$manLocalDir/Darwin-1.3-ppc",
 | ||
| );
 | ||
| 
 | ||
| # delete not existing releases
 | ||
| while (($key,$val) = each %manPath) {
 | ||
|     if ((! -d $val) && (! -l $val)) {
 | ||
| 	delete $manPath{"$key"} if $key ne $manPathDefault;
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| # keywords must be in lower cases.
 | ||
| %manPathAliases = 
 | ||
|     (
 | ||
|      'freebsd', 'FreeBSD 4.8-RELEASE',
 | ||
|      'freebsd-stable', 'FreeBSD 4.7-stable',
 | ||
|      'freebsd-current', 'FreeBSD 5.0-current',
 | ||
|      'slackware', 'Linux Slackware 3.1',
 | ||
|      'linux-de', 'deutsch - Linux/GNU',
 | ||
|      'redhat', 'Red Hat Linux/i386 7.3',
 | ||
|      'suse', 'SuSE Linux/i386 7.3',
 | ||
|      'linux', 'Red Hat Linux/i386 7.3',
 | ||
|      'darwin', 'Darwin 1.3 PPC',
 | ||
|      'macosx', 'Darwin 1.3 PPC',
 | ||
| 
 | ||
|      'netbsd', 'NetBSD 1.6.1',
 | ||
|      'openbsd', 'OpenBSD 3.3',
 | ||
|      'v7', 'Unix Seventh Edition', 
 | ||
|      'v7man', 'Unix Seventh Edition', 
 | ||
|      'x11', 'XFree86 4.3.0',
 | ||
|      'xfree86', 'XFree86 4.3.0',
 | ||
|      'ultrix', 'ULTRIX 4.2',
 | ||
|      'hpux', 'HP-UX 11.22',
 | ||
|      'solaris', 'SunOS 5.9',
 | ||
|      'sunos5', 'SunOS 5.9',
 | ||
|      'sunos4', 'SunOS 4.1.3',
 | ||
|      'sunos', 'SunOS 4.1.3',
 | ||
|      'freebsd ports', 'FreeBSD Ports 4.7-RELEASE',
 | ||
|      'ports', 'FreeBSD Ports 4.7-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;
 | ||
| 
 | ||
| # Plexus Native Interface
 | ||
| sub do_man {
 | ||
|     local($BASE, $path, $form) = @_;
 | ||
|     local($_, %form, $query, $proto, $name, $section, $apropos);
 | ||
| 
 | ||
|     # spinner is buggy, shit
 | ||
|     local($u) = 'http://user.cs.tu-berlin.de/~wosch/man.cgi';
 | ||
| 	local($u)= $BASE;
 | ||
| 
 | ||
|     return &faq_output($u) if ($path =~ /faq.html$/);
 | ||
|     return ©right_output($u) if ($path =~ /copyright.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) {
 | ||
| 	$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;
 | ||
|     }
 | ||
|     
 | ||
|     $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) = '/usr/local/www/bsddoc/bin/man.cgi';
 | ||
|     $file = $0 if ! -f $file;
 | ||
| 
 | ||
|     open(R, $file) || &mydie("open $file: $!\n");
 | ||
|     print "Content-type: text/plain\n\n";
 | ||
|     while(<R>) { print }
 | ||
|     close R;
 | ||
|     exit;
 | ||
| }
 | ||
| 
 | ||
| # download a manual directory as gzip'd tar archive
 | ||
| sub download {
 | ||
| 
 | ||
|     $| = 1;
 | ||
|     print qq{Content-type: application/x-tar\n} .
 | ||
| 	qq{Content-encoding: x-gzip\n\n};
 | ||
| 
 | ||
|     local($m) = $manPath{"$manpath"};
 | ||
|     $m =~ s%^$manLocalDir/?%%;
 | ||
| 
 | ||
|     chdir($manLocalDir) || do {
 | ||
| 	print "chdir: $!\n"; exit(0);
 | ||
|     };
 | ||
| 
 | ||
|     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("$www{'title'}: Apropos $title");
 | ||
|     print "<H1>$www{'head'}</H1>\n\n";
 | ||
|     &formquery;
 | ||
| 
 | ||
|     local($mpath) = ($manpath ? &dec($manpath) : $manPathDefault);
 | ||
| 
 | ||
|     open(APROPOS, "$manPath{$mpath}/whatis") || do {
 | ||
| 	warn "$0: Cannot open whatis database for `$mpath'\n";
 | ||
| 	print "Cannot open whatis database for `$mpath'\n";
 | ||
| 	print "</DL>\n</BODY>\n</HTML>\n";
 | ||
| 	return;
 | ||
|     };
 | ||
| 
 | ||
|     local($q) = $query; 
 | ||
|     $q =~ s/(\W)/\\W/g;
 | ||
|     local($acounter) = 0;
 | ||
|     
 | ||
|     while (<APROPOS>) {
 | ||
| 	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 "<DT><A HREF=\"$BASE?query=", &encode_url($key),
 | ||
| 	    "&sektion=", &encode_url($section), "&apropos=0", 
 | ||
|             "&manpath=", &encode_url($manpath), "\">",
 | ||
| 	    &encode_data("$names"), "</A>\n<DD>",
 | ||
| 	    &encode_data($msg), "\n";
 | ||
|     }
 | ||
|     close(APROPOS);
 | ||
| 
 | ||
|     if (!$acounter) {
 | ||
| 	print "Sorry, no data found for `$query'.\n";
 | ||
| 	print qq{You may look for other } . 
 | ||
| 	    qq{<a href="../../search/">FreeBSD Search Services</a>.\n};
 | ||
|     }
 | ||
|     print "</DL>\n</BODY>\n</HTML>\n";
 | ||
| }
 | ||
| 
 | ||
| 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("$www{'title'}: $title");
 | ||
| 	print "<H1>$www{'head'}</H1>\n\n";
 | ||
| 	&formquery;
 | ||
| 	print "<PRE>\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}));
 | ||
| 	} elsif ($manpath{&dec($manpath)}) {
 | ||
| 	    unshift(@manargs, ('-M', $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');
 | ||
|     }
 | ||
| 
 | ||
|     # print "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 "Sorry, no data found for `$html_name" .
 | ||
| 		($html_section ? "($html_section)": '') . "'.\n";
 | ||
| 	print qq{You may look for other } . 
 | ||
| 	    qq{<a href="../../search/">FreeBSD Search Services</a>.\n};
 | ||
| 	return;
 | ||
|     }
 | ||
| 
 | ||
|     if ($format ne "html") {
 | ||
| 	if ($format eq "latin1" || $format eq "ascii") {
 | ||
| 	    while(<MAN>) { 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) = <TMP>;
 | ||
| 	    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(<MAN>) {
 | ||
| 		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(<PDF>) {
 | ||
| 		print;
 | ||
| 	    }
 | ||
| 	    close PDF;
 | ||
| 	    unlink($tempfile);
 | ||
| 
 | ||
| 	} else {
 | ||
| 	    while(<MAN>) { print; }
 | ||
| 	}
 | ||
| 	close(MAN);
 | ||
| 	exit(0);
 | ||
|     }
 | ||
| 
 | ||
|     local($space) = 1;
 | ||
|     local(@sect);
 | ||
|     local($i, $j);
 | ||
|     while(<MAN>) {
 | ||
| 	# remove tailing white space
 | ||
| 	if (/^\s+$/) {
 | ||
| 	    next if $space;
 | ||
| 	    $space = 1;
 | ||
| 	} else {
 | ||
| 	    $space = 0;
 | ||
| 	}
 | ||
| 
 | ||
| 	$_ = &encode_data($_);
 | ||
| 	if($enable_include_links &&
 | ||
| 	   m,(<B>)?\#include(</B>)?\s+(<B>)?\<\;(.*\.h)\>\;(</B>)?,) {
 | ||
| 	    $match = $4; ($regexp = $match) =~ s/\./\\\./;
 | ||
| 	    s,$regexp,\<A HREF=\"$BASE/usr/include/$match\"\>$match\</A\>,;
 | ||
|         }
 | ||
| 	/^\s/ && 			# skip headers
 | ||
| 	    s,((<[IB]>)?[\w\_\.\-]+\s*(</[IB]>)?\s*\(([1-9ln][a-zA-Z]*)\)),&mlnk($1),oige;
 | ||
| 
 | ||
| 	# detect E-Mail Addreses in manpages
 | ||
| 	if (/\@/) {
 | ||
| 	    s/([a-z0-9_\-\.]+\@[a-z0-9\-\.]+\.[a-z]+)/<A HREF="mailto:$1">$1<\/A>/gi;
 | ||
| 	}
 | ||
| 
 | ||
| 	# detect URLs in manpages
 | ||
| 	if (m%tp://%) {
 | ||
| 	    s,((ftp|http)://[^\s<>\)]+),<A HREF="$1">$1</A>,gi;
 | ||
| 	}
 | ||
| 
 | ||
| 	if (/^<B>\S+/ && m%^<B>([^<]+)%) {
 | ||
| 	    $i = $1; $j = &encode_url($i);
 | ||
| 	    s%^<B>([^<]+)</B>%<a name="$j" href="#end"><B>$i</B></a>%;
 | ||
| 	    push(@sect, $1);
 | ||
|         }
 | ||
| 	print;
 | ||
|     }
 | ||
|     close(MAN);
 | ||
|     print qq{</PRE>\n<a name="end">\n<hr noshade>\n};
 | ||
| 
 | ||
|     for ($i = 0; $i <= $#sect; $i++) {
 | ||
| 	print qq{<a href="#} . &encode_url($sect[$i]) . 
 | ||
|             qq{">$sect[$i]</a>} . ($i < $#sect ? " |\n" : "\n");
 | ||
|     }
 | ||
| 
 | ||
|     print "</BODY>\n";
 | ||
|     print "</HTML>\n";
 | ||
| 
 | ||
|     # Sleep 0.35 seconds to avoid DoS attacs
 | ||
|     select undef, undef, undef, 0.35;
 | ||
| }
 | ||
| 
 | ||
| sub mlnk {
 | ||
|     local($matched) = @_;
 | ||
|     local($link, $section);
 | ||
|     ($link = $matched) =~ s/[\s]+//g;
 | ||
|     $link =~ s/<\/?[IB]>//g;
 | ||
|     ($link, $section) = ($link =~ m/^([^\(]*)\((.*)\)/);
 | ||
|     $link = &encode_url($link);
 | ||
|     $section = &encode_url($section);
 | ||
|     local($manpath) = &encode_url($manpath);
 | ||
|     return qq{<A HREF="$BASE?query=$link} . 
 | ||
|            qq{&sektion=$section&apropos=0&manpath=$manpath">$matched</A>};
 | ||
| }
 | ||
| 
 | ||
| sub proc {
 | ||
|     local(*FH, $prog, @args) = @_;
 | ||
|     local($pid) = open(FH, "-|");
 | ||
|     return undef unless defined($pid);
 | ||
|     if ($pid == 0) {
 | ||
| 	exec $prog, @args;
 | ||
| 	&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 <dbh@doc.ic.ac.uk>
 | ||
| # and Thomas A Fine <fine@cis.ohio-state.edu>
 | ||
| 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; 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 <A HREF="...">
 | ||
| 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 <TITLE>...</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)+,$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;
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
|     # 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;
 | ||
| 
 | ||
|     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>: ";
 | ||
|     foreach ('1', '2', '3', '4', '5', '6', '7', '8', '9', 'n') {
 | ||
| 	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>";
 | ||
|     foreach ('1', '2', '3', '4', '5', '6', '7', '8', '9') {
 | ||
| 	print qq{¤ <A HREF="$BASE?query=intro&sektion=$_&apropos=0&manpath=$m&title=Introduction%20Section%20$_">intro($_)</A>\n};
 | ||
|     }
 | ||
| 
 | ||
|     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 $mailto;
 | ||
| <HR noshade>
 | ||
| <img ALIGN="RIGHT" src="/gifs/powerlogo.gif">
 | ||
| Please direct questions about this server to
 | ||
| <I><A HREF="$webmasterURL">$webmaster</A></I><br>
 | ||
| URL:  <A HREF="$BASE" target=_parent>$www{'home'}$BASE</a><br>
 | ||
| ETX
 | ||
| 
 | ||
|     print "<br>\n";
 | ||
|     print "</BODY>\n</HTML>\n";
 | ||
|     0;
 | ||
| }
 | ||
| 
 | ||
| sub formquery {
 | ||
|     local($astring, $bstring);
 | ||
|     if (!$apropos) {
 | ||
| 	$astring = " CHECKED";
 | ||
|     } else {
 | ||
| 	$bstring = " CHECKED";
 | ||
|     }
 | ||
| 
 | ||
|     print <<ETX;
 | ||
| <FORM METHOD="GET" ACTION="$BASE">
 | ||
| <B><I>Man Page or Keyword Search:</I></B>
 | ||
| <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
 | ||
| 
 | ||
| 
 | ||
|     while(($key, $value) = each %sectionName) {
 | ||
| 	print "<OPTION" . (($key eq $section) ? ' SELECTED ' : ' ') .
 | ||
| 	      qq{VALUE="$key">$value</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 ' : ' ') .
 | ||
| 	      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', 'troff') {
 | ||
| 	print qq{<OPTION VALUE="$_">$_</OPTION>\n};
 | ||
|     };
 | ||
| 
 | ||
|     print <<ETX;
 | ||
| </SELECT>
 | ||
| Output format
 | ||
| </FORM>
 | ||
| 
 | ||
| <A HREF="$BASE?manpath=$m">Index Page and Help</A> |
 | ||
| <A HREF="$BASE/faq.html">FAQ</A> |
 | ||
| <A HREF="$BASE/copyright.html">Copyright</A>
 | ||
| <HR>
 | ||
| ETX
 | ||
|     0;
 | ||
| }
 | ||
| 
 | ||
| sub copyright {
 | ||
|     $id = '$Id: man.cgi,v 1.104 2003-05-07 10:23:44 www Exp $';
 | ||
| 
 | ||
|     return qq{\
 | ||
| <PRE>
 | ||
| Copyright (c) 1996-2003 Wolfram Schneider <A HREF="$mailtoURL"><$mailto></A>. Berlin.
 | ||
| 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>
 | ||
| };
 | ||
| }
 | ||
| 
 | ||
| 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});
 | ||
|     }
 | ||
| 
 | ||
|     foreach (sort keys %manPathAliases) {
 | ||
| 	push(@list2, qq[<li>"$_" -> "$manPathAliases{$_}" -> ] .
 | ||
| 	     "$BASE?manpath=" . 
 | ||
| 	     &encode_url($_) . "\n") if $manPathAliases{$_};
 | ||
|     }
 | ||
| 
 | ||
|     return qq{\
 | ||
| <PRE>
 | ||
| Copyright (c) 1996-2003 Wolfram Schneider <a href="$mailtoURL"><$mailto></a>. Berlin.
 | ||
| </PRE>
 | ||
| 
 | ||
| <h2>FAQ</h2>
 | ||
| <UL>
 | ||
| <li>Get the <a href="$BASE/source">source</a> of the man.cgi script
 | ||
| <li>Troff macros works only if defined in FreeBSD/groff. OS specific
 | ||
| macros like `appeared in NetBSD version 1.2' are not supported.
 | ||
| <li>Netscape is buggy, you may press twice the link 'Index Page and Help'
 | ||
| <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>The <a href="http://cvsweb.freebsd.org/src/share/misc/bsd-family-tree">
 | ||
| Unix family tree, BSD part</a>.
 | ||
| <li>The <a href="http://www.freebsd.org/cgi/ports.cgi">
 | ||
| FreeBSD Ports Changes</a> script.
 | ||
| <li>Copyright (c) and download for man pages by <a href="$BASE/copyright.html">
 | ||
| OS vendors</a>
 | ||
| </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.  Or you can select a category from <I>Quick Reference
 | ||
| Categories</I> and see man pages relevant to the selected topic.
 | ||
| <P>
 | ||
| };
 | ||
| }
 | ||
| 
 | ||
| sub copyright_output {
 | ||
|     &http_header("text/html");
 | ||
|     print &html_header("HTML hypertext FreeBSD man page interface") .
 | ||
| 	"<H1>$www{'head'}</H1>\n" . ©right . qq{\
 | ||
| <HR>
 | ||
| 
 | ||
| <A HREF="$_[0]">Index Page and Help</A>
 | ||
| </BODY>
 | ||
| </HTML>
 | ||
| };
 | ||
| }
 | ||
| 
 | ||
| sub faq_output {
 | ||
|     &http_header("text/html");
 | ||
|     print &html_header("HTML hypertext FreeBSD man page interface") .
 | ||
| 	"<H1>$www{'head'}</H1>\n" . &faq . qq{\
 | ||
| <HR>
 | ||
| 
 | ||
| <A HREF="$_[0]">Index Page and Help</A>
 | ||
| </BODY>
 | ||
| </HTML>
 | ||
| };
 | ||
| }
 | ||
| 
 | ||
| sub html_header {
 | ||
|     return qq{<HTML>
 | ||
| <HEAD>
 | ||
| <TITLE>$_[0]</TITLE>
 | ||
| <link rev="made" href="mailto:wosch\@FreeBSD.ORG">
 | ||
| <META name="robots" content="nofollow">
 | ||
| <meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
 | ||
| </HEAD> 
 | ||
| <BODY BGCOLOR="#FFFFFF" TEXT="#000000">\n\n};
 | ||
| }
 | ||
| 
 | ||
| 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'} = 'en_US.ISO_8859-1';
 | ||
|     undef $main'ENV{'DISPLAY'};
 | ||
| }
 | ||
| 
 | ||
| sub include_output {
 | ||
|     local($inc) = @_;
 | ||
| 
 | ||
|     &http_header("text/plain");
 | ||
|     open(I, "$inc") || do { print "open $inc: $!\n"; exit(1) };
 | ||
|     while(<I>) { 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{
 | ||
| <p>
 | ||
| <A HREF="$BASE">Index Page and Help</A>
 | ||
| </BODY>
 | ||
| </HTML>
 | ||
| };
 | ||
| 
 | ||
| 	exit(0);
 | ||
| }
 | ||
| 
 | ||
| 1;
 | ||
| 
 | ||
| 
 |